1
mirror of https://github.com/home-assistant/core synced 2024-08-15 18:25:44 +02:00

Add speed to SensorDeviceClass (#77953)

* Add speed to SensorDeviceClass

* Adjust recorder

* Adjust tests

* Adjust sensor UNIT_CONVERTERS

* Add tests

* Add websocket tests

* Update strings.json
This commit is contained in:
epenet 2022-09-27 17:19:34 +01:00 committed by GitHub
parent 7ead77eea6
commit 7c448416e1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 75 additions and 0 deletions

View File

@ -37,6 +37,7 @@ from homeassistant.util.unit_conversion import (
EnergyConverter,
PowerConverter,
PressureConverter,
SpeedConverter,
TemperatureConverter,
VolumeConverter,
)
@ -127,6 +128,7 @@ STATISTIC_UNIT_TO_UNIT_CLASS: dict[str | None, str] = {
EnergyConverter.NORMALIZED_UNIT: EnergyConverter.UNIT_CLASS,
PowerConverter.NORMALIZED_UNIT: PowerConverter.UNIT_CLASS,
PressureConverter.NORMALIZED_UNIT: PressureConverter.UNIT_CLASS,
SpeedConverter.NORMALIZED_UNIT: SpeedConverter.UNIT_CLASS,
TemperatureConverter.NORMALIZED_UNIT: TemperatureConverter.UNIT_CLASS,
VolumeConverter.NORMALIZED_UNIT: VolumeConverter.UNIT_CLASS,
}
@ -136,6 +138,7 @@ STATISTIC_UNIT_TO_UNIT_CONVERTER: dict[str | None, type[BaseUnitConverter]] = {
EnergyConverter.NORMALIZED_UNIT: EnergyConverter,
PowerConverter.NORMALIZED_UNIT: PowerConverter,
PressureConverter.NORMALIZED_UNIT: PressureConverter,
SpeedConverter.NORMALIZED_UNIT: SpeedConverter,
TemperatureConverter.NORMALIZED_UNIT: TemperatureConverter,
VolumeConverter.NORMALIZED_UNIT: VolumeConverter,
}

View File

@ -25,6 +25,7 @@ from homeassistant.util.unit_conversion import (
EnergyConverter,
PowerConverter,
PressureConverter,
SpeedConverter,
TemperatureConverter,
)
@ -128,6 +129,7 @@ async def ws_handle_get_statistics_during_period(
vol.Optional("energy"): vol.In(EnergyConverter.VALID_UNITS),
vol.Optional("power"): vol.In(PowerConverter.VALID_UNITS),
vol.Optional("pressure"): vol.In(PressureConverter.VALID_UNITS),
vol.Optional("speed"): vol.In(SpeedConverter.VALID_UNITS),
vol.Optional("temperature"): vol.In(TemperatureConverter.VALID_UNITS),
vol.Optional("volume"): vol.Any(VOLUME_CUBIC_FEET, VOLUME_CUBIC_METERS),
}

View File

@ -62,6 +62,7 @@ from homeassistant.util.unit_conversion import (
BaseUnitConverter,
DistanceConverter,
PressureConverter,
SpeedConverter,
TemperatureConverter,
)
@ -166,6 +167,9 @@ class SensorDeviceClass(StrEnum):
# signal strength (dB/dBm)
SIGNAL_STRENGTH = "signal_strength"
# speed (SPEED_*)
SPEED = "speed"
# Amount of SO2 (µg/m³)
SULPHUR_DIOXIDE = "sulphur_dioxide"
@ -215,12 +219,14 @@ STATE_CLASSES: Final[list[str]] = [cls.value for cls in SensorStateClass]
UNIT_CONVERTERS: dict[str, type[BaseUnitConverter]] = {
SensorDeviceClass.DISTANCE: DistanceConverter,
SensorDeviceClass.PRESSURE: PressureConverter,
SensorDeviceClass.SPEED: SpeedConverter,
SensorDeviceClass.TEMPERATURE: TemperatureConverter,
}
UNIT_RATIOS: dict[str, dict[str, float]] = {
SensorDeviceClass.DISTANCE: DistanceConverter.UNIT_CONVERSION,
SensorDeviceClass.PRESSURE: PressureConverter.UNIT_CONVERSION,
SensorDeviceClass.SPEED: SpeedConverter.UNIT_CONVERSION,
SensorDeviceClass.TEMPERATURE: {
TEMP_CELSIUS: 1.0,
TEMP_FAHRENHEIT: 1.8,

View File

@ -53,6 +53,7 @@ CONF_IS_PM25 = "is_pm25"
CONF_IS_POWER = "is_power"
CONF_IS_POWER_FACTOR = "is_power_factor"
CONF_IS_PRESSURE = "is_pressure"
CONF_IS_SPEED = "is_speed"
CONF_IS_REACTIVE_POWER = "is_reactive_power"
CONF_IS_SIGNAL_STRENGTH = "is_signal_strength"
CONF_IS_SULPHUR_DIOXIDE = "is_sulphur_dioxide"
@ -86,6 +87,7 @@ ENTITY_CONDITIONS = {
SensorDeviceClass.PRESSURE: [{CONF_TYPE: CONF_IS_PRESSURE}],
SensorDeviceClass.REACTIVE_POWER: [{CONF_TYPE: CONF_IS_REACTIVE_POWER}],
SensorDeviceClass.SIGNAL_STRENGTH: [{CONF_TYPE: CONF_IS_SIGNAL_STRENGTH}],
SensorDeviceClass.SPEED: [{CONF_TYPE: CONF_IS_SPEED}],
SensorDeviceClass.SULPHUR_DIOXIDE: [{CONF_TYPE: CONF_IS_SULPHUR_DIOXIDE}],
SensorDeviceClass.TEMPERATURE: [{CONF_TYPE: CONF_IS_TEMPERATURE}],
SensorDeviceClass.VOLATILE_ORGANIC_COMPOUNDS: [

View File

@ -54,6 +54,7 @@ CONF_POWER_FACTOR = "power_factor"
CONF_PRESSURE = "pressure"
CONF_REACTIVE_POWER = "reactive_power"
CONF_SIGNAL_STRENGTH = "signal_strength"
CONF_SPEED = "speed"
CONF_SULPHUR_DIOXIDE = "sulphur_dioxide"
CONF_TEMPERATURE = "temperature"
CONF_VOLATILE_ORGANIC_COMPOUNDS = "volatile_organic_compounds"
@ -85,6 +86,7 @@ ENTITY_TRIGGERS = {
SensorDeviceClass.PRESSURE: [{CONF_TYPE: CONF_PRESSURE}],
SensorDeviceClass.REACTIVE_POWER: [{CONF_TYPE: CONF_REACTIVE_POWER}],
SensorDeviceClass.SIGNAL_STRENGTH: [{CONF_TYPE: CONF_SIGNAL_STRENGTH}],
SensorDeviceClass.SPEED: [{CONF_TYPE: CONF_SPEED}],
SensorDeviceClass.SULPHUR_DIOXIDE: [{CONF_TYPE: CONF_SULPHUR_DIOXIDE}],
SensorDeviceClass.TEMPERATURE: [{CONF_TYPE: CONF_TEMPERATURE}],
SensorDeviceClass.VOLATILE_ORGANIC_COMPOUNDS: [

View File

@ -34,6 +34,7 @@ from homeassistant.util.unit_conversion import (
EnergyConverter,
PowerConverter,
PressureConverter,
SpeedConverter,
TemperatureConverter,
VolumeConverter,
)
@ -62,6 +63,7 @@ UNIT_CONVERTERS: dict[str, type[BaseUnitConverter]] = {
SensorDeviceClass.ENERGY: EnergyConverter,
SensorDeviceClass.POWER: PowerConverter,
SensorDeviceClass.PRESSURE: PressureConverter,
SensorDeviceClass.SPEED: SpeedConverter,
SensorDeviceClass.TEMPERATURE: TemperatureConverter,
SensorDeviceClass.GAS: VolumeConverter,
}

View File

@ -22,6 +22,7 @@
"is_pressure": "Current {entity_name} pressure",
"is_reactive_power": "Current {entity_name} reactive power",
"is_signal_strength": "Current {entity_name} signal strength",
"is_speed": "Current {entity_name} speed",
"is_sulphur_dioxide": "Current {entity_name} sulphur dioxide concentration level",
"is_temperature": "Current {entity_name} temperature",
"is_current": "Current {entity_name} current",
@ -53,6 +54,7 @@
"pressure": "{entity_name} pressure changes",
"reactive_power": "{entity_name} reactive power changes",
"signal_strength": "{entity_name} signal strength changes",
"speed": "{entity_name} speed changes",
"sulphur_dioxide": "{entity_name} sulphur dioxide concentration changes",
"temperature": "{entity_name} temperature changes",
"current": "{entity_name} current changes",

View File

@ -25,6 +25,7 @@
"is_pressure": "Current {entity_name} pressure",
"is_reactive_power": "Current {entity_name} reactive power",
"is_signal_strength": "Current {entity_name} signal strength",
"is_speed": "Current {entity_name} speed",
"is_sulphur_dioxide": "Current {entity_name} sulphur dioxide concentration level",
"is_temperature": "Current {entity_name} temperature",
"is_value": "Current {entity_name} value",
@ -56,6 +57,7 @@
"pressure": "{entity_name} pressure changes",
"reactive_power": "{entity_name} reactive power changes",
"signal_strength": "{entity_name} signal strength changes",
"speed": "{entity_name} speed changes",
"sulphur_dioxide": "{entity_name} sulphur dioxide concentration changes",
"temperature": "{entity_name} temperature changes",
"value": "{entity_name} value changes",

View File

@ -80,6 +80,16 @@ PRESSURE_SENSOR_PA_ATTRIBUTES = {
"state_class": "measurement",
"unit_of_measurement": "Pa",
}
SPEED_SENSOR_KPH_ATTRIBUTES = {
"device_class": "speed",
"state_class": "measurement",
"unit_of_measurement": "km/h",
}
SPEED_SENSOR_MPH_ATTRIBUTES = {
"device_class": "speed",
"state_class": "measurement",
"unit_of_measurement": "mph",
}
TEMPERATURE_SENSOR_C_ATTRIBUTES = {
"device_class": "temperature",
"state_class": "measurement",
@ -159,6 +169,9 @@ async def test_statistics_during_period(hass, hass_ws_client, recorder_mock):
(PRESSURE_SENSOR_HPA_ATTRIBUTES, 10, 10, {"pressure": "Pa"}, 1000),
(PRESSURE_SENSOR_HPA_ATTRIBUTES, 10, 10, {"pressure": "hPa"}, 10),
(PRESSURE_SENSOR_HPA_ATTRIBUTES, 10, 10, {"pressure": "psi"}, 1000 / 6894.757),
(SPEED_SENSOR_KPH_ATTRIBUTES, 10, 10, {"speed": "m/s"}, 2.77778),
(SPEED_SENSOR_KPH_ATTRIBUTES, 10, 10, {"speed": "km/h"}, 10),
(SPEED_SENSOR_KPH_ATTRIBUTES, 10, 10, {"speed": "mph"}, 6.21371),
(TEMPERATURE_SENSOR_C_ATTRIBUTES, 10, 10, {"temperature": "°C"}, 10),
(TEMPERATURE_SENSOR_C_ATTRIBUTES, 10, 10, {"temperature": "°F"}, 50),
(TEMPERATURE_SENSOR_C_ATTRIBUTES, 10, 10, {"temperature": "K"}, 283.15),
@ -564,6 +577,8 @@ async def test_statistics_during_period_bad_end_time(
(METRIC_SYSTEM, POWER_SENSOR_KW_ATTRIBUTES, "kW", "W", "power"),
(IMPERIAL_SYSTEM, PRESSURE_SENSOR_HPA_ATTRIBUTES, "hPa", "Pa", "pressure"),
(METRIC_SYSTEM, PRESSURE_SENSOR_HPA_ATTRIBUTES, "hPa", "Pa", "pressure"),
(IMPERIAL_SYSTEM, SPEED_SENSOR_KPH_ATTRIBUTES, "km/h", "m/s", "speed"),
(METRIC_SYSTEM, SPEED_SENSOR_KPH_ATTRIBUTES, "km/h", "m/s", "speed"),
(IMPERIAL_SYSTEM, TEMPERATURE_SENSOR_C_ATTRIBUTES, "°C", "°C", "temperature"),
(METRIC_SYSTEM, TEMPERATURE_SENSOR_C_ATTRIBUTES, "°C", "°C", "temperature"),
(IMPERIAL_SYSTEM, TEMPERATURE_SENSOR_F_ATTRIBUTES, "°F", "°C", "temperature"),
@ -1357,6 +1372,8 @@ async def test_backup_end_without_start(
(METRIC_SYSTEM, POWER_SENSOR_KW_ATTRIBUTES, "W", "power"),
(METRIC_SYSTEM, PRESSURE_SENSOR_PA_ATTRIBUTES, "Pa", "pressure"),
(METRIC_SYSTEM, PRESSURE_SENSOR_HPA_ATTRIBUTES, "Pa", "pressure"),
(METRIC_SYSTEM, SPEED_SENSOR_KPH_ATTRIBUTES, "m/s", "speed"),
(METRIC_SYSTEM, SPEED_SENSOR_MPH_ATTRIBUTES, "m/s", "speed"),
(METRIC_SYSTEM, TEMPERATURE_SENSOR_C_ATTRIBUTES, "°C", "temperature"),
(METRIC_SYSTEM, TEMPERATURE_SENSOR_F_ATTRIBUTES, "°C", "temperature"),
],

View File

@ -16,6 +16,10 @@ from homeassistant.const import (
PRESSURE_INHG,
PRESSURE_KPA,
PRESSURE_MMHG,
SPEED_INCHES_PER_HOUR,
SPEED_KILOMETERS_PER_HOUR,
SPEED_MILES_PER_HOUR,
SPEED_MILLIMETERS_PER_DAY,
STATE_UNKNOWN,
TEMP_CELSIUS,
TEMP_FAHRENHEIT,
@ -520,6 +524,31 @@ async def test_custom_unit(
1000,
SensorDeviceClass.PRESSURE,
),
# Speed
(
SPEED_KILOMETERS_PER_HOUR,
SPEED_MILES_PER_HOUR,
SPEED_MILES_PER_HOUR,
100,
62,
SensorDeviceClass.SPEED,
),
(
SPEED_MILLIMETERS_PER_DAY,
SPEED_INCHES_PER_HOUR,
SPEED_INCHES_PER_HOUR,
78,
0.13,
SensorDeviceClass.SPEED,
),
(
SPEED_KILOMETERS_PER_HOUR,
"peer_distance",
SPEED_KILOMETERS_PER_HOUR,
100,
100,
SensorDeviceClass.SPEED,
),
],
)
async def test_custom_unit_change(

View File

@ -94,6 +94,8 @@ def set_time_zone():
("pressure", "mbar", "mbar", "Pa", "pressure", 13.050847, -10, 30),
("pressure", "inHg", "inHg", "Pa", "pressure", 13.050847, -10, 30),
("pressure", "psi", "psi", "Pa", "pressure", 13.050847, -10, 30),
("speed", "m/s", "m/s", "m/s", "speed", 13.050847, -10, 30),
("speed", "mph", "mph", "m/s", "speed", 13.050847, -10, 30),
("temperature", "°C", "°C", "°C", "temperature", 13.050847, -10, 30),
("temperature", "°F", "°F", "°C", "temperature", 13.050847, -10, 30),
],
@ -1563,6 +1565,8 @@ def test_compile_hourly_energy_statistics_multiple(hass_recorder, caplog):
("pressure", "mbar", 30),
("pressure", "inHg", 30),
("pressure", "psi", 30),
("speed", "m/s", 30),
("speed", "mph", 30),
("temperature", "°C", 30),
("temperature", "°F", 30),
],
@ -1652,6 +1656,8 @@ def test_compile_hourly_statistics_partially_unavailable(hass_recorder, caplog):
("pressure", "mbar", 30),
("pressure", "inHg", 30),
("pressure", "psi", 30),
("speed", "m/s", 30),
("speed", "mph", 30),
("temperature", "°C", 30),
("temperature", "°F", 30),
],
@ -1741,6 +1747,8 @@ def test_compile_hourly_statistics_fails(hass_recorder, caplog):
("measurement", "pressure", "mbar", "mbar", "Pa", "pressure", "mean"),
("measurement", "pressure", "inHg", "inHg", "Pa", "pressure", "mean"),
("measurement", "pressure", "psi", "psi", "Pa", "pressure", "mean"),
("measurement", "speed", "m/s", "m/s", "m/s", "speed", "mean"),
("measurement", "speed", "mph", "mph", "m/s", "speed", "mean"),
("measurement", "temperature", "°C", "°C", "°C", "temperature", "mean"),
("measurement", "temperature", "°F", "°F", "°C", "temperature", "mean"),
],