|
12 | 12 |
|
13 | 13 | from ..api import NodeEvent, NodeType, PlugwiseNode, StickEvent |
14 | 14 | from ..connection import StickController |
15 | | -from ..constants import ENERGY_NODE_TYPES, UTF8 |
| 15 | +from ..constants import ENERGY_NODE_TYPES, NODE_DISCOVER_INTERVAL, UTF8 |
16 | 16 | from ..exceptions import CacheError, MessageError, NodeError, StickError, StickTimeout |
17 | 17 | from ..helpers.util import validate_mac |
18 | 18 | from ..messages.requests import CircleMeasureIntervalRequest, NodePingRequest |
@@ -72,6 +72,8 @@ def __init__( |
72 | 72 | self._unsubscribe_node_rejoin: Callable[[], None] | None = None |
73 | 73 |
|
74 | 74 | self._discover_sed_tasks: dict[str, Task[bool]] = {} |
| 75 | + self._discover_task: Task | None = None |
| 76 | + self._discover_schedule_task: Task | None = None |
75 | 77 |
|
76 | 78 | # region - Properties |
77 | 79 |
|
@@ -431,15 +433,33 @@ async def _discover_node( |
431 | 433 | async def _discover_registered_nodes(self) -> None: |
432 | 434 | """Discover nodes.""" |
433 | 435 | _LOGGER.debug("Start discovery of registered nodes") |
434 | | - counter = 0 |
| 436 | + registered_counter = 0 |
| 437 | + discovered_counter = 0 |
435 | 438 | for address, registration in self._register.registry.items(): |
436 | 439 | mac, node_type = registration |
437 | 440 | if mac != "": |
438 | 441 | if self._nodes.get(mac) is None: |
439 | | - await self._discover_node(address, mac, node_type) |
440 | | - counter += 1 |
| 442 | + if await self._discover_node(address, mac, node_type): |
| 443 | + discovered_counter += 1 |
| 444 | + else: |
| 445 | + discovered_counter += 1 |
| 446 | + registered_counter += 1 |
441 | 447 | await sleep(0) |
442 | | - _LOGGER.debug("Total %s registered node(s)", str(counter)) |
| 448 | + _LOGGER.debug( |
| 449 | + "Total %s online of %s registered node(s)", |
| 450 | + str(discovered_counter), |
| 451 | + str(registered_counter), |
| 452 | + ) |
| 453 | + if discovered_counter < registered_counter: |
| 454 | + if self._discover_task is None or self._discover_task.done(): |
| 455 | + self._discover_task = create_task( |
| 456 | + self._schedule_discover_registered_nodes() |
| 457 | + ) |
| 458 | + |
| 459 | + async def _schedule_discover_registered_nodes(self) -> None: |
| 460 | + """Reschedule node discovery every interval until finished.""" |
| 461 | + await sleep(NODE_DISCOVER_INTERVAL) |
| 462 | + self._discover_schedule_task = create_task(self._discover_registered_nodes()) |
443 | 463 |
|
444 | 464 | async def _load_node(self, mac: str) -> bool: |
445 | 465 | """Load node.""" |
@@ -499,7 +519,6 @@ async def discover_nodes(self, load: bool = True) -> bool: |
499 | 519 | await self.discover_network_coordinator(load=load) |
500 | 520 | if not self._is_running: |
501 | 521 | await self.start() |
502 | | - |
503 | 522 | await self._discover_registered_nodes() |
504 | 523 | if load: |
505 | 524 | return await self._load_discovered_nodes() |
|
0 commit comments