From c8d20a8c23506b16a96b800b54ca7f8db0458947 Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Mon, 23 Sep 2024 12:50:51 +0200 Subject: [PATCH] Move fritzbox base entity to separate module (#126482) --- homeassistant/components/fritzbox/__init__.py | 62 +---------------- .../components/fritzbox/binary_sensor.py | 2 +- homeassistant/components/fritzbox/button.py | 2 +- homeassistant/components/fritzbox/climate.py | 2 +- homeassistant/components/fritzbox/cover.py | 2 +- homeassistant/components/fritzbox/entity.py | 68 +++++++++++++++++++ homeassistant/components/fritzbox/light.py | 4 +- homeassistant/components/fritzbox/sensor.py | 2 +- homeassistant/components/fritzbox/switch.py | 2 +- 9 files changed, 77 insertions(+), 69 deletions(-) create mode 100644 homeassistant/components/fritzbox/entity.py diff --git a/homeassistant/components/fritzbox/__init__.py b/homeassistant/components/fritzbox/__init__.py index ab6d88772d5..07bc8fb15f2 100644 --- a/homeassistant/components/fritzbox/__init__.py +++ b/homeassistant/components/fritzbox/__init__.py @@ -2,18 +2,11 @@ from __future__ import annotations -from abc import ABC, abstractmethod - -from pyfritzhome import FritzhomeDevice -from pyfritzhome.devicetypes.fritzhomeentitybase import FritzhomeEntityBase - from homeassistant.components.binary_sensor import DOMAIN as BINARY_SENSOR_DOMAIN from homeassistant.const import EVENT_HOMEASSISTANT_STOP, UnitOfTemperature from homeassistant.core import Event, HomeAssistant -from homeassistant.helpers.device_registry import DeviceEntry, DeviceInfo -from homeassistant.helpers.entity import EntityDescription +from homeassistant.helpers.device_registry import DeviceEntry from homeassistant.helpers.entity_registry import RegistryEntry, async_migrate_entries -from homeassistant.helpers.update_coordinator import CoordinatorEntity from .const import DOMAIN, LOGGER, PLATFORMS from .coordinator import FritzboxConfigEntry, FritzboxDataUpdateCoordinator @@ -83,56 +76,3 @@ async def async_remove_config_entry_device( return False return True - - -class FritzBoxEntity(CoordinatorEntity[FritzboxDataUpdateCoordinator], ABC): - """Basis FritzBox entity.""" - - def __init__( - self, - coordinator: FritzboxDataUpdateCoordinator, - ain: str, - entity_description: EntityDescription | None = None, - ) -> None: - """Initialize the FritzBox entity.""" - super().__init__(coordinator) - - self.ain = ain - if entity_description is not None: - self._attr_has_entity_name = True - self.entity_description = entity_description - self._attr_unique_id = f"{ain}_{entity_description.key}" - else: - self._attr_name = self.data.name - self._attr_unique_id = ain - - @property - @abstractmethod - def data(self) -> FritzhomeEntityBase: - """Return data object from coordinator.""" - - -class FritzBoxDeviceEntity(FritzBoxEntity): - """Reflects FritzhomeDevice and uses its attributes to construct FritzBoxDeviceEntity.""" - - @property - def available(self) -> bool: - """Return if entity is available.""" - return super().available and self.data.present - - @property - def data(self) -> FritzhomeDevice: - """Return device data object from coordinator.""" - return self.coordinator.data.devices[self.ain] - - @property - def device_info(self) -> DeviceInfo: - """Return device specific attributes.""" - return DeviceInfo( - name=self.data.name, - identifiers={(DOMAIN, self.ain)}, - manufacturer=self.data.manufacturer, - model=self.data.productname, - sw_version=self.data.fw_version, - configuration_url=self.coordinator.configuration_url, - ) diff --git a/homeassistant/components/fritzbox/binary_sensor.py b/homeassistant/components/fritzbox/binary_sensor.py index 89394d35fe5..3c9cb6ada5c 100644 --- a/homeassistant/components/fritzbox/binary_sensor.py +++ b/homeassistant/components/fritzbox/binary_sensor.py @@ -17,8 +17,8 @@ from homeassistant.const import EntityCategory from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.entity_platform import AddEntitiesCallback -from . import FritzBoxDeviceEntity from .coordinator import FritzboxConfigEntry +from .entity import FritzBoxDeviceEntity from .model import FritzEntityDescriptionMixinBase diff --git a/homeassistant/components/fritzbox/button.py b/homeassistant/components/fritzbox/button.py index 7ef91a74252..44a6697e1c0 100644 --- a/homeassistant/components/fritzbox/button.py +++ b/homeassistant/components/fritzbox/button.py @@ -7,9 +7,9 @@ from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.device_registry import DeviceInfo from homeassistant.helpers.entity_platform import AddEntitiesCallback -from . import FritzBoxEntity from .const import DOMAIN from .coordinator import FritzboxConfigEntry +from .entity import FritzBoxEntity async def async_setup_entry( diff --git a/homeassistant/components/fritzbox/climate.py b/homeassistant/components/fritzbox/climate.py index 61e75bec000..7b0bec6fc09 100644 --- a/homeassistant/components/fritzbox/climate.py +++ b/homeassistant/components/fritzbox/climate.py @@ -22,7 +22,6 @@ from homeassistant.core import HomeAssistant, callback from homeassistant.exceptions import HomeAssistantError from homeassistant.helpers.entity_platform import AddEntitiesCallback -from . import FritzBoxDeviceEntity from .const import ( ATTR_STATE_BATTERY_LOW, ATTR_STATE_HOLIDAY_MODE, @@ -32,6 +31,7 @@ from .const import ( LOGGER, ) from .coordinator import FritzboxConfigEntry, FritzboxDataUpdateCoordinator +from .entity import FritzBoxDeviceEntity from .model import ClimateExtraAttributes HVAC_MODES = [HVACMode.HEAT, HVACMode.OFF] diff --git a/homeassistant/components/fritzbox/cover.py b/homeassistant/components/fritzbox/cover.py index 7a74d0b8184..de87d6f8852 100644 --- a/homeassistant/components/fritzbox/cover.py +++ b/homeassistant/components/fritzbox/cover.py @@ -13,8 +13,8 @@ from homeassistant.components.cover import ( from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.entity_platform import AddEntitiesCallback -from . import FritzBoxDeviceEntity from .coordinator import FritzboxConfigEntry +from .entity import FritzBoxDeviceEntity async def async_setup_entry( diff --git a/homeassistant/components/fritzbox/entity.py b/homeassistant/components/fritzbox/entity.py new file mode 100644 index 00000000000..cd619588bc1 --- /dev/null +++ b/homeassistant/components/fritzbox/entity.py @@ -0,0 +1,68 @@ +"""Support for AVM FRITZ!SmartHome devices.""" + +from __future__ import annotations + +from abc import ABC, abstractmethod + +from pyfritzhome import FritzhomeDevice +from pyfritzhome.devicetypes.fritzhomeentitybase import FritzhomeEntityBase + +from homeassistant.helpers.device_registry import DeviceInfo +from homeassistant.helpers.entity import EntityDescription +from homeassistant.helpers.update_coordinator import CoordinatorEntity + +from .const import DOMAIN +from .coordinator import FritzboxDataUpdateCoordinator + + +class FritzBoxEntity(CoordinatorEntity[FritzboxDataUpdateCoordinator], ABC): + """Basis FritzBox entity.""" + + def __init__( + self, + coordinator: FritzboxDataUpdateCoordinator, + ain: str, + entity_description: EntityDescription | None = None, + ) -> None: + """Initialize the FritzBox entity.""" + super().__init__(coordinator) + + self.ain = ain + if entity_description is not None: + self._attr_has_entity_name = True + self.entity_description = entity_description + self._attr_unique_id = f"{ain}_{entity_description.key}" + else: + self._attr_name = self.data.name + self._attr_unique_id = ain + + @property + @abstractmethod + def data(self) -> FritzhomeEntityBase: + """Return data object from coordinator.""" + + +class FritzBoxDeviceEntity(FritzBoxEntity): + """Reflects FritzhomeDevice and uses its attributes to construct FritzBoxDeviceEntity.""" + + @property + def available(self) -> bool: + """Return if entity is available.""" + return super().available and self.data.present + + @property + def data(self) -> FritzhomeDevice: + """Return device data object from coordinator.""" + return self.coordinator.data.devices[self.ain] + + @property + def device_info(self) -> DeviceInfo: + """Return device specific attributes.""" + return DeviceInfo( + name=self.data.name, + identifiers={(DOMAIN, self.ain)}, + manufacturer=self.data.manufacturer, + model=self.data.productname, + sw_version=self.data.fw_version, + configuration_url=self.coordinator.configuration_url, + ) diff --git a/homeassistant/components/fritzbox/light.py b/homeassistant/components/fritzbox/light.py index c19d7a8600d..d347f6898c0 100644 --- a/homeassistant/components/fritzbox/light.py +++ b/homeassistant/components/fritzbox/light.py @@ -16,9 +16,9 @@ from homeassistant.components.light import ( from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.entity_platform import AddEntitiesCallback -from . import FritzboxDataUpdateCoordinator, FritzBoxDeviceEntity from .const import COLOR_MODE, LOGGER -from .coordinator import FritzboxConfigEntry +from .coordinator import FritzboxConfigEntry, FritzboxDataUpdateCoordinator +from .entity import FritzBoxDeviceEntity async def async_setup_entry( diff --git a/homeassistant/components/fritzbox/sensor.py b/homeassistant/components/fritzbox/sensor.py index dbfdc2f9c95..e610fd80f3e 100644 --- a/homeassistant/components/fritzbox/sensor.py +++ b/homeassistant/components/fritzbox/sensor.py @@ -30,8 +30,8 @@ from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.typing import StateType from homeassistant.util.dt import utc_from_timestamp -from . import FritzBoxDeviceEntity from .coordinator import FritzboxConfigEntry +from .entity import FritzBoxDeviceEntity from .model import FritzEntityDescriptionMixinBase diff --git a/homeassistant/components/fritzbox/switch.py b/homeassistant/components/fritzbox/switch.py index d13f21e1c14..18b676d449e 100644 --- a/homeassistant/components/fritzbox/switch.py +++ b/homeassistant/components/fritzbox/switch.py @@ -9,9 +9,9 @@ from homeassistant.core import HomeAssistant, callback from homeassistant.exceptions import HomeAssistantError from homeassistant.helpers.entity_platform import AddEntitiesCallback -from . import FritzBoxDeviceEntity from .const import DOMAIN from .coordinator import FritzboxConfigEntry +from .entity import FritzBoxDeviceEntity async def async_setup_entry(