"""Library for extracting device specific information common to entities.""" from google_nest_sdm.device import Device from google_nest_sdm.device_traits import InfoTrait from .const import DOMAIN DEVICE_TYPE_MAP = { "sdm.devices.types.CAMERA": "Camera", "sdm.devices.types.DISPLAY": "Display", "sdm.devices.types.DOORBELL": "Doorbell", "sdm.devices.types.THERMOSTAT": "Thermostat", } class DeviceInfo: """Provide device info from the SDM device, shared across platforms.""" device_brand = "Google Nest" def __init__(self, device: Device): """Initialize the DeviceInfo.""" self._device = device @property def device_info(self): """Return device specific attributes.""" return { # The API "name" field is a unique device identifier. "identifiers": {(DOMAIN, self._device.name)}, "name": self.device_name, "manufacturer": self.device_brand, "model": self.device_model, } @property def device_name(self): """Return the name of the physical device that includes the sensor.""" if InfoTrait.NAME in self._device.traits: trait = self._device.traits[InfoTrait.NAME] if trait.custom_name: return trait.custom_name # Build a name from the room/structure. Note: This room/structure name # is not associated with a home assistant Area. parent_relations = self._device.parent_relations if parent_relations: items = sorted(parent_relations.items()) names = [name for id, name in items] return " ".join(names) return self.device_model @property def device_model(self): """Return device model information.""" # The API intentionally returns minimal information about specific # devices, instead relying on traits, but we can infer a generic model # name based on the type return DEVICE_TYPE_MAP.get(self._device.type)