From 5c4e2eee83ba98107eeeaca6e5fbc43c664a4973 Mon Sep 17 00:00:00 2001 From: tstabrawa <59430211+tstabrawa@users.noreply.github.com> Date: Wed, 16 Aug 2023 23:37:04 -0500 Subject: [PATCH 1/2] Add test for multiple queued refresh requests We'd like for only the most recent refresh request to be queued. --- tests/device/test_BatterySensorDev.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/device/test_BatterySensorDev.py b/tests/device/test_BatterySensorDev.py index ba5a2360..80e1f2fb 100644 --- a/tests/device/test_BatterySensorDev.py +++ b/tests/device/test_BatterySensorDev.py @@ -133,3 +133,22 @@ def on_done(*args): assert len(test_device.protocol.sent) == 1 assert len(test_device._send_queue) == 0 assert msg_handler._num_retry > 0 + + def test_queued_refresh_replace(self, test_device): + # Queue multiple refresh commands + msg1 = Msg.OutStandard.direct(test_device.addr, 0x19, 0x00) + msg2 = Msg.OutStandard.direct(test_device.addr, 0x19, 0x00) + msg3 = Msg.OutStandard.direct(test_device.addr, 0x19, 0x00) + msg_handler1 = IM.handler.StandardCmd(msg1, None, None) + msg_handler2 = IM.handler.StandardCmd(msg2, None, None) + msg_handler3 = IM.handler.StandardCmd(msg3, None, None) + test_device.send(msg1, msg_handler1) + test_device.send(msg2, msg_handler2) + test_device.send(msg3, msg_handler3) + # Confirm that only the last command is queued + assert len(test_device._send_queue) == 1 + m, h, p, a = test_device._send_queue[0] + assert m != msg1 + assert m == msg3 + assert h != msg_handler1 + assert h == msg_handler3 From 38b99a3023df818fd7471ebd402f615dbe74339d Mon Sep 17 00:00:00 2001 From: tstabrawa <59430211+tstabrawa@users.noreply.github.com> Date: Wed, 16 Aug 2023 23:37:16 -0500 Subject: [PATCH 2/2] Don't let refresh requests pile up while not awake --- insteon_mqtt/device/BatterySensor.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/insteon_mqtt/device/BatterySensor.py b/insteon_mqtt/device/BatterySensor.py index 02b5c1ab..06825e9e 100644 --- a/insteon_mqtt/device/BatterySensor.py +++ b/insteon_mqtt/device/BatterySensor.py @@ -115,6 +115,17 @@ def send(self, msg, msg_handler, high_priority=False, after=None): if self._awake_time >= (time.time() - 180): super().send(msg, msg_handler, high_priority, after) else: + # Don't let refresh requests pile up while not awake. Better to + # replace old requests with new ones as they come in. + if str(msg) == str(Msg.OutStandard.direct(self.addr, 0x19, 0x00)): + for i in range(len(self._send_queue)): + if str(msg) == str(self._send_queue[i][0]): + LOG.ui("BatterySensor %s - replacing previously-queued" + " refresh request (device not awake)", + self.label) + self._send_queue[i] = [msg, msg_handler, + high_priority, after] + return LOG.ui("BatterySensor %s - queueing msg until awake", self.label) self._send_queue.append([msg, msg_handler, high_priority, after])