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]) 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