Skip to content

Commit d824833

Browse files
committed
Fix networkname retrieval for some wifi devices
1 parent 49290b1 commit d824833

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
@@ -1,4 +1,5 @@
11
"""Matter Client implementation."""
2+
23
from __future__ import annotations
34

45
import asyncio
@@ -9,6 +10,7 @@
910

1011
from aiohttp import ClientSession
1112
from chip.clusters import Objects as Clusters
13+
from chip.clusters.Types import NullValue
1214

1315
from matter_server.common.errors import ERROR_MAP, NodeNotExists
1416

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

258260
async def node_diagnostics(self, node_id: int) -> NodeDiagnostics:
259261
"""Gather diagnostics for the given node."""
262+
# pylint: disable=too-many-statements
260263
node = self.get_node(node_id)
261264
# grab some details from the first (operational) network interface
262265
network_type = NetworkType.UNKNOWN
@@ -306,7 +309,7 @@ async def node_diagnostics(self, node_id: int) -> NodeDiagnostics:
306309
)
307310
if isinstance(thread_cluster.networkName, bytes):
308311
network_name = thread_cluster.networkName.decode("utf-8")
309-
else:
312+
elif thread_cluster.networkName != NullValue:
310313
network_name = thread_cluster.networkName
311314
# parse routing role to (diagnostics) node type
312315
if (
@@ -336,10 +339,28 @@ async def node_diagnostics(self, node_id: int) -> NodeDiagnostics:
336339
attribute=Clusters.NetworkCommissioning.Attributes.LastNetworkID,
337340
)
338341
):
342+
node.get_cluster(0, Clusters.NetworkCommissioning)
339343
if isinstance(last_network_id, bytes):
340344
network_name = last_network_id.decode("utf-8")
341-
else:
345+
elif last_network_id != NullValue:
342346
network_name = last_network_id
347+
# last resort to get the (wifi) networkname;
348+
# enumerate networks on the NetworkCommissioning cluster
349+
networks: list[Clusters.NetworkCommissioning.Structs.NetworkInfoStruct]
350+
if not network_name and (
351+
networks := node.get_attribute_value(
352+
0,
353+
cluster=None,
354+
attribute=Clusters.NetworkCommissioning.Attributes.Networks,
355+
)
356+
):
357+
for network in networks:
358+
if isinstance(network.networkID, bytes):
359+
network_name = network.networkID.decode("utf-8")
360+
break
361+
if network.networkID != NullValue:
362+
network_name = network.networkID
363+
break
343364
# override node type if node is a bridge
344365
if node.node_data.is_bridge:
345366
node_type = NodeType.BRIDGE

0 commit comments

Comments
 (0)