From 62e64eb8ab7ab3b8db2e1fc38a93c1a682fdd3bd Mon Sep 17 00:00:00 2001 From: rappenze Date: Wed, 19 Jan 2022 19:32:44 +0100 Subject: [PATCH] Extract fibaro switch energy attributes into sensors (#63697) Co-authored-by: Franck Nijhof --- homeassistant/components/fibaro/__init__.py | 11 ++--- homeassistant/components/fibaro/sensor.py | 47 +++++++++++++++++++-- 2 files changed, 47 insertions(+), 11 deletions(-) diff --git a/homeassistant/components/fibaro/__init__.py b/homeassistant/components/fibaro/__init__.py index 5f76681a69f..9d4b26fa118 100644 --- a/homeassistant/components/fibaro/__init__.py +++ b/homeassistant/components/fibaro/__init__.py @@ -29,7 +29,6 @@ from homeassistant.util import convert, slugify _LOGGER = logging.getLogger(__name__) -ATTR_CURRENT_ENERGY_KWH = "current_energy_kwh" ATTR_CURRENT_POWER_W = "current_power_w" CONF_COLOR = "color" @@ -190,11 +189,13 @@ class FibaroController: except (ValueError, KeyError): pass for item in callback_set: - self._callbacks[item]() + for callback in self._callbacks[item]: + callback() def register(self, device_id, callback): """Register device with a callback for updates.""" - self._callbacks[device_id] = callback + self._callbacks.setdefault(device_id, []) + self._callbacks[device_id].append(callback) def get_children(self, device_id): """Get a list of child devices.""" @@ -523,10 +524,6 @@ class FibaroDevice(Entity): attr[ATTR_CURRENT_POWER_W] = convert( self.fibaro_device.properties.power, float, 0.0 ) - if "energy" in self.fibaro_device.interfaces: - attr[ATTR_CURRENT_ENERGY_KWH] = convert( - self.fibaro_device.properties.energy, float, 0.0 - ) except (ValueError, KeyError): pass diff --git a/homeassistant/components/fibaro/sensor.py b/homeassistant/components/fibaro/sensor.py index 53b95b7120c..03959ea4e34 100644 --- a/homeassistant/components/fibaro/sensor.py +++ b/homeassistant/components/fibaro/sensor.py @@ -3,9 +3,15 @@ from __future__ import annotations from contextlib import suppress -from homeassistant.components.sensor import DOMAIN, SensorDeviceClass, SensorEntity +from homeassistant.components.sensor import ( + DOMAIN, + SensorDeviceClass, + SensorEntity, + SensorStateClass, +) from homeassistant.const import ( CONCENTRATION_PARTS_PER_MILLION, + ENERGY_KILO_WATT_HOUR, LIGHT_LUX, PERCENTAGE, TEMP_CELSIUS, @@ -14,6 +20,7 @@ from homeassistant.const import ( from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType +from homeassistant.util import convert from . import FIBARO_DEVICES, FibaroDevice @@ -57,9 +64,15 @@ def setup_platform( if discovery_info is None: return - add_entities( - [FibaroSensor(device) for device in hass.data[FIBARO_DEVICES]["sensor"]], True - ) + entities: list[SensorEntity] = [] + for device in hass.data[FIBARO_DEVICES]["sensor"]: + entities.append(FibaroSensor(device)) + for device_type in ("cover", "light", "switch"): + for device in hass.data[FIBARO_DEVICES][device_type]: + if "energy" in device.interfaces: + entities.append(FibaroEnergySensor(device)) + + add_entities(entities, True) class FibaroSensor(FibaroDevice, SensorEntity): @@ -114,3 +127,29 @@ class FibaroSensor(FibaroDevice, SensorEntity): """Update the state.""" with suppress(KeyError, ValueError): self.current_value = float(self.fibaro_device.properties.value) + + +class FibaroEnergySensor(FibaroDevice, SensorEntity): + """Representation of a Fibaro Energy Sensor.""" + + _attr_device_class = SensorDeviceClass.ENERGY + _attr_state_class = SensorStateClass.TOTAL_INCREASING + _attr_native_unit_of_measurement = ENERGY_KILO_WATT_HOUR + + def __init__(self, fibaro_device): + """Initialize the sensor.""" + super().__init__(fibaro_device) + self.entity_id = f"{DOMAIN}.{self.ha_id}_energy" + self._name = f"{fibaro_device.friendly_name} Energy" + + @property + def unique_id(self) -> str: + """Return a unique ID.""" + return f"{self.fibaro_device.unique_id_str}_energy" + + def update(self): + """Update the state.""" + with suppress(KeyError, ValueError): + self._attr_native_value = convert( + self.fibaro_device.properties.energy, float + )