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 (%)
This commit is contained in:
fabiocastagnino 2020-08-08 21:04:18 +02:00 committed by GitHub
parent 74c23c3e96
commit 02d572aae5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 57 additions and 1 deletions

View File

@ -7,13 +7,17 @@ import voluptuous as vol
from homeassistant.const import ( from homeassistant.const import (
DEVICE_CLASS_BATTERY, DEVICE_CLASS_BATTERY,
DEVICE_CLASS_CURRENT,
DEVICE_CLASS_ENERGY,
DEVICE_CLASS_HUMIDITY, DEVICE_CLASS_HUMIDITY,
DEVICE_CLASS_ILLUMINANCE, DEVICE_CLASS_ILLUMINANCE,
DEVICE_CLASS_POWER, DEVICE_CLASS_POWER,
DEVICE_CLASS_POWER_FACTOR,
DEVICE_CLASS_PRESSURE, DEVICE_CLASS_PRESSURE,
DEVICE_CLASS_SIGNAL_STRENGTH, DEVICE_CLASS_SIGNAL_STRENGTH,
DEVICE_CLASS_TEMPERATURE, DEVICE_CLASS_TEMPERATURE,
DEVICE_CLASS_TIMESTAMP, DEVICE_CLASS_TIMESTAMP,
DEVICE_CLASS_VOLTAGE,
) )
from homeassistant.helpers.config_validation import ( # noqa: F401 from homeassistant.helpers.config_validation import ( # noqa: F401
PLATFORM_SCHEMA, PLATFORM_SCHEMA,
@ -32,6 +36,8 @@ ENTITY_ID_FORMAT = DOMAIN + ".{}"
SCAN_INTERVAL = timedelta(seconds=30) SCAN_INTERVAL = timedelta(seconds=30)
DEVICE_CLASSES = [ DEVICE_CLASSES = [
DEVICE_CLASS_BATTERY, # % of battery that is left 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_HUMIDITY, # % of humidity in the air
DEVICE_CLASS_ILLUMINANCE, # current light level (lx/lm) DEVICE_CLASS_ILLUMINANCE, # current light level (lx/lm)
DEVICE_CLASS_SIGNAL_STRENGTH, # signal strength (dB/dBm) DEVICE_CLASS_SIGNAL_STRENGTH, # signal strength (dB/dBm)
@ -39,6 +45,8 @@ DEVICE_CLASSES = [
DEVICE_CLASS_TIMESTAMP, # timestamp (ISO8601) DEVICE_CLASS_TIMESTAMP, # timestamp (ISO8601)
DEVICE_CLASS_PRESSURE, # pressure (hPa/mbar) DEVICE_CLASS_PRESSURE, # pressure (hPa/mbar)
DEVICE_CLASS_POWER, # power (W/kW) 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)) DEVICE_CLASSES_SCHEMA = vol.All(vol.Lower, vol.In(DEVICE_CLASSES))

View File

@ -14,13 +14,17 @@ from homeassistant.const import (
CONF_ENTITY_ID, CONF_ENTITY_ID,
CONF_TYPE, CONF_TYPE,
DEVICE_CLASS_BATTERY, DEVICE_CLASS_BATTERY,
DEVICE_CLASS_CURRENT,
DEVICE_CLASS_ENERGY,
DEVICE_CLASS_HUMIDITY, DEVICE_CLASS_HUMIDITY,
DEVICE_CLASS_ILLUMINANCE, DEVICE_CLASS_ILLUMINANCE,
DEVICE_CLASS_POWER, DEVICE_CLASS_POWER,
DEVICE_CLASS_POWER_FACTOR,
DEVICE_CLASS_PRESSURE, DEVICE_CLASS_PRESSURE,
DEVICE_CLASS_SIGNAL_STRENGTH, DEVICE_CLASS_SIGNAL_STRENGTH,
DEVICE_CLASS_TEMPERATURE, DEVICE_CLASS_TEMPERATURE,
DEVICE_CLASS_TIMESTAMP, DEVICE_CLASS_TIMESTAMP,
DEVICE_CLASS_VOLTAGE,
) )
from homeassistant.core import HomeAssistant, callback from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers import condition, config_validation as cv from homeassistant.helpers import condition, config_validation as cv
@ -37,24 +41,32 @@ from . import DOMAIN
DEVICE_CLASS_NONE = "none" DEVICE_CLASS_NONE = "none"
CONF_IS_BATTERY_LEVEL = "is_battery_level" CONF_IS_BATTERY_LEVEL = "is_battery_level"
CONF_IS_CURRENT = "is_current"
CONF_IS_ENERGY = "is_energy"
CONF_IS_HUMIDITY = "is_humidity" CONF_IS_HUMIDITY = "is_humidity"
CONF_IS_ILLUMINANCE = "is_illuminance" CONF_IS_ILLUMINANCE = "is_illuminance"
CONF_IS_POWER = "is_power" CONF_IS_POWER = "is_power"
CONF_IS_POWER_FACTOR = "is_power_factor"
CONF_IS_PRESSURE = "is_pressure" CONF_IS_PRESSURE = "is_pressure"
CONF_IS_SIGNAL_STRENGTH = "is_signal_strength" CONF_IS_SIGNAL_STRENGTH = "is_signal_strength"
CONF_IS_TEMPERATURE = "is_temperature" CONF_IS_TEMPERATURE = "is_temperature"
CONF_IS_TIMESTAMP = "is_timestamp" CONF_IS_TIMESTAMP = "is_timestamp"
CONF_IS_VOLTAGE = "is_voltage"
CONF_IS_VALUE = "is_value" CONF_IS_VALUE = "is_value"
ENTITY_CONDITIONS = { ENTITY_CONDITIONS = {
DEVICE_CLASS_BATTERY: [{CONF_TYPE: CONF_IS_BATTERY_LEVEL}], 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_HUMIDITY: [{CONF_TYPE: CONF_IS_HUMIDITY}],
DEVICE_CLASS_ILLUMINANCE: [{CONF_TYPE: CONF_IS_ILLUMINANCE}], DEVICE_CLASS_ILLUMINANCE: [{CONF_TYPE: CONF_IS_ILLUMINANCE}],
DEVICE_CLASS_POWER: [{CONF_TYPE: CONF_IS_POWER}], 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_PRESSURE: [{CONF_TYPE: CONF_IS_PRESSURE}],
DEVICE_CLASS_SIGNAL_STRENGTH: [{CONF_TYPE: CONF_IS_SIGNAL_STRENGTH}], DEVICE_CLASS_SIGNAL_STRENGTH: [{CONF_TYPE: CONF_IS_SIGNAL_STRENGTH}],
DEVICE_CLASS_TEMPERATURE: [{CONF_TYPE: CONF_IS_TEMPERATURE}], DEVICE_CLASS_TEMPERATURE: [{CONF_TYPE: CONF_IS_TEMPERATURE}],
DEVICE_CLASS_TIMESTAMP: [{CONF_TYPE: CONF_IS_TIMESTAMP}], DEVICE_CLASS_TIMESTAMP: [{CONF_TYPE: CONF_IS_TIMESTAMP}],
DEVICE_CLASS_VOLTAGE: [{CONF_TYPE: CONF_IS_VOLTAGE}],
DEVICE_CLASS_NONE: [{CONF_TYPE: CONF_IS_VALUE}], DEVICE_CLASS_NONE: [{CONF_TYPE: CONF_IS_VALUE}],
} }
@ -65,13 +77,17 @@ CONDITION_SCHEMA = vol.All(
vol.Required(CONF_TYPE): vol.In( vol.Required(CONF_TYPE): vol.In(
[ [
CONF_IS_BATTERY_LEVEL, CONF_IS_BATTERY_LEVEL,
CONF_IS_CURRENT,
CONF_IS_ENERGY,
CONF_IS_HUMIDITY, CONF_IS_HUMIDITY,
CONF_IS_ILLUMINANCE, CONF_IS_ILLUMINANCE,
CONF_IS_POWER, CONF_IS_POWER,
CONF_IS_POWER_FACTOR,
CONF_IS_PRESSURE, CONF_IS_PRESSURE,
CONF_IS_SIGNAL_STRENGTH, CONF_IS_SIGNAL_STRENGTH,
CONF_IS_TEMPERATURE, CONF_IS_TEMPERATURE,
CONF_IS_TIMESTAMP, CONF_IS_TIMESTAMP,
CONF_IS_VOLTAGE,
CONF_IS_VALUE, CONF_IS_VALUE,
] ]
), ),

View File

@ -15,13 +15,17 @@ from homeassistant.const import (
CONF_FOR, CONF_FOR,
CONF_TYPE, CONF_TYPE,
DEVICE_CLASS_BATTERY, DEVICE_CLASS_BATTERY,
DEVICE_CLASS_CURRENT,
DEVICE_CLASS_ENERGY,
DEVICE_CLASS_HUMIDITY, DEVICE_CLASS_HUMIDITY,
DEVICE_CLASS_ILLUMINANCE, DEVICE_CLASS_ILLUMINANCE,
DEVICE_CLASS_POWER, DEVICE_CLASS_POWER,
DEVICE_CLASS_POWER_FACTOR,
DEVICE_CLASS_PRESSURE, DEVICE_CLASS_PRESSURE,
DEVICE_CLASS_SIGNAL_STRENGTH, DEVICE_CLASS_SIGNAL_STRENGTH,
DEVICE_CLASS_TEMPERATURE, DEVICE_CLASS_TEMPERATURE,
DEVICE_CLASS_TIMESTAMP, DEVICE_CLASS_TIMESTAMP,
DEVICE_CLASS_VOLTAGE,
) )
from homeassistant.helpers import config_validation as cv from homeassistant.helpers import config_validation as cv
from homeassistant.helpers.entity_registry import async_entries_for_device from homeassistant.helpers.entity_registry import async_entries_for_device
@ -33,24 +37,32 @@ from . import DOMAIN
DEVICE_CLASS_NONE = "none" DEVICE_CLASS_NONE = "none"
CONF_BATTERY_LEVEL = "battery_level" CONF_BATTERY_LEVEL = "battery_level"
CONF_CURRENT = "current"
CONF_ENERGY = "energy"
CONF_HUMIDITY = "humidity" CONF_HUMIDITY = "humidity"
CONF_ILLUMINANCE = "illuminance" CONF_ILLUMINANCE = "illuminance"
CONF_POWER = "power" CONF_POWER = "power"
CONF_POWER_FACTOR = "power_factor"
CONF_PRESSURE = "pressure" CONF_PRESSURE = "pressure"
CONF_SIGNAL_STRENGTH = "signal_strength" CONF_SIGNAL_STRENGTH = "signal_strength"
CONF_TEMPERATURE = "temperature" CONF_TEMPERATURE = "temperature"
CONF_TIMESTAMP = "timestamp" CONF_TIMESTAMP = "timestamp"
CONF_VOLTAGE = "voltage"
CONF_VALUE = "value" CONF_VALUE = "value"
ENTITY_TRIGGERS = { ENTITY_TRIGGERS = {
DEVICE_CLASS_BATTERY: [{CONF_TYPE: CONF_BATTERY_LEVEL}], 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_HUMIDITY: [{CONF_TYPE: CONF_HUMIDITY}],
DEVICE_CLASS_ILLUMINANCE: [{CONF_TYPE: CONF_ILLUMINANCE}], DEVICE_CLASS_ILLUMINANCE: [{CONF_TYPE: CONF_ILLUMINANCE}],
DEVICE_CLASS_POWER: [{CONF_TYPE: CONF_POWER}], 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_PRESSURE: [{CONF_TYPE: CONF_PRESSURE}],
DEVICE_CLASS_SIGNAL_STRENGTH: [{CONF_TYPE: CONF_SIGNAL_STRENGTH}], DEVICE_CLASS_SIGNAL_STRENGTH: [{CONF_TYPE: CONF_SIGNAL_STRENGTH}],
DEVICE_CLASS_TEMPERATURE: [{CONF_TYPE: CONF_TEMPERATURE}], DEVICE_CLASS_TEMPERATURE: [{CONF_TYPE: CONF_TEMPERATURE}],
DEVICE_CLASS_TIMESTAMP: [{CONF_TYPE: CONF_TIMESTAMP}], DEVICE_CLASS_TIMESTAMP: [{CONF_TYPE: CONF_TIMESTAMP}],
DEVICE_CLASS_VOLTAGE: [{CONF_TYPE: CONF_VOLTAGE}],
DEVICE_CLASS_NONE: [{CONF_TYPE: CONF_VALUE}], DEVICE_CLASS_NONE: [{CONF_TYPE: CONF_VALUE}],
} }
@ -62,13 +74,17 @@ TRIGGER_SCHEMA = vol.All(
vol.Required(CONF_TYPE): vol.In( vol.Required(CONF_TYPE): vol.In(
[ [
CONF_BATTERY_LEVEL, CONF_BATTERY_LEVEL,
CONF_CURRENT,
CONF_ENERGY,
CONF_HUMIDITY, CONF_HUMIDITY,
CONF_ILLUMINANCE, CONF_ILLUMINANCE,
CONF_POWER, CONF_POWER,
CONF_POWER_FACTOR,
CONF_PRESSURE, CONF_PRESSURE,
CONF_SIGNAL_STRENGTH, CONF_SIGNAL_STRENGTH,
CONF_TEMPERATURE, CONF_TEMPERATURE,
CONF_TIMESTAMP, CONF_TIMESTAMP,
CONF_VOLTAGE,
CONF_VALUE, CONF_VALUE,
] ]
), ),

View File

@ -10,6 +10,10 @@
"is_signal_strength": "Current {entity_name} signal strength", "is_signal_strength": "Current {entity_name} signal strength",
"is_temperature": "Current {entity_name} temperature", "is_temperature": "Current {entity_name} temperature",
"is_timestamp": "Current {entity_name} timestamp", "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" "is_value": "Current {entity_name} value"
}, },
"trigger_type": { "trigger_type": {
@ -21,6 +25,10 @@
"signal_strength": "{entity_name} signal strength changes", "signal_strength": "{entity_name} signal strength changes",
"temperature": "{entity_name} temperature changes", "temperature": "{entity_name} temperature changes",
"timestamp": "{entity_name} timestamp 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" "value": "{entity_name} value changes"
} }
}, },

View File

@ -218,6 +218,10 @@ DEVICE_CLASS_TEMPERATURE = "temperature"
DEVICE_CLASS_TIMESTAMP = "timestamp" DEVICE_CLASS_TIMESTAMP = "timestamp"
DEVICE_CLASS_PRESSURE = "pressure" DEVICE_CLASS_PRESSURE = "pressure"
DEVICE_CLASS_POWER = "power" DEVICE_CLASS_POWER = "power"
DEVICE_CLASS_CURRENT = "current"
DEVICE_CLASS_ENERGY = "energy"
DEVICE_CLASS_POWER_FACTOR = "power_factor"
DEVICE_CLASS_VOLTAGE = "voltage"
# #### STATES #### # #### STATES ####
STATE_ON = "on" STATE_ON = "on"

View File

@ -76,7 +76,7 @@ async def test_get_triggers(hass, device_reg, entity_reg):
if device_class != "none" if device_class != "none"
] ]
triggers = await async_get_device_automations(hass, "trigger", device_entry.id) triggers = await async_get_device_automations(hass, "trigger", device_entry.id)
assert len(triggers) == 8 assert len(triggers) == 12
assert triggers == expected_triggers assert triggers == expected_triggers

View File

@ -20,6 +20,10 @@ UNITS_OF_MEASUREMENT = {
sensor.DEVICE_CLASS_TIMESTAMP: "hh:mm:ss", # timestamp (ISO8601) sensor.DEVICE_CLASS_TIMESTAMP: "hh:mm:ss", # timestamp (ISO8601)
sensor.DEVICE_CLASS_PRESSURE: "hPa", # pressure (hPa/mbar) sensor.DEVICE_CLASS_PRESSURE: "hPa", # pressure (hPa/mbar)
sensor.DEVICE_CLASS_POWER: "kW", # power (W/kW) 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 = {} ENTITIES = {}