mirror of
https://github.com/home-assistant/core.git
synced 2025-07-22 20:57:21 +00:00
Make percentage string values as floats/ints in InfluxDB (#7879)
* 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. * Add tests and remove all trailing non digits Adds tests and now removes all trailing non-numeric characters for better use * Update variable name for InfluxDB digit checks Updates the variable used for the regex to remove trailing non digits * Fix linting errors for InfluxDB component Fixes a small linting error on the InfluxDB component
This commit is contained in:
parent
09fec29537
commit
1ddcab5e26
@ -6,6 +6,8 @@ https://home-assistant.io/components/influxdb/
|
|||||||
"""
|
"""
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
import re
|
||||||
|
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
@ -147,6 +149,8 @@ def setup(hass, config):
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
non_digit_tail = re.compile(r'[\d.]+')
|
||||||
|
non_decimal = re.compile(r'[^\d.]+')
|
||||||
for key, value in state.attributes.items():
|
for key, value in state.attributes.items():
|
||||||
if key != 'unit_of_measurement':
|
if key != 'unit_of_measurement':
|
||||||
# If the key is already in fields
|
# If the key is already in fields
|
||||||
@ -161,6 +165,9 @@ def setup(hass, config):
|
|||||||
except (ValueError, TypeError):
|
except (ValueError, TypeError):
|
||||||
new_key = "{}_str".format(key)
|
new_key = "{}_str".format(key)
|
||||||
json_body[0]['fields'][new_key] = str(value)
|
json_body[0]['fields'][new_key] = str(value)
|
||||||
|
if non_digit_tail.match(json_body[0]['fields'][new_key]):
|
||||||
|
json_body[0]['fields'][key] = float(
|
||||||
|
non_decimal.sub('', value))
|
||||||
|
|
||||||
json_body[0]['tags'].update(tags)
|
json_body[0]['tags'].update(tags)
|
||||||
|
|
||||||
|
@ -120,7 +120,10 @@ class TestInfluxDB(unittest.TestCase):
|
|||||||
attrs = {
|
attrs = {
|
||||||
'unit_of_measurement': 'foobars',
|
'unit_of_measurement': 'foobars',
|
||||||
'longitude': '1.1',
|
'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 = mock.MagicMock(
|
||||||
state=in_, domain='fake', object_id='entity', attributes=attrs)
|
state=in_, domain='fake', object_id='entity', attributes=attrs)
|
||||||
@ -136,7 +139,12 @@ class TestInfluxDB(unittest.TestCase):
|
|||||||
'fields': {
|
'fields': {
|
||||||
'state': out,
|
'state': out,
|
||||||
'longitude': 1.1,
|
'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 @@ class TestInfluxDB(unittest.TestCase):
|
|||||||
'fields': {
|
'fields': {
|
||||||
'value': out,
|
'value': out,
|
||||||
'longitude': 1.1,
|
'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)
|
self.handler_method(event)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user