Populate measurement state field for HA states like home/not_home (#9833)
This commit is contained in:
parent
b548116f9b
commit
fb32cc39e1
2 changed files with 71 additions and 92 deletions
|
@ -145,11 +145,16 @@ def setup(hass, config):
|
||||||
(whitelist_d and state.domain not in whitelist_d):
|
(whitelist_d and state.domain not in whitelist_d):
|
||||||
return
|
return
|
||||||
|
|
||||||
_state = float(state_helper.state_as_number(state))
|
_include_state = _include_value = False
|
||||||
_state_key = "value"
|
|
||||||
|
_state_as_value = float(state.state)
|
||||||
|
_include_value = True
|
||||||
except ValueError:
|
except ValueError:
|
||||||
_state = state.state
|
try:
|
||||||
_state_key = "state"
|
_state_as_value = float(state_helper.state_as_number(state))
|
||||||
|
_include_state = _include_value = True
|
||||||
|
except ValueError:
|
||||||
|
_include_state = True
|
||||||
|
|
||||||
include_uom = True
|
include_uom = True
|
||||||
measurement = component_config.get(state.entity_id).get(
|
measurement = component_config.get(state.entity_id).get(
|
||||||
|
@ -176,10 +181,13 @@ def setup(hass, config):
|
||||||
},
|
},
|
||||||
'time': event.time_fired,
|
'time': event.time_fired,
|
||||||
'fields': {
|
'fields': {
|
||||||
_state_key: _state,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
if _include_state:
|
||||||
|
json_body[0]['fields']['state'] = state.state
|
||||||
|
if _include_value:
|
||||||
|
json_body[0]['fields']['value'] = _state_as_value
|
||||||
|
|
||||||
for key, value in state.attributes.items():
|
for key, value in state.attributes.items():
|
||||||
if key in tags_attributes:
|
if key in tags_attributes:
|
||||||
|
|
|
@ -7,7 +7,8 @@ import influxdb as influx_client
|
||||||
|
|
||||||
from homeassistant.setup import setup_component
|
from homeassistant.setup import setup_component
|
||||||
import homeassistant.components.influxdb as influxdb
|
import homeassistant.components.influxdb as influxdb
|
||||||
from homeassistant.const import EVENT_STATE_CHANGED, STATE_OFF, STATE_ON
|
from homeassistant.const import EVENT_STATE_CHANGED, STATE_OFF, STATE_ON, \
|
||||||
|
STATE_STANDBY
|
||||||
|
|
||||||
from tests.common import get_test_home_assistant
|
from tests.common import get_test_home_assistant
|
||||||
|
|
||||||
|
@ -110,12 +111,14 @@ class TestInfluxDB(unittest.TestCase):
|
||||||
"""Test the event listener."""
|
"""Test the event listener."""
|
||||||
self._setup()
|
self._setup()
|
||||||
|
|
||||||
|
# map of HA State to valid influxdb [state, value] fields
|
||||||
valid = {
|
valid = {
|
||||||
'1': 1,
|
'1': [None, 1],
|
||||||
'1.0': 1.0,
|
'1.0': [None, 1.0],
|
||||||
STATE_ON: 1,
|
STATE_ON: [STATE_ON, 1],
|
||||||
STATE_OFF: 0,
|
STATE_OFF: [STATE_OFF, 0],
|
||||||
'foo': 'foo'
|
STATE_STANDBY: [STATE_STANDBY, None],
|
||||||
|
'foo': ['foo', None]
|
||||||
}
|
}
|
||||||
for in_, out in valid.items():
|
for in_, out in valid.items():
|
||||||
attrs = {
|
attrs = {
|
||||||
|
@ -132,53 +135,32 @@ class TestInfluxDB(unittest.TestCase):
|
||||||
state=in_, domain='fake', entity_id='fake.entity-id',
|
state=in_, domain='fake', entity_id='fake.entity-id',
|
||||||
object_id='entity', attributes=attrs)
|
object_id='entity', attributes=attrs)
|
||||||
event = mock.MagicMock(data={'new_state': state}, time_fired=12345)
|
event = mock.MagicMock(data={'new_state': state}, time_fired=12345)
|
||||||
if isinstance(out, str):
|
body = [{
|
||||||
body = [{
|
'measurement': 'foobars',
|
||||||
'measurement': 'foobars',
|
'tags': {
|
||||||
'tags': {
|
'domain': 'fake',
|
||||||
'domain': 'fake',
|
'entity_id': 'entity',
|
||||||
'entity_id': 'entity',
|
},
|
||||||
},
|
'time': 12345,
|
||||||
'time': 12345,
|
'fields': {
|
||||||
'fields': {
|
'longitude': 1.1,
|
||||||
'state': out,
|
'latitude': 2.2,
|
||||||
'longitude': 1.1,
|
'battery_level_str': '99%',
|
||||||
'latitude': 2.2,
|
'battery_level': 99.0,
|
||||||
'battery_level_str': '99%',
|
'temperature_str': '20c',
|
||||||
'battery_level': 99.0,
|
'temperature': 20.0,
|
||||||
'temperature_str': '20c',
|
'last_seen_str': 'Last seen 23 minutes ago',
|
||||||
'temperature': 20.0,
|
'last_seen': 23.0,
|
||||||
'last_seen_str': 'Last seen 23 minutes ago',
|
'updated_at_str': '2017-01-01 00:00:00',
|
||||||
'last_seen': 23.0,
|
'updated_at': 20170101000000,
|
||||||
'updated_at_str': '2017-01-01 00:00:00',
|
'multi_periods_str': '0.120.240.2023873'
|
||||||
'updated_at': 20170101000000,
|
},
|
||||||
'multi_periods_str': '0.120.240.2023873'
|
}]
|
||||||
},
|
if out[0] is not None:
|
||||||
}]
|
body[0]['fields']['state'] = out[0]
|
||||||
|
if out[1] is not None:
|
||||||
|
body[0]['fields']['value'] = out[1]
|
||||||
|
|
||||||
else:
|
|
||||||
body = [{
|
|
||||||
'measurement': 'foobars',
|
|
||||||
'tags': {
|
|
||||||
'domain': 'fake',
|
|
||||||
'entity_id': 'entity',
|
|
||||||
},
|
|
||||||
'time': 12345,
|
|
||||||
'fields': {
|
|
||||||
'value': out,
|
|
||||||
'longitude': 1.1,
|
|
||||||
'latitude': 2.2,
|
|
||||||
'battery_level_str': '99%',
|
|
||||||
'battery_level': 99.0,
|
|
||||||
'temperature_str': '20c',
|
|
||||||
'temperature': 20.0,
|
|
||||||
'last_seen_str': 'Last seen 23 minutes ago',
|
|
||||||
'last_seen': 23.0,
|
|
||||||
'updated_at_str': '2017-01-01 00:00:00',
|
|
||||||
'updated_at': 20170101000000,
|
|
||||||
'multi_periods_str': '0.120.240.2023873'
|
|
||||||
},
|
|
||||||
}]
|
|
||||||
self.handler_method(event)
|
self.handler_method(event)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
mock_client.return_value.write_points.call_count, 1
|
mock_client.return_value.write_points.call_count, 1
|
||||||
|
@ -428,12 +410,14 @@ class TestInfluxDB(unittest.TestCase):
|
||||||
"""Test the event listener when an attribute has an invalid type."""
|
"""Test the event listener when an attribute has an invalid type."""
|
||||||
self._setup()
|
self._setup()
|
||||||
|
|
||||||
|
# map of HA State to valid influxdb [state, value] fields
|
||||||
valid = {
|
valid = {
|
||||||
'1': 1,
|
'1': [None, 1],
|
||||||
'1.0': 1.0,
|
'1.0': [None, 1.0],
|
||||||
STATE_ON: 1,
|
STATE_ON: [STATE_ON, 1],
|
||||||
STATE_OFF: 0,
|
STATE_OFF: [STATE_OFF, 0],
|
||||||
'foo': 'foo'
|
STATE_STANDBY: [STATE_STANDBY, None],
|
||||||
|
'foo': ['foo', None]
|
||||||
}
|
}
|
||||||
for in_, out in valid.items():
|
for in_, out in valid.items():
|
||||||
attrs = {
|
attrs = {
|
||||||
|
@ -446,37 +430,24 @@ class TestInfluxDB(unittest.TestCase):
|
||||||
state=in_, domain='fake', entity_id='fake.entity-id',
|
state=in_, domain='fake', entity_id='fake.entity-id',
|
||||||
object_id='entity', attributes=attrs)
|
object_id='entity', attributes=attrs)
|
||||||
event = mock.MagicMock(data={'new_state': state}, time_fired=12345)
|
event = mock.MagicMock(data={'new_state': state}, time_fired=12345)
|
||||||
if isinstance(out, str):
|
body = [{
|
||||||
body = [{
|
'measurement': 'foobars',
|
||||||
'measurement': 'foobars',
|
'tags': {
|
||||||
'tags': {
|
'domain': 'fake',
|
||||||
'domain': 'fake',
|
'entity_id': 'entity',
|
||||||
'entity_id': 'entity',
|
},
|
||||||
},
|
'time': 12345,
|
||||||
'time': 12345,
|
'fields': {
|
||||||
'fields': {
|
'longitude': 1.1,
|
||||||
'state': out,
|
'latitude': 2.2,
|
||||||
'longitude': 1.1,
|
'invalid_attribute_str': "['value1', 'value2']"
|
||||||
'latitude': 2.2,
|
},
|
||||||
'invalid_attribute_str': "['value1', 'value2']"
|
}]
|
||||||
},
|
if out[0] is not None:
|
||||||
}]
|
body[0]['fields']['state'] = out[0]
|
||||||
|
if out[1] is not None:
|
||||||
|
body[0]['fields']['value'] = out[1]
|
||||||
|
|
||||||
else:
|
|
||||||
body = [{
|
|
||||||
'measurement': 'foobars',
|
|
||||||
'tags': {
|
|
||||||
'domain': 'fake',
|
|
||||||
'entity_id': 'entity',
|
|
||||||
},
|
|
||||||
'time': 12345,
|
|
||||||
'fields': {
|
|
||||||
'value': float(out),
|
|
||||||
'longitude': 1.1,
|
|
||||||
'latitude': 2.2,
|
|
||||||
'invalid_attribute_str': "['value1', 'value2']"
|
|
||||||
},
|
|
||||||
}]
|
|
||||||
self.handler_method(event)
|
self.handler_method(event)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
mock_client.return_value.write_points.call_count, 1
|
mock_client.return_value.write_points.call_count, 1
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue