"""Base classes for ONVIF entities.""" from homeassistant.helpers.device_registry import CONNECTION_NETWORK_MAC from homeassistant.helpers.entity import DeviceInfo, Entity from .const import DOMAIN from .device import ONVIFDevice from .models import Profile class ONVIFBaseEntity(Entity): """Base class common to all ONVIF entities.""" def __init__(self, device: ONVIFDevice, profile: Profile = None) -> None: """Initialize the ONVIF entity.""" self.device: ONVIFDevice = device self.profile: Profile = profile @property def available(self): """Return True if device is available.""" return self.device.available @property def device_info(self) -> DeviceInfo: """Return a device description for device registry.""" connections = None if self.device.info.mac: connections = {(CONNECTION_NETWORK_MAC, self.device.info.mac)} return DeviceInfo( connections=connections, identifiers={ # MAC address is not always available, and given the number # of non-conformant ONVIF devices we have historically supported, # we can not guarantee serial number either. Due to this, we have # adopted an either/or approach in the config entry setup, and can # guarantee that one or the other will be populated. # See: https://github.com/home-assistant/core/issues/35883 (DOMAIN, self.device.info.mac or self.device.info.serial_number) }, manufacturer=self.device.info.manufacturer, model=self.device.info.model, name=self.device.name, sw_version=self.device.info.fw_version, configuration_url=f"http://{self.device.host}:{self.device.port}", )