Use HA constants for Rfxtrx units (#40562)

* Add more units and device classes

* Battery level is a value beteen 0 and 9 where 9 indicate full

Actual 0 battery can't occur since since then we would get to signal

* Adjust tests

* Add wind direction and adjust rain rate

* Adjust data types to be None rather than empty string

* Set counter values to count unit

* Forgotten unit
This commit is contained in:
Joakim Plate 2020-09-25 14:27:38 +02:00 committed by GitHub
parent b6aa29012e
commit 0fbeb3bf7b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 53 additions and 33 deletions

View File

@ -18,11 +18,19 @@ from homeassistant.const import (
CONF_DEVICES, CONF_DEVICES,
CONF_HOST, CONF_HOST,
CONF_PORT, CONF_PORT,
DEGREE,
ELECTRICAL_CURRENT_AMPERE,
ENERGY_KILO_WATT_HOUR,
EVENT_HOMEASSISTANT_STOP, EVENT_HOMEASSISTANT_STOP,
LENGTH_MILLIMETERS,
PERCENTAGE, PERCENTAGE,
POWER_WATT, POWER_WATT,
PRESSURE_HPA,
SPEED_METERS_PER_SECOND,
TEMP_CELSIUS, TEMP_CELSIUS,
TIME_HOURS,
UV_INDEX, UV_INDEX,
VOLT,
) )
from homeassistant.core import callback from homeassistant.core import callback
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
@ -52,30 +60,28 @@ DATA_TYPES = OrderedDict(
("Temperature", TEMP_CELSIUS), ("Temperature", TEMP_CELSIUS),
("Temperature2", TEMP_CELSIUS), ("Temperature2", TEMP_CELSIUS),
("Humidity", PERCENTAGE), ("Humidity", PERCENTAGE),
("Barometer", ""), ("Barometer", PRESSURE_HPA),
("Wind direction", ""), ("Wind direction", DEGREE),
("Rain rate", ""), ("Rain rate", f"{LENGTH_MILLIMETERS}/{TIME_HOURS}"),
("Energy usage", POWER_WATT), ("Energy usage", POWER_WATT),
("Total usage", POWER_WATT), ("Total usage", ENERGY_KILO_WATT_HOUR),
("Sound", ""), ("Sound", None),
("Sensor Status", ""), ("Sensor Status", None),
("Counter value", ""), ("Counter value", "count"),
("UV", UV_INDEX), ("UV", UV_INDEX),
("Humidity status", ""), ("Humidity status", None),
("Forecast", ""), ("Forecast", None),
("Forecast numeric", ""), ("Forecast numeric", None),
("Rain total", ""), ("Rain total", LENGTH_MILLIMETERS),
("Wind average speed", ""), ("Wind average speed", SPEED_METERS_PER_SECOND),
("Wind gust", ""), ("Wind gust", SPEED_METERS_PER_SECOND),
("Chill", ""), ("Chill", TEMP_CELSIUS),
("Total usage", ""), ("Count", "count"),
("Count", ""), ("Current Ch. 1", ELECTRICAL_CURRENT_AMPERE),
("Current Ch. 1", ""), ("Current Ch. 2", ELECTRICAL_CURRENT_AMPERE),
("Current Ch. 2", ""), ("Current Ch. 3", ELECTRICAL_CURRENT_AMPERE),
("Current Ch. 3", ""), ("Voltage", VOLT),
("Energy usage", ""), ("Current", ELECTRICAL_CURRENT_AMPERE),
("Voltage", ""),
("Current", ""),
("Battery numeric", PERCENTAGE), ("Battery numeric", PERCENTAGE),
("Rssi numeric", "dBm"), ("Rssi numeric", "dBm"),
] ]

View File

@ -9,7 +9,14 @@ from homeassistant.components.sensor import (
DEVICE_CLASS_SIGNAL_STRENGTH, DEVICE_CLASS_SIGNAL_STRENGTH,
DEVICE_CLASS_TEMPERATURE, DEVICE_CLASS_TEMPERATURE,
) )
from homeassistant.const import CONF_DEVICES from homeassistant.const import (
CONF_DEVICES,
DEVICE_CLASS_CURRENT,
DEVICE_CLASS_ENERGY,
DEVICE_CLASS_POWER,
DEVICE_CLASS_PRESSURE,
DEVICE_CLASS_VOLTAGE,
)
from homeassistant.core import callback from homeassistant.core import callback
from . import ( from . import (
@ -30,7 +37,7 @@ def _battery_convert(value):
"""Battery is given as a value between 0 and 9.""" """Battery is given as a value between 0 and 9."""
if value is None: if value is None:
return None return None
return value * 10 return (value + 1) * 10
def _rssi_convert(value): def _rssi_convert(value):
@ -41,10 +48,17 @@ def _rssi_convert(value):
DEVICE_CLASSES = { DEVICE_CLASSES = {
"Barometer": DEVICE_CLASS_PRESSURE,
"Battery numeric": DEVICE_CLASS_BATTERY, "Battery numeric": DEVICE_CLASS_BATTERY,
"Rssi numeric": DEVICE_CLASS_SIGNAL_STRENGTH, "Current Ch. 1": DEVICE_CLASS_CURRENT,
"Current Ch. 2": DEVICE_CLASS_CURRENT,
"Current Ch. 3": DEVICE_CLASS_CURRENT,
"Energy usage": DEVICE_CLASS_POWER,
"Humidity": DEVICE_CLASS_HUMIDITY, "Humidity": DEVICE_CLASS_HUMIDITY,
"Rssi numeric": DEVICE_CLASS_SIGNAL_STRENGTH,
"Temperature": DEVICE_CLASS_TEMPERATURE, "Temperature": DEVICE_CLASS_TEMPERATURE,
"Total usage": DEVICE_CLASS_ENERGY,
"Voltage": DEVICE_CLASS_VOLTAGE,
} }
@ -124,7 +138,7 @@ class RfxtrxSensor(RfxtrxEntity):
"""Initialize the sensor.""" """Initialize the sensor."""
super().__init__(device, device_id, event=event) super().__init__(device, device_id, event=event)
self.data_type = data_type self.data_type = data_type
self._unit_of_measurement = DATA_TYPES.get(data_type, "") self._unit_of_measurement = DATA_TYPES.get(data_type)
self._name = f"{device.type_string} {device.id_string} {data_type}" self._name = f"{device.type_string} {device.id_string} {data_type}"
self._unique_id = "_".join(x for x in (*self._device_id, data_type)) self._unique_id = "_".join(x for x in (*self._device_id, data_type))

View File

@ -87,7 +87,7 @@ async def test_one_sensor_no_datatype(hass, rfxtrx):
assert state assert state
assert state.state == "unknown" assert state.state == "unknown"
assert state.attributes.get("friendly_name") == f"{base_name} Humidity status" assert state.attributes.get("friendly_name") == f"{base_name} Humidity status"
assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == "" assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) is None
state = hass.states.get(f"{base_id}_rssi_numeric") state = hass.states.get(f"{base_id}_rssi_numeric")
assert state assert state
@ -164,7 +164,7 @@ async def test_discover_sensor(hass, rfxtrx_automatic):
state = hass.states.get(f"{base_id}_humidity_status") state = hass.states.get(f"{base_id}_humidity_status")
assert state assert state
assert state.state == "normal" assert state.state == "normal"
assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == "" assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) is None
state = hass.states.get(f"{base_id}_rssi_numeric") state = hass.states.get(f"{base_id}_rssi_numeric")
assert state assert state
@ -178,7 +178,7 @@ async def test_discover_sensor(hass, rfxtrx_automatic):
state = hass.states.get(f"{base_id}_battery_numeric") state = hass.states.get(f"{base_id}_battery_numeric")
assert state assert state
assert state.state == "90" assert state.state == "100"
assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == PERCENTAGE assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == PERCENTAGE
# 2 # 2
@ -193,7 +193,7 @@ async def test_discover_sensor(hass, rfxtrx_automatic):
state = hass.states.get(f"{base_id}_humidity_status") state = hass.states.get(f"{base_id}_humidity_status")
assert state assert state
assert state.state == "normal" assert state.state == "normal"
assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == "" assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) is None
state = hass.states.get(f"{base_id}_rssi_numeric") state = hass.states.get(f"{base_id}_rssi_numeric")
assert state assert state
@ -207,7 +207,7 @@ async def test_discover_sensor(hass, rfxtrx_automatic):
state = hass.states.get(f"{base_id}_battery_numeric") state = hass.states.get(f"{base_id}_battery_numeric")
assert state assert state
assert state.state == "90" assert state.state == "100"
assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == PERCENTAGE assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == PERCENTAGE
# 1 Update # 1 Update
@ -222,7 +222,7 @@ async def test_discover_sensor(hass, rfxtrx_automatic):
state = hass.states.get(f"{base_id}_humidity_status") state = hass.states.get(f"{base_id}_humidity_status")
assert state assert state
assert state.state == "normal" assert state.state == "normal"
assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == "" assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) is None
state = hass.states.get(f"{base_id}_rssi_numeric") state = hass.states.get(f"{base_id}_rssi_numeric")
assert state assert state
@ -236,7 +236,7 @@ async def test_discover_sensor(hass, rfxtrx_automatic):
state = hass.states.get(f"{base_id}_battery_numeric") state = hass.states.get(f"{base_id}_battery_numeric")
assert state assert state
assert state.state == "90" assert state.state == "100"
assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == PERCENTAGE assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == PERCENTAGE
assert len(hass.states.async_all()) == 10 assert len(hass.states.async_all()) == 10