1 """Ferry information for departures, provided by Trafikverket."""
3 from __future__
import annotations
5 from collections.abc
import Callable
6 from dataclasses
import dataclass
7 from datetime
import datetime, timedelta
8 from typing
import Any, cast
13 SensorEntityDescription,
23 from .
import TVFerryConfigEntry
24 from .const
import ATTRIBUTION, DOMAIN
25 from .coordinator
import TVDataUpdateCoordinator
27 ATTR_FROM =
"from_harbour"
28 ATTR_TO =
"to_harbour"
29 ATTR_MODIFIED_TIME =
"modified_time"
30 ATTR_OTHER_INFO =
"other_info"
35 @dataclass(frozen=True, kw_only=True)
37 """Describes Trafikverket sensor entity."""
39 value_fn: Callable[[dict[str, Any]], StateType | datetime]
40 info_fn: Callable[[dict[str, Any]], StateType | list] |
None
43 SENSOR_TYPES: tuple[TrafikverketSensorEntityDescription, ...] = (
46 translation_key=
"departure_time",
47 device_class=SensorDeviceClass.TIMESTAMP,
48 value_fn=
lambda data:
as_utc(data[
"departure_time"]),
49 info_fn=
lambda data: cast(list[str], data[
"departure_information"]),
53 translation_key=
"departure_from",
54 value_fn=
lambda data: cast(str, data[
"departure_from"]),
55 info_fn=
lambda data: cast(list[str], data[
"departure_information"]),
59 translation_key=
"departure_to",
60 value_fn=
lambda data: cast(str, data[
"departure_to"]),
61 info_fn=
lambda data: cast(list[str], data[
"departure_information"]),
64 key=
"departure_modified",
65 translation_key=
"departure_modified",
66 device_class=SensorDeviceClass.TIMESTAMP,
67 value_fn=
lambda data:
as_utc(data[
"departure_modified"]),
68 info_fn=
lambda data: cast(list[str], data[
"departure_information"]),
69 entity_registry_enabled_default=
False,
72 key=
"departure_time_next",
73 translation_key=
"departure_time_next",
74 device_class=SensorDeviceClass.TIMESTAMP,
75 value_fn=
lambda data:
as_utc(data[
"departure_time_next"]),
77 entity_registry_enabled_default=
False,
80 key=
"departure_time_next_next",
81 translation_key=
"departure_time_next_next",
82 device_class=SensorDeviceClass.TIMESTAMP,
83 value_fn=
lambda data:
as_utc(data[
"departure_time_next_next"]),
85 entity_registry_enabled_default=
False,
92 entry: TVFerryConfigEntry,
93 async_add_entities: AddEntitiesCallback,
95 """Set up the Trafikverket sensor entry."""
97 coordinator = entry.runtime_data
101 FerrySensor(coordinator, entry.data[CONF_NAME], entry.entry_id, description)
102 for description
in SENSOR_TYPES
108 """Contains data about a ferry departure."""
110 entity_description: TrafikverketSensorEntityDescription
111 _attr_attribution = ATTRIBUTION
112 _attr_has_entity_name =
True
116 coordinator: TVDataUpdateCoordinator,
119 entity_description: TrafikverketSensorEntityDescription,
121 """Initialize the sensor."""
126 entry_type=DeviceEntryType.SERVICE,
127 identifiers={(DOMAIN, entry_id)},
128 manufacturer=
"Trafikverket",
131 configuration_url=
"https://api.trafikinfo.trafikverket.se/",
138 self.coordinator.data
144 self.coordinator.data
None _handle_coordinator_update(self)
_attr_extra_state_attributes
None __init__(self, TVDataUpdateCoordinator coordinator, str name, str entry_id, TrafikverketSensorEntityDescription entity_description)
None async_setup_entry(HomeAssistant hass, TVFerryConfigEntry entry, AddEntitiesCallback async_add_entities)
dt.datetime as_utc(dt.datetime dattim)