From d8248333e2b076bc8ead561979393d13cea59323 Mon Sep 17 00:00:00 2001 From: Marcel van der Veldt Date: Wed, 7 Feb 2024 14:01:32 +0100 Subject: [PATCH 1/3] Fix networkname retrieval for some wifi devices --- matter_server/client/client.py | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/matter_server/client/client.py b/matter_server/client/client.py index c0fb8358..397f9575 100644 --- a/matter_server/client/client.py +++ b/matter_server/client/client.py @@ -1,4 +1,5 @@ """Matter Client implementation.""" + from __future__ import annotations import asyncio @@ -9,6 +10,7 @@ from aiohttp import ClientSession from chip.clusters import Objects as Clusters +from chip.clusters.Types import NullValue from matter_server.common.errors import ERROR_MAP, NodeNotExists @@ -257,6 +259,7 @@ async def ping_node(self, node_id: int) -> NodePingResult: async def node_diagnostics(self, node_id: int) -> NodeDiagnostics: """Gather diagnostics for the given node.""" + # pylint: disable=too-many-statements node = self.get_node(node_id) # grab some details from the first (operational) network interface network_type = NetworkType.UNKNOWN @@ -306,7 +309,7 @@ async def node_diagnostics(self, node_id: int) -> NodeDiagnostics: ) if isinstance(thread_cluster.networkName, bytes): network_name = thread_cluster.networkName.decode("utf-8") - else: + elif thread_cluster.networkName != NullValue: network_name = thread_cluster.networkName # parse routing role to (diagnostics) node type if ( @@ -336,10 +339,28 @@ async def node_diagnostics(self, node_id: int) -> NodeDiagnostics: attribute=Clusters.NetworkCommissioning.Attributes.LastNetworkID, ) ): + node.get_cluster(0, Clusters.NetworkCommissioning) if isinstance(last_network_id, bytes): network_name = last_network_id.decode("utf-8") - else: + elif last_network_id != NullValue: network_name = last_network_id + # last resort to get the (wifi) networkname; + # enumerate networks on the NetworkCommissioning cluster + networks: list[Clusters.NetworkCommissioning.Structs.NetworkInfoStruct] + if not network_name and ( + networks := node.get_attribute_value( + 0, + cluster=None, + attribute=Clusters.NetworkCommissioning.Attributes.Networks, + ) + ): + for network in networks: + if isinstance(network.networkID, bytes): + network_name = network.networkID.decode("utf-8") + break + if network.networkID != NullValue: + network_name = network.networkID + break # override node type if node is a bridge if node.node_data.is_bridge: node_type = NodeType.BRIDGE From e4dd876d60f4b174e5772acc3ccab1f0ae180d90 Mon Sep 17 00:00:00 2001 From: Marcel van der Veldt Date: Wed, 7 Feb 2024 15:19:46 +0100 Subject: [PATCH 2/3] remove redundant code --- matter_server/client/client.py | 1 - 1 file changed, 1 deletion(-) diff --git a/matter_server/client/client.py b/matter_server/client/client.py index 397f9575..c6039e12 100644 --- a/matter_server/client/client.py +++ b/matter_server/client/client.py @@ -339,7 +339,6 @@ async def node_diagnostics(self, node_id: int) -> NodeDiagnostics: attribute=Clusters.NetworkCommissioning.Attributes.LastNetworkID, ) ): - node.get_cluster(0, Clusters.NetworkCommissioning) if isinstance(last_network_id, bytes): network_name = last_network_id.decode("utf-8") elif last_network_id != NullValue: From c260edc5ae95f9a472f70e8eb4c47d7922e17d73 Mon Sep 17 00:00:00 2001 From: Marcel van der Veldt Date: Wed, 7 Feb 2024 15:28:54 +0100 Subject: [PATCH 3/3] ignore not connected networks --- matter_server/client/client.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/matter_server/client/client.py b/matter_server/client/client.py index c6039e12..8f0de314 100644 --- a/matter_server/client/client.py +++ b/matter_server/client/client.py @@ -354,6 +354,8 @@ async def node_diagnostics(self, node_id: int) -> NodeDiagnostics: ) ): for network in networks: + if not network.connected: + continue if isinstance(network.networkID, bytes): network_name = network.networkID.decode("utf-8") break