Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Support for De Lijn (Flemish public transport) information."""
2 
3 from __future__ import annotations
4 
5 from datetime import datetime
6 import logging
7 
8 from pydelijn.api import Passages
9 from pydelijn.common import HttpException
10 import voluptuous as vol
11 
13  PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA,
14  SensorDeviceClass,
15  SensorEntity,
16 )
17 from homeassistant.const import CONF_API_KEY
18 from homeassistant.core import HomeAssistant
19 from homeassistant.helpers.aiohttp_client import async_get_clientsession
21 from homeassistant.helpers.entity_platform import AddEntitiesCallback
22 from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
23 
24 _LOGGER = logging.getLogger(__name__)
25 
26 ATTRIBUTION = "Data provided by data.delijn.be"
27 
28 CONF_NEXT_DEPARTURE = "next_departure"
29 CONF_STOP_ID = "stop_id"
30 CONF_NUMBER_OF_DEPARTURES = "number_of_departures"
31 
32 DEFAULT_NAME = "De Lijn"
33 
34 PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend(
35  {
36  vol.Required(CONF_API_KEY): cv.string,
37  vol.Required(CONF_NEXT_DEPARTURE): [
38  {
39  vol.Required(CONF_STOP_ID): cv.string,
40  vol.Optional(CONF_NUMBER_OF_DEPARTURES, default=5): cv.positive_int,
41  }
42  ],
43  }
44 )
45 
46 AUTO_ATTRIBUTES = (
47  "line_number_public",
48  "line_transport_type",
49  "final_destination",
50  "due_at_schedule",
51  "due_at_realtime",
52  "is_realtime",
53 )
54 
55 
57  hass: HomeAssistant,
58  config: ConfigType,
59  async_add_entities: AddEntitiesCallback,
60  discovery_info: DiscoveryInfoType | None = None,
61 ) -> None:
62  """Create the sensor."""
63  api_key = config[CONF_API_KEY]
64 
65  session = async_get_clientsession(hass)
66 
68  (
70  Passages(
71  nextpassage[CONF_STOP_ID],
72  nextpassage[CONF_NUMBER_OF_DEPARTURES],
73  api_key,
74  session,
75  True,
76  )
77  )
78  for nextpassage in config[CONF_NEXT_DEPARTURE]
79  ),
80  True,
81  )
82 
83 
85  """Representation of a Ruter sensor."""
86 
87  _attr_attribution = ATTRIBUTION
88  _attr_device_class = SensorDeviceClass.TIMESTAMP
89  _attr_icon = "mdi:bus"
90 
91  def __init__(self, line):
92  """Initialize the sensor."""
93  self.lineline = line
94  self._attr_extra_state_attributes_attr_extra_state_attributes = {}
95 
96  async def async_update(self) -> None:
97  """Get the latest data from the De Lijn API."""
98  try:
99  await self.lineline.get_passages()
100  self._attr_name_attr_name = await self.lineline.get_stopname()
101  except HttpException:
102  self._attr_available_attr_available = False
103  _LOGGER.error("De Lijn http error")
104  return
105 
106  self._attr_extra_state_attributes_attr_extra_state_attributes["stopname"] = self._attr_name_attr_name
107 
108  if not self.lineline.passages:
109  self._attr_available_attr_available = False
110  return
111 
112  try:
113  first = self.lineline.passages[0]
114  if (first_passage := first["due_at_realtime"]) is None:
115  first_passage = first["due_at_schedule"]
116  self._attr_native_value_attr_native_value = datetime.strptime(
117  first_passage, "%Y-%m-%dT%H:%M:%S%z"
118  )
119 
120  for key in AUTO_ATTRIBUTES:
121  self._attr_extra_state_attributes_attr_extra_state_attributes[key] = first[key]
122  self._attr_extra_state_attributes_attr_extra_state_attributes["next_passages"] = self.lineline.passages
123 
124  self._attr_available_attr_available = True
125  except KeyError as error:
126  _LOGGER.error("Invalid data received from De Lijn: %s", error)
127  self._attr_available_attr_available = False
None async_setup_platform(HomeAssistant hass, ConfigType config, AddEntitiesCallback async_add_entities, DiscoveryInfoType|None discovery_info=None)
Definition: sensor.py:61
aiohttp.ClientSession async_get_clientsession(HomeAssistant hass, bool verify_ssl=True, socket.AddressFamily family=socket.AF_UNSPEC, ssl_util.SSLCipherList ssl_cipher=ssl_util.SSLCipherList.PYTHON_DEFAULT)