69 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			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,
 | 
						|
        )
 |