Skip to content

Commit cdb87b2

Browse files
committed
simplify timer to use task cancellation instead of future
1 parent 70b619d commit cdb87b2

File tree

1 file changed

+18
-33
lines changed

1 file changed

+18
-33
lines changed

plugwise_usb/nodes/sed.py

Lines changed: 18 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from __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
66
from collections.abc import Awaitable, Callable, Coroutine
77
from dataclasses import replace
88
from 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

Comments
 (0)