55from asyncio import (
66 CancelledError ,
77 Future ,
8- Lock ,
98 Task ,
109 gather ,
1110 get_running_loop ,
@@ -101,9 +100,7 @@ def __init__(
101100 self ._battery_config = BatteryConfig ()
102101 self ._new_battery_config = BatteryConfig ()
103102 self ._sed_config_task_scheduled = False
104- self ._send_task_queue : list [Coroutine [Any , Any , bool ]] = []
105- self ._send_task_lock = Lock ()
106- self ._delayed_task : Task [None ] | None = None
103+ self ._sed_node_info_update_task_scheduled = False
107104
108105 self ._last_awake : dict [NodeAwakeResponseType , datetime ] = {}
109106 self ._last_awake_reason : str = "Unknown"
@@ -136,14 +133,6 @@ async def unload(self) -> None:
136133 await self ._awake_timer_task
137134 if self ._awake_subscription is not None :
138135 self ._awake_subscription ()
139- if self ._delayed_task is not None and not self ._delayed_task .done ():
140- await self ._delayed_task
141- if len (self ._send_task_queue ) > 0 :
142- _LOGGER .warning (
143- "Unable to execute %s open tasks for %s" ,
144- len (self ._send_task_queue ),
145- self .name ,
146- )
147136 await super ().unload ()
148137
149138 @raise_not_loaded
@@ -168,10 +157,9 @@ async def _load_defaults(self) -> None:
168157 maintenance_interval = SED_DEFAULT_MAINTENANCE_INTERVAL ,
169158 sleep_duration = SED_DEFAULT_SLEEP_DURATION ,
170159 )
171- await self .schedule_task_when_awake (self .node_info_update (None ))
172- self ._sed_config_task_scheduled = True
160+ self ._sed_node_info_update_task_scheduled = True
173161 self ._new_battery_config = self ._battery_config
174- await self .schedule_task_when_awake ( self . _configure_sed_task ())
162+ self ._sed_config_task_scheduled = True
175163
176164 async def _load_from_cache (self ) -> bool :
177165 """Load states from previous cached information. Returns True if successful."""
@@ -250,7 +238,6 @@ async def set_awake_duration(self, seconds: int) -> bool:
250238 self ._new_battery_config , awake_duration = seconds
251239 )
252240 if not self ._sed_config_task_scheduled :
253- await self .schedule_task_when_awake (self ._configure_sed_task ())
254241 self ._sed_config_task_scheduled = True
255242 _LOGGER .debug (
256243 "set_awake_duration | Device %s | config scheduled" ,
@@ -280,7 +267,6 @@ async def set_clock_interval(self, minutes: int) -> bool:
280267 self ._new_battery_config , clock_interval = minutes
281268 )
282269 if not self ._sed_config_task_scheduled :
283- await self .schedule_task_when_awake (self ._configure_sed_task ())
284270 self ._sed_config_task_scheduled = True
285271 _LOGGER .debug (
286272 "set_clock_interval | Device %s | config scheduled" ,
@@ -303,7 +289,6 @@ async def set_clock_sync(self, sync: bool) -> bool:
303289
304290 self ._new_battery_config = replace (self ._new_battery_config , clock_sync = sync )
305291 if not self ._sed_config_task_scheduled :
306- await self .schedule_task_when_awake (self ._configure_sed_task ())
307292 self ._sed_config_task_scheduled = True
308293 _LOGGER .debug (
309294 "set_clock_sync | Device %s | config scheduled" ,
@@ -333,7 +318,6 @@ async def set_maintenance_interval(self, minutes: int) -> bool:
333318 self ._new_battery_config , maintenance_interval = minutes
334319 )
335320 if not self ._sed_config_task_scheduled :
336- await self .schedule_task_when_awake (self ._configure_sed_task ())
337321 self ._sed_config_task_scheduled = True
338322 _LOGGER .debug (
339323 "set_maintenance_interval | Device %s | config scheduled" ,
@@ -366,7 +350,6 @@ async def set_sleep_duration(self, minutes: int) -> bool:
366350 self ._new_battery_config , sleep_duration = minutes
367351 )
368352 if not self ._sed_config_task_scheduled :
369- await self .schedule_task_when_awake (self ._configure_sed_task ())
370353 self ._sed_config_task_scheduled = True
371354 _LOGGER .debug (
372355 "set_sleep_duration | Device %s | config scheduled" ,
@@ -490,14 +473,6 @@ async def _configure_sed_task(self) -> bool:
490473
491474 return True
492475
493- async def node_info_update (
494- self , node_info : NodeInfoResponse | None = None
495- ) -> NodeInfo | None :
496- """Update Node (hardware) information."""
497- if node_info is not None and self .skip_update (self ._node_info , 86400 ):
498- return self ._node_info
499- return await super ().node_info_update (node_info )
500-
501476 async def _awake_response (self , response : PlugwiseResponse ) -> bool :
502477 """Process awake message."""
503478 if not isinstance (response , NodeAwakeResponse ):
@@ -522,16 +497,14 @@ async def _awake_response(self, response: PlugwiseResponse) -> bool:
522497 self ._last_awake [response .awake_type ] = response .timestamp
523498
524499 tasks : list [Coroutine [Any , Any , None ]] = [
525- self ._reset_awake (response .timestamp ),
500+ await self ._reset_awake (response .timestamp ),
526501 self .publish_feature_update_to_subscribers (
527502 NodeFeature .BATTERY ,
528503 self ._battery_config ,
529504 ),
530- self .save_cache (),
505+ await self .save_cache (),
531506 ]
532- self ._delayed_task = self ._loop .create_task (
533- self ._send_tasks (), name = f"Delayed update for { self ._mac_in_str } "
534- )
507+ await self ._run_awake_tasks ()
535508 if response .awake_type == NodeAwakeResponseType .MAINTENANCE :
536509 self ._last_awake_reason = "Maintenance"
537510 self ._set_cache (CACHE_AWAKE_REASON , "Maintenance" )
@@ -642,27 +615,19 @@ async def _awake_timer(self) -> None:
642615 pass
643616 self ._awake_future = None
644617
645- async def _send_tasks (self ) -> None :
646- """Send all tasks in queue."""
647- if len (self ._send_task_queue ) == 0 :
648- return
649- async with self ._send_task_lock :
650- task_result = await gather (* self ._send_task_queue )
651- if not all (task_result ):
652- _LOGGER .warning (
653- "Executed %s tasks (result=%s) for %s" ,
654- len (self ._send_task_queue ),
655- task_result ,
656- self .name ,
657- )
658- self ._send_task_queue = []
618+ async def _run_awake_tasks (self ) -> None :
619+ """Execute all awake tasks."""
620+ if (
621+ self ._sed_node_info_update_task_scheduled
622+ and await self .node_info_update (None ) is not None
623+ ):
624+ self ._sed_node_info_update_task_scheduled = False
659625
660- async def schedule_task_when_awake (
661- self , task_fn : Coroutine [Any , Any , bool ]
662- ) -> None :
663- """Add task to queue to be executed when node is awake."""
664- async with self ._send_task_lock :
665- self ._send_task_queue .append (task_fn )
626+ if (
627+ self ._sed_config_task_scheduled
628+ and await self ._configure_sed_task ()
629+ ):
630+ self ._sed_config_task_scheduled = False
666631
667632 async def sed_configure ( # pylint: disable=too-many-arguments
668633 self ,
0 commit comments