""" Entity for Zigbee Home Automation. For more details about this component, please refer to the documentation at https://home-assistant.io/components/zha/ """ from homeassistant.components.zha.const import ( DATA_ZHA, DATA_ZHA_BRIDGE_ID, DOMAIN) from homeassistant.core import callback from homeassistant.helpers import entity from homeassistant.helpers.device_registry import CONNECTION_ZIGBEE from homeassistant.util import slugify class ZhaEntity(entity.Entity): """A base class for ZHA entities.""" _domain = None # Must be overridden by subclasses def __init__(self, endpoint, in_clusters, out_clusters, manufacturer, model, application_listener, unique_id, **kwargs): """Init ZHA entity.""" self._device_state_attributes = {} ieee = endpoint.device.ieee ieeetail = ''.join(['%02x' % (o, ) for o in ieee[-4:]]) if manufacturer and model is not None: self.entity_id = "{}.{}_{}_{}_{}{}".format( self._domain, slugify(manufacturer), slugify(model), ieeetail, endpoint.endpoint_id, kwargs.get('entity_suffix', ''), ) self._device_state_attributes['friendly_name'] = "{} {}".format( manufacturer, model, ) else: self.entity_id = "{}.zha_{}_{}{}".format( self._domain, ieeetail, endpoint.endpoint_id, kwargs.get('entity_suffix', ''), ) self._endpoint = endpoint self._in_clusters = in_clusters self._out_clusters = out_clusters self._state = None self._unique_id = unique_id # Normally the entity itself is the listener. Sub-classes may set this # to a dict of cluster ID -> listener to receive messages for specific # clusters separately self._in_listeners = {} self._out_listeners = {} self._initialized = False application_listener.register_entity(ieee, self) async def async_added_to_hass(self): """Handle entity addition to hass. It is now safe to update the entity state """ for cluster_id, cluster in self._in_clusters.items(): cluster.add_listener(self._in_listeners.get(cluster_id, self)) for cluster_id, cluster in self._out_clusters.items(): cluster.add_listener(self._out_listeners.get(cluster_id, self)) self._initialized = True @property def unique_id(self) -> str: """Return a unique ID.""" return self._unique_id @property def device_state_attributes(self): """Return device specific state attributes.""" return self._device_state_attributes @callback def attribute_updated(self, attribute, value): """Handle an attribute updated on this cluster.""" pass @callback def zdo_command(self, tsn, command_id, args): """Handle a ZDO command received on this cluster.""" pass @property def device_info(self): """Return a device description for device registry.""" ieee = str(self._endpoint.device.ieee) return { 'connections': {(CONNECTION_ZIGBEE, ieee)}, 'identifiers': {(DOMAIN, ieee)}, 'manufacturer': self._endpoint.manufacturer, 'model': self._endpoint.model, 'name': self._device_state_attributes.get('friendly_name', ieee), 'via_hub': (DOMAIN, self.hass.data[DATA_ZHA][DATA_ZHA_BRIDGE_ID]), } @callback def zha_send_event(self, cluster, command, args): """Relay entity events to hass.""" pass # don't relay events from entities