Use SensorDeviceClass in sensor and helpers packages (#63452)

This commit is contained in:
Marc Mueller 2022-01-05 14:59:51 +01:00 committed by GitHub
parent dfa94d6ce1
commit c384596899
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 27 additions and 42 deletions

View file

@ -26,7 +26,6 @@ from homeassistant.components.recorder.models import (
from homeassistant.const import ( from homeassistant.const import (
ATTR_DEVICE_CLASS, ATTR_DEVICE_CLASS,
ATTR_UNIT_OF_MEASUREMENT, ATTR_UNIT_OF_MEASUREMENT,
DEVICE_CLASS_POWER,
ENERGY_KILO_WATT_HOUR, ENERGY_KILO_WATT_HOUR,
ENERGY_MEGA_WATT_HOUR, ENERGY_MEGA_WATT_HOUR,
ENERGY_WATT_HOUR, ENERGY_WATT_HOUR,
@ -56,16 +55,12 @@ import homeassistant.util.volume as volume_util
from . import ( from . import (
ATTR_LAST_RESET, ATTR_LAST_RESET,
ATTR_STATE_CLASS, ATTR_STATE_CLASS,
DEVICE_CLASS_ENERGY,
DEVICE_CLASS_GAS,
DEVICE_CLASS_MONETARY,
DEVICE_CLASS_PRESSURE,
DEVICE_CLASS_TEMPERATURE,
DOMAIN, DOMAIN,
STATE_CLASS_MEASUREMENT, STATE_CLASS_MEASUREMENT,
STATE_CLASS_TOTAL, STATE_CLASS_TOTAL,
STATE_CLASS_TOTAL_INCREASING, STATE_CLASS_TOTAL_INCREASING,
STATE_CLASSES, STATE_CLASSES,
SensorDeviceClass,
) )
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -73,9 +68,9 @@ _LOGGER = logging.getLogger(__name__)
DEVICE_CLASS_STATISTICS: dict[str, dict[str, set[str]]] = { DEVICE_CLASS_STATISTICS: dict[str, dict[str, set[str]]] = {
STATE_CLASS_MEASUREMENT: { STATE_CLASS_MEASUREMENT: {
# Deprecated, support will be removed in Home Assistant 2021.11 # Deprecated, support will be removed in Home Assistant 2021.11
DEVICE_CLASS_ENERGY: {"sum"}, SensorDeviceClass.ENERGY: {"sum"},
DEVICE_CLASS_GAS: {"sum"}, SensorDeviceClass.GAS: {"sum"},
DEVICE_CLASS_MONETARY: {"sum"}, SensorDeviceClass.MONETARY: {"sum"},
}, },
STATE_CLASS_TOTAL: {}, STATE_CLASS_TOTAL: {},
STATE_CLASS_TOTAL_INCREASING: {}, STATE_CLASS_TOTAL_INCREASING: {},
@ -87,29 +82,29 @@ DEFAULT_STATISTICS = {
} }
# Normalized units which will be stored in the statistics table # Normalized units which will be stored in the statistics table
DEVICE_CLASS_UNITS = { DEVICE_CLASS_UNITS: dict[str, str] = {
DEVICE_CLASS_ENERGY: ENERGY_KILO_WATT_HOUR, SensorDeviceClass.ENERGY: ENERGY_KILO_WATT_HOUR,
DEVICE_CLASS_POWER: POWER_WATT, SensorDeviceClass.POWER: POWER_WATT,
DEVICE_CLASS_PRESSURE: PRESSURE_PA, SensorDeviceClass.PRESSURE: PRESSURE_PA,
DEVICE_CLASS_TEMPERATURE: TEMP_CELSIUS, SensorDeviceClass.TEMPERATURE: TEMP_CELSIUS,
DEVICE_CLASS_GAS: VOLUME_CUBIC_METERS, SensorDeviceClass.GAS: VOLUME_CUBIC_METERS,
} }
UNIT_CONVERSIONS: dict[str, dict[str, Callable]] = { UNIT_CONVERSIONS: dict[str, dict[str, Callable]] = {
# Convert energy to kWh # Convert energy to kWh
DEVICE_CLASS_ENERGY: { SensorDeviceClass.ENERGY: {
ENERGY_KILO_WATT_HOUR: lambda x: x, ENERGY_KILO_WATT_HOUR: lambda x: x,
ENERGY_MEGA_WATT_HOUR: lambda x: x * 1000, ENERGY_MEGA_WATT_HOUR: lambda x: x * 1000,
ENERGY_WATT_HOUR: lambda x: x / 1000, ENERGY_WATT_HOUR: lambda x: x / 1000,
}, },
# Convert power W # Convert power W
DEVICE_CLASS_POWER: { SensorDeviceClass.POWER: {
POWER_WATT: lambda x: x, POWER_WATT: lambda x: x,
POWER_KILO_WATT: lambda x: x * 1000, POWER_KILO_WATT: lambda x: x * 1000,
}, },
# Convert pressure to Pa # Convert pressure to Pa
# Note: pressure_util.convert is bypassed to avoid redundant error checking # Note: pressure_util.convert is bypassed to avoid redundant error checking
DEVICE_CLASS_PRESSURE: { SensorDeviceClass.PRESSURE: {
PRESSURE_BAR: lambda x: x / pressure_util.UNIT_CONVERSION[PRESSURE_BAR], PRESSURE_BAR: lambda x: x / pressure_util.UNIT_CONVERSION[PRESSURE_BAR],
PRESSURE_HPA: lambda x: x / pressure_util.UNIT_CONVERSION[PRESSURE_HPA], PRESSURE_HPA: lambda x: x / pressure_util.UNIT_CONVERSION[PRESSURE_HPA],
PRESSURE_INHG: lambda x: x / pressure_util.UNIT_CONVERSION[PRESSURE_INHG], PRESSURE_INHG: lambda x: x / pressure_util.UNIT_CONVERSION[PRESSURE_INHG],
@ -120,13 +115,13 @@ UNIT_CONVERSIONS: dict[str, dict[str, Callable]] = {
}, },
# Convert temperature to °C # Convert temperature to °C
# Note: temperature_util.convert is bypassed to avoid redundant error checking # Note: temperature_util.convert is bypassed to avoid redundant error checking
DEVICE_CLASS_TEMPERATURE: { SensorDeviceClass.TEMPERATURE: {
TEMP_CELSIUS: lambda x: x, TEMP_CELSIUS: lambda x: x,
TEMP_FAHRENHEIT: temperature_util.fahrenheit_to_celsius, TEMP_FAHRENHEIT: temperature_util.fahrenheit_to_celsius,
TEMP_KELVIN: temperature_util.kelvin_to_celsius, TEMP_KELVIN: temperature_util.kelvin_to_celsius,
}, },
# Convert volume to cubic meter # Convert volume to cubic meter
DEVICE_CLASS_GAS: { SensorDeviceClass.GAS: {
VOLUME_CUBIC_METERS: lambda x: x, VOLUME_CUBIC_METERS: lambda x: x,
VOLUME_CUBIC_FEET: volume_util.cubic_feet_to_cubic_meter, VOLUME_CUBIC_FEET: volume_util.cubic_feet_to_cubic_meter,
}, },

View file

@ -14,17 +14,7 @@ from homeassistant.helpers.significant_change import (
check_percentage_change, check_percentage_change,
) )
from . import ( from . import SensorDeviceClass
DEVICE_CLASS_AQI,
DEVICE_CLASS_BATTERY,
DEVICE_CLASS_CO,
DEVICE_CLASS_CO2,
DEVICE_CLASS_HUMIDITY,
DEVICE_CLASS_PM10,
DEVICE_CLASS_PM25,
DEVICE_CLASS_TEMPERATURE,
DEVICE_CLASS_VOLATILE_ORGANIC_COMPOUNDS,
)
def _absolute_and_relative_change( def _absolute_and_relative_change(
@ -53,22 +43,22 @@ def async_check_significant_change(
absolute_change: float | None = None absolute_change: float | None = None
percentage_change: float | None = None percentage_change: float | None = None
if device_class == DEVICE_CLASS_TEMPERATURE: if device_class == SensorDeviceClass.TEMPERATURE:
if new_attrs.get(ATTR_UNIT_OF_MEASUREMENT) == TEMP_FAHRENHEIT: if new_attrs.get(ATTR_UNIT_OF_MEASUREMENT) == TEMP_FAHRENHEIT:
absolute_change = 1.0 absolute_change = 1.0
else: else:
absolute_change = 0.5 absolute_change = 0.5
if device_class in (DEVICE_CLASS_BATTERY, DEVICE_CLASS_HUMIDITY): if device_class in (SensorDeviceClass.BATTERY, SensorDeviceClass.HUMIDITY):
absolute_change = 1.0 absolute_change = 1.0
if device_class in ( if device_class in (
DEVICE_CLASS_AQI, SensorDeviceClass.AQI,
DEVICE_CLASS_CO, SensorDeviceClass.CO,
DEVICE_CLASS_CO2, SensorDeviceClass.CO2,
DEVICE_CLASS_PM25, SensorDeviceClass.PM25,
DEVICE_CLASS_PM10, SensorDeviceClass.PM10,
DEVICE_CLASS_VOLATILE_ORGANIC_COMPOUNDS, SensorDeviceClass.VOLATILE_ORGANIC_COMPOUNDS,
): ):
absolute_change = 1.0 absolute_change = 1.0
percentage_change = 2.0 percentage_change = 2.0

View file

@ -17,7 +17,7 @@ from homeassistant.components.device_automation import (
DeviceAutomationType, DeviceAutomationType,
async_get_device_automation_platform, async_get_device_automation_platform,
) )
from homeassistant.components.sensor import DEVICE_CLASS_TIMESTAMP from homeassistant.components.sensor import SensorDeviceClass
from homeassistant.const import ( from homeassistant.const import (
ATTR_DEVICE_CLASS, ATTR_DEVICE_CLASS,
ATTR_GPS_ACCURACY, ATTR_GPS_ACCURACY,
@ -714,7 +714,7 @@ def time(
) )
elif after_entity.attributes.get( elif after_entity.attributes.get(
ATTR_DEVICE_CLASS ATTR_DEVICE_CLASS
) == DEVICE_CLASS_TIMESTAMP and after_entity.state not in ( ) == SensorDeviceClass.TIMESTAMP and after_entity.state not in (
STATE_UNAVAILABLE, STATE_UNAVAILABLE,
STATE_UNKNOWN, STATE_UNKNOWN,
): ):
@ -738,7 +738,7 @@ def time(
) )
elif before_entity.attributes.get( elif before_entity.attributes.get(
ATTR_DEVICE_CLASS ATTR_DEVICE_CLASS
) == DEVICE_CLASS_TIMESTAMP and before_entity.state not in ( ) == SensorDeviceClass.TIMESTAMP and before_entity.state not in (
STATE_UNAVAILABLE, STATE_UNAVAILABLE,
STATE_UNKNOWN, STATE_UNKNOWN,
): ):