From 8ae73b2b59a5b1937d49160dde7ffc47762b3abf Mon Sep 17 00:00:00 2001 From: Phil Hawthorne Date: Sat, 3 Jun 2017 16:47:12 +1000 Subject: [PATCH 1/4] Make percentage string values as floats in InfluxDB Currently Z-wave and other compontents report an attributes battery level as an integer, for example ```yaml { "is_awake": false, "battery_level": 61, } ``` However, some other components like Vera add the battery level as a string ```yaml { "Vera Device Id": 25, "device_armed": "False", "battery_level": "63%", "device_tripped": "False", } ``` By removing any % signs in the field, this will send the value to InfluxDB as an int, which can then be used to plot the data in graphs correctly, like other percentage fields. --- homeassistant/components/influxdb.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/homeassistant/components/influxdb.py b/homeassistant/components/influxdb.py index abd02554ac08f9..c96b1b7d9d8012 100644 --- a/homeassistant/components/influxdb.py +++ b/homeassistant/components/influxdb.py @@ -8,6 +8,8 @@ import voluptuous as vol +import re + from homeassistant.const import ( EVENT_STATE_CHANGED, STATE_UNAVAILABLE, STATE_UNKNOWN, CONF_HOST, CONF_PORT, CONF_SSL, CONF_VERIFY_SSL, CONF_USERNAME, CONF_PASSWORD, @@ -147,6 +149,7 @@ def influx_event_listener(event): } ] + percent_remove_regex = re.compile(r"^([0-9.])+\%$") for key, value in state.attributes.items(): if key != 'unit_of_measurement': # If the key is already in fields @@ -157,6 +160,8 @@ def influx_event_listener(event): # But if we can not do it we store the value # as string add "_str" postfix to the field key try: + if percent_remove_regex.match(value): + value = value.replace("%", "") json_body[0]['fields'][key] = float(value) except (ValueError, TypeError): new_key = "{}_str".format(key) From 7e18ada4d96636112d75b44a955c795d25001723 Mon Sep 17 00:00:00 2001 From: Phil Hawthorne Date: Mon, 5 Jun 2017 22:00:51 +1000 Subject: [PATCH 2/4] Add tests and remove all trailing non digits Adds tests and now removes all trailing non-numeric characters for better use --- homeassistant/components/influxdb.py | 10 +++++++--- tests/components/test_influxdb.py | 19 ++++++++++++++++--- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/influxdb.py b/homeassistant/components/influxdb.py index c96b1b7d9d8012..40e60b08f6472f 100644 --- a/homeassistant/components/influxdb.py +++ b/homeassistant/components/influxdb.py @@ -149,7 +149,8 @@ def influx_event_listener(event): } ] - percent_remove_regex = re.compile(r"^([0-9.])+\%$") + percent_remove_regex = re.compile(r'[\d.]+') + non_decimal = re.compile(r'[^\d.]+') for key, value in state.attributes.items(): if key != 'unit_of_measurement': # If the key is already in fields @@ -160,12 +161,15 @@ def influx_event_listener(event): # But if we can not do it we store the value # as string add "_str" postfix to the field key try: - if percent_remove_regex.match(value): - value = value.replace("%", "") json_body[0]['fields'][key] = float(value) except (ValueError, TypeError): new_key = "{}_str".format(key) json_body[0]['fields'][new_key] = str(value) + if percent_remove_regex.match( + json_body[0]['fields'][new_key] + ): + json_body[0]['fields'][key] = float( + non_decimal.sub('', value)) json_body[0]['tags'].update(tags) diff --git a/tests/components/test_influxdb.py b/tests/components/test_influxdb.py index ab1f8916c37ee7..301c4c7b9b1ecf 100644 --- a/tests/components/test_influxdb.py +++ b/tests/components/test_influxdb.py @@ -120,7 +120,10 @@ def test_event_listener(self, mock_client): attrs = { 'unit_of_measurement': 'foobars', 'longitude': '1.1', - 'latitude': '2.2' + 'latitude': '2.2', + 'battery_level': '99%', + 'temperature': '20c', + 'last_seen': 'Last seen 23 minutes ago' } state = mock.MagicMock( state=in_, domain='fake', object_id='entity', attributes=attrs) @@ -136,7 +139,12 @@ def test_event_listener(self, mock_client): 'fields': { 'state': out, 'longitude': 1.1, - 'latitude': 2.2 + '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' }, }] @@ -151,7 +159,12 @@ def test_event_listener(self, mock_client): 'fields': { 'value': out, 'longitude': 1.1, - 'latitude': 2.2 + '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' }, }] self.handler_method(event) From 56e6ca1bd43874085dfea1d8357ac4adeef5d0c0 Mon Sep 17 00:00:00 2001 From: Phil Hawthorne Date: Tue, 6 Jun 2017 09:44:50 +1000 Subject: [PATCH 3/4] Update variable name for InfluxDB digit checks Updates the variable used for the regex to remove trailing non digits --- homeassistant/components/influxdb.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/influxdb.py b/homeassistant/components/influxdb.py index 40e60b08f6472f..424e8638e47f84 100644 --- a/homeassistant/components/influxdb.py +++ b/homeassistant/components/influxdb.py @@ -149,7 +149,7 @@ def influx_event_listener(event): } ] - percent_remove_regex = re.compile(r'[\d.]+') + non_digit_tail = re.compile(r'[\d.]+') non_decimal = re.compile(r'[^\d.]+') for key, value in state.attributes.items(): if key != 'unit_of_measurement': @@ -165,9 +165,7 @@ def influx_event_listener(event): except (ValueError, TypeError): new_key = "{}_str".format(key) json_body[0]['fields'][new_key] = str(value) - if percent_remove_regex.match( - json_body[0]['fields'][new_key] - ): + if non_digit_tail.match(json_body[0]['fields'][new_key]): json_body[0]['fields'][key] = float( non_decimal.sub('', value)) From b73274b3c876f44d2f54b74dd573a98faf15c144 Mon Sep 17 00:00:00 2001 From: Phil Hawthorne Date: Fri, 9 Jun 2017 13:41:42 +1000 Subject: [PATCH 4/4] Fix linting errors for InfluxDB component Fixes a small linting error on the InfluxDB component --- homeassistant/components/influxdb.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/influxdb.py b/homeassistant/components/influxdb.py index 424e8638e47f84..e421216aed7d55 100644 --- a/homeassistant/components/influxdb.py +++ b/homeassistant/components/influxdb.py @@ -6,10 +6,10 @@ """ import logging -import voluptuous as vol - import re +import voluptuous as vol + from homeassistant.const import ( EVENT_STATE_CHANGED, STATE_UNAVAILABLE, STATE_UNKNOWN, CONF_HOST, CONF_PORT, CONF_SSL, CONF_VERIFY_SSL, CONF_USERNAME, CONF_PASSWORD,