From 06b051c53dc0bff213d9150caa81fa78e889a49c Mon Sep 17 00:00:00 2001 From: Phil Hawthorne Date: Tue, 20 Jun 2017 15:53:13 +1000 Subject: [PATCH] Update InfluxDB to handle datetime objects and multiple decimal points (#8080) * Update InfluxDB to handle datetime objects Updates the InfluxDB regex to ignore datetime objects being coverted into float values. Adds tests to the component to ensure datetime objects are corectly handled. * Fix Hound errors Fixes errors from Hound bot * Update InfluxDB to handle multiple decimal points Changes the way InfluxDB handles values such as 1.2.3.4 to be 1.234 so it stores in InfluxDB as a valid float value * Fix lint issues Reduce the size of a line for the linter * Update InfluxDB to pass on unknown variable If we get an error trying to convert a variable to a float, let's ignore it completely * Make InfluxDB Regex constants Makes the Regex's used by InfluxDB constants so they don't need to be compiled each time * cleanup * fix lint * Update regex * fix tests * Fix JSON body missing new line character * fix exceptions --- homeassistant/components/influxdb.py | 13 ++++++++----- tests/components/test_influxdb.py | 17 ++++++++++++++--- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/homeassistant/components/influxdb.py b/homeassistant/components/influxdb.py index 37aeeee41b7..6b8cd6734dd 100644 --- a/homeassistant/components/influxdb.py +++ b/homeassistant/components/influxdb.py @@ -58,6 +58,9 @@ CONFIG_SCHEMA = vol.Schema({ }), }, extra=vol.ALLOW_EXTRA) +RE_DIGIT_TAIL = re.compile(r'^[^\.]*\d+\.?\d+[^\.]*$') +RE_DECIMAL = re.compile(r'[^\d.]+') + def setup(hass, config): """Set up the InfluxDB component.""" @@ -149,8 +152,6 @@ def setup(hass, config): } ] - 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': # If the key is already in fields @@ -164,10 +165,12 @@ def setup(hass, config): json_body[0]['fields'][key] = float(value) except (ValueError, TypeError): new_key = "{}_str".format(key) - json_body[0]['fields'][new_key] = str(value) - if non_digit_tail.match(json_body[0]['fields'][new_key]): + new_value = str(value) + json_body[0]['fields'][new_key] = new_value + + if RE_DIGIT_TAIL.match(new_value): json_body[0]['fields'][key] = float( - non_decimal.sub('', value)) + RE_DECIMAL.sub('', new_value)) json_body[0]['tags'].update(tags) diff --git a/tests/components/test_influxdb.py b/tests/components/test_influxdb.py index 301c4c7b9b1..896ee4699cc 100644 --- a/tests/components/test_influxdb.py +++ b/tests/components/test_influxdb.py @@ -1,5 +1,6 @@ """The tests for the InfluxDB component.""" import unittest +import datetime from unittest import mock import influxdb as influx_client @@ -123,7 +124,9 @@ class TestInfluxDB(unittest.TestCase): 'latitude': '2.2', 'battery_level': '99%', 'temperature': '20c', - 'last_seen': 'Last seen 23 minutes ago' + 'last_seen': 'Last seen 23 minutes ago', + 'updated_at': datetime.datetime(2017, 1, 1, 0, 0), + 'multi_periods': '0.120.240.2023873' } state = mock.MagicMock( state=in_, domain='fake', object_id='entity', attributes=attrs) @@ -144,7 +147,11 @@ class TestInfluxDB(unittest.TestCase): 'battery_level': 99.0, 'temperature_str': '20c', 'temperature': 20.0, - 'last_seen_str': 'Last seen 23 minutes ago' + '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' }, }] @@ -164,7 +171,11 @@ class TestInfluxDB(unittest.TestCase): 'battery_level': 99.0, 'temperature_str': '20c', 'temperature': 20.0, - 'last_seen_str': 'Last seen 23 minutes ago' + '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)