From c9db21ffac81fcf9dc035233b3734533f0667c33 Mon Sep 17 00:00:00 2001 From: Robert Svensson Date: Sat, 18 Jan 2020 00:33:46 +0100 Subject: [PATCH] Fix service device refresh calling state update (#30920) --- .../components/deconz/binary_sensor.py | 8 ++++--- .../components/deconz/deconz_device.py | 5 +++- .../components/deconz/deconz_event.py | 24 +++++++++++-------- homeassistant/components/deconz/manifest.json | 10 +++++--- homeassistant/components/deconz/sensor.py | 18 ++++++++------ homeassistant/components/deconz/services.py | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 8 files changed, 44 insertions(+), 27 deletions(-) diff --git a/homeassistant/components/deconz/binary_sensor.py b/homeassistant/components/deconz/binary_sensor.py index 6261473bb0e..225a28f52f8 100644 --- a/homeassistant/components/deconz/binary_sensor.py +++ b/homeassistant/components/deconz/binary_sensor.py @@ -54,11 +54,13 @@ class DeconzBinarySensor(DeconzDevice, BinarySensorDevice): """Representation of a deCONZ binary sensor.""" @callback - def async_update_callback(self, force_update=False): + def async_update_callback(self, force_update=False, ignore_update=False): """Update the sensor's state.""" - changed = set(self._device.changed_keys) + if ignore_update: + return + keys = {"on", "reachable", "state"} - if force_update or any(key in changed for key in keys): + if force_update or self._device.changed_keys.intersection(keys): self.async_schedule_update_ha_state() @property diff --git a/homeassistant/components/deconz/deconz_device.py b/homeassistant/components/deconz/deconz_device.py index a9a1e2cdb1f..06756bb49f6 100644 --- a/homeassistant/components/deconz/deconz_device.py +++ b/homeassistant/components/deconz/deconz_device.py @@ -97,8 +97,11 @@ class DeconzDevice(DeconzBase, Entity): unsub_dispatcher() @callback - def async_update_callback(self, force_update=False): + def async_update_callback(self, force_update=False, ignore_update=False): """Update the device's state.""" + if ignore_update: + return + self.async_schedule_update_ha_state() @property diff --git a/homeassistant/components/deconz/deconz_event.py b/homeassistant/components/deconz/deconz_event.py index 3c2442994a5..527e8d2ab7a 100644 --- a/homeassistant/components/deconz/deconz_event.py +++ b/homeassistant/components/deconz/deconz_event.py @@ -39,17 +39,21 @@ class DeconzEvent(DeconzBase): self._device = None @callback - def async_update_callback(self, force_update=False): + def async_update_callback(self, force_update=False, ignore_update=False): """Fire the event if reason is that state is updated.""" - if "state" in self._device.changed_keys: - data = { - CONF_ID: self.event_id, - CONF_UNIQUE_ID: self.serial, - CONF_EVENT: self._device.state, - } - if self._device.gesture: - data[CONF_GESTURE] = self._device.gesture - self.gateway.hass.bus.async_fire(CONF_DECONZ_EVENT, data) + if ignore_update or "state" not in self._device.changed_keys: + return + + data = { + CONF_ID: self.event_id, + CONF_UNIQUE_ID: self.serial, + CONF_EVENT: self._device.state, + } + + if self._device.gesture: + data[CONF_GESTURE] = self._device.gesture + + self.gateway.hass.bus.async_fire(CONF_DECONZ_EVENT, data) async def async_update_device_registry(self): """Update device registry.""" diff --git a/homeassistant/components/deconz/manifest.json b/homeassistant/components/deconz/manifest.json index a327d7106fc..f448e9105c8 100644 --- a/homeassistant/components/deconz/manifest.json +++ b/homeassistant/components/deconz/manifest.json @@ -3,13 +3,17 @@ "name": "deCONZ", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/deconz", - "requirements": ["pydeconz==67"], + "requirements": [ + "pydeconz==68" + ], "ssdp": [ { "manufacturer": "Royal Philips Electronics" } ], "dependencies": [], - "codeowners": ["@kane610"], + "codeowners": [ + "@kane610" + ], "quality_scale": "platinum" -} +} \ No newline at end of file diff --git a/homeassistant/components/deconz/sensor.py b/homeassistant/components/deconz/sensor.py index 8194dd145dc..8261f03e902 100644 --- a/homeassistant/components/deconz/sensor.py +++ b/homeassistant/components/deconz/sensor.py @@ -97,11 +97,13 @@ class DeconzSensor(DeconzDevice): """Representation of a deCONZ sensor.""" @callback - def async_update_callback(self, force_update=False): + def async_update_callback(self, force_update=False, ignore_update=False): """Update the sensor's state.""" - changed = set(self._device.changed_keys) + if ignore_update: + return + keys = {"on", "reachable", "state"} - if force_update or any(key in changed for key in keys): + if force_update or self._device.changed_keys.intersection(keys): self.async_schedule_update_ha_state() @property @@ -155,11 +157,13 @@ class DeconzBattery(DeconzDevice): """Battery class for when a device is only represented as an event.""" @callback - def async_update_callback(self, force_update=False): + def async_update_callback(self, force_update=False, ignore_update=False): """Update the battery's state, if needed.""" - changed = set(self._device.changed_keys) + if ignore_update: + return + keys = {"battery", "reachable"} - if force_update or any(key in changed for key in keys): + if force_update or self._device.changed_keys.intersection(keys): self.async_schedule_update_ha_state() @property @@ -217,7 +221,7 @@ class DeconzSensorStateTracker: self.sensor = None @callback - def async_update_callback(self): + def async_update_callback(self, ignore_update=False): """Sensor state updated.""" if "battery" in self.sensor.changed_keys: async_dispatcher_send( diff --git a/homeassistant/components/deconz/services.py b/homeassistant/components/deconz/services.py index f20ff65c434..f893b9880fd 100644 --- a/homeassistant/components/deconz/services.py +++ b/homeassistant/components/deconz/services.py @@ -127,7 +127,7 @@ async def async_refresh_devices_service(hass, data): scenes = set(gateway.api.scenes.keys()) sensors = set(gateway.api.sensors.keys()) - await gateway.api.refresh_state() + await gateway.api.refresh_state(ignore_update=True) gateway.async_add_device_callback( NEW_GROUP, diff --git a/requirements_all.txt b/requirements_all.txt index d726862f290..cc3b6d733c9 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1188,7 +1188,7 @@ pydaikin==1.6.1 pydanfossair==0.1.0 # homeassistant.components.deconz -pydeconz==67 +pydeconz==68 # homeassistant.components.delijn pydelijn==0.5.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index c87df849389..0ae6225c7a3 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -417,7 +417,7 @@ pycoolmasternet==0.0.4 pydaikin==1.6.1 # homeassistant.components.deconz -pydeconz==67 +pydeconz==68 # homeassistant.components.zwave pydispatcher==2.0.5