From 39f9d164db6fae4aeb199b1b85488b72e93918bc Mon Sep 17 00:00:00 2001 From: Stefan Agner Date: Fri, 7 Jun 2024 18:32:56 +0200 Subject: [PATCH] Call TriggerResubscribeIfScheduled on mDNS re-discovery If we have active subscriptions, and we re-discover the device through mDNS, we can ask the SDK to re-subscribe to the device immediately. This should make device to be available quicker when they come back online. --- matter_server/server/device_controller.py | 9 +++++++++ matter_server/server/sdk.py | 11 +++++++++++ 2 files changed, 20 insertions(+) diff --git a/matter_server/server/device_controller.py b/matter_server/server/device_controller.py index a8d0c6be..2a55a0b4 100644 --- a/matter_server/server/device_controller.py +++ b/matter_server/server/device_controller.py @@ -1301,6 +1301,15 @@ def _on_mdns_operational_node_state( elif (now - last_seen) > NODE_MDNS_BACKOFF: # node came back online after being offline for a while or restarted logger.info("Node %s re-discovered on MDNS", node_id) + elif state_change == ServiceStateChange.Added: + # Trigger node re-subscriptions when mDNS entry got added + logger.info("Node %s activity on MDNS, trigger resubscribe", node_id) + asyncio.create_task( + self._chip_device_controller.trigger_resubscribe_if_scheduled( + node_id, "mDNS state change detected" + ) + ) + return else: # ignore all other cases return diff --git a/matter_server/server/sdk.py b/matter_server/server/sdk.py index 38478804..a2a54e2f 100644 --- a/matter_server/server/sdk.py +++ b/matter_server/server/sdk.py @@ -396,3 +396,14 @@ async def shutdown_subscription(self, node_id: int) -> None: def node_has_subscription(self, node_id: int) -> bool: """Check if a node has an active subscription.""" return node_id in self._subscriptions + + async def trigger_resubscribe_if_scheduled(self, node_id: int, reason: str) -> None: + """Trigger resubscribe now if a resubscribe is scheduled. + + If the ReadClient currently has a resubscription attempt scheduled, This + function allows to trigger that attempt immediately. This is useful + when the server side is up and communicating, and it's a good time to + try to resubscribe. + """ + if sub := self._subscriptions.get(node_id, None): + await sub.TriggerResubscribeIfScheduled(reason)