Move fritzbox base entity to separate module (#126482)

This commit is contained in:
epenet 2024-09-23 12:50:51 +02:00 committed by GitHub
parent 8ef7cae36d
commit c8d20a8c23
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 77 additions and 69 deletions

View file

@ -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,
)

View file

@ -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

View file

@ -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(

View file

@ -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]

View file

@ -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(

View file

@ -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,
)

View file

@ -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(

View file

@ -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

View file

@ -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(