1 """Train information for departures and delays, provided by Trafikverket."""
3 from __future__
import annotations
5 from collections.abc
import Callable, Mapping
6 from dataclasses
import dataclass
7 from datetime
import datetime
13 SensorEntityDescription,
22 from .
import TVTrainConfigEntry
23 from .const
import ATTRIBUTION, DOMAIN
24 from .coordinator
import TrainData, TVDataUpdateCoordinator
26 ATTR_PRODUCT_FILTER =
"product_filter"
29 @dataclass(frozen=True, kw_only=True)
31 """Describes Trafikverket sensor entity."""
33 value_fn: Callable[[TrainData], StateType | datetime]
36 SENSOR_TYPES: tuple[TrafikverketSensorEntityDescription, ...] = (
39 translation_key=
"departure_time",
40 device_class=SensorDeviceClass.TIMESTAMP,
41 value_fn=
lambda data: data.departure_time,
44 key=
"departure_state",
45 translation_key=
"departure_state",
46 value_fn=
lambda data: data.departure_state,
47 device_class=SensorDeviceClass.ENUM,
48 options=[
"on_time",
"delayed",
"canceled"],
52 translation_key=
"cancelled",
53 value_fn=
lambda data: data.cancelled,
57 translation_key=
"delayed_time",
58 device_class=SensorDeviceClass.DURATION,
59 native_unit_of_measurement=UnitOfTime.SECONDS,
60 value_fn=
lambda data: data.delayed_time,
64 translation_key=
"planned_time",
65 device_class=SensorDeviceClass.TIMESTAMP,
66 value_fn=
lambda data: data.planned_time,
67 entity_registry_enabled_default=
False,
71 translation_key=
"estimated_time",
72 device_class=SensorDeviceClass.TIMESTAMP,
73 value_fn=
lambda data: data.estimated_time,
74 entity_registry_enabled_default=
False,
78 translation_key=
"actual_time",
79 device_class=SensorDeviceClass.TIMESTAMP,
80 value_fn=
lambda data: data.actual_time,
81 entity_registry_enabled_default=
False,
85 translation_key=
"other_info",
86 value_fn=
lambda data: data.other_info,
90 translation_key=
"deviation",
91 value_fn=
lambda data: data.deviation,
94 key=
"departure_time_next",
95 translation_key=
"departure_time_next",
96 device_class=SensorDeviceClass.TIMESTAMP,
97 value_fn=
lambda data: data.departure_time_next,
100 key=
"departure_time_next_next",
101 translation_key=
"departure_time_next_next",
102 device_class=SensorDeviceClass.TIMESTAMP,
103 value_fn=
lambda data: data.departure_time_next_next,
110 entry: TVTrainConfigEntry,
111 async_add_entities: AddEntitiesCallback,
113 """Set up the Trafikverket sensor entry."""
115 coordinator = entry.runtime_data
119 TrainSensor(coordinator, entry.data[CONF_NAME], entry.entry_id, description)
120 for description
in SENSOR_TYPES
126 """Contains data about a train depature."""
128 entity_description: TrafikverketSensorEntityDescription
129 _attr_attribution = ATTRIBUTION
130 _attr_has_entity_name =
True
134 coordinator: TVDataUpdateCoordinator,
137 entity_description: TrafikverketSensorEntityDescription,
139 """Initialize the sensor."""
144 entry_type=DeviceEntryType.SERVICE,
145 identifiers={(DOMAIN, entry_id)},
147 configuration_url=
"https://api.trafikinfo.trafikverket.se/",
155 self.coordinator.data
165 """Return additional attributes for Trafikverket Train sensor."""
166 if self.coordinator.data.product_filter:
167 return {ATTR_PRODUCT_FILTER: self.coordinator.data.product_filter}
None _handle_coordinator_update(self)
Mapping[str, Any]|None extra_state_attributes(self)
None __init__(self, TVDataUpdateCoordinator coordinator, str name, str entry_id, TrafikverketSensorEntityDescription entity_description)
None async_setup_entry(HomeAssistant hass, TVTrainConfigEntry entry, AddEntitiesCallback async_add_entities)