diff --git a/homeassistant/components/devolo_home_control/sensor.py b/homeassistant/components/devolo_home_control/sensor.py index bdf0f05528d..4bb2536dcc2 100644 --- a/homeassistant/components/devolo_home_control/sensor.py +++ b/homeassistant/components/devolo_home_control/sensor.py @@ -4,6 +4,7 @@ import logging from homeassistant.components.sensor import ( DEVICE_CLASS_HUMIDITY, DEVICE_CLASS_ILLUMINANCE, + DEVICE_CLASS_POWER, DEVICE_CLASS_TEMPERATURE, ) from homeassistant.config_entries import ConfigEntry @@ -18,6 +19,8 @@ DEVICE_CLASS_MAPPING = { "temperature": DEVICE_CLASS_TEMPERATURE, "light": DEVICE_CLASS_ILLUMINANCE, "humidity": DEVICE_CLASS_HUMIDITY, + "current": DEVICE_CLASS_POWER, + "total": DEVICE_CLASS_POWER, } @@ -36,17 +39,39 @@ async def async_setup_entry( element_uid=multi_level_sensor, ) ) + for device in hass.data[DOMAIN]["homecontrol"].devices.values(): + if hasattr(device, "consumption_property"): + for consumption in device.consumption_property: + for consumption_type in ["current", "total"]: + entities.append( + DevoloConsumptionEntity( + homecontrol=hass.data[DOMAIN]["homecontrol"], + device_instance=device, + element_uid=consumption, + consumption=consumption_type, + ) + ) async_add_entities(entities, False) class DevoloMultiLevelDeviceEntity(DevoloDeviceEntity): - """Representation o a multi level sensor within devolo Home Control.""" + """Representation of a multi level sensor within devolo Home Control.""" - def __init__(self, homecontrol, device_instance, element_uid): + def __init__( + self, + homecontrol, + device_instance, + element_uid, + multi_level_sensor_property=None, + sync=None, + ): """Initialize a devolo multi level sensor.""" - self._multi_level_sensor_property = device_instance.multi_level_sensor_property[ - element_uid - ] + if multi_level_sensor_property is None: + self._multi_level_sensor_property = ( + device_instance.multi_level_sensor_property[element_uid] + ) + else: + self._multi_level_sensor_property = multi_level_sensor_property self._state = self._multi_level_sensor_property.value @@ -66,7 +91,7 @@ class DevoloMultiLevelDeviceEntity(DevoloDeviceEntity): device_instance=device_instance, element_uid=element_uid, name=name, - sync=self._sync, + sync=self._sync if sync is None else sync, ) @property @@ -95,3 +120,46 @@ class DevoloMultiLevelDeviceEntity(DevoloDeviceEntity): else: _LOGGER.debug("No valid message received: %s", message) self.schedule_update_ha_state() + + +class DevoloConsumptionEntity(DevoloMultiLevelDeviceEntity): + """Representation of a consumption entity within devolo Home Control.""" + + def __init__(self, homecontrol, device_instance, element_uid, consumption): + """Initialize a devolo consumption sensor.""" + self._device_instance = device_instance + + self.value = getattr( + device_instance.consumption_property[element_uid], consumption + ) + self.sensor_type = consumption + self.unit = getattr( + device_instance.consumption_property[element_uid], f"{consumption}_unit" + ) + self.element_uid = element_uid + + super().__init__( + homecontrol, + device_instance, + element_uid, + multi_level_sensor_property=self, + sync=self._sync, + ) + + @property + def unique_id(self): + """Return the unique ID of the entity.""" + return f"{self._unique_id}_{self.sensor_type}" + + def _sync(self, message=None): + """Update the consumption sensor state.""" + if message[0] == self.element_uid: + self._state = getattr( + self._device_instance.consumption_property[self.element_uid], + self.sensor_type, + ) + elif message[0].startswith("hdm"): + self._available = self._device_instance.is_online() + else: + _LOGGER.debug("No valid message received: %s", message) + self.schedule_update_ha_state()