diff --git a/homeassistant/components/influxdb.py b/homeassistant/components/influxdb.py index d96fb8c384f..ebb4169f8e6 100644 --- a/homeassistant/components/influxdb.py +++ b/homeassistant/components/influxdb.py @@ -21,6 +21,7 @@ _LOGGER = logging.getLogger(__name__) CONF_DB_NAME = 'database' CONF_TAGS = 'tags' +CONF_DEFAULT_MEASUREMENT = 'default_measurement' DEFAULT_DATABASE = 'home_assistant' DEFAULT_HOST = 'localhost' @@ -40,6 +41,7 @@ CONFIG_SCHEMA = vol.Schema({ vol.Optional(CONF_DB_NAME, default=DEFAULT_DATABASE): cv.string, vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, vol.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, + vol.Optional(CONF_DEFAULT_MEASUREMENT): cv.string, vol.Optional(CONF_TAGS, default={}): vol.Schema({cv.string: cv.string}), vol.Optional(CONF_WHITELIST, default=[]): @@ -65,6 +67,7 @@ def setup(hass, config): blacklist = conf.get(CONF_BLACKLIST) whitelist = conf.get(CONF_WHITELIST) tags = conf.get(CONF_TAGS) + default_measurement = conf.get(CONF_DEFAULT_MEASUREMENT) try: influx = InfluxDBClient( @@ -96,7 +99,10 @@ def setup(hass, config): measurement = state.attributes.get('unit_of_measurement') if measurement in (None, ''): - measurement = state.entity_id + if default_measurement: + measurement = default_measurement + else: + measurement = state.entity_id json_body = [ { diff --git a/tests/components/test_influxdb.py b/tests/components/test_influxdb.py index de90e86c0bf..1ddac909c63 100644 --- a/tests/components/test_influxdb.py +++ b/tests/components/test_influxdb.py @@ -256,3 +256,46 @@ class TestInfluxDB(unittest.TestCase): else: self.assertFalse(mock_client.return_value.write_points.called) mock_client.return_value.write_points.reset_mock() + + def test_event_listener_default_measurement(self, mock_client): + """Test the event listener with a default measurement.""" + config = { + 'influxdb': { + 'host': 'host', + 'username': 'user', + 'password': 'pass', + 'default_measurement': 'state', + 'blacklist': ['fake.blacklisted'] + } + } + assert setup_component(self.hass, influxdb.DOMAIN, config) + self.handler_method = self.hass.bus.listen.call_args_list[0][0][1] + + for entity_id in ('ok', 'blacklisted'): + state = mock.MagicMock( + state=1, domain='fake', entity_id='fake.{}'.format(entity_id), + object_id=entity_id, attributes={}) + event = mock.MagicMock(data={'new_state': state}, time_fired=12345) + body = [{ + 'measurement': 'state', + 'tags': { + 'domain': 'fake', + 'entity_id': entity_id, + }, + 'time': 12345, + 'fields': { + 'value': 1, + }, + }] + self.handler_method(event) + if entity_id == 'ok': + self.assertEqual( + mock_client.return_value.write_points.call_count, 1 + ) + self.assertEqual( + mock_client.return_value.write_points.call_args, + mock.call(body) + ) + else: + self.assertFalse(mock_client.return_value.write_points.called) + mock_client.return_value.write_points.reset_mock()