Add configure_reporting() method to zha component (#16487)
* Add zha.configure_reporting() method. Binds a cluster and configures reporting for the specified attribute. * git add homeassistant/components/binary_sensor/zha.py * Refactor sensor.zha to use new 'configure_reporting() method. * Zha configure reporting - switch (#1) * use configure_reporting for zha switch * lint fixes * Rename variables/classes to properly reflect the content
This commit is contained in:
parent
1586d3000c
commit
f2203e52ef
4 changed files with 66 additions and 24 deletions
|
@ -65,28 +65,25 @@ async def _async_setup_iaszone(hass, config, async_add_entities,
|
||||||
async def _async_setup_remote(hass, config, async_add_entities,
|
async def _async_setup_remote(hass, config, async_add_entities,
|
||||||
discovery_info):
|
discovery_info):
|
||||||
|
|
||||||
async def safe(coro):
|
remote = Remote(**discovery_info)
|
||||||
"""Run coro, catching ZigBee delivery errors, and ignoring them."""
|
|
||||||
import zigpy.exceptions
|
|
||||||
try:
|
|
||||||
await coro
|
|
||||||
except zigpy.exceptions.DeliveryError as exc:
|
|
||||||
_LOGGER.warning("Ignoring error during setup: %s", exc)
|
|
||||||
|
|
||||||
if discovery_info['new_join']:
|
if discovery_info['new_join']:
|
||||||
from zigpy.zcl.clusters.general import OnOff, LevelControl
|
from zigpy.zcl.clusters.general import OnOff, LevelControl
|
||||||
out_clusters = discovery_info['out_clusters']
|
out_clusters = discovery_info['out_clusters']
|
||||||
if OnOff.cluster_id in out_clusters:
|
if OnOff.cluster_id in out_clusters:
|
||||||
cluster = out_clusters[OnOff.cluster_id]
|
cluster = out_clusters[OnOff.cluster_id]
|
||||||
await safe(cluster.bind())
|
await zha.configure_reporting(
|
||||||
await safe(cluster.configure_reporting(0, 0, 600, 1))
|
remote.entity_id, cluster, 0, min_report=0, max_report=600,
|
||||||
|
reportable_change=1
|
||||||
|
)
|
||||||
if LevelControl.cluster_id in out_clusters:
|
if LevelControl.cluster_id in out_clusters:
|
||||||
cluster = out_clusters[LevelControl.cluster_id]
|
cluster = out_clusters[LevelControl.cluster_id]
|
||||||
await safe(cluster.bind())
|
await zha.configure_reporting(
|
||||||
await safe(cluster.configure_reporting(0, 1, 600, 1))
|
remote.entity_id, cluster, 0, min_report=1, max_report=600,
|
||||||
|
reportable_change=1
|
||||||
|
)
|
||||||
|
|
||||||
sensor = Switch(**discovery_info)
|
async_add_entities([remote], update_before_add=True)
|
||||||
async_add_entities([sensor], update_before_add=True)
|
|
||||||
|
|
||||||
|
|
||||||
class BinarySensor(zha.Entity, BinarySensorDevice):
|
class BinarySensor(zha.Entity, BinarySensorDevice):
|
||||||
|
@ -131,7 +128,7 @@ class BinarySensor(zha.Entity, BinarySensorDevice):
|
||||||
|
|
||||||
async def async_update(self):
|
async def async_update(self):
|
||||||
"""Retrieve latest state."""
|
"""Retrieve latest state."""
|
||||||
from bellows.types.basic import uint16_t
|
from zigpy.types.basic import uint16_t
|
||||||
|
|
||||||
result = await zha.safe_read(self._endpoint.ias_zone,
|
result = await zha.safe_read(self._endpoint.ias_zone,
|
||||||
['zone_status'],
|
['zone_status'],
|
||||||
|
@ -141,7 +138,7 @@ class BinarySensor(zha.Entity, BinarySensorDevice):
|
||||||
self._state = result.get('zone_status', self._state) & 3
|
self._state = result.get('zone_status', self._state) & 3
|
||||||
|
|
||||||
|
|
||||||
class Switch(zha.Entity, BinarySensorDevice):
|
class Remote(zha.Entity, BinarySensorDevice):
|
||||||
"""ZHA switch/remote controller/button."""
|
"""ZHA switch/remote controller/button."""
|
||||||
|
|
||||||
_domain = DOMAIN
|
_domain = DOMAIN
|
||||||
|
|
|
@ -57,9 +57,9 @@ def make_sensor(discovery_info):
|
||||||
|
|
||||||
if discovery_info['new_join']:
|
if discovery_info['new_join']:
|
||||||
cluster = list(in_clusters.values())[0]
|
cluster = list(in_clusters.values())[0]
|
||||||
yield from cluster.bind()
|
yield from zha.configure_reporting(
|
||||||
yield from cluster.configure_reporting(
|
sensor.entity_id, cluster, sensor.value_attribute,
|
||||||
sensor.value_attribute, 300, 600, sensor.min_reportable_change,
|
reportable_change=sensor.min_reportable_change
|
||||||
)
|
)
|
||||||
|
|
||||||
return sensor
|
return sensor
|
||||||
|
|
|
@ -17,17 +17,23 @@ DEPENDENCIES = ['zha']
|
||||||
async def async_setup_platform(hass, config, async_add_entities,
|
async def async_setup_platform(hass, config, async_add_entities,
|
||||||
discovery_info=None):
|
discovery_info=None):
|
||||||
"""Set up the Zigbee Home Automation switches."""
|
"""Set up the Zigbee Home Automation switches."""
|
||||||
|
from zigpy.zcl.clusters.general import OnOff
|
||||||
|
|
||||||
discovery_info = zha.get_discovery_info(hass, discovery_info)
|
discovery_info = zha.get_discovery_info(hass, discovery_info)
|
||||||
if discovery_info is None:
|
if discovery_info is None:
|
||||||
return
|
return
|
||||||
|
|
||||||
from zigpy.zcl.clusters.general import OnOff
|
switch = Switch(**discovery_info)
|
||||||
|
|
||||||
|
if discovery_info['new_join']:
|
||||||
in_clusters = discovery_info['in_clusters']
|
in_clusters = discovery_info['in_clusters']
|
||||||
cluster = in_clusters[OnOff.cluster_id]
|
cluster = in_clusters[OnOff.cluster_id]
|
||||||
await cluster.bind()
|
await zha.configure_reporting(
|
||||||
await cluster.configure_reporting(0, 0, 600, 1,)
|
switch.entity_id, cluster, switch.value_attribute,
|
||||||
|
min_report=0, max_report=600, reportable_change=1
|
||||||
|
)
|
||||||
|
|
||||||
async_add_entities([Switch(**discovery_info)], update_before_add=True)
|
async_add_entities([switch], update_before_add=True)
|
||||||
|
|
||||||
|
|
||||||
class Switch(zha.Entity, SwitchDevice):
|
class Switch(zha.Entity, SwitchDevice):
|
||||||
|
|
|
@ -399,3 +399,42 @@ async def safe_read(cluster, attributes, allow_cache=True):
|
||||||
return result
|
return result
|
||||||
except Exception: # pylint: disable=broad-except
|
except Exception: # pylint: disable=broad-except
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
|
|
||||||
|
async def configure_reporting(entity_id, cluster, attr, skip_bind=False,
|
||||||
|
min_report=300, max_report=900,
|
||||||
|
reportable_change=1):
|
||||||
|
"""Configure attribute reporting for a cluster.
|
||||||
|
|
||||||
|
while swallowing the DeliverError exceptions in case of unreachable
|
||||||
|
devices.
|
||||||
|
"""
|
||||||
|
from zigpy.exceptions import DeliveryError
|
||||||
|
|
||||||
|
attr_name = cluster.attributes.get(attr, [attr])[0]
|
||||||
|
cluster_name = cluster.ep_attribute
|
||||||
|
if not skip_bind:
|
||||||
|
try:
|
||||||
|
res = await cluster.bind()
|
||||||
|
_LOGGER.debug(
|
||||||
|
"%s: bound '%s' cluster: %s", entity_id, cluster_name, res[0]
|
||||||
|
)
|
||||||
|
except DeliveryError as ex:
|
||||||
|
_LOGGER.debug(
|
||||||
|
"%s: Failed to bind '%s' cluster: %s",
|
||||||
|
entity_id, cluster_name, str(ex)
|
||||||
|
)
|
||||||
|
|
||||||
|
try:
|
||||||
|
res = await cluster.configure_reporting(attr, min_report,
|
||||||
|
max_report, reportable_change)
|
||||||
|
_LOGGER.debug(
|
||||||
|
"%s: reporting '%s' attr on '%s' cluster: %d/%d/%d: Status: %s",
|
||||||
|
entity_id, attr_name, cluster_name, min_report, max_report,
|
||||||
|
reportable_change, res[0][0].status
|
||||||
|
)
|
||||||
|
except DeliveryError as ex:
|
||||||
|
_LOGGER.debug(
|
||||||
|
"%s: failed to set reporting for '%s' attr on '%s' cluster: %s",
|
||||||
|
entity_id, attr_name, cluster_name, str(ex)
|
||||||
|
)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue