Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Support for transport.opendata.ch."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable
6 from dataclasses import dataclass
7 from datetime import datetime, timedelta
8 import logging
9 from typing import TYPE_CHECKING
10 
12  SensorDeviceClass,
13  SensorEntity,
14  SensorEntityDescription,
15 )
16 from homeassistant.const import UnitOfTime
17 from homeassistant.core import HomeAssistant
18 from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo
19 from homeassistant.helpers.entity_platform import AddEntitiesCallback
20 from homeassistant.helpers.typing import StateType
21 from homeassistant.helpers.update_coordinator import CoordinatorEntity
22 
23 from .const import CONNECTIONS_COUNT, DOMAIN
24 from .coordinator import (
25  DataConnection,
26  SwissPublicTransportConfigEntry,
27  SwissPublicTransportDataUpdateCoordinator,
28 )
29 
30 _LOGGER = logging.getLogger(__name__)
31 
32 SCAN_INTERVAL = timedelta(seconds=90)
33 
34 
35 @dataclass(kw_only=True, frozen=True)
37  """Describes swiss public transport sensor entity."""
38 
39  value_fn: Callable[[DataConnection], StateType | datetime]
40 
41  index: int = 0
42 
43 
44 SENSORS: tuple[SwissPublicTransportSensorEntityDescription, ...] = (
45  *[
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"],
51  index=i,
52  )
53  for i in range(CONNECTIONS_COUNT)
54  ],
56  key="duration",
57  device_class=SensorDeviceClass.DURATION,
58  native_unit_of_measurement=UnitOfTime.SECONDS,
59  value_fn=lambda data_connection: data_connection["duration"],
60  ),
62  key="transfers",
63  translation_key="transfers",
64  value_fn=lambda data_connection: data_connection["transfers"],
65  ),
67  key="platform",
68  translation_key="platform",
69  value_fn=lambda data_connection: data_connection["platform"],
70  ),
72  key="delay",
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"],
77  ),
79  key="line",
80  translation_key="line",
81  value_fn=lambda data_connection: data_connection["line"],
82  ),
83 )
84 
85 
87  hass: HomeAssistant,
88  config_entry: SwissPublicTransportConfigEntry,
89  async_add_entities: AddEntitiesCallback,
90 ) -> None:
91  """Set up the sensor from a config entry created in the integrations UI."""
92  unique_id = config_entry.unique_id
93 
94  if TYPE_CHECKING:
95  assert unique_id
96 
98  SwissPublicTransportSensor(config_entry.runtime_data, description, unique_id)
99  for description in SENSORS
100  )
101 
102 
104  CoordinatorEntity[SwissPublicTransportDataUpdateCoordinator], SensorEntity
105 ):
106  """Implementation of a Swiss public transport sensor."""
107 
108  entity_description: SwissPublicTransportSensorEntityDescription
109  _attr_attribution = "Data provided by transport.opendata.ch"
110  _attr_has_entity_name = True
111 
112  def __init__(
113  self,
114  coordinator: SwissPublicTransportDataUpdateCoordinator,
115  entity_description: SwissPublicTransportSensorEntityDescription,
116  unique_id: str,
117  ) -> None:
118  """Initialize the sensor."""
119  super().__init__(coordinator)
120  self.entity_descriptionentity_description = entity_description
121  self._attr_unique_id_attr_unique_id = f"{unique_id}_{entity_description.key}"
122  self._attr_device_info_attr_device_info = DeviceInfo(
123  identifiers={(DOMAIN, unique_id)},
124  manufacturer="Opendata.ch",
125  entry_type=DeviceEntryType.SERVICE,
126  )
127 
128  @property
129  def native_value(self) -> StateType | datetime:
130  """Return the state of the sensor."""
131  return self.entity_descriptionentity_description.value_fn(
132  self.coordinator.data[self.entity_descriptionentity_description.index]
133  )
None __init__(self, SwissPublicTransportDataUpdateCoordinator coordinator, SwissPublicTransportSensorEntityDescription entity_description, str unique_id)
Definition: sensor.py:117
None async_setup_entry(HomeAssistant hass, SwissPublicTransportConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:90