From 07a0bc4abe5f3d337e90afd6421d2ce37d6f8000 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 68daee6cf26..4ac3e6cd379 100644 --- a/homeassistant/components/deconz/deconz_device.py +++ b/homeassistant/components/deconz/deconz_device.py @@ -91,8 +91,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 f59edf2b4b8..508ff673ad0 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1194,7 +1194,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 d7f44aed82b..fcd7b1df821 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -414,7 +414,7 @@ pycoolmasternet==0.0.4 pydaikin==1.6.1 # homeassistant.components.deconz -pydeconz==67 +pydeconz==68 # homeassistant.components.zwave pydispatcher==2.0.5