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
This commit is contained in:
parent
473d765bb9
commit
06b051c53d
2 changed files with 22 additions and 8 deletions
|
@ -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)
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Reference in a new issue