Skip to content

Commit 86d68cc

Browse files
authored
Fix networkname retrieval for some wifi devices (#535)
1 parent d122be4 commit 86d68cc

File tree

1 file changed

+23
-2
lines changed

1 file changed

+23
-2
lines changed

matter_server/client/client.py

+23-2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
from aiohttp import ClientSession
1212
from chip.clusters import Objects as Clusters
13+
from chip.clusters.Types import NullValue
1314

1415
from matter_server.common.errors import ERROR_MAP, NodeNotExists
1516

@@ -258,6 +259,7 @@ async def ping_node(self, node_id: int) -> NodePingResult:
258259

259260
async def node_diagnostics(self, node_id: int) -> NodeDiagnostics:
260261
"""Gather diagnostics for the given node."""
262+
# pylint: disable=too-many-statements
261263
node = self.get_node(node_id)
262264
# grab some details from the first (operational) network interface
263265
network_type = NetworkType.UNKNOWN
@@ -307,7 +309,7 @@ async def node_diagnostics(self, node_id: int) -> NodeDiagnostics:
307309
)
308310
if isinstance(thread_cluster.networkName, bytes):
309311
network_name = thread_cluster.networkName.decode("utf-8")
310-
else:
312+
elif thread_cluster.networkName != NullValue:
311313
network_name = thread_cluster.networkName
312314
# parse routing role to (diagnostics) node type
313315
if (
@@ -339,8 +341,27 @@ async def node_diagnostics(self, node_id: int) -> NodeDiagnostics:
339341
):
340342
if isinstance(last_network_id, bytes):
341343
network_name = last_network_id.decode("utf-8")
342-
else:
344+
elif last_network_id != NullValue:
343345
network_name = last_network_id
346+
# last resort to get the (wifi) networkname;
347+
# enumerate networks on the NetworkCommissioning cluster
348+
networks: list[Clusters.NetworkCommissioning.Structs.NetworkInfoStruct]
349+
if not network_name and (
350+
networks := node.get_attribute_value(
351+
0,
352+
cluster=None,
353+
attribute=Clusters.NetworkCommissioning.Attributes.Networks,
354+
)
355+
):
356+
for network in networks:
357+
if not network.connected:
358+
continue
359+
if isinstance(network.networkID, bytes):
360+
network_name = network.networkID.decode("utf-8")
361+
break
362+
if network.networkID != NullValue:
363+
network_name = network.networkID
364+
break
344365
# override node type if node is a bridge
345366
if node.node_data.is_bridge:
346367
node_type = NodeType.BRIDGE

0 commit comments

Comments
 (0)