Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Support for TMB (Transports Metropolitans de Barcelona) Barcelona public transport."""
2 
3 from __future__ import annotations
4 
5 from datetime import timedelta
6 import logging
7 
8 from requests import HTTPError
9 from tmb import IBus
10 import voluptuous as vol
11 
13  PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA,
14  SensorEntity,
15 )
16 from homeassistant.const import CONF_NAME, UnitOfTime
17 from homeassistant.core import HomeAssistant
19 from homeassistant.helpers.entity_platform import AddEntitiesCallback
20 from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
21 from homeassistant.util import Throttle
22 
23 _LOGGER = logging.getLogger(__name__)
24 
25 CONF_APP_ID = "app_id"
26 CONF_APP_KEY = "app_key"
27 CONF_LINE = "line"
28 CONF_BUS_STOP = "stop"
29 CONF_BUS_STOPS = "stops"
30 ATTR_BUS_STOP = "stop"
31 ATTR_LINE = "line"
32 
33 MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=60)
34 
35 LINE_STOP_SCHEMA = vol.Schema(
36  {
37  vol.Required(CONF_BUS_STOP): cv.string,
38  vol.Required(CONF_LINE): cv.string,
39  vol.Optional(CONF_NAME): cv.string,
40  }
41 )
42 
43 PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend(
44  {
45  vol.Required(CONF_APP_ID): cv.string,
46  vol.Required(CONF_APP_KEY): cv.string,
47  vol.Required(CONF_BUS_STOPS): vol.All(cv.ensure_list, [LINE_STOP_SCHEMA]),
48  }
49 )
50 
51 
53  hass: HomeAssistant,
54  config: ConfigType,
55  add_entities: AddEntitiesCallback,
56  discovery_info: DiscoveryInfoType | None = None,
57 ) -> None:
58  """Set up the sensors."""
59  ibus_client = IBus(config[CONF_APP_ID], config[CONF_APP_KEY])
60 
61  sensors = []
62 
63  for line_stop in config[CONF_BUS_STOPS]:
64  line = line_stop[CONF_LINE]
65  stop = line_stop[CONF_BUS_STOP]
66  if line_stop.get(CONF_NAME):
67  name = f"{line} - {line_stop[CONF_NAME]} ({stop})"
68  else:
69  name = f"{line} - {stop}"
70  sensors.append(TMBSensor(ibus_client, stop, line, name))
71 
72  add_entities(sensors, True)
73 
74 
76  """Implementation of a TMB line/stop Sensor."""
77 
78  _attr_attribution = "Data provided by Transport Metropolitans de Barcelona"
79  _attr_icon = "mdi:bus-clock"
80 
81  def __init__(self, ibus_client, stop, line, name):
82  """Initialize the sensor."""
83  self._ibus_client_ibus_client = ibus_client
84  self._stop_stop = stop
85  self._line_line = line.upper()
86  self._name_name = name
87  self._unit_unit = UnitOfTime.MINUTES
88  self._state_state = None
89 
90  @property
91  def name(self):
92  """Return the name of the sensor."""
93  return self._name_name
94 
95  @property
97  """Return the unit of measurement."""
98  return self._unit_unit
99 
100  @property
101  def unique_id(self):
102  """Return a unique, HASS-friendly identifier for this entity."""
103  return f"{self._stop}_{self._line}"
104 
105  @property
106  def native_value(self):
107  """Return the next departure time."""
108  return self._state_state
109 
110  @property
112  """Return the state attributes of the last update."""
113  return {
114  ATTR_BUS_STOP: self._stop_stop,
115  ATTR_LINE: self._line_line,
116  }
117 
118  @Throttle(MIN_TIME_BETWEEN_UPDATES)
119  def update(self) -> None:
120  """Get the next bus information."""
121  try:
122  self._state_state = self._ibus_client_ibus_client.get_stop_forecast(self._stop_stop, self._line_line)
123  except HTTPError:
124  _LOGGER.error(
125  "Unable to fetch data from TMB API. Please check your API keys are"
126  " valid"
127  )
def __init__(self, ibus_client, stop, line, name)
Definition: sensor.py:81
def add_entities(account, async_add_entities, tracked)
Definition: sensor.py:40
None setup_platform(HomeAssistant hass, ConfigType config, AddEntitiesCallback add_entities, DiscoveryInfoType|None discovery_info=None)
Definition: sensor.py:57