Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Support for israel rail."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable
6 from dataclasses import dataclass
7 from datetime import datetime
8 import logging
9 from typing import TYPE_CHECKING
10 
12  SensorDeviceClass,
13  SensorEntity,
14  SensorEntityDescription,
15 )
16 from homeassistant.core import HomeAssistant
17 from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo
18 from homeassistant.helpers.entity_platform import AddEntitiesCallback
19 from homeassistant.helpers.typing import StateType
20 from homeassistant.helpers.update_coordinator import CoordinatorEntity
21 
22 from . import IsraelRailConfigEntry
23 from .const import ATTRIBUTION, DEPARTURES_COUNT, DOMAIN
24 from .coordinator import DataConnection, IsraelRailDataUpdateCoordinator
25 
26 _LOGGER = logging.getLogger(__name__)
27 
28 
29 @dataclass(kw_only=True, frozen=True)
31  """Describes israel rail sensor entity."""
32 
33  value_fn: Callable[[DataConnection], StateType | datetime]
34 
35  index: int = 0
36 
37 
38 DEPARTURE_SENSORS: tuple[IsraelRailSensorEntityDescription, ...] = (
39  *[
41  key=f"departure{i or ''}",
42  translation_key=f"departure{i}",
43  device_class=SensorDeviceClass.TIMESTAMP,
44  value_fn=lambda data_connection: data_connection.departure,
45  index=i,
46  )
47  for i in range(DEPARTURES_COUNT)
48  ],
49 )
50 
51 SENSORS: tuple[IsraelRailSensorEntityDescription, ...] = (
53  key="platform",
54  translation_key="platform",
55  value_fn=lambda data_connection: data_connection.platform,
56  ),
58  key="trains",
59  translation_key="trains",
60  value_fn=lambda data_connection: data_connection.trains,
61  ),
63  key="train_number",
64  translation_key="train_number",
65  value_fn=lambda data_connection: data_connection.train_number,
66  ),
67 )
68 
69 
71  hass: HomeAssistant,
72  config_entry: IsraelRailConfigEntry,
73  async_add_entities: AddEntitiesCallback,
74 ) -> None:
75  """Set up the sensor from a config entry created in the integrations UI."""
76  coordinator = config_entry.runtime_data
77 
78  unique_id = config_entry.unique_id
79 
80  if TYPE_CHECKING:
81  assert unique_id
82 
84  IsraelRailEntitySensor(coordinator, description, unique_id)
85  for description in (*DEPARTURE_SENSORS, *SENSORS)
86  )
87 
88 
90  CoordinatorEntity[IsraelRailDataUpdateCoordinator], SensorEntity
91 ):
92  """Define a Israel Rail sensor."""
93 
94  entity_description: IsraelRailSensorEntityDescription
95  _attr_attribution = ATTRIBUTION
96  _attr_has_entity_name = True
97 
98  def __init__(
99  self,
100  coordinator: IsraelRailDataUpdateCoordinator,
101  entity_description: IsraelRailSensorEntityDescription,
102  unique_id: str,
103  ) -> None:
104  """Initialize the sensor."""
105  super().__init__(coordinator)
106  self.entity_descriptionentity_description = entity_description
107  self._attr_device_info_attr_device_info = DeviceInfo(
108  identifiers={(DOMAIN, unique_id)},
109  entry_type=DeviceEntryType.SERVICE,
110  )
111  self._attr_unique_id_attr_unique_id = f"{unique_id}_{entity_description.key}"
112 
113  @property
114  def native_value(self) -> StateType | datetime:
115  """Return the state of the sensor."""
116  return self.entity_descriptionentity_description.value_fn(
117  self.coordinator.data[self.entity_descriptionentity_description.index]
118  )
None __init__(self, IsraelRailDataUpdateCoordinator coordinator, IsraelRailSensorEntityDescription entity_description, str unique_id)
Definition: sensor.py:103
None async_setup_entry(HomeAssistant hass, IsraelRailConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:74