1 """DataUpdateCoordinator for the Trafikverket Train integration."""
3 from __future__
import annotations
5 from dataclasses
import dataclass
6 from datetime
import datetime, time, timedelta
8 from typing
import TYPE_CHECKING
10 from pytrafikverket
import TrafikverketTrain
11 from pytrafikverket.exceptions
import (
12 InvalidAuthentication,
13 MultipleTrainStationsFound,
14 NoTrainAnnouncementFound,
18 from pytrafikverket.models
import StationInfoModel, TrainStopModel
27 from .const
import CONF_FILTER_PRODUCT, CONF_FROM, CONF_TIME, CONF_TO, DOMAIN
28 from .util
import next_departuredate
31 from .
import TVTrainConfigEntry
36 """Dataclass for Trafikverket Train data."""
38 departure_time: datetime |
None
40 cancelled: bool |
None
41 delayed_time: int |
None
42 planned_time: datetime |
None
43 estimated_time: datetime |
None
44 actual_time: datetime |
None
45 other_info: str |
None
47 product_filter: str |
None
48 departure_time_next: datetime |
None
49 departure_time_next_next: datetime |
None
52 _LOGGER = logging.getLogger(__name__)
56 def _get_as_utc(date_value: datetime |
None) -> datetime |
None:
57 """Return utc datetime or None."""
59 return dt_util.as_utc(date_value)
64 """Return joined information or None."""
66 return ", ".join(information)
71 """A Trafikverket Data Update Coordinator."""
73 config_entry: TVTrainConfigEntry
74 from_station: StationInfoModel
75 to_station: StationInfoModel
77 def __init__(self, hass: HomeAssistant) ->
None:
78 """Initialize the Trafikverket coordinator."""
83 update_interval=TIME_BETWEEN_UPDATES,
88 self._time: time |
None = dt_util.parse_time(self.
config_entryconfig_entry.data[CONF_TIME])
89 self._weekdays: list[str] = self.
config_entryconfig_entry.data[CONF_WEEKDAY]
90 self._filter_product: str |
None = self.
config_entryconfig_entry.options.get(
95 """Initiate stations."""
103 except InvalidAuthentication
as error:
104 raise ConfigEntryAuthFailed
from error
105 except (NoTrainStationFound, MultipleTrainStationsFound)
as error:
107 f
"Problem when trying station {self.config_entry.data[CONF_FROM]} to"
108 f
" {self.config_entry.data[CONF_TO]}. Error: {error} "
112 """Fetch data from Trafikverket."""
115 state: TrainStopModel |
None =
None
116 states: list[TrainStopModel] |
None =
None
119 when = datetime.combine(
122 dt_util.get_default_time_zone(),
126 state = await self.
_train_api_train_api.async_get_train_stop(
130 states = await self.
_train_api_train_api.async_get_next_train_stops(
134 self._filter_product,
137 except InvalidAuthentication
as error:
138 raise ConfigEntryAuthFailed
from error
140 NoTrainAnnouncementFound,
144 f
"Train departure {when} encountered a problem: {error}"
148 depart_next_next =
None
149 if not state
and states:
152 states[1].advertised_time_at_location
if len(states) > 1
else None
155 states[2].advertised_time_at_location
if len(states) > 2
else None
161 departure_time = state.advertised_time_at_location
162 if state.estimated_time_at_location:
163 departure_time = state.estimated_time_at_location
164 elif state.time_at_location:
165 departure_time = state.time_at_location
167 delay_time = state.get_delay_time()
171 departure_state=state.get_state().value,
172 cancelled=state.canceled,
173 delayed_time=delay_time.seconds
if delay_time
else None,
174 planned_time=
_get_as_utc(state.advertised_time_at_location),
175 estimated_time=
_get_as_utc(state.estimated_time_at_location),
179 product_filter=self._filter_product,
181 departure_time_next_next=
_get_as_utc(depart_next_next),
None __init__(self, HomeAssistant hass)
TrainData _async_update_data(self)
date next_departuredate(list[str] departure)
datetime|None _get_as_utc(datetime|None date_value)
str|None _get_as_joined(list[str]|None information)
aiohttp.ClientSession async_get_clientsession(HomeAssistant hass, bool verify_ssl=True, socket.AddressFamily family=socket.AF_UNSPEC, ssl_util.SSLCipherList ssl_cipher=ssl_util.SSLCipherList.PYTHON_DEFAULT)