mirror of
https://github.com/home-assistant/core.git
synced 2025-07-12 15:57:06 +00:00
Test all device classes in Sensor device condition/trigger tests (#146366)
This commit is contained in:
parent
46dcc91510
commit
0cce4d1b81
@ -5,52 +5,104 @@ from homeassistant.components.sensor import (
|
|||||||
SensorDeviceClass,
|
SensorDeviceClass,
|
||||||
SensorEntity,
|
SensorEntity,
|
||||||
)
|
)
|
||||||
|
from homeassistant.components.sensor.const import DEVICE_CLASS_STATE_CLASSES
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
|
CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
|
||||||
CONCENTRATION_PARTS_PER_MILLION,
|
CONCENTRATION_PARTS_PER_MILLION,
|
||||||
|
DEGREE,
|
||||||
LIGHT_LUX,
|
LIGHT_LUX,
|
||||||
PERCENTAGE,
|
PERCENTAGE,
|
||||||
SIGNAL_STRENGTH_DECIBELS,
|
SIGNAL_STRENGTH_DECIBELS,
|
||||||
UnitOfApparentPower,
|
UnitOfApparentPower,
|
||||||
|
UnitOfArea,
|
||||||
|
UnitOfBloodGlucoseConcentration,
|
||||||
|
UnitOfConductivity,
|
||||||
|
UnitOfDataRate,
|
||||||
|
UnitOfElectricCurrent,
|
||||||
|
UnitOfElectricPotential,
|
||||||
|
UnitOfEnergy,
|
||||||
|
UnitOfEnergyDistance,
|
||||||
UnitOfFrequency,
|
UnitOfFrequency,
|
||||||
|
UnitOfInformation,
|
||||||
|
UnitOfIrradiance,
|
||||||
|
UnitOfLength,
|
||||||
|
UnitOfMass,
|
||||||
|
UnitOfPower,
|
||||||
|
UnitOfPrecipitationDepth,
|
||||||
UnitOfPressure,
|
UnitOfPressure,
|
||||||
UnitOfReactiveEnergy,
|
UnitOfReactiveEnergy,
|
||||||
UnitOfReactivePower,
|
UnitOfReactivePower,
|
||||||
|
UnitOfSoundPressure,
|
||||||
|
UnitOfSpeed,
|
||||||
|
UnitOfTemperature,
|
||||||
|
UnitOfTime,
|
||||||
UnitOfVolume,
|
UnitOfVolume,
|
||||||
|
UnitOfVolumeFlowRate,
|
||||||
|
UnitOfVolumetricFlux,
|
||||||
)
|
)
|
||||||
|
|
||||||
from tests.common import MockEntity
|
from tests.common import MockEntity
|
||||||
|
|
||||||
UNITS_OF_MEASUREMENT = {
|
UNITS_OF_MEASUREMENT = {
|
||||||
SensorDeviceClass.APPARENT_POWER: UnitOfApparentPower.VOLT_AMPERE, # apparent power (VA)
|
SensorDeviceClass.APPARENT_POWER: UnitOfApparentPower.VOLT_AMPERE,
|
||||||
SensorDeviceClass.BATTERY: PERCENTAGE, # % of battery that is left
|
SensorDeviceClass.AQI: None,
|
||||||
SensorDeviceClass.CO: CONCENTRATION_PARTS_PER_MILLION, # ppm of CO concentration
|
SensorDeviceClass.AREA: UnitOfArea.SQUARE_METERS,
|
||||||
SensorDeviceClass.CO2: CONCENTRATION_PARTS_PER_MILLION, # ppm of CO2 concentration
|
SensorDeviceClass.ATMOSPHERIC_PRESSURE: UnitOfPressure.HPA,
|
||||||
SensorDeviceClass.HUMIDITY: PERCENTAGE, # % of humidity in the air
|
SensorDeviceClass.BATTERY: PERCENTAGE,
|
||||||
SensorDeviceClass.ILLUMINANCE: LIGHT_LUX, # current light level lx
|
SensorDeviceClass.BLOOD_GLUCOSE_CONCENTRATION: UnitOfBloodGlucoseConcentration.MILLIGRAMS_PER_DECILITER,
|
||||||
SensorDeviceClass.MOISTURE: PERCENTAGE, # % of water in a substance
|
SensorDeviceClass.CO2: CONCENTRATION_PARTS_PER_MILLION,
|
||||||
SensorDeviceClass.NITROGEN_DIOXIDE: CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, # µg/m³ of nitrogen dioxide
|
SensorDeviceClass.CO: CONCENTRATION_PARTS_PER_MILLION,
|
||||||
SensorDeviceClass.NITROGEN_MONOXIDE: CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, # µg/m³ of nitrogen monoxide
|
SensorDeviceClass.CONDUCTIVITY: UnitOfConductivity.SIEMENS_PER_CM,
|
||||||
SensorDeviceClass.NITROUS_OXIDE: CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, # µg/m³ of nitrogen oxide
|
SensorDeviceClass.CURRENT: UnitOfElectricCurrent.AMPERE,
|
||||||
SensorDeviceClass.OZONE: CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, # µg/m³ of ozone
|
SensorDeviceClass.DATA_RATE: UnitOfDataRate.BITS_PER_SECOND,
|
||||||
SensorDeviceClass.PM1: CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, # µg/m³ of PM1
|
SensorDeviceClass.DATA_SIZE: UnitOfInformation.BYTES,
|
||||||
SensorDeviceClass.PM10: CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, # µg/m³ of PM10
|
SensorDeviceClass.DATE: None,
|
||||||
SensorDeviceClass.PM25: CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, # µg/m³ of PM2.5
|
SensorDeviceClass.DISTANCE: UnitOfLength.METERS,
|
||||||
SensorDeviceClass.SIGNAL_STRENGTH: SIGNAL_STRENGTH_DECIBELS, # signal strength (dB/dBm)
|
SensorDeviceClass.DURATION: UnitOfTime.SECONDS,
|
||||||
SensorDeviceClass.SULPHUR_DIOXIDE: CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, # µg/m³ of sulphur dioxide
|
SensorDeviceClass.ENERGY: UnitOfEnergy.KILO_WATT_HOUR,
|
||||||
SensorDeviceClass.TEMPERATURE: "C", # temperature (C/F)
|
SensorDeviceClass.ENERGY_DISTANCE: UnitOfEnergyDistance.KILO_WATT_HOUR_PER_100_KM,
|
||||||
SensorDeviceClass.PRESSURE: UnitOfPressure.HPA, # pressure (hPa/mbar)
|
SensorDeviceClass.ENERGY_STORAGE: UnitOfEnergy.KILO_WATT_HOUR,
|
||||||
SensorDeviceClass.POWER: "kW", # power (W/kW)
|
SensorDeviceClass.ENUM: None,
|
||||||
SensorDeviceClass.CURRENT: "A", # current (A)
|
SensorDeviceClass.FREQUENCY: UnitOfFrequency.GIGAHERTZ,
|
||||||
SensorDeviceClass.ENERGY: "kWh", # energy (Wh/kWh/MWh)
|
SensorDeviceClass.GAS: UnitOfVolume.CUBIC_METERS,
|
||||||
SensorDeviceClass.FREQUENCY: UnitOfFrequency.GIGAHERTZ, # energy (Hz/kHz/MHz/GHz)
|
SensorDeviceClass.HUMIDITY: PERCENTAGE,
|
||||||
SensorDeviceClass.POWER_FACTOR: PERCENTAGE, # power factor (no unit, min: -1.0, max: 1.0)
|
SensorDeviceClass.ILLUMINANCE: LIGHT_LUX,
|
||||||
SensorDeviceClass.REACTIVE_ENERGY: UnitOfReactiveEnergy.VOLT_AMPERE_REACTIVE_HOUR, # reactive energy (varh)
|
SensorDeviceClass.IRRADIANCE: UnitOfIrradiance.WATTS_PER_SQUARE_METER,
|
||||||
SensorDeviceClass.REACTIVE_POWER: UnitOfReactivePower.VOLT_AMPERE_REACTIVE, # reactive power (var)
|
SensorDeviceClass.MOISTURE: PERCENTAGE,
|
||||||
SensorDeviceClass.VOLATILE_ORGANIC_COMPOUNDS: CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, # µg/m³ of vocs
|
SensorDeviceClass.MONETARY: None,
|
||||||
SensorDeviceClass.VOLTAGE: "V", # voltage (V)
|
SensorDeviceClass.NITROGEN_DIOXIDE: CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
|
||||||
SensorDeviceClass.GAS: UnitOfVolume.CUBIC_METERS, # gas (m³)
|
SensorDeviceClass.NITROGEN_MONOXIDE: CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
|
||||||
|
SensorDeviceClass.NITROUS_OXIDE: CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
|
||||||
|
SensorDeviceClass.OZONE: CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
|
||||||
|
SensorDeviceClass.PH: None,
|
||||||
|
SensorDeviceClass.PM10: CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
|
||||||
|
SensorDeviceClass.PM1: CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
|
||||||
|
SensorDeviceClass.PM25: CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
|
||||||
|
SensorDeviceClass.POWER: UnitOfPower.KILO_WATT,
|
||||||
|
SensorDeviceClass.POWER_FACTOR: PERCENTAGE,
|
||||||
|
SensorDeviceClass.PRECIPITATION: UnitOfPrecipitationDepth.MILLIMETERS,
|
||||||
|
SensorDeviceClass.PRECIPITATION_INTENSITY: UnitOfVolumetricFlux.MILLIMETERS_PER_HOUR,
|
||||||
|
SensorDeviceClass.PRESSURE: UnitOfPressure.HPA,
|
||||||
|
SensorDeviceClass.REACTIVE_ENERGY: UnitOfReactiveEnergy.VOLT_AMPERE_REACTIVE_HOUR,
|
||||||
|
SensorDeviceClass.REACTIVE_POWER: UnitOfReactivePower.VOLT_AMPERE_REACTIVE,
|
||||||
|
SensorDeviceClass.SIGNAL_STRENGTH: SIGNAL_STRENGTH_DECIBELS,
|
||||||
|
SensorDeviceClass.SOUND_PRESSURE: UnitOfSoundPressure.DECIBEL,
|
||||||
|
SensorDeviceClass.SPEED: UnitOfSpeed.METERS_PER_SECOND,
|
||||||
|
SensorDeviceClass.SULPHUR_DIOXIDE: CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
|
||||||
|
SensorDeviceClass.TEMPERATURE: UnitOfTemperature.CELSIUS,
|
||||||
|
SensorDeviceClass.TIMESTAMP: None,
|
||||||
|
SensorDeviceClass.VOLATILE_ORGANIC_COMPOUNDS: CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
|
||||||
|
SensorDeviceClass.VOLATILE_ORGANIC_COMPOUNDS_PARTS: CONCENTRATION_PARTS_PER_MILLION,
|
||||||
|
SensorDeviceClass.VOLTAGE: UnitOfElectricPotential.VOLT,
|
||||||
|
SensorDeviceClass.VOLUME: UnitOfVolume.LITERS,
|
||||||
|
SensorDeviceClass.VOLUME_FLOW_RATE: UnitOfVolumeFlowRate.LITERS_PER_MINUTE,
|
||||||
|
SensorDeviceClass.VOLUME_STORAGE: UnitOfVolume.LITERS,
|
||||||
|
SensorDeviceClass.WATER: UnitOfVolume.LITERS,
|
||||||
|
SensorDeviceClass.WEIGHT: UnitOfMass.KILOGRAMS,
|
||||||
|
SensorDeviceClass.WIND_DIRECTION: DEGREE,
|
||||||
|
SensorDeviceClass.WIND_SPEED: UnitOfSpeed.METERS_PER_SECOND,
|
||||||
}
|
}
|
||||||
|
assert UNITS_OF_MEASUREMENT.keys() == {cls.value for cls in SensorDeviceClass}
|
||||||
|
|
||||||
|
|
||||||
class MockSensor(MockEntity, SensorEntity):
|
class MockSensor(MockEntity, SensorEntity):
|
||||||
@ -118,6 +170,7 @@ def get_mock_sensor_entities() -> dict[str, MockSensor]:
|
|||||||
name=f"{device_class} sensor",
|
name=f"{device_class} sensor",
|
||||||
unique_id=f"unique_{device_class}",
|
unique_id=f"unique_{device_class}",
|
||||||
device_class=device_class,
|
device_class=device_class,
|
||||||
|
state_class=DEVICE_CLASS_STATE_CLASSES.get(device_class),
|
||||||
native_unit_of_measurement=UNITS_OF_MEASUREMENT.get(device_class),
|
native_unit_of_measurement=UNITS_OF_MEASUREMENT.get(device_class),
|
||||||
)
|
)
|
||||||
for device_class in SensorDeviceClass
|
for device_class in SensorDeviceClass
|
||||||
|
@ -102,6 +102,11 @@ async def test_get_conditions(
|
|||||||
device_id=device_entry.id,
|
device_id=device_entry.id,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
DEVICE_CLASSES_WITHOUT_CONDITION = {
|
||||||
|
SensorDeviceClass.DATE,
|
||||||
|
SensorDeviceClass.ENUM,
|
||||||
|
SensorDeviceClass.TIMESTAMP,
|
||||||
|
}
|
||||||
expected_conditions = [
|
expected_conditions = [
|
||||||
{
|
{
|
||||||
"condition": "device",
|
"condition": "device",
|
||||||
@ -113,13 +118,14 @@ async def test_get_conditions(
|
|||||||
}
|
}
|
||||||
for device_class in SensorDeviceClass
|
for device_class in SensorDeviceClass
|
||||||
if device_class in UNITS_OF_MEASUREMENT
|
if device_class in UNITS_OF_MEASUREMENT
|
||||||
|
and device_class not in DEVICE_CLASSES_WITHOUT_CONDITION
|
||||||
for condition in ENTITY_CONDITIONS[device_class]
|
for condition in ENTITY_CONDITIONS[device_class]
|
||||||
if device_class != "none"
|
if device_class != "none"
|
||||||
]
|
]
|
||||||
conditions = await async_get_device_automations(
|
conditions = await async_get_device_automations(
|
||||||
hass, DeviceAutomationType.CONDITION, device_entry.id
|
hass, DeviceAutomationType.CONDITION, device_entry.id
|
||||||
)
|
)
|
||||||
assert len(conditions) == 28
|
assert len(conditions) == 54
|
||||||
assert conditions == unordered(expected_conditions)
|
assert conditions == unordered(expected_conditions)
|
||||||
|
|
||||||
|
|
||||||
@ -197,6 +203,14 @@ async def test_get_conditions_no_state(
|
|||||||
|
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
IGNORED_DEVICE_CLASSES = {
|
||||||
|
SensorDeviceClass.DATE, # No condition
|
||||||
|
SensorDeviceClass.ENUM, # No condition
|
||||||
|
SensorDeviceClass.TIMESTAMP, # No condition
|
||||||
|
SensorDeviceClass.AQI, # No unit of measurement
|
||||||
|
SensorDeviceClass.PH, # No unit of measurement
|
||||||
|
SensorDeviceClass.MONETARY, # No unit of measurement
|
||||||
|
}
|
||||||
expected_conditions = [
|
expected_conditions = [
|
||||||
{
|
{
|
||||||
"condition": "device",
|
"condition": "device",
|
||||||
@ -208,8 +222,8 @@ async def test_get_conditions_no_state(
|
|||||||
}
|
}
|
||||||
for device_class in SensorDeviceClass
|
for device_class in SensorDeviceClass
|
||||||
if device_class in UNITS_OF_MEASUREMENT
|
if device_class in UNITS_OF_MEASUREMENT
|
||||||
|
and device_class not in IGNORED_DEVICE_CLASSES
|
||||||
for condition in ENTITY_CONDITIONS[device_class]
|
for condition in ENTITY_CONDITIONS[device_class]
|
||||||
if device_class != "none"
|
|
||||||
]
|
]
|
||||||
conditions = await async_get_device_automations(
|
conditions = await async_get_device_automations(
|
||||||
hass, DeviceAutomationType.CONDITION, device_entry.id
|
hass, DeviceAutomationType.CONDITION, device_entry.id
|
||||||
|
@ -104,6 +104,11 @@ async def test_get_triggers(
|
|||||||
device_id=device_entry.id,
|
device_id=device_entry.id,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
DEVICE_CLASSES_WITHOUT_TRIGGER = {
|
||||||
|
SensorDeviceClass.DATE,
|
||||||
|
SensorDeviceClass.ENUM,
|
||||||
|
SensorDeviceClass.TIMESTAMP,
|
||||||
|
}
|
||||||
expected_triggers = [
|
expected_triggers = [
|
||||||
{
|
{
|
||||||
"platform": "device",
|
"platform": "device",
|
||||||
@ -115,13 +120,13 @@ async def test_get_triggers(
|
|||||||
}
|
}
|
||||||
for device_class in SensorDeviceClass
|
for device_class in SensorDeviceClass
|
||||||
if device_class in UNITS_OF_MEASUREMENT
|
if device_class in UNITS_OF_MEASUREMENT
|
||||||
|
and device_class not in DEVICE_CLASSES_WITHOUT_TRIGGER
|
||||||
for trigger in ENTITY_TRIGGERS[device_class]
|
for trigger in ENTITY_TRIGGERS[device_class]
|
||||||
if device_class != "none"
|
|
||||||
]
|
]
|
||||||
triggers = await async_get_device_automations(
|
triggers = await async_get_device_automations(
|
||||||
hass, DeviceAutomationType.TRIGGER, device_entry.id
|
hass, DeviceAutomationType.TRIGGER, device_entry.id
|
||||||
)
|
)
|
||||||
assert len(triggers) == 28
|
assert len(triggers) == 54
|
||||||
assert triggers == unordered(expected_triggers)
|
assert triggers == unordered(expected_triggers)
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user