From 0f8575f9392b33230ec6c2e0d6fe6f0e043edf8c Mon Sep 17 00:00:00 2001 From: "David F. Mulcahey" Date: Thu, 21 Feb 2019 08:20:58 -0500 Subject: [PATCH] Fix ZHA bugs (#21246) * fix bugs * add comment * allow entities to be marked unavailable --- .../components/zha/core/channels/general.py | 4 +++- homeassistant/components/zha/core/device.py | 10 +++++----- homeassistant/components/zha/core/gateway.py | 13 +++++++++++-- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/homeassistant/components/zha/core/channels/general.py b/homeassistant/components/zha/core/channels/general.py index a29b23d340b..621b0ccbee1 100644 --- a/homeassistant/components/zha/core/channels/general.py +++ b/homeassistant/components/zha/core/channels/general.py @@ -126,9 +126,11 @@ class LevelControlChannel(ZigbeeChannel): class BasicChannel(ZigbeeChannel): """Channel to interact with the basic cluster.""" + UNKNOWN = 0 BATTERY = 3 + POWER_SOURCES = { - 0: 'Unknown', + UNKNOWN: 'Unknown', 1: 'Mains (single phase)', 2: 'Mains (3 phase)', BATTERY: 'Battery', diff --git a/homeassistant/components/zha/core/device.py b/homeassistant/components/zha/core/device.py index 12bb397fbc3..1ee800d8559 100644 --- a/homeassistant/components/zha/core/device.py +++ b/homeassistant/components/zha/core/device.py @@ -146,11 +146,11 @@ class ZHADevice: self._available_signal, False ) - async_dispatcher_send( - self.hass, - "{}_{}".format(self._available_signal, 'entity'), - True - ) + async_dispatcher_send( + self.hass, + "{}_{}".format(self._available_signal, 'entity'), + available + ) self._available = available @property diff --git a/homeassistant/components/zha/core/gateway.py b/homeassistant/components/zha/core/gateway.py index a50bfeae1be..cb5e5bf7774 100644 --- a/homeassistant/components/zha/core/gateway.py +++ b/homeassistant/components/zha/core/gateway.py @@ -36,6 +36,7 @@ _LOGGER = logging.getLogger(__name__) SENSOR_TYPES = {} BINARY_SENSOR_TYPES = {} +SMARTTHINGS_HUMIDITY_CLUSTER = 64581 EntityReference = collections.namedtuple( 'EntityReference', 'reference_id zha_device cluster_channels device_info') @@ -174,7 +175,8 @@ class ZHAGateway: # available and we already loaded fresh state above zha_device.update_available(True) elif not zha_device.available and zha_device.power_source is not None\ - and zha_device.power_source != BasicChannel.BATTERY: + and zha_device.power_source != BasicChannel.BATTERY\ + and zha_device.power_source != BasicChannel.UNKNOWN: # the device is currently marked unavailable and it isn't a battery # powered device so we should be able to update it now _LOGGER.debug( @@ -380,7 +382,10 @@ async def _handle_single_cluster_match(hass, zha_device, cluster, device_key, """Dispatch a single cluster match to a HA component.""" component = None # sub_component = None for cluster_type, candidate_component in device_classes.items(): - if isinstance(cluster, cluster_type): + if isinstance(cluster_type, int): + if cluster.cluster_id == cluster_type: + component = candidate_component + elif isinstance(cluster, cluster_type): component = candidate_component break @@ -473,6 +478,9 @@ def establish_device_mappings(): SINGLE_INPUT_CLUSTER_DEVICE_CLASS.update({ zcl.clusters.general.OnOff: 'switch', zcl.clusters.measurement.RelativeHumidity: 'sensor', + # this works for now but if we hit conflicts we can break it out to + # a different dict that is keyed by manufacturer + SMARTTHINGS_HUMIDITY_CLUSTER: 'sensor', zcl.clusters.measurement.TemperatureMeasurement: 'sensor', zcl.clusters.measurement.PressureMeasurement: 'sensor', zcl.clusters.measurement.IlluminanceMeasurement: 'sensor', @@ -489,6 +497,7 @@ def establish_device_mappings(): SENSOR_TYPES.update({ zcl.clusters.measurement.RelativeHumidity.cluster_id: HUMIDITY, + SMARTTHINGS_HUMIDITY_CLUSTER: HUMIDITY, zcl.clusters.measurement.TemperatureMeasurement.cluster_id: TEMPERATURE, zcl.clusters.measurement.PressureMeasurement.cluster_id: PRESSURE,