From 6c6a5f496afe6dc659085694dae624e8533fe7a4 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 22 May 2024 21:56:49 -1000 Subject: [PATCH] Simplify async_track_time_interval implementation (#117956) --- homeassistant/helpers/event.py | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/homeassistant/helpers/event.py b/homeassistant/helpers/event.py index 4c99f3c38bd..b5445da04f2 100644 --- a/homeassistant/helpers/event.py +++ b/homeassistant/helpers/event.py @@ -1571,11 +1571,10 @@ class _TrackTimeInterval: cancel_on_shutdown: bool | None _track_job: HassJob[[datetime], Coroutine[Any, Any, None] | None] | None = None _run_job: HassJob[[datetime], Coroutine[Any, Any, None] | None] | None = None - _cancel_callback: CALLBACK_TYPE | None = None + _timer_handle: asyncio.TimerHandle | None = None def async_attach(self) -> None: """Initialize track job.""" - hass = self.hass self._track_job = HassJob( self._interval_listener, self.job_name, @@ -1587,32 +1586,32 @@ class _TrackTimeInterval: f"track time interval {self.seconds}", cancel_on_shutdown=self.cancel_on_shutdown, ) - self._cancel_callback = async_call_at( - hass, - self._track_job, - hass.loop.time() + self.seconds, + self._schedule_timer() + + def _schedule_timer(self) -> None: + """Schedule the timer.""" + if TYPE_CHECKING: + assert self._track_job is not None + hass = self.hass + loop = hass.loop + self._timer_handle = loop.call_at( + loop.time() + self.seconds, self._interval_listener, self._track_job ) @callback - def _interval_listener(self, now: datetime) -> None: + def _interval_listener(self, _: Any) -> None: """Handle elapsed intervals.""" if TYPE_CHECKING: assert self._run_job is not None - assert self._track_job is not None - hass = self.hass - self._cancel_callback = async_call_at( - hass, - self._track_job, - hass.loop.time() + self.seconds, - ) - hass.async_run_hass_job(self._run_job, now, background=True) + self._schedule_timer() + self.hass.async_run_hass_job(self._run_job, dt_util.utcnow(), background=True) @callback def async_cancel(self) -> None: """Cancel the call_at.""" if TYPE_CHECKING: - assert self._cancel_callback is not None - self._cancel_callback() + assert self._timer_handle is not None + self._timer_handle.cancel() @callback