@@ -72,6 +72,8 @@ def __init__(
7272 self ._unsubscribe_node_rejoin : Callable [[], None ] | None = None
7373
7474 self ._discover_sed_tasks : dict [str , Task [bool ]] = {}
75+ self ._registry_stragglers : dict [int , str ] = {}
76+ self ._discover_stragglers_task : Task [None ] | None = None
7577
7678 # region - Properties
7779
@@ -434,23 +436,42 @@ async def _discover_registered_nodes(self) -> None:
434436 """Discover nodes."""
435437 _LOGGER .debug ("Start discovery of registered nodes" )
436438 registered_counter = 0
437- discovered_counter = 0
438439 for address , registration in self ._register .registry .items ():
439440 mac , node_type = registration
440441 if mac != "" :
441442 if self ._nodes .get (mac ) is None :
442- if await self ._discover_node (address , mac , node_type ):
443- discovered_counter += 1
444- else :
445- discovered_counter += 1
443+ if not await self ._discover_node (address , mac , node_type ):
444+ self ._registry_stragglers [address ] = mac
446445 registered_counter += 1
447446 await sleep (0 )
447+ if len (self ._registry_stragglers ) > 0 :
448+ if (
449+ self ._discover_stragglers_task is None
450+ or self ._discover_stragglers_task .done ()
451+ ):
452+ self ._discover_stragglers_task = create_task (
453+ self ._discover_stragglers ()
454+ )
448455 _LOGGER .debug (
449456 "Total %s online of %s registered node(s)" ,
450- str (discovered_counter ),
457+ str (len ( self . _nodes ) ),
451458 str (registered_counter ),
452459 )
453460
461+ async def _discover_stragglers (self ) -> None :
462+ """Repeat Discovery of Nodes with unknown NodeType."""
463+ while len (self ._registry_stragglers ) > 0 :
464+ await sleep (60 )
465+ stragglers : dict [int , str ] = {}
466+ for address , mac in self ._registry_stragglers .items ():
467+ if not await self ._discover_node (address , mac , None ):
468+ stragglers [address ] = mac
469+ self ._registry_stragglers = stragglers
470+ _LOGGER .debug (
471+ "Total %s nodes unreachable having unknown NodeType" ,
472+ str (len (stragglers )),
473+ )
474+
454475 async def _load_node (self , mac : str ) -> bool :
455476 """Load node."""
456477 if self ._nodes .get (mac ) is None :
0 commit comments