Skip to content

Commit

Permalink
Merge pull request #521 from tstabrawa/refresh-pileup
Browse files Browse the repository at this point in the history
Don't let refresh requests pile up while not awake
  • Loading branch information
krkeegan authored Sep 7, 2023
2 parents bcd34c0 + 38b99a3 commit f11f091
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 0 deletions.
11 changes: 11 additions & 0 deletions insteon_mqtt/device/BatterySensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -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])

Expand Down
19 changes: 19 additions & 0 deletions tests/device/test_BatterySensorDev.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit f11f091

Please sign in to comment.