From c67bbd06d4416ea63d6c7efb23cd519bdf25b06a Mon Sep 17 00:00:00 2001 From: rhadamantys <46837767+rhadamantys@users.noreply.github.com> Date: Tue, 17 May 2022 13:43:36 +0200 Subject: [PATCH] Provide unique id for enocean devices (#71774) Co-authored-by: Martin Hjelmare --- .../components/enocean/binary_sensor.py | 2 + homeassistant/components/enocean/light.py | 2 + homeassistant/components/enocean/sensor.py | 39 +++++++++++++++---- homeassistant/components/enocean/switch.py | 2 + 4 files changed, 37 insertions(+), 8 deletions(-) diff --git a/homeassistant/components/enocean/binary_sensor.py b/homeassistant/components/enocean/binary_sensor.py index 3afa7110657..e18542241da 100644 --- a/homeassistant/components/enocean/binary_sensor.py +++ b/homeassistant/components/enocean/binary_sensor.py @@ -1,6 +1,7 @@ """Support for EnOcean binary sensors.""" from __future__ import annotations +from enocean.utils import combine_hex import voluptuous as vol from homeassistant.components.binary_sensor import ( @@ -57,6 +58,7 @@ class EnOceanBinarySensor(EnOceanEntity, BinarySensorEntity): self._device_class = device_class self.which = -1 self.onoff = -1 + self._attr_unique_id = f"{combine_hex(dev_id)}-{device_class}" @property def name(self): diff --git a/homeassistant/components/enocean/light.py b/homeassistant/components/enocean/light.py index c7bf076c738..8ecc3f63831 100644 --- a/homeassistant/components/enocean/light.py +++ b/homeassistant/components/enocean/light.py @@ -3,6 +3,7 @@ from __future__ import annotations import math +from enocean.utils import combine_hex import voluptuous as vol from homeassistant.components.light import ( @@ -58,6 +59,7 @@ class EnOceanLight(EnOceanEntity, LightEntity): self._on_state = False self._brightness = 50 self._sender_id = sender_id + self._attr_unique_id = f"{combine_hex(dev_id)}" @property def name(self): diff --git a/homeassistant/components/enocean/sensor.py b/homeassistant/components/enocean/sensor.py index e48f117648a..06ea50d4cdb 100644 --- a/homeassistant/components/enocean/sensor.py +++ b/homeassistant/components/enocean/sensor.py @@ -1,6 +1,10 @@ """Support for EnOcean sensors.""" from __future__ import annotations +from collections.abc import Callable +from dataclasses import dataclass + +from enocean.utils import combine_hex import voluptuous as vol from homeassistant.components.sensor import ( @@ -40,37 +44,56 @@ SENSOR_TYPE_POWER = "powersensor" SENSOR_TYPE_TEMPERATURE = "temperature" SENSOR_TYPE_WINDOWHANDLE = "windowhandle" -SENSOR_DESC_TEMPERATURE = SensorEntityDescription( + +@dataclass +class EnOceanSensorEntityDescriptionMixin: + """Mixin for required keys.""" + + unique_id: Callable[[list[int]], str | None] + + +@dataclass +class EnOceanSensorEntityDescription( + SensorEntityDescription, EnOceanSensorEntityDescriptionMixin +): + """Describes EnOcean sensor entity.""" + + +SENSOR_DESC_TEMPERATURE = EnOceanSensorEntityDescription( key=SENSOR_TYPE_TEMPERATURE, name="Temperature", native_unit_of_measurement=TEMP_CELSIUS, icon="mdi:thermometer", device_class=SensorDeviceClass.TEMPERATURE, state_class=SensorStateClass.MEASUREMENT, + unique_id=lambda dev_id: f"{combine_hex(dev_id)}-{SENSOR_TYPE_TEMPERATURE}", ) -SENSOR_DESC_HUMIDITY = SensorEntityDescription( +SENSOR_DESC_HUMIDITY = EnOceanSensorEntityDescription( key=SENSOR_TYPE_HUMIDITY, name="Humidity", native_unit_of_measurement=PERCENTAGE, icon="mdi:water-percent", device_class=SensorDeviceClass.HUMIDITY, state_class=SensorStateClass.MEASUREMENT, + unique_id=lambda dev_id: f"{combine_hex(dev_id)}-{SENSOR_TYPE_HUMIDITY}", ) -SENSOR_DESC_POWER = SensorEntityDescription( +SENSOR_DESC_POWER = EnOceanSensorEntityDescription( key=SENSOR_TYPE_POWER, name="Power", native_unit_of_measurement=POWER_WATT, icon="mdi:power-plug", device_class=SensorDeviceClass.POWER, state_class=SensorStateClass.MEASUREMENT, + unique_id=lambda dev_id: f"{combine_hex(dev_id)}-{SENSOR_TYPE_POWER}", ) -SENSOR_DESC_WINDOWHANDLE = SensorEntityDescription( +SENSOR_DESC_WINDOWHANDLE = EnOceanSensorEntityDescription( key=SENSOR_TYPE_WINDOWHANDLE, name="WindowHandle", - icon="mdi:window", + icon="mdi:window-open-variant", + unique_id=lambda dev_id: f"{combine_hex(dev_id)}-{SENSOR_TYPE_WINDOWHANDLE}", ) @@ -132,11 +155,12 @@ def setup_platform( class EnOceanSensor(EnOceanEntity, RestoreEntity, SensorEntity): """Representation of an EnOcean sensor device such as a power meter.""" - def __init__(self, dev_id, dev_name, description: SensorEntityDescription): + def __init__(self, dev_id, dev_name, description: EnOceanSensorEntityDescription): """Initialize the EnOcean sensor device.""" super().__init__(dev_id, dev_name) self.entity_description = description self._attr_name = f"{description.name} {dev_name}" + self._attr_unique_id = description.unique_id(dev_id) async def async_added_to_hass(self): """Call when entity about to be added to hass.""" @@ -194,7 +218,7 @@ class EnOceanTemperatureSensor(EnOceanSensor): self, dev_id, dev_name, - description: SensorEntityDescription, + description: EnOceanSensorEntityDescription, *, scale_min, scale_max, @@ -248,7 +272,6 @@ class EnOceanWindowHandle(EnOceanSensor): def value_changed(self, packet): """Update the internal state of the sensor.""" - action = (packet.data[1] & 0x70) >> 4 if action == 0x07: diff --git a/homeassistant/components/enocean/switch.py b/homeassistant/components/enocean/switch.py index fc788e88d72..a53f691df19 100644 --- a/homeassistant/components/enocean/switch.py +++ b/homeassistant/components/enocean/switch.py @@ -1,6 +1,7 @@ """Support for EnOcean switches.""" from __future__ import annotations +from enocean.utils import combine_hex import voluptuous as vol from homeassistant.components.switch import PLATFORM_SCHEMA, SwitchEntity @@ -48,6 +49,7 @@ class EnOceanSwitch(EnOceanEntity, SwitchEntity): self._on_state = False self._on_state2 = False self.channel = channel + self._attr_unique_id = f"{combine_hex(dev_id)}" @property def is_on(self):