From 02d572aae5ee05002776e9722a40f3fdfbeaa7bf Mon Sep 17 00:00:00 2001 From: fabiocastagnino Date: Sat, 8 Aug 2020 21:04:18 +0200 Subject: [PATCH] Add device classes for electrical measurement (#36800) * added device classes for electrical measurement (cherry picked from commit 2409fe19ed43bef568a0cca826652867d3a2d71a) * upadte power factor unit (%) * update power factor unit (%) --- homeassistant/components/sensor/__init__.py | 8 ++++++++ .../components/sensor/device_condition.py | 16 ++++++++++++++++ .../components/sensor/device_trigger.py | 16 ++++++++++++++++ homeassistant/components/sensor/strings.json | 8 ++++++++ homeassistant/const.py | 4 ++++ tests/components/sensor/test_device_trigger.py | 2 +- .../custom_components/test/sensor.py | 4 ++++ 7 files changed, 57 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/sensor/__init__.py b/homeassistant/components/sensor/__init__.py index 83711a07759..46462019749 100644 --- a/homeassistant/components/sensor/__init__.py +++ b/homeassistant/components/sensor/__init__.py @@ -7,13 +7,17 @@ import voluptuous as vol from homeassistant.const import ( DEVICE_CLASS_BATTERY, + DEVICE_CLASS_CURRENT, + DEVICE_CLASS_ENERGY, DEVICE_CLASS_HUMIDITY, DEVICE_CLASS_ILLUMINANCE, DEVICE_CLASS_POWER, + DEVICE_CLASS_POWER_FACTOR, DEVICE_CLASS_PRESSURE, DEVICE_CLASS_SIGNAL_STRENGTH, DEVICE_CLASS_TEMPERATURE, DEVICE_CLASS_TIMESTAMP, + DEVICE_CLASS_VOLTAGE, ) from homeassistant.helpers.config_validation import ( # noqa: F401 PLATFORM_SCHEMA, @@ -32,6 +36,8 @@ ENTITY_ID_FORMAT = DOMAIN + ".{}" SCAN_INTERVAL = timedelta(seconds=30) DEVICE_CLASSES = [ DEVICE_CLASS_BATTERY, # % of battery that is left + DEVICE_CLASS_CURRENT, # current (A) + DEVICE_CLASS_ENERGY, # energy (kWh, Wh) DEVICE_CLASS_HUMIDITY, # % of humidity in the air DEVICE_CLASS_ILLUMINANCE, # current light level (lx/lm) DEVICE_CLASS_SIGNAL_STRENGTH, # signal strength (dB/dBm) @@ -39,6 +45,8 @@ DEVICE_CLASSES = [ DEVICE_CLASS_TIMESTAMP, # timestamp (ISO8601) DEVICE_CLASS_PRESSURE, # pressure (hPa/mbar) DEVICE_CLASS_POWER, # power (W/kW) + DEVICE_CLASS_POWER_FACTOR, # power factor (%) + DEVICE_CLASS_VOLTAGE, # voltage (V) ] DEVICE_CLASSES_SCHEMA = vol.All(vol.Lower, vol.In(DEVICE_CLASSES)) diff --git a/homeassistant/components/sensor/device_condition.py b/homeassistant/components/sensor/device_condition.py index 3c4337c1dba..d58381a2f40 100644 --- a/homeassistant/components/sensor/device_condition.py +++ b/homeassistant/components/sensor/device_condition.py @@ -14,13 +14,17 @@ from homeassistant.const import ( CONF_ENTITY_ID, CONF_TYPE, DEVICE_CLASS_BATTERY, + DEVICE_CLASS_CURRENT, + DEVICE_CLASS_ENERGY, DEVICE_CLASS_HUMIDITY, DEVICE_CLASS_ILLUMINANCE, DEVICE_CLASS_POWER, + DEVICE_CLASS_POWER_FACTOR, DEVICE_CLASS_PRESSURE, DEVICE_CLASS_SIGNAL_STRENGTH, DEVICE_CLASS_TEMPERATURE, DEVICE_CLASS_TIMESTAMP, + DEVICE_CLASS_VOLTAGE, ) from homeassistant.core import HomeAssistant, callback from homeassistant.helpers import condition, config_validation as cv @@ -37,24 +41,32 @@ from . import DOMAIN DEVICE_CLASS_NONE = "none" CONF_IS_BATTERY_LEVEL = "is_battery_level" +CONF_IS_CURRENT = "is_current" +CONF_IS_ENERGY = "is_energy" CONF_IS_HUMIDITY = "is_humidity" CONF_IS_ILLUMINANCE = "is_illuminance" CONF_IS_POWER = "is_power" +CONF_IS_POWER_FACTOR = "is_power_factor" CONF_IS_PRESSURE = "is_pressure" CONF_IS_SIGNAL_STRENGTH = "is_signal_strength" CONF_IS_TEMPERATURE = "is_temperature" CONF_IS_TIMESTAMP = "is_timestamp" +CONF_IS_VOLTAGE = "is_voltage" CONF_IS_VALUE = "is_value" ENTITY_CONDITIONS = { DEVICE_CLASS_BATTERY: [{CONF_TYPE: CONF_IS_BATTERY_LEVEL}], + DEVICE_CLASS_CURRENT: [{CONF_TYPE: CONF_IS_CURRENT}], + DEVICE_CLASS_ENERGY: [{CONF_TYPE: CONF_IS_ENERGY}], DEVICE_CLASS_HUMIDITY: [{CONF_TYPE: CONF_IS_HUMIDITY}], DEVICE_CLASS_ILLUMINANCE: [{CONF_TYPE: CONF_IS_ILLUMINANCE}], DEVICE_CLASS_POWER: [{CONF_TYPE: CONF_IS_POWER}], + DEVICE_CLASS_POWER_FACTOR: [{CONF_TYPE: CONF_IS_POWER_FACTOR}], DEVICE_CLASS_PRESSURE: [{CONF_TYPE: CONF_IS_PRESSURE}], DEVICE_CLASS_SIGNAL_STRENGTH: [{CONF_TYPE: CONF_IS_SIGNAL_STRENGTH}], DEVICE_CLASS_TEMPERATURE: [{CONF_TYPE: CONF_IS_TEMPERATURE}], DEVICE_CLASS_TIMESTAMP: [{CONF_TYPE: CONF_IS_TIMESTAMP}], + DEVICE_CLASS_VOLTAGE: [{CONF_TYPE: CONF_IS_VOLTAGE}], DEVICE_CLASS_NONE: [{CONF_TYPE: CONF_IS_VALUE}], } @@ -65,13 +77,17 @@ CONDITION_SCHEMA = vol.All( vol.Required(CONF_TYPE): vol.In( [ CONF_IS_BATTERY_LEVEL, + CONF_IS_CURRENT, + CONF_IS_ENERGY, CONF_IS_HUMIDITY, CONF_IS_ILLUMINANCE, CONF_IS_POWER, + CONF_IS_POWER_FACTOR, CONF_IS_PRESSURE, CONF_IS_SIGNAL_STRENGTH, CONF_IS_TEMPERATURE, CONF_IS_TIMESTAMP, + CONF_IS_VOLTAGE, CONF_IS_VALUE, ] ), diff --git a/homeassistant/components/sensor/device_trigger.py b/homeassistant/components/sensor/device_trigger.py index 57c32da97e9..48c0ec493c9 100644 --- a/homeassistant/components/sensor/device_trigger.py +++ b/homeassistant/components/sensor/device_trigger.py @@ -15,13 +15,17 @@ from homeassistant.const import ( CONF_FOR, CONF_TYPE, DEVICE_CLASS_BATTERY, + DEVICE_CLASS_CURRENT, + DEVICE_CLASS_ENERGY, DEVICE_CLASS_HUMIDITY, DEVICE_CLASS_ILLUMINANCE, DEVICE_CLASS_POWER, + DEVICE_CLASS_POWER_FACTOR, DEVICE_CLASS_PRESSURE, DEVICE_CLASS_SIGNAL_STRENGTH, DEVICE_CLASS_TEMPERATURE, DEVICE_CLASS_TIMESTAMP, + DEVICE_CLASS_VOLTAGE, ) from homeassistant.helpers import config_validation as cv from homeassistant.helpers.entity_registry import async_entries_for_device @@ -33,24 +37,32 @@ from . import DOMAIN DEVICE_CLASS_NONE = "none" CONF_BATTERY_LEVEL = "battery_level" +CONF_CURRENT = "current" +CONF_ENERGY = "energy" CONF_HUMIDITY = "humidity" CONF_ILLUMINANCE = "illuminance" CONF_POWER = "power" +CONF_POWER_FACTOR = "power_factor" CONF_PRESSURE = "pressure" CONF_SIGNAL_STRENGTH = "signal_strength" CONF_TEMPERATURE = "temperature" CONF_TIMESTAMP = "timestamp" +CONF_VOLTAGE = "voltage" CONF_VALUE = "value" ENTITY_TRIGGERS = { DEVICE_CLASS_BATTERY: [{CONF_TYPE: CONF_BATTERY_LEVEL}], + DEVICE_CLASS_CURRENT: [{CONF_TYPE: CONF_CURRENT}], + DEVICE_CLASS_ENERGY: [{CONF_TYPE: CONF_ENERGY}], DEVICE_CLASS_HUMIDITY: [{CONF_TYPE: CONF_HUMIDITY}], DEVICE_CLASS_ILLUMINANCE: [{CONF_TYPE: CONF_ILLUMINANCE}], DEVICE_CLASS_POWER: [{CONF_TYPE: CONF_POWER}], + DEVICE_CLASS_POWER_FACTOR: [{CONF_TYPE: CONF_POWER_FACTOR}], DEVICE_CLASS_PRESSURE: [{CONF_TYPE: CONF_PRESSURE}], DEVICE_CLASS_SIGNAL_STRENGTH: [{CONF_TYPE: CONF_SIGNAL_STRENGTH}], DEVICE_CLASS_TEMPERATURE: [{CONF_TYPE: CONF_TEMPERATURE}], DEVICE_CLASS_TIMESTAMP: [{CONF_TYPE: CONF_TIMESTAMP}], + DEVICE_CLASS_VOLTAGE: [{CONF_TYPE: CONF_VOLTAGE}], DEVICE_CLASS_NONE: [{CONF_TYPE: CONF_VALUE}], } @@ -62,13 +74,17 @@ TRIGGER_SCHEMA = vol.All( vol.Required(CONF_TYPE): vol.In( [ CONF_BATTERY_LEVEL, + CONF_CURRENT, + CONF_ENERGY, CONF_HUMIDITY, CONF_ILLUMINANCE, CONF_POWER, + CONF_POWER_FACTOR, CONF_PRESSURE, CONF_SIGNAL_STRENGTH, CONF_TEMPERATURE, CONF_TIMESTAMP, + CONF_VOLTAGE, CONF_VALUE, ] ), diff --git a/homeassistant/components/sensor/strings.json b/homeassistant/components/sensor/strings.json index 024f942280c..76ea9efabc3 100644 --- a/homeassistant/components/sensor/strings.json +++ b/homeassistant/components/sensor/strings.json @@ -10,6 +10,10 @@ "is_signal_strength": "Current {entity_name} signal strength", "is_temperature": "Current {entity_name} temperature", "is_timestamp": "Current {entity_name} timestamp", + "is_current": "Current {entity_name} current", + "is_energy": "Current {entity_name} energy", + "is_power_factor": "Current {entity_name} power factor", + "is_voltage": "Current {entity_name} voltage", "is_value": "Current {entity_name} value" }, "trigger_type": { @@ -21,6 +25,10 @@ "signal_strength": "{entity_name} signal strength changes", "temperature": "{entity_name} temperature changes", "timestamp": "{entity_name} timestamp changes", + "current": "{entity_name} current changes", + "energy": "{entity_name} energy changes", + "power_factor": "{entity_name} power factor changes", + "voltage": "{entity_name} voltage changes", "value": "{entity_name} value changes" } }, diff --git a/homeassistant/const.py b/homeassistant/const.py index 8b075d37950..7ef23fa6903 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -218,6 +218,10 @@ DEVICE_CLASS_TEMPERATURE = "temperature" DEVICE_CLASS_TIMESTAMP = "timestamp" DEVICE_CLASS_PRESSURE = "pressure" DEVICE_CLASS_POWER = "power" +DEVICE_CLASS_CURRENT = "current" +DEVICE_CLASS_ENERGY = "energy" +DEVICE_CLASS_POWER_FACTOR = "power_factor" +DEVICE_CLASS_VOLTAGE = "voltage" # #### STATES #### STATE_ON = "on" diff --git a/tests/components/sensor/test_device_trigger.py b/tests/components/sensor/test_device_trigger.py index 3f44e9e5e32..9bdaf5b1fe0 100644 --- a/tests/components/sensor/test_device_trigger.py +++ b/tests/components/sensor/test_device_trigger.py @@ -76,7 +76,7 @@ async def test_get_triggers(hass, device_reg, entity_reg): if device_class != "none" ] triggers = await async_get_device_automations(hass, "trigger", device_entry.id) - assert len(triggers) == 8 + assert len(triggers) == 12 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 38bf9653938..b81cc34c34b 100644 --- a/tests/testing_config/custom_components/test/sensor.py +++ b/tests/testing_config/custom_components/test/sensor.py @@ -20,6 +20,10 @@ UNITS_OF_MEASUREMENT = { sensor.DEVICE_CLASS_TIMESTAMP: "hh:mm:ss", # timestamp (ISO8601) sensor.DEVICE_CLASS_PRESSURE: "hPa", # pressure (hPa/mbar) sensor.DEVICE_CLASS_POWER: "kW", # power (W/kW) + sensor.DEVICE_CLASS_CURRENT: "A", # current (A) + sensor.DEVICE_CLASS_ENERGY: "kWh", # energy (Wh/kWh) + sensor.DEVICE_CLASS_POWER_FACTOR: "%", # power factor (no unit, min: -1.0, max: 1.0) + sensor.DEVICE_CLASS_VOLTAGE: "V", # voltage (V) } ENTITIES = {}