1 """Support for transport.opendata.ch."""
3 from __future__
import annotations
5 from collections.abc
import Callable
6 from dataclasses
import dataclass
7 from datetime
import datetime, timedelta
9 from typing
import TYPE_CHECKING
14 SensorEntityDescription,
23 from .const
import CONNECTIONS_COUNT, DOMAIN
24 from .coordinator
import (
26 SwissPublicTransportConfigEntry,
27 SwissPublicTransportDataUpdateCoordinator,
30 _LOGGER = logging.getLogger(__name__)
35 @dataclass(kw_only=True, frozen=True)
37 """Describes swiss public transport sensor entity."""
39 value_fn: Callable[[DataConnection], StateType | datetime]
44 SENSORS: tuple[SwissPublicTransportSensorEntityDescription, ...] = (
47 key=f
"departure{i or ''}",
48 translation_key=f
"departure{i}",
49 device_class=SensorDeviceClass.TIMESTAMP,
50 value_fn=
lambda data_connection: data_connection[
"departure"],
53 for i
in range(CONNECTIONS_COUNT)
57 device_class=SensorDeviceClass.DURATION,
58 native_unit_of_measurement=UnitOfTime.SECONDS,
59 value_fn=
lambda data_connection: data_connection[
"duration"],
63 translation_key=
"transfers",
64 value_fn=
lambda data_connection: data_connection[
"transfers"],
68 translation_key=
"platform",
69 value_fn=
lambda data_connection: data_connection[
"platform"],
73 translation_key=
"delay",
74 device_class=SensorDeviceClass.DURATION,
75 native_unit_of_measurement=UnitOfTime.MINUTES,
76 value_fn=
lambda data_connection: data_connection[
"delay"],
80 translation_key=
"line",
81 value_fn=
lambda data_connection: data_connection[
"line"],
88 config_entry: SwissPublicTransportConfigEntry,
89 async_add_entities: AddEntitiesCallback,
91 """Set up the sensor from a config entry created in the integrations UI."""
92 unique_id = config_entry.unique_id
99 for description
in SENSORS
104 CoordinatorEntity[SwissPublicTransportDataUpdateCoordinator], SensorEntity
106 """Implementation of a Swiss public transport sensor."""
108 entity_description: SwissPublicTransportSensorEntityDescription
109 _attr_attribution =
"Data provided by transport.opendata.ch"
110 _attr_has_entity_name =
True
114 coordinator: SwissPublicTransportDataUpdateCoordinator,
115 entity_description: SwissPublicTransportSensorEntityDescription,
118 """Initialize the sensor."""
123 identifiers={(DOMAIN, unique_id)},
124 manufacturer=
"Opendata.ch",
125 entry_type=DeviceEntryType.SERVICE,
130 """Return the state of the sensor."""
None __init__(self, SwissPublicTransportDataUpdateCoordinator coordinator, SwissPublicTransportSensorEntityDescription entity_description, str unique_id)
StateType|datetime native_value(self)
None async_setup_entry(HomeAssistant hass, SwissPublicTransportConfigEntry config_entry, AddEntitiesCallback async_add_entities)