From 5805601a839987d406f1cc16113ab9b5007fa2d1 Mon Sep 17 00:00:00 2001 From: Christopher Fenner <9592452+CFenner@users.noreply.github.com> Date: Tue, 21 Nov 2023 09:53:02 +0100 Subject: [PATCH] Set unique_id by base entity in ViCare integration (#104277) * set unique_id in ViCareEntity * remove individual unique_id functions * remove description * remove individual _attr_unique_id * fix return types --- .../components/vicare/binary_sensor.py | 18 +++--------------- homeassistant/components/vicare/button.py | 14 +------------- homeassistant/components/vicare/climate.py | 4 +--- homeassistant/components/vicare/entity.py | 16 +++++++++++++++- homeassistant/components/vicare/sensor.py | 18 +++--------------- .../components/vicare/water_heater.py | 4 +--- 6 files changed, 24 insertions(+), 50 deletions(-) diff --git a/homeassistant/components/vicare/binary_sensor.py b/homeassistant/components/vicare/binary_sensor.py index 4e3d8d05f97..9e9f133b730 100644 --- a/homeassistant/components/vicare/binary_sensor.py +++ b/homeassistant/components/vicare/binary_sensor.py @@ -198,28 +198,16 @@ class ViCareBinarySensor(ViCareEntity, BinarySensorEntity): self, name, api, device_config, description: ViCareBinarySensorEntityDescription ) -> None: """Initialize the sensor.""" - super().__init__(device_config) + super().__init__(device_config, api, description.key) self.entity_description = description self._attr_name = name - self._api = api - self._device_config = device_config @property - def available(self): + def available(self) -> bool: """Return True if entity is available.""" return self._attr_is_on is not None - @property - def unique_id(self) -> str: - """Return unique ID for this device.""" - tmp_id = ( - f"{self._device_config.getConfig().serial}-{self.entity_description.key}" - ) - if hasattr(self._api, "id"): - return f"{tmp_id}-{self._api.id}" - return tmp_id - - def update(self): + def update(self) -> None: """Update state of sensor.""" try: with suppress(PyViCareNotSupportedFeatureError): diff --git a/homeassistant/components/vicare/button.py b/homeassistant/components/vicare/button.py index 2516446a94e..5ea6cf5edae 100644 --- a/homeassistant/components/vicare/button.py +++ b/homeassistant/components/vicare/button.py @@ -99,10 +99,8 @@ class ViCareButton(ViCareEntity, ButtonEntity): self, name, api, device_config, description: ViCareButtonEntityDescription ) -> None: """Initialize the button.""" - super().__init__(device_config) + super().__init__(device_config, api, description.key) self.entity_description = description - self._device_config = device_config - self._api = api def press(self) -> None: """Handle the button press.""" @@ -117,13 +115,3 @@ class ViCareButton(ViCareEntity, ButtonEntity): _LOGGER.error("Vicare API rate limit exceeded: %s", limit_exception) except PyViCareInvalidDataError as invalid_data_exception: _LOGGER.error("Invalid data from Vicare server: %s", invalid_data_exception) - - @property - def unique_id(self) -> str: - """Return unique ID for this device.""" - tmp_id = ( - f"{self._device_config.getConfig().serial}-{self.entity_description.key}" - ) - if hasattr(self._api, "id"): - return f"{tmp_id}-{self._api.id}" - return tmp_id diff --git a/homeassistant/components/vicare/climate.py b/homeassistant/components/vicare/climate.py index d306cc6604d..0c145e5e5a8 100644 --- a/homeassistant/components/vicare/climate.py +++ b/homeassistant/components/vicare/climate.py @@ -150,13 +150,11 @@ class ViCareClimate(ViCareEntity, ClimateEntity): def __init__(self, name, api, circuit, device_config) -> None: """Initialize the climate device.""" - super().__init__(device_config) + super().__init__(device_config, api, circuit.id) self._attr_name = name - self._api = api self._circuit = circuit self._attributes: dict[str, Any] = {} self._current_program = None - self._attr_unique_id = f"{device_config.getConfig().serial}-{circuit.id}" def update(self) -> None: """Let HA know there has been an update from the ViCare API.""" diff --git a/homeassistant/components/vicare/entity.py b/homeassistant/components/vicare/entity.py index 089f9c062b8..af35c7bf8dd 100644 --- a/homeassistant/components/vicare/entity.py +++ b/homeassistant/components/vicare/entity.py @@ -1,4 +1,7 @@ """Entities for the ViCare integration.""" +from PyViCare.PyViCareDevice import Device as PyViCareDevice +from PyViCare.PyViCareDeviceConfig import PyViCareDeviceConfig + from homeassistant.helpers.device_registry import DeviceInfo from homeassistant.helpers.entity import Entity @@ -10,8 +13,19 @@ class ViCareEntity(Entity): _attr_has_entity_name = True - def __init__(self, device_config) -> None: + def __init__( + self, + device_config: PyViCareDeviceConfig, + device: PyViCareDevice, + unique_id_suffix: str, + ) -> None: """Initialize the entity.""" + self._api = device + + self._attr_unique_id = f"{device_config.getConfig().serial}-{unique_id_suffix}" + # valid for compressors, circuits, burners (HeatingDeviceWithComponent) + if hasattr(device, "id"): + self._attr_unique_id += f"-{device.id}" self._attr_device_info = DeviceInfo( identifiers={(DOMAIN, device_config.getConfig().serial)}, diff --git a/homeassistant/components/vicare/sensor.py b/homeassistant/components/vicare/sensor.py index 99f1eef80b9..ae83459ddda 100644 --- a/homeassistant/components/vicare/sensor.py +++ b/homeassistant/components/vicare/sensor.py @@ -688,28 +688,16 @@ class ViCareSensor(ViCareEntity, SensorEntity): self, name, api, device_config, description: ViCareSensorEntityDescription ) -> None: """Initialize the sensor.""" - super().__init__(device_config) + super().__init__(device_config, api, description.key) self.entity_description = description self._attr_name = name - self._api = api - self._device_config = device_config @property - def available(self): + def available(self) -> bool: """Return True if entity is available.""" return self._attr_native_value is not None - @property - def unique_id(self) -> str: - """Return unique ID for this device.""" - tmp_id = ( - f"{self._device_config.getConfig().serial}-{self.entity_description.key}" - ) - if hasattr(self._api, "id"): - return f"{tmp_id}-{self._api.id}" - return tmp_id - - def update(self): + def update(self) -> None: """Update state of sensor.""" try: with suppress(PyViCareNotSupportedFeatureError): diff --git a/homeassistant/components/vicare/water_heater.py b/homeassistant/components/vicare/water_heater.py index db8a959f4ae..0e927a24650 100644 --- a/homeassistant/components/vicare/water_heater.py +++ b/homeassistant/components/vicare/water_heater.py @@ -101,13 +101,11 @@ class ViCareWater(ViCareEntity, WaterHeaterEntity): def __init__(self, name, api, circuit, device_config) -> None: """Initialize the DHW water_heater device.""" - super().__init__(device_config) + super().__init__(device_config, api, circuit.id) self._attr_name = name - self._api = api self._circuit = circuit self._attributes: dict[str, Any] = {} self._current_mode = None - self._attr_unique_id = f"{device_config.getConfig().serial}-{circuit.id}" def update(self) -> None: """Let HA know there has been an update from the ViCare API."""