1 """DataUpdateCoordinator for the swiss_public_transport integration."""
3 from __future__
import annotations
5 from datetime
import datetime, timedelta
7 from typing
import TypedDict
9 from opendata_transport
import OpendataTransport
10 from opendata_transport.exceptions
import (
11 OpendataTransportConnectionError,
12 OpendataTransportError,
21 from .const
import CONNECTIONS_COUNT, DEFAULT_UPDATE_TIME, DOMAIN
22 from .helper
import offset_opendata
24 _LOGGER = logging.getLogger(__name__)
26 type SwissPublicTransportConfigEntry = ConfigEntry[
27 SwissPublicTransportDataUpdateCoordinator
32 """A connection data class."""
34 departure: datetime |
None
47 """Transform and calculate the duration into seconds."""
49 duration_text_pg_format = duration_text.replace(
"d",
" days ")
50 duration = dt_util.parse_duration(duration_text_pg_format)
51 return duration.seconds
if duration
else None
55 DataUpdateCoordinator[list[DataConnection]]
57 """A SwissPublicTransport Data Update Coordinator."""
59 config_entry: SwissPublicTransportConfigEntry
64 opendata: OpendataTransport,
65 time_offset: dict[str, int] |
None,
67 """Initialize the SwissPublicTransport data coordinator."""
72 update_interval=
timedelta(seconds=DEFAULT_UPDATE_TIME),
78 """Calculate the remaining time for the departure."""
79 departure_datetime = dt_util.parse_datetime(departure)
81 if departure_datetime:
82 return departure_datetime - dt_util.as_local(dt_util.utcnow())
89 """Fetch connections using the opendata api."""
96 except OpendataTransportConnectionError
as e:
97 _LOGGER.warning(
"Connection to transport.opendata.ch cannot be established")
98 raise UpdateFailed
from e
99 except OpendataTransportError
as e:
101 "Unable to connect and retrieve data from transport.opendata.ch"
103 raise UpdateFailed
from e
104 connections = self.
_opendata_opendata.connections
107 departure=dt_util.parse_datetime(connections[i][
"departure"]),
108 train_number=connections[i][
"number"],
109 platform=connections[i][
"platform"],
110 transfers=connections[i][
"transfers"],
113 destination=self.
_opendata_opendata.to_name,
114 remaining_time=
str(self.
remaining_timeremaining_time(connections[i][
"departure"])),
115 delay=connections[i][
"delay"],
116 line=connections[i][
"line"],
118 for i
in range(limit)
119 if len(connections) > i
and connections[i]
is not None
123 """Fetch connections using the opendata api."""
126 "departure": connection[
"departure"].isoformat()
127 if connection[
"departure"]
129 "duration": connection[
"duration"],
130 "platform": connection[
"platform"],
131 "remaining_time": connection[
"remaining_time"],
132 "start": connection[
"start"],
133 "destination": connection[
"destination"],
134 "train_number": connection[
"train_number"],
135 "transfers": connection[
"transfers"],
136 "delay": connection[
"delay"],
137 "line": connection[
"line"],
list[JsonValueType] fetch_connections_as_json(self, int limit)
timedelta|None remaining_time(self, departure)
list[DataConnection] _async_update_data(self)
list[DataConnection] fetch_connections(self, int limit)
None __init__(self, HomeAssistant hass, OpendataTransport opendata, dict[str, int]|None time_offset)
RadioThermUpdate async_get_data(HomeAssistant hass, CommonThermostat device)
int|None calculate_duration_in_seconds(str duration_text)
None offset_opendata(OpendataTransport opendata, dict[str, int] offset)