|
23 | 23 | from ..messages.responses import ( |
24 | 24 | NODE_AWAKE_RESPONSE_ID, |
25 | 25 | NODE_JOIN_ID, |
| 26 | + NODE_REJOIN_ID, |
26 | 27 | NodeAwakeResponse, |
27 | 28 | NodeInfoResponse, |
28 | 29 | NodeJoinAvailableResponse, |
29 | 30 | NodePingResponse, |
| 31 | + NodeRejoinResponse, |
30 | 32 | NodeResponseType, |
31 | 33 | PlugwiseResponse, |
32 | 34 | ) |
@@ -74,6 +76,7 @@ def __init__( |
74 | 76 | self._unsubscribe_stick_event: Callable[[], None] | None = None |
75 | 77 | self._unsubscribe_node_awake: Callable[[], None] | None = None |
76 | 78 | self._unsubscribe_node_join: Callable[[], None] | None = None |
| 79 | + self._unsubscribe_node_rejoin: Callable[[], None] | None = None |
77 | 80 |
|
78 | 81 | # region - Properties |
79 | 82 |
|
@@ -244,6 +247,31 @@ async def node_join_available_message(self, response: PlugwiseResponse) -> bool: |
244 | 247 | await self._notify_node_event_subscribers(NodeEvent.JOIN, mac) |
245 | 248 | return True |
246 | 249 |
|
| 250 | + async def node_rejoin_message(self, response: PlugwiseResponse) -> bool: |
| 251 | + """Handle NodeRejoinResponse messages.""" |
| 252 | + if not isinstance(response, NodeRejoinResponse): |
| 253 | + raise MessageError( |
| 254 | + f"Invalid response message type ({response.__class__.__name__}) received, expected NodeRejoinResponse" |
| 255 | + ) |
| 256 | + mac = response.mac_decoded |
| 257 | + address = self._register.network_address(mac) |
| 258 | + if (address := self._register.network_address(mac)) is not None: |
| 259 | + if self._nodes.get(mac) is None: |
| 260 | + if self._discover_sed_tasks.get(mac) is None: |
| 261 | + self._discover_sed_tasks[mac] = create_task( |
| 262 | + self._discover_battery_powered_node(address, mac) |
| 263 | + ) |
| 264 | + elif self._discover_sed_tasks[mac].done(): |
| 265 | + self._discover_sed_tasks[mac] = create_task( |
| 266 | + self._discover_battery_powered_node(address, mac) |
| 267 | + ) |
| 268 | + else: |
| 269 | + _LOGGER.debug("duplicate awake discovery for %s", mac) |
| 270 | + return True |
| 271 | + else: |
| 272 | + raise NodeError("Unknown network address for node {mac}") |
| 273 | + return True |
| 274 | + |
247 | 275 | def _unsubscribe_to_protocol_events(self) -> None: |
248 | 276 | """Unsubscribe to events from protocol.""" |
249 | 277 | if self._unsubscribe_node_awake is not None: |
@@ -478,6 +506,7 @@ async def start(self) -> None: |
478 | 506 | self._register.full_scan_finished(self._discover_registered_nodes) |
479 | 507 | await self._register.start() |
480 | 508 | self._subscribe_to_protocol_events() |
| 509 | + await self._subscribe_to_node_events() |
481 | 510 | self._is_running = True |
482 | 511 |
|
483 | 512 | async def discover_nodes(self, load: bool = True) -> bool: |
|
0 commit comments