mirror of
https://github.com/home-assistant/core.git
synced 2025-07-23 05:07:41 +00:00
Configure ZHA entity on new ZHA device join (#19470)
* Address PR#19177 comments. * Make 'new_join' part of ZhaEntity. Call async_configure() automatically when new device ZHA device joins.
This commit is contained in:
parent
0b84eefa2e
commit
4a1da0b041
@ -60,20 +60,19 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
|
|||||||
async def _async_setup_entities(hass, config_entry, async_add_entities,
|
async def _async_setup_entities(hass, config_entry, async_add_entities,
|
||||||
discovery_infos):
|
discovery_infos):
|
||||||
"""Set up the ZHA binary sensors."""
|
"""Set up the ZHA binary sensors."""
|
||||||
|
from zigpy.zcl.clusters.general import OnOff
|
||||||
|
from zigpy.zcl.clusters.measurement import OccupancySensing
|
||||||
|
from zigpy.zcl.clusters.security import IasZone
|
||||||
|
|
||||||
entities = []
|
entities = []
|
||||||
for discovery_info in discovery_infos:
|
for discovery_info in discovery_infos:
|
||||||
from zigpy.zcl.clusters.general import OnOff
|
|
||||||
from zigpy.zcl.clusters.measurement import OccupancySensing
|
|
||||||
from zigpy.zcl.clusters.security import IasZone
|
|
||||||
if IasZone.cluster_id in discovery_info['in_clusters']:
|
if IasZone.cluster_id in discovery_info['in_clusters']:
|
||||||
entities.append(await _async_setup_iaszone(discovery_info))
|
entities.append(await _async_setup_iaszone(discovery_info))
|
||||||
elif OccupancySensing.cluster_id in discovery_info['in_clusters']:
|
elif OccupancySensing.cluster_id in discovery_info['in_clusters']:
|
||||||
entities.append(await _async_setup_occupancy(
|
entities.append(
|
||||||
DEVICE_CLASS_OCCUPANCY,
|
BinarySensor(DEVICE_CLASS_OCCUPANCY, **discovery_info))
|
||||||
discovery_info
|
|
||||||
))
|
|
||||||
elif OnOff.cluster_id in discovery_info['out_clusters']:
|
elif OnOff.cluster_id in discovery_info['out_clusters']:
|
||||||
entities.append(await _async_setup_remote(discovery_info))
|
entities.append(Remote(**discovery_info))
|
||||||
|
|
||||||
async_add_entities(entities, update_before_add=True)
|
async_add_entities(entities, update_before_add=True)
|
||||||
|
|
||||||
@ -97,21 +96,6 @@ async def _async_setup_iaszone(discovery_info):
|
|||||||
return IasZoneSensor(device_class, **discovery_info)
|
return IasZoneSensor(device_class, **discovery_info)
|
||||||
|
|
||||||
|
|
||||||
async def _async_setup_remote(discovery_info):
|
|
||||||
remote = Remote(**discovery_info)
|
|
||||||
|
|
||||||
if discovery_info['new_join']:
|
|
||||||
await remote.async_configure()
|
|
||||||
return remote
|
|
||||||
|
|
||||||
|
|
||||||
async def _async_setup_occupancy(device_class, discovery_info):
|
|
||||||
sensor = BinarySensor(device_class, **discovery_info)
|
|
||||||
if discovery_info['new_join']:
|
|
||||||
await sensor.async_configure()
|
|
||||||
return sensor
|
|
||||||
|
|
||||||
|
|
||||||
class IasZoneSensor(RestoreEntity, ZhaEntity, BinarySensorDevice):
|
class IasZoneSensor(RestoreEntity, ZhaEntity, BinarySensorDevice):
|
||||||
"""The IasZoneSensor Binary Sensor."""
|
"""The IasZoneSensor Binary Sensor."""
|
||||||
|
|
||||||
|
@ -70,10 +70,7 @@ async def _async_setup_entities(hass, config_entry, async_add_entities,
|
|||||||
"""Set up the ZHA fans."""
|
"""Set up the ZHA fans."""
|
||||||
entities = []
|
entities = []
|
||||||
for discovery_info in discovery_infos:
|
for discovery_info in discovery_infos:
|
||||||
fan = ZhaFan(**discovery_info)
|
entities.append(ZhaFan(**discovery_info))
|
||||||
if discovery_info['new_join']:
|
|
||||||
await fan.async_configure()
|
|
||||||
entities.append(fan)
|
|
||||||
|
|
||||||
async_add_entities(entities, update_before_add=True)
|
async_add_entities(entities, update_before_add=True)
|
||||||
|
|
||||||
|
@ -79,8 +79,6 @@ async def _async_setup_entities(hass, config_entry, async_add_entities,
|
|||||||
CAPABILITIES_COLOR_TEMP
|
CAPABILITIES_COLOR_TEMP
|
||||||
|
|
||||||
zha_light = Light(**discovery_info)
|
zha_light = Light(**discovery_info)
|
||||||
if discovery_info['new_join']:
|
|
||||||
await zha_light.async_configure()
|
|
||||||
entities.append(zha_light)
|
entities.append(zha_light)
|
||||||
|
|
||||||
async_add_entities(entities, update_before_add=True)
|
async_add_entities(entities, update_before_add=True)
|
||||||
|
@ -84,8 +84,6 @@ async def make_sensor(discovery_info):
|
|||||||
else:
|
else:
|
||||||
sensor = Sensor(**discovery_info)
|
sensor = Sensor(**discovery_info)
|
||||||
|
|
||||||
if discovery_info['new_join']:
|
|
||||||
await sensor.async_configure()
|
|
||||||
return sensor
|
return sensor
|
||||||
|
|
||||||
|
|
||||||
|
@ -46,10 +46,7 @@ async def _async_setup_entities(hass, config_entry, async_add_entities,
|
|||||||
"""Set up the ZHA switches."""
|
"""Set up the ZHA switches."""
|
||||||
entities = []
|
entities = []
|
||||||
for discovery_info in discovery_infos:
|
for discovery_info in discovery_infos:
|
||||||
switch = Switch(**discovery_info)
|
entities.append(Switch(**discovery_info))
|
||||||
if discovery_info['new_join']:
|
|
||||||
await switch.async_configure()
|
|
||||||
entities.append(switch)
|
|
||||||
|
|
||||||
async_add_entities(entities, update_before_add=True)
|
async_add_entities(entities, update_before_add=True)
|
||||||
|
|
||||||
@ -119,7 +116,7 @@ class Switch(ZhaEntity, SwitchDevice):
|
|||||||
|
|
||||||
async def async_update(self):
|
async def async_update(self):
|
||||||
"""Retrieve latest state."""
|
"""Retrieve latest state."""
|
||||||
result = await helpers.safe_read(self._endpoint.on_off,
|
result = await helpers.safe_read(self.cluster,
|
||||||
['on_off'],
|
['on_off'],
|
||||||
allow_cache=False,
|
allow_cache=False,
|
||||||
only_cache=(not self._initialized))
|
only_cache=(not self._initialized))
|
||||||
|
@ -4,7 +4,7 @@ Entity for Zigbee Home Automation.
|
|||||||
For more details about this component, please refer to the documentation at
|
For more details about this component, please refer to the documentation at
|
||||||
https://home-assistant.io/components/zha/
|
https://home-assistant.io/components/zha/
|
||||||
"""
|
"""
|
||||||
from asyncio import sleep
|
import asyncio
|
||||||
import logging
|
import logging
|
||||||
from random import uniform
|
from random import uniform
|
||||||
|
|
||||||
@ -25,7 +25,8 @@ class ZhaEntity(entity.Entity):
|
|||||||
_domain = None # Must be overridden by subclasses
|
_domain = None # Must be overridden by subclasses
|
||||||
|
|
||||||
def __init__(self, endpoint, in_clusters, out_clusters, manufacturer,
|
def __init__(self, endpoint, in_clusters, out_clusters, manufacturer,
|
||||||
model, application_listener, unique_id, **kwargs):
|
model, application_listener, unique_id, new_join=False,
|
||||||
|
**kwargs):
|
||||||
"""Init ZHA entity."""
|
"""Init ZHA entity."""
|
||||||
self._device_state_attributes = {}
|
self._device_state_attributes = {}
|
||||||
ieee = endpoint.device.ieee
|
ieee = endpoint.device.ieee
|
||||||
@ -54,6 +55,7 @@ class ZhaEntity(entity.Entity):
|
|||||||
self._endpoint = endpoint
|
self._endpoint = endpoint
|
||||||
self._in_clusters = in_clusters
|
self._in_clusters = in_clusters
|
||||||
self._out_clusters = out_clusters
|
self._out_clusters = out_clusters
|
||||||
|
self._new_join = new_join
|
||||||
self._state = None
|
self._state = None
|
||||||
self._unique_id = unique_id
|
self._unique_id = unique_id
|
||||||
|
|
||||||
@ -79,6 +81,9 @@ class ZhaEntity(entity.Entity):
|
|||||||
|
|
||||||
self._endpoint.device.zdo.add_listener(self)
|
self._endpoint.device.zdo.add_listener(self)
|
||||||
|
|
||||||
|
if self._new_join:
|
||||||
|
self.hass.async_create_task(self.async_configure())
|
||||||
|
|
||||||
self._initialized = True
|
self._initialized = True
|
||||||
|
|
||||||
async def async_configure(self):
|
async def async_configure(self):
|
||||||
@ -104,7 +109,7 @@ class ZhaEntity(entity.Entity):
|
|||||||
manufacturer=manufacturer
|
manufacturer=manufacturer
|
||||||
)
|
)
|
||||||
skip_bind = True
|
skip_bind = True
|
||||||
await sleep(uniform(0.1, 0.5))
|
await asyncio.sleep(uniform(0.1, 0.5))
|
||||||
_LOGGER.debug("%s: finished configuration", self.entity_id)
|
_LOGGER.debug("%s: finished configuration", self.entity_id)
|
||||||
|
|
||||||
def _get_cluster_from_report_config(self, cluster_key):
|
def _get_cluster_from_report_config(self, cluster_key):
|
||||||
@ -152,7 +157,7 @@ class ZhaEntity(entity.Entity):
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
return dict()
|
return {}
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def unique_id(self) -> str:
|
def unique_id(self) -> str:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user