111 lines
3.7 KiB
Python
111 lines
3.7 KiB
Python
"""
|
|
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
|