diff --git a/homeassistant/components/sensor/__init__.py b/homeassistant/components/sensor/__init__.py index b115da28800..3bbbe221fcf 100644 --- a/homeassistant/components/sensor/__init__.py +++ b/homeassistant/components/sensor/__init__.py @@ -72,6 +72,9 @@ SCAN_INTERVAL: Final = timedelta(seconds=30) class SensorDeviceClass(StrEnum): """Device class for sensors.""" + # apparent power (VA) + APPARENT_POWER = "apparent_power" + # Air Quality Index AQI = "aqi" @@ -138,6 +141,9 @@ class SensorDeviceClass(StrEnum): # pressure (hPa/mbar) PRESSURE = "pressure" + # reactive power (var) + REACTIVE_POWER = "reactive_power" + # signal strength (dB/dBm) SIGNAL_STRENGTH = "signal_strength" diff --git a/homeassistant/components/sensor/device_condition.py b/homeassistant/components/sensor/device_condition.py index 7ba3e907c60..229e5069069 100644 --- a/homeassistant/components/sensor/device_condition.py +++ b/homeassistant/components/sensor/device_condition.py @@ -22,6 +22,7 @@ from . import DOMAIN, SensorDeviceClass DEVICE_CLASS_NONE = "none" +CONF_IS_APPARENT_POWER = "is_apparent_power" CONF_IS_BATTERY_LEVEL = "is_battery_level" CONF_IS_CO = "is_carbon_monoxide" CONF_IS_CO2 = "is_carbon_dioxide" @@ -41,6 +42,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_REACTIVE_POWER = "is_reactive_power" CONF_IS_SIGNAL_STRENGTH = "is_signal_strength" CONF_IS_SULPHUR_DIOXIDE = "is_sulphur_dioxide" CONF_IS_TEMPERATURE = "is_temperature" @@ -49,6 +51,7 @@ CONF_IS_VOLTAGE = "is_voltage" CONF_IS_VALUE = "is_value" ENTITY_CONDITIONS = { + SensorDeviceClass.APPARENT_POWER: [{CONF_TYPE: CONF_IS_APPARENT_POWER}], SensorDeviceClass.BATTERY: [{CONF_TYPE: CONF_IS_BATTERY_LEVEL}], SensorDeviceClass.CO: [{CONF_TYPE: CONF_IS_CO}], SensorDeviceClass.CO2: [{CONF_TYPE: CONF_IS_CO2}], @@ -68,6 +71,7 @@ ENTITY_CONDITIONS = { SensorDeviceClass.PM10: [{CONF_TYPE: CONF_IS_PM10}], SensorDeviceClass.PM25: [{CONF_TYPE: CONF_IS_PM25}], 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.SULPHUR_DIOXIDE: [{CONF_TYPE: CONF_IS_SULPHUR_DIOXIDE}], SensorDeviceClass.TEMPERATURE: [{CONF_TYPE: CONF_IS_TEMPERATURE}], @@ -84,6 +88,7 @@ CONDITION_SCHEMA = vol.All( vol.Required(CONF_ENTITY_ID): cv.entity_id, vol.Required(CONF_TYPE): vol.In( [ + CONF_IS_APPARENT_POWER, CONF_IS_BATTERY_LEVEL, CONF_IS_CO, CONF_IS_CO2, @@ -103,6 +108,7 @@ CONDITION_SCHEMA = vol.All( CONF_IS_PM10, CONF_IS_PM25, CONF_IS_PRESSURE, + CONF_IS_REACTIVE_POWER, CONF_IS_SIGNAL_STRENGTH, CONF_IS_SULPHUR_DIOXIDE, CONF_IS_TEMPERATURE, diff --git a/homeassistant/components/sensor/device_trigger.py b/homeassistant/components/sensor/device_trigger.py index 1970e8df65b..17d1230221d 100644 --- a/homeassistant/components/sensor/device_trigger.py +++ b/homeassistant/components/sensor/device_trigger.py @@ -26,6 +26,7 @@ from . import DOMAIN, SensorDeviceClass DEVICE_CLASS_NONE = "none" +CONF_APPARENT_POWER = "apparent_power" CONF_BATTERY_LEVEL = "battery_level" CONF_CO = "carbon_monoxide" CONF_CO2 = "carbon_dioxide" @@ -45,6 +46,7 @@ CONF_PM25 = "pm25" CONF_POWER = "power" CONF_POWER_FACTOR = "power_factor" CONF_PRESSURE = "pressure" +CONF_REACTIVE_POWER = "reactive_power" CONF_SIGNAL_STRENGTH = "signal_strength" CONF_SULPHUR_DIOXIDE = "sulphur_dioxide" CONF_TEMPERATURE = "temperature" @@ -53,6 +55,7 @@ CONF_VOLTAGE = "voltage" CONF_VALUE = "value" ENTITY_TRIGGERS = { + SensorDeviceClass.APPARENT_POWER: [{CONF_TYPE: CONF_APPARENT_POWER}], SensorDeviceClass.BATTERY: [{CONF_TYPE: CONF_BATTERY_LEVEL}], SensorDeviceClass.CO: [{CONF_TYPE: CONF_CO}], SensorDeviceClass.CO2: [{CONF_TYPE: CONF_CO2}], @@ -72,6 +75,7 @@ ENTITY_TRIGGERS = { SensorDeviceClass.POWER: [{CONF_TYPE: CONF_POWER}], SensorDeviceClass.POWER_FACTOR: [{CONF_TYPE: CONF_POWER_FACTOR}], SensorDeviceClass.PRESSURE: [{CONF_TYPE: CONF_PRESSURE}], + SensorDeviceClass.REACTIVE_POWER: [{CONF_TYPE: CONF_REACTIVE_POWER}], SensorDeviceClass.SIGNAL_STRENGTH: [{CONF_TYPE: CONF_SIGNAL_STRENGTH}], SensorDeviceClass.SULPHUR_DIOXIDE: [{CONF_TYPE: CONF_SULPHUR_DIOXIDE}], SensorDeviceClass.TEMPERATURE: [{CONF_TYPE: CONF_TEMPERATURE}], @@ -89,6 +93,7 @@ TRIGGER_SCHEMA = vol.All( vol.Required(CONF_ENTITY_ID): cv.entity_id, vol.Required(CONF_TYPE): vol.In( [ + CONF_APPARENT_POWER, CONF_BATTERY_LEVEL, CONF_CO, CONF_CO2, @@ -108,6 +113,7 @@ TRIGGER_SCHEMA = vol.All( CONF_POWER, CONF_POWER_FACTOR, CONF_PRESSURE, + CONF_REACTIVE_POWER, CONF_SIGNAL_STRENGTH, CONF_SULPHUR_DIOXIDE, CONF_TEMPERATURE, diff --git a/homeassistant/components/sensor/strings.json b/homeassistant/components/sensor/strings.json index df2dc3560af..f09f2c80db0 100644 --- a/homeassistant/components/sensor/strings.json +++ b/homeassistant/components/sensor/strings.json @@ -2,6 +2,7 @@ "title": "Sensor", "device_automation": { "condition_type": { + "is_apparent_power": "Current {entity_name} apparent power", "is_battery_level": "Current {entity_name} battery level", "is_carbon_monoxide": "Current {entity_name} carbon monoxide concentration level", "is_carbon_dioxide": "Current {entity_name} carbon dioxide concentration level", @@ -17,6 +18,7 @@ "is_pm25": "Current {entity_name} PM2.5 concentration level", "is_power": "Current {entity_name} power", "is_pressure": "Current {entity_name} pressure", + "is_reactive_power": "Current {entity_name} reactive power", "is_signal_strength": "Current {entity_name} signal strength", "is_sulphur_dioxide": "Current {entity_name} sulphur dioxide concentration level", "is_temperature": "Current {entity_name} temperature", @@ -29,6 +31,7 @@ "is_value": "Current {entity_name} value" }, "trigger_type": { + "apparent_power": "{entity_name} apparent power changes", "battery_level": "{entity_name} battery level changes", "carbon_monoxide": "{entity_name} carbon monoxide concentration changes", "carbon_dioxide": "{entity_name} carbon dioxide concentration changes", @@ -44,6 +47,7 @@ "pm25": "{entity_name} PM2.5 concentration changes", "power": "{entity_name} power changes", "pressure": "{entity_name} pressure changes", + "reactive_power": "{entity_name} reactive power changes", "signal_strength": "{entity_name} signal strength changes", "sulphur_dioxide": "{entity_name} sulphur dioxide concentration changes", "temperature": "{entity_name} temperature changes", diff --git a/homeassistant/const.py b/homeassistant/const.py index 2b9302c0fc9..ffe472acec9 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -458,12 +458,17 @@ ATTR_TEMPERATURE: Final = "temperature" # #### UNITS OF MEASUREMENT #### +# Apparent power units +POWER_VOLT_AMPERE: Final = "VA" + # Power units POWER_WATT: Final = "W" POWER_KILO_WATT: Final = "kW" -POWER_VOLT_AMPERE: Final = "VA" POWER_BTU_PER_HOUR: Final = "BTU/h" +# Reactive power units +POWER_VOLT_AMPERE_REACTIVE: Final = "var" + # Energy units ENERGY_WATT_HOUR: Final = "Wh" ENERGY_KILO_WATT_HOUR: Final = "kWh" diff --git a/tests/components/sensor/test_device_condition.py b/tests/components/sensor/test_device_condition.py index ebbeb5ee616..d2be84e1233 100644 --- a/tests/components/sensor/test_device_condition.py +++ b/tests/components/sensor/test_device_condition.py @@ -77,6 +77,7 @@ async def test_get_conditions(hass, device_reg, entity_reg, enable_custom_integr conditions = await async_get_device_automations( hass, DeviceAutomationType.CONDITION, device_entry.id ) + assert len(conditions) == 26 assert conditions == expected_conditions diff --git a/tests/components/sensor/test_device_trigger.py b/tests/components/sensor/test_device_trigger.py index b217016d339..e37b0e9470f 100644 --- a/tests/components/sensor/test_device_trigger.py +++ b/tests/components/sensor/test_device_trigger.py @@ -81,7 +81,7 @@ async def test_get_triggers(hass, device_reg, entity_reg, enable_custom_integrat triggers = await async_get_device_automations( hass, DeviceAutomationType.TRIGGER, device_entry.id ) - assert len(triggers) == 24 + assert len(triggers) == 26 assert triggers == expected_triggers diff --git a/tests/testing_config/custom_components/test/sensor.py b/tests/testing_config/custom_components/test/sensor.py index 436bafc11ff..4ad2580ad8b 100644 --- a/tests/testing_config/custom_components/test/sensor.py +++ b/tests/testing_config/custom_components/test/sensor.py @@ -13,6 +13,8 @@ from homeassistant.const import ( CONCENTRATION_PARTS_PER_MILLION, FREQUENCY_GIGAHERTZ, PERCENTAGE, + POWER_VOLT_AMPERE, + POWER_VOLT_AMPERE_REACTIVE, PRESSURE_HPA, SIGNAL_STRENGTH_DECIBELS, VOLUME_CUBIC_METERS, @@ -23,6 +25,7 @@ from tests.common import MockEntity DEVICE_CLASSES.append("none") UNITS_OF_MEASUREMENT = { + SensorDeviceClass.APPARENT_POWER: POWER_VOLT_AMPERE, # apparent power (VA) SensorDeviceClass.BATTERY: PERCENTAGE, # % of battery that is left SensorDeviceClass.CO: CONCENTRATION_PARTS_PER_MILLION, # ppm of CO concentration SensorDeviceClass.CO2: CONCENTRATION_PARTS_PER_MILLION, # ppm of CO2 concentration @@ -41,9 +44,10 @@ UNITS_OF_MEASUREMENT = { SensorDeviceClass.PRESSURE: PRESSURE_HPA, # pressure (hPa/mbar) SensorDeviceClass.POWER: "kW", # power (W/kW) SensorDeviceClass.CURRENT: "A", # current (A) - SensorDeviceClass.ENERGY: "kWh", # energy (Wh/kWh) + SensorDeviceClass.ENERGY: "kWh", # energy (Wh/kWh/MWh) SensorDeviceClass.FREQUENCY: FREQUENCY_GIGAHERTZ, # energy (Hz/kHz/MHz/GHz) SensorDeviceClass.POWER_FACTOR: PERCENTAGE, # power factor (no unit, min: -1.0, max: 1.0) + SensorDeviceClass.REACTIVE_POWER: POWER_VOLT_AMPERE_REACTIVE, # reactive power (var) SensorDeviceClass.VOLATILE_ORGANIC_COMPOUNDS: CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, # µg/m³ of vocs SensorDeviceClass.VOLTAGE: "V", # voltage (V) SensorDeviceClass.GAS: VOLUME_CUBIC_METERS, # gas (m³)