1 """Contains time pickers exposed by the Starlink integration."""
3 from __future__
import annotations
5 from collections.abc
import Awaitable, Callable
6 from dataclasses
import dataclass
7 from datetime
import UTC, datetime, time, tzinfo
16 from .const
import DOMAIN
17 from .coordinator
import StarlinkData, StarlinkUpdateCoordinator
18 from .entity
import StarlinkEntity
22 hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
24 """Set up all time entities for this entry."""
25 coordinator = hass.data[DOMAIN][entry.entry_id]
32 @dataclass(frozen=True, kw_only=True)
34 """Describes a Starlink time entity."""
36 value_fn: Callable[[StarlinkData, tzinfo], time |
None]
37 update_fn: Callable[[StarlinkUpdateCoordinator, time], Awaitable[
None]]
38 available_fn: Callable[[StarlinkData], bool]
42 """A TimeEntity for Starlink devices. Handles creating unique IDs."""
44 entity_description: StarlinkTimeEntityDescription
48 """Return the value reported by the time."""
50 self.coordinator.data, self.coordinator.timezone
55 """Return True if entity is available."""
59 """Change the time."""
60 return await self.
entity_descriptionentity_description.update_fn(self.coordinator, value)
64 hour = math.floor(utc_minutes / 60)
67 minute = utc_minutes % 60
69 utc = datetime.now(UTC).replace(
70 hour=hour, minute=minute, second=0, microsecond=0
72 except ValueError
as exc:
73 raise HomeAssistantError
from exc
74 return utc.astimezone(timezone).
time()
79 zoned_time = datetime.now(timezone).replace(
80 hour=t.hour, minute=t.minute, second=0, microsecond=0
82 except ValueError
as exc:
83 raise HomeAssistantError
from exc
84 utc_time = zoned_time.astimezone(UTC).
time()
85 return (utc_time.hour * 60) + utc_time.minute
91 translation_key=
"sleep_start",
93 update_fn=
lambda coordinator, time: coordinator.async_set_sleep_start(
96 available_fn=
lambda data: data.sleep[2],
100 translation_key=
"sleep_end",
102 data.sleep[0] + data.sleep[1], timezone
104 update_fn=
lambda coordinator, time: coordinator.async_set_sleep_duration(
107 available_fn=
lambda data: data.sleep[2],
None async_set_value(self, time value)
time|None native_value(self)
int _time_to_utc_minutes(time t, tzinfo timezone)
time _utc_minutes_to_time(int utc_minutes, tzinfo timezone)
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
bool time(HomeAssistant hass, dt_time|str|None before=None, dt_time|str|None after=None, str|Container[str]|None weekday=None)