core/homeassistant/components/fritzbox/entity.py

69 lines
2.2 KiB
Python

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