Skip to content

Commit ec4194c

Browse files
authored
Tweak subscription ceiling based on routing role (#619)
1 parent 16961b0 commit ec4194c

File tree

1 file changed

+18
-22
lines changed

1 file changed

+18
-22
lines changed

matter_server/server/device_controller.py

+18-22
Original file line numberDiff line numberDiff line change
@@ -63,16 +63,15 @@
6363
DATA_KEY_LAST_NODE_ID = "last_node_id"
6464

6565
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
7069
MAX_COMMISSION_RETRIES = 3
7170
NODE_RESUBSCRIBE_ATTEMPTS_UNAVAILABLE = 3
7271
NODE_RESUBSCRIBE_TIMEOUT_OFFLINE = 30 * 60 * 1000
7372
NODE_PING_TIMEOUT = 10
7473
NODE_PING_TIMEOUT_BATTERY_POWERED = 60
75-
NODE_MDNS_BACKOFF = 300
74+
NODE_MDNS_BACKOFF = 610 # must be higher than (highest) sub ceiling
7675
FALLBACK_NODE_SCANNER_INTERVAL = 1800
7776

7877
MDNS_TYPE_OPERATIONAL_NODE = "_matter._tcp.local."
@@ -842,13 +841,6 @@ async def _subscribe_node(self, node_id: int) -> None:
842841
await self._call_sdk(prev_sub.Shutdown)
843842
del self._subscriptions[node_id]
844843

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-
852844
loop = cast(asyncio.AbstractEventLoop, self.server.loop)
853845

854846
# set-up the actual subscription
@@ -927,6 +919,7 @@ def event_callback(
927919
node_logger.debug(
928920
"Received node event: %s - transaction: %s", data, transaction
929921
)
922+
self._node_last_seen[node_id] = time.time()
930923
node_event = MatterNodeEvent(
931924
node_id=node_id,
932925
endpoint_id=data.Header.EndpointId,
@@ -994,16 +987,19 @@ def resubscription_succeeded(
994987

995988
node_logger.info("Setting up attributes and events subscription.")
996989
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
10071003
self._last_subscription_attempt[node_id] = 0
10081004
sub: Attribute.SubscriptionTransaction = await self.chip_controller.Read(
10091005
node_id,

0 commit comments

Comments
 (0)