22
33from __future__ import annotations
44
5- from asyncio import CancelledError , Future , Task , gather , get_running_loop , wait_for
5+ from asyncio import Task , create_task , gather , sleep
66from collections .abc import Awaitable , Callable , Coroutine
77from dataclasses import replace
88from datetime import datetime , timedelta
@@ -85,7 +85,6 @@ def __init__(
8585 ):
8686 """Initialize base class for Sleeping End Device."""
8787 super ().__init__ (mac , node_type , controller , loaded_callback )
88- self ._loop = get_running_loop ()
8988 self ._node_info .is_battery_powered = True
9089
9190 # Configure SED
@@ -95,7 +94,6 @@ def __init__(
9594
9695 self ._last_awake : dict [NodeAwakeResponseType , datetime ] = {}
9796 self ._last_awake_reason : str = "Unknown"
98- self ._awake_future : Future [bool ] | None = None
9997
10098 # Maintenance
10199 self ._maintenance_last_awake : datetime | None = None
@@ -118,10 +116,8 @@ async def load(self) -> bool:
118116
119117 async def unload (self ) -> None :
120118 """Deactivate and unload node features."""
121- if self ._awake_future is not None and not self ._awake_future .done ():
122- self ._awake_future .set_result (True )
123119 if self ._awake_timer_task is not None and not self ._awake_timer_task .done ():
124- await self ._awake_timer_task
120+ self ._awake_timer_task . cancel ()
125121 if self ._awake_subscription is not None :
126122 self ._awake_subscription ()
127123 if self ._delayed_task is not None and not self ._delayed_task .done ():
@@ -440,7 +436,7 @@ async def _awake_response(self, response: PlugwiseResponse) -> bool:
440436 ),
441437 self .save_cache (),
442438 ]
443- self ._delayed_task = self . _loop . create_task (
439+ self ._delayed_task = create_task (
444440 self ._run_awake_tasks (), name = f"Delayed update for { self ._mac_in_str } "
445441 )
446442 if response .awake_type == NodeAwakeResponseType .MAINTENANCE :
@@ -516,41 +512,30 @@ def _detect_maintenance_interval(self, timestamp: datetime) -> None:
516512
517513 async def _reset_awake (self , last_alive : datetime ) -> None :
518514 """Reset node alive state."""
519- if self ._awake_future is not None and not self ._awake_future .done ():
520- self ._awake_future . set_result ( True )
515+ if self ._awake_timer_task is not None and not self ._awake_timer_task .done ():
516+ self ._awake_timer_task . cancel ( )
521517 # Setup new maintenance timer
522- self ._awake_future = self ._loop .create_future ()
523- self ._awake_timer_task = self ._loop .create_task (
518+ self ._awake_timer_task = create_task (
524519 self ._awake_timer (), name = f"Node awake timer for { self ._mac_in_str } "
525520 )
526521
527522 async def _awake_timer (self ) -> None :
528523 """Task to monitor to get next awake in time. If not it sets device to be unavailable."""
529524 # wait for next maintenance timer, but allow missing one
530- if self ._awake_future is None :
531- return
532525 timeout_interval = self .maintenance_interval * 60 * 2.1
533- try :
534- await wait_for (
535- self ._awake_future ,
536- timeout = timeout_interval ,
526+ await sleep (timeout_interval )
527+ # No maintenance awake message within expected time frame
528+ # Mark node as unavailable
529+ if self ._available :
530+ last_awake = self ._last_awake .get (NodeAwakeResponseType .MAINTENANCE )
531+ _LOGGER .warning (
532+ "No awake message received from %s | last_maintenance_awake=%s | interval=%s (%s) | Marking node as unavailable" ,
533+ self .name ,
534+ last_awake ,
535+ self .maintenance_interval ,
536+ timeout_interval ,
537537 )
538- except TimeoutError :
539- # No maintenance awake message within expected time frame
540- # Mark node as unavailable
541- if self ._available :
542- last_awake = self ._last_awake .get (NodeAwakeResponseType .MAINTENANCE )
543- _LOGGER .warning (
544- "No awake message received from %s | last_maintenance_awake=%s | interval=%s (%s) | Marking node as unavailable" ,
545- self .name ,
546- last_awake ,
547- self .maintenance_interval ,
548- timeout_interval ,
549- )
550- await self ._available_update_state (False )
551- except CancelledError :
552- pass
553- self ._awake_future = None
538+ await self ._available_update_state (False )
554539
555540 async def _run_awake_tasks (self ) -> None :
556541 """Execute all awake tasks."""
0 commit comments