New apps Added
This commit is contained in:
+68
@@ -0,0 +1,68 @@
|
||||
"""Home Assistant timer scheduler adapter.
|
||||
|
||||
This adapter implements ITimerScheduler using Home Assistant's
|
||||
async_track_point_in_time API.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import logging
|
||||
from datetime import datetime
|
||||
from typing import Any, Callable, Coroutine, cast
|
||||
|
||||
from homeassistant.core import HomeAssistant, callback
|
||||
from homeassistant.helpers.event import async_track_point_in_time
|
||||
|
||||
from ...domain.interfaces import ITimerScheduler
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class HATimerScheduler(ITimerScheduler):
|
||||
"""Home Assistant implementation of timer scheduler.
|
||||
|
||||
Uses Home Assistant's event loop to schedule callbacks at specific times.
|
||||
This adapter contains NO business logic - it only wraps HA's timer API.
|
||||
"""
|
||||
|
||||
def __init__(self, hass: HomeAssistant) -> None:
|
||||
"""Initialize the timer scheduler adapter.
|
||||
|
||||
Args:
|
||||
hass: Home Assistant instance
|
||||
"""
|
||||
self._hass = hass
|
||||
|
||||
def schedule_timer(
|
||||
self,
|
||||
target_time: datetime,
|
||||
callback_func: Callable[[], Coroutine[Any, Any, Any]],
|
||||
) -> Callable[[], None]:
|
||||
"""Schedule a callback to execute at a specific time.
|
||||
|
||||
Args:
|
||||
target_time: When to execute the callback
|
||||
callback_func: Async function to execute at target_time
|
||||
|
||||
Returns:
|
||||
Cancel function that can be called to cancel the timer
|
||||
"""
|
||||
|
||||
@callback
|
||||
def _timer_callback(_now: datetime) -> None:
|
||||
"""Wrapper callback that creates async task."""
|
||||
self._hass.async_create_task(callback_func())
|
||||
|
||||
# Schedule the timer and return the cancel function
|
||||
cancel_func = async_track_point_in_time(
|
||||
self._hass,
|
||||
_timer_callback,
|
||||
target_time,
|
||||
)
|
||||
|
||||
_LOGGER.debug(
|
||||
"Timer scheduled for %s",
|
||||
target_time.isoformat(),
|
||||
)
|
||||
|
||||
return cast(Callable[[], None], cancel_func)
|
||||
Reference in New Issue
Block a user