|
63 | 63 | DATA_KEY_LAST_NODE_ID = "last_node_id"
|
64 | 64 |
|
65 | 65 | LOGGER = logging.getLogger(__name__)
|
66 |
| -MIN_NODE_SUBSCRIPTION_CEILING = 30 |
67 |
| -MAX_NODE_SUBSCRIPTION_CEILING = 300 |
68 |
| -MIN_NODE_SUBSCRIPTION_CEILING_BATTERY_POWERED = 300 |
69 |
| -MAX_NODE_SUBSCRIPTION_CEILING_BATTERY_POWERED = 1800 |
| 66 | +NODE_SUBSCRIPTION_CEILING_WIFI = 30 |
| 67 | +NODE_SUBSCRIPTION_CEILING_THREAD = 60 |
| 68 | +NODE_SUBSCRIPTION_CEILING_BATTERY_POWERED = 600 |
70 | 69 | MAX_COMMISSION_RETRIES = 3
|
71 | 70 | NODE_RESUBSCRIBE_ATTEMPTS_UNAVAILABLE = 3
|
72 | 71 | NODE_RESUBSCRIBE_TIMEOUT_OFFLINE = 30 * 60 * 1000
|
73 | 72 | NODE_PING_TIMEOUT = 10
|
74 | 73 | NODE_PING_TIMEOUT_BATTERY_POWERED = 60
|
75 |
| -NODE_MDNS_BACKOFF = 300 |
| 74 | +NODE_MDNS_BACKOFF = 610 # must be higher than (highest) sub ceiling |
76 | 75 | FALLBACK_NODE_SCANNER_INTERVAL = 1800
|
77 | 76 |
|
78 | 77 | MDNS_TYPE_OPERATIONAL_NODE = "_matter._tcp.local."
|
@@ -842,13 +841,6 @@ async def _subscribe_node(self, node_id: int) -> None:
|
842 | 841 | await self._call_sdk(prev_sub.Shutdown)
|
843 | 842 | del self._subscriptions[node_id]
|
844 | 843 |
|
845 |
| - # determine if node is battery powered sleeping device |
846 |
| - # Endpoint 0, ThreadNetworkDiagnostics Cluster, routingRole attribute |
847 |
| - battery_powered = ( |
848 |
| - node.attributes.get(ROUTING_ROLE_ATTRIBUTE_PATH, 0) |
849 |
| - == Clusters.ThreadNetworkDiagnostics.Enums.RoutingRoleEnum.kSleepyEndDevice |
850 |
| - ) |
851 |
| - |
852 | 844 | loop = cast(asyncio.AbstractEventLoop, self.server.loop)
|
853 | 845 |
|
854 | 846 | # set-up the actual subscription
|
@@ -927,6 +919,7 @@ def event_callback(
|
927 | 919 | node_logger.debug(
|
928 | 920 | "Received node event: %s - transaction: %s", data, transaction
|
929 | 921 | )
|
| 922 | + self._node_last_seen[node_id] = time.time() |
930 | 923 | node_event = MatterNodeEvent(
|
931 | 924 | node_id=node_id,
|
932 | 925 | endpoint_id=data.Header.EndpointId,
|
@@ -994,16 +987,19 @@ def resubscription_succeeded(
|
994 | 987 |
|
995 | 988 | node_logger.info("Setting up attributes and events subscription.")
|
996 | 989 | interval_floor = 0
|
997 |
| - interval_ceiling = ( |
998 |
| - randint( # noqa: S311 |
999 |
| - MIN_NODE_SUBSCRIPTION_CEILING_BATTERY_POWERED, |
1000 |
| - MAX_NODE_SUBSCRIPTION_CEILING_BATTERY_POWERED, |
1001 |
| - ) |
1002 |
| - if battery_powered |
1003 |
| - else randint( # noqa: S311 |
1004 |
| - MIN_NODE_SUBSCRIPTION_CEILING, MAX_NODE_SUBSCRIPTION_CEILING |
1005 |
| - ) |
1006 |
| - ) |
| 990 | + # determine subscription ceiling based on routing role |
| 991 | + # Endpoint 0, ThreadNetworkDiagnostics Cluster, routingRole attribute |
| 992 | + # for WiFi devices, this cluster doesn't exist. |
| 993 | + routing_role = node.attributes.get(ROUTING_ROLE_ATTRIBUTE_PATH) |
| 994 | + if routing_role is None: |
| 995 | + interval_ceiling = NODE_SUBSCRIPTION_CEILING_WIFI |
| 996 | + elif ( |
| 997 | + routing_role |
| 998 | + == Clusters.ThreadNetworkDiagnostics.Enums.RoutingRoleEnum.kSleepyEndDevice |
| 999 | + ): |
| 1000 | + interval_ceiling = NODE_SUBSCRIPTION_CEILING_BATTERY_POWERED |
| 1001 | + else: |
| 1002 | + interval_ceiling = NODE_SUBSCRIPTION_CEILING_THREAD |
1007 | 1003 | self._last_subscription_attempt[node_id] = 0
|
1008 | 1004 | sub: Attribute.SubscriptionTransaction = await self.chip_controller.Read(
|
1009 | 1005 | node_id,
|
|
0 commit comments