Home Assistant Unofficial Reference 2024.12.1
coordinator.py
Go to the documentation of this file.
1 """DataUpdateCoordinator for the israel rail integration."""
2 
3 from __future__ import annotations
4 
5 from dataclasses import dataclass
6 from datetime import datetime
7 import logging
8 
9 from israelrailapi import TrainSchedule
10 from israelrailapi.api import TrainRoute
11 from israelrailapi.train_station import station_name_to_id
12 
13 from homeassistant.config_entries import ConfigEntry
14 from homeassistant.core import HomeAssistant
15 from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
16 import homeassistant.util.dt as dt_util
17 
18 from .const import DEFAULT_SCAN_INTERVAL, DEPARTURES_COUNT, DOMAIN
19 
20 _LOGGER = logging.getLogger(__name__)
21 
22 
23 @dataclass
25  """A connection data class."""
26 
27  departure: datetime | None
28  platform: str
29  start: str
30  destination: str
31  train_number: str
32  trains: int
33 
34 
35 def departure_time(train_route: TrainRoute) -> datetime | None:
36  """Get departure time."""
37  start_datetime = dt_util.parse_datetime(train_route.start_time)
38  return start_datetime.astimezone() if start_datetime else None
39 
40 
42  """A IsraelRail Data Update Coordinator."""
43 
44  config_entry: ConfigEntry
45 
46  def __init__(
47  self,
48  hass: HomeAssistant,
49  train_schedule: TrainSchedule,
50  start: str,
51  destination: str,
52  ) -> None:
53  """Initialize the IsraelRail data coordinator."""
54  super().__init__(
55  hass,
56  _LOGGER,
57  name=DOMAIN,
58  update_interval=DEFAULT_SCAN_INTERVAL,
59  )
60  self._train_schedule_train_schedule = train_schedule
61  self._start_start = start
62  self._destination_destination = destination
63 
64  async def _async_update_data(self) -> list[DataConnection]:
65  try:
66  train_routes = await self.hasshass.async_add_executor_job(
67  self._train_schedule_train_schedule.query,
68  self._start_start,
69  self._destination_destination,
70  datetime.now().strftime("%Y-%m-%d"),
71  datetime.now().strftime("%H:%M"),
72  )
73  except Exception as e:
74  raise UpdateFailed(
75  "Unable to connect and retrieve data from israelrail api",
76  ) from e
77 
78  return [
80  departure=departure_time(train_routes[i]),
81  train_number=train_routes[i].trains[0].data["trainNumber"],
82  platform=train_routes[i].trains[0].platform,
83  trains=len(train_routes[i].trains),
84  start=station_name_to_id(train_routes[i].trains[0].src),
85  destination=station_name_to_id(train_routes[i].trains[-1].dst),
86  )
87  for i in range(DEPARTURES_COUNT)
88  if len(train_routes) > i and train_routes[i] is not None
89  ]
None __init__(self, HomeAssistant hass, TrainSchedule train_schedule, str start, str destination)
Definition: coordinator.py:52
datetime|None departure_time(TrainRoute train_route)
Definition: coordinator.py:35