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)