@@ -366,7 +366,8 @@ async def interview_node(self, node_id: int) -> None:
366
366
raise RuntimeError ("Device Controller not initialized." )
367
367
368
368
try :
369
- await self ._resolve_node (node_id = node_id )
369
+ if not (node := self ._nodes .get (node_id )) or not node .available :
370
+ await self ._resolve_node (node_id = node_id )
370
371
async with self ._get_node_lock (node_id ):
371
372
LOGGER .info ("Interviewing node: %s" , node_id )
372
373
read_response : Attribute .AsyncReadTransaction .ReadResponse = (
@@ -455,7 +456,6 @@ async def read_attribute(
455
456
if self .chip_controller is None :
456
457
raise RuntimeError ("Device Controller not initialized." )
457
458
node_lock = self ._get_node_lock (node_id )
458
- await self ._resolve_node (node_id = node_id )
459
459
endpoint_id , cluster_id , attribute_id = parse_attribute_path (attribute_path )
460
460
async with node_lock :
461
461
assert self .server .loop is not None
@@ -616,7 +616,6 @@ async def _subscribe_node(self, node_id: int) -> None:
616
616
node_logger = LOGGER .getChild (f"[node { node_id } ]" )
617
617
node_lock = self ._get_node_lock (node_id )
618
618
node = cast (MatterNodeData , self ._nodes [node_id ])
619
- await self ._resolve_node (node_id = node_id )
620
619
621
620
# work out all (current) attribute subscriptions
622
621
attr_subscriptions : list [Attribute .AttributePath ] = []
@@ -973,10 +972,6 @@ async def _resolve_node(
973
972
self , node_id : int , retries : int = 2 , attempt : int = 1
974
973
) -> DeviceProxyWrapper :
975
974
"""Resolve a Node on the network."""
976
- if (node := self ._nodes .get (node_id )) and node .available :
977
- # no need to resolve, the node is already available/connected
978
- return
979
-
980
975
log_level = logging .DEBUG if attempt == 1 else logging .INFO
981
976
if self .chip_controller is None :
982
977
raise RuntimeError ("Device Controller not initialized." )
@@ -1001,10 +996,11 @@ async def _resolve_node(
1001
996
if attempt >= retries :
1002
997
# when we're out of retries, raise NodeNotResolving
1003
998
raise NodeNotResolving (f"Unable to resolve Node { node_id } " ) from err
1004
- await self ._resolve_node (
999
+ await asyncio .sleep (2 + attempt )
1000
+ # retry the resolve
1001
+ return await self ._resolve_node (
1005
1002
node_id = node_id , retries = retries , attempt = attempt + 1
1006
1003
)
1007
- await asyncio .sleep (2 + attempt )
1008
1004
1009
1005
def _handle_endpoints_removed (self , node_id : int , endpoints : Iterable [int ]) -> None :
1010
1006
"""Handle callback for when bridge endpoint(s) get deleted."""
0 commit comments