Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Support for Tellstick sensors."""
2 
3 from __future__ import annotations
4 
5 from collections import namedtuple
6 import logging
7 
8 from tellcore import telldus
9 import tellcore.constants as tellcore_constants
10 import voluptuous as vol
11 
13  PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA,
14  SensorDeviceClass,
15  SensorEntity,
16 )
17 from homeassistant.const import (
18  CONF_ID,
19  CONF_MODEL,
20  CONF_NAME,
21  CONF_PROTOCOL,
22  PERCENTAGE,
23  UnitOfTemperature,
24 )
25 from homeassistant.core import HomeAssistant
27 from homeassistant.helpers.entity_platform import AddEntitiesCallback
28 from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
29 
30 _LOGGER = logging.getLogger(__name__)
31 
32 DatatypeDescription = namedtuple( # noqa: PYI024
33  "DatatypeDescription", ["name", "unit", "device_class"]
34 )
35 
36 CONF_DATATYPE_MASK = "datatype_mask"
37 CONF_ONLY_NAMED = "only_named"
38 CONF_TEMPERATURE_SCALE = "temperature_scale"
39 
40 DEFAULT_DATATYPE_MASK = 127
41 DEFAULT_TEMPERATURE_SCALE = UnitOfTemperature.CELSIUS
42 
43 PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend(
44  {
45  vol.Optional(
46  CONF_TEMPERATURE_SCALE, default=DEFAULT_TEMPERATURE_SCALE
47  ): cv.string,
48  vol.Optional(
49  CONF_DATATYPE_MASK, default=DEFAULT_DATATYPE_MASK
50  ): cv.positive_int,
51  vol.Optional(CONF_ONLY_NAMED, default=[]): vol.All(
52  cv.ensure_list,
53  [
54  vol.Schema(
55  {
56  vol.Required(CONF_ID): cv.positive_int,
57  vol.Required(CONF_NAME): cv.string,
58  vol.Optional(CONF_PROTOCOL): cv.string,
59  vol.Optional(CONF_MODEL): cv.string,
60  }
61  )
62  ],
63  ),
64  }
65 )
66 
67 
69  hass: HomeAssistant,
70  config: ConfigType,
71  add_entities: AddEntitiesCallback,
72  discovery_info: DiscoveryInfoType | None = None,
73 ) -> None:
74  """Set up the Tellstick sensors."""
75 
76  sensor_value_descriptions = {
77  tellcore_constants.TELLSTICK_TEMPERATURE: DatatypeDescription(
78  "temperature",
79  config.get(CONF_TEMPERATURE_SCALE),
80  SensorDeviceClass.TEMPERATURE,
81  ),
82  tellcore_constants.TELLSTICK_HUMIDITY: DatatypeDescription(
83  "humidity",
84  PERCENTAGE,
85  SensorDeviceClass.HUMIDITY,
86  ),
87  tellcore_constants.TELLSTICK_RAINRATE: DatatypeDescription(
88  "rain rate", "", None
89  ),
90  tellcore_constants.TELLSTICK_RAINTOTAL: DatatypeDescription(
91  "rain total", "", None
92  ),
93  tellcore_constants.TELLSTICK_WINDDIRECTION: DatatypeDescription(
94  "wind direction", "", None
95  ),
96  tellcore_constants.TELLSTICK_WINDAVERAGE: DatatypeDescription(
97  "wind average", "", None
98  ),
99  tellcore_constants.TELLSTICK_WINDGUST: DatatypeDescription(
100  "wind gust", "", None
101  ),
102  }
103 
104  try:
105  tellcore_lib = telldus.TelldusCore()
106  except OSError:
107  _LOGGER.exception("Could not initialize Tellstick")
108  return
109 
110  sensors = []
111  datatype_mask = config.get(CONF_DATATYPE_MASK)
112 
113  if config[CONF_ONLY_NAMED]:
114  named_sensors = {}
115  for named_sensor in config[CONF_ONLY_NAMED]:
116  name = named_sensor[CONF_NAME]
117  proto = named_sensor.get(CONF_PROTOCOL)
118  model = named_sensor.get(CONF_MODEL)
119  id_ = named_sensor[CONF_ID]
120  if proto is not None:
121  if model is not None:
122  named_sensors[f"{proto}{model}{id_}"] = name
123  else:
124  named_sensors[f"{proto}{id_}"] = name
125  else:
126  named_sensors[id_] = name
127 
128  for tellcore_sensor in tellcore_lib.sensors():
129  if not config[CONF_ONLY_NAMED]:
130  sensor_name = str(tellcore_sensor.id)
131  else:
132  proto_id = f"{tellcore_sensor.protocol}{tellcore_sensor.id}"
133  proto_model_id = (
134  f"{tellcore_sensor.protocol}{tellcore_sensor.model}{tellcore_sensor.id}"
135  )
136  if tellcore_sensor.id in named_sensors:
137  sensor_name = named_sensors[tellcore_sensor.id]
138  elif proto_id in named_sensors:
139  sensor_name = named_sensors[proto_id]
140  elif proto_model_id in named_sensors:
141  sensor_name = named_sensors[proto_model_id]
142  else:
143  continue
144 
145  for datatype, sensor_info in sensor_value_descriptions.items():
146  if datatype & datatype_mask and tellcore_sensor.has_value(datatype):
147  sensors.append(
148  TellstickSensor(sensor_name, tellcore_sensor, datatype, sensor_info)
149  )
150 
151  add_entities(sensors)
152 
153 
155  """Representation of a Tellstick sensor."""
156 
157  def __init__(self, name, tellcore_sensor, datatype, sensor_info):
158  """Initialize the sensor."""
159  self._datatype_datatype = datatype
160  self._tellcore_sensor_tellcore_sensor = tellcore_sensor
161  self._attr_native_unit_of_measurement_attr_native_unit_of_measurement = sensor_info.unit or None
162  self._attr_name_attr_name = f"{name} {sensor_info.name}"
163 
164  def update(self) -> None:
165  """Update tellstick sensor."""
166  self._attr_native_value_attr_native_value = self._tellcore_sensor_tellcore_sensor.value(self._datatype_datatype).value
def __init__(self, name, tellcore_sensor, datatype, sensor_info)
Definition: sensor.py:157
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:73