Skip to content

Commit 1904d8f

Browse files
committed
Fixes nugget#201
* Refactored Device.receive_message() to call _is_duplicate() for Direct ACK * Refactored Device._is_duplicate() to use Message.matches_pattern()
1 parent bef7dc1 commit 1904d8f

File tree

2 files changed

+25
-40
lines changed

2 files changed

+25
-40
lines changed

insteonplm/devices/__init__.py

+23-38
Original file line numberDiff line numberDiff line change
@@ -672,24 +672,26 @@ def receive_message(self, msg):
672672
_LOGGER.debug('DA queue: %s',
673673
self._sent_msg_wait_for_directACK)
674674
_LOGGER.debug('Message ACK with no callback')
675-
if (hasattr(msg, 'flags') and
676-
hasattr(msg.flags, 'isDirectACK') and
677-
msg.flags.isDirectACK):
678-
_LOGGER.debug('Got Direct ACK message. Already in queue: %d, '
679-
'Queueing %s:%s',
680-
self._directACK_received_queue.qsize(), id(msg), msg)
681-
if self._send_msg_lock.locked():
682-
self._directACK_received_queue.put_nowait(msg)
683-
else:
684-
_LOGGER.debug('But Direct ACK not expected')
675+
676+
685677
if not self._is_duplicate(msg):
678+
if (hasattr(msg, 'flags') and
679+
hasattr(msg.flags, 'isDirectACK') and
680+
msg.flags.isDirectACK):
681+
_LOGGER.debug('Got Direct ACK message. Already in queue: %d, '
682+
'Queueing %s:%s', self._directACK_received_queue.qsize(),
683+
id(msg), msg)
684+
if self._send_msg_lock.locked():
685+
self._directACK_received_queue.put_nowait(msg)
686+
else:
687+
_LOGGER.debug('But Direct ACK not expected')
688+
686689
callbacks = self._message_callbacks.get_callbacks_from_message(msg)
687690
for callback in callbacks:
688691
_LOGGER.debug('Scheduling msg callback: %s', callback)
689692
self._plm.loop.call_soon(callback, msg)
690693
else:
691-
_LOGGER.debug('msg is duplicate')
692-
_LOGGER.debug(msg)
694+
_LOGGER.debug('msg is duplicate: %s', id(msg))
693695
self._last_communication_received = datetime.datetime.now()
694696
_LOGGER.debug('Ending Device.receive_message')
695697

@@ -706,36 +708,19 @@ def _is_duplicate(self, msg):
706708
if msg_received >= (datetime.datetime.now() -
707709
datetime.timedelta(0, 0, 500000)):
708710
recent_messages.append(recent_message)
709-
if not recent_messages:
710-
self._save_recent_message(msg)
711-
return False
712711

712+
ret_val = False
713713
for recent_message in recent_messages:
714714
prev_msg = recent_message.get('msg')
715715
self._recent_messages.put_nowait(recent_message)
716-
prev_cmd1 = prev_msg.cmd1
717-
if prev_msg.flags.isAllLinkBroadcast:
718-
prev_group = prev_msg.target.bytes[2]
719-
elif prev_msg.flags.isAllLinkCleanup:
720-
prev_group = prev_msg.cmd2
721-
722-
if msg.flags.isAllLinkCleanup or msg.flags.isAllLinkBroadcast:
723-
cmd1 = msg.cmd1
724-
if msg.flags.isAllLinkBroadcast:
725-
group = msg.target.bytes[2]
726-
else:
727-
group = msg.cmd2
728-
if prev_cmd1 == cmd1 and prev_group == group:
729-
return True
730-
self._save_recent_message(msg)
731-
else:
732-
self._save_recent_message(msg)
733-
return False
734-
735-
def _save_recent_message(self, msg):
736-
recent_message = {"msg": msg,
737-
"received": datetime.datetime.now()}
738-
self._recent_messages.put_nowait(recent_message)
716+
if msg.matches_pattern(prev_msg):
717+
ret_val = True
718+
719+
self._recent_messages.put_nowait(
720+
{"msg": msg,
721+
"received": datetime.datetime.now()
722+
})
723+
return ret_val
739724

740725
def _send_msg(self, msg, callback=None, on_timeout=False):
741726
_LOGGER.debug('Starting %s Device._send_msg: Queuing message',

insteonplm/plm.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -472,8 +472,8 @@ async def _wait_ack_nak(self, msg):
472472
with async_timeout.timeout(ACKNAK_TIMEOUT):
473473
while not is_ack_nak:
474474
acknak = await self._acknak_queue.get()
475-
_LOGGER.debug('Processing _acknak_queue acknak: %s:%s msg'
476-
': %s:%s', id(acknak), acknak, id(msg), msg)
475+
_LOGGER.debug('Processing _acknak_queue acknak: %s msg: %s',
476+
id(acknak), id(msg))
477477
is_ack_nak = self._msg_is_ack_nak(msg, acknak)
478478
is_sent = self._msg_is_sent(acknak)
479479
except asyncio.TimeoutError:

0 commit comments

Comments
 (0)