Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Support for getting temperature from TEMPer devices."""
2 
3 from __future__ import annotations
4 
5 import logging
6 
7 from temperusb.temper import TemperHandler
8 import voluptuous as vol
9 
11  PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA,
12  SensorDeviceClass,
13  SensorEntity,
14 )
15 from homeassistant.const import (
16  CONF_NAME,
17  CONF_OFFSET,
18  DEVICE_DEFAULT_NAME,
19  UnitOfTemperature,
20 )
21 from homeassistant.core import HomeAssistant
22 from homeassistant.helpers.entity_platform import AddEntitiesCallback
23 from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
24 
25 _LOGGER = logging.getLogger(__name__)
26 
27 CONF_SCALE = "scale"
28 
29 PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend(
30  {
31  vol.Optional(CONF_NAME, default=DEVICE_DEFAULT_NAME): vol.Coerce(str),
32  vol.Optional(CONF_SCALE, default=1): vol.Coerce(float),
33  vol.Optional(CONF_OFFSET, default=0): vol.Coerce(float),
34  }
35 )
36 
37 TEMPER_SENSORS: list[TemperSensor] = []
38 
39 
41  """Scan the Temper devices from temperusb."""
42  return TemperHandler().get_devices()
43 
44 
46  hass: HomeAssistant,
47  config: ConfigType,
48  add_entities: AddEntitiesCallback,
49  discovery_info: DiscoveryInfoType | None = None,
50 ) -> None:
51  """Set up the Temper sensors."""
52  prefix = name = config[CONF_NAME]
53  scaling = {"scale": config.get(CONF_SCALE), "offset": config.get(CONF_OFFSET)}
54  temper_devices = get_temper_devices()
55 
56  for idx, dev in enumerate(temper_devices):
57  if idx != 0:
58  name = f"{prefix}_{idx!s}"
59  TEMPER_SENSORS.append(TemperSensor(dev, name, scaling))
60  add_entities(TEMPER_SENSORS)
61 
62 
64  """Re-scan for underlying Temper sensors and assign them to our devices.
65 
66  This assumes the same sensor devices are present in the same order.
67  """
68  temper_devices = get_temper_devices()
69  for sensor, device in zip(TEMPER_SENSORS, temper_devices, strict=False):
70  sensor.set_temper_device(device)
71 
72 
74  """Representation of a Temper temperature sensor."""
75 
76  _attr_device_class = SensorDeviceClass.TEMPERATURE
77  _attr_native_unit_of_measurement = UnitOfTemperature.CELSIUS
78 
79  def __init__(self, temper_device, name, scaling):
80  """Initialize the sensor."""
81  self.scalescale = scaling["scale"]
82  self.offsetoffset = scaling["offset"]
83  self.set_temper_deviceset_temper_device(temper_device)
84 
85  self._attr_name_attr_name = name
86 
87  def set_temper_device(self, temper_device):
88  """Assign the underlying device for this sensor."""
89  self.temper_devicetemper_device = temper_device
90 
91  # set calibration data
92  self.temper_devicetemper_device.set_calibration_data(scale=self.scalescale, offset=self.offsetoffset)
93 
94  def update(self) -> None:
95  """Retrieve latest state."""
96  try:
97  sensor_value = self.temper_devicetemper_device.get_temperature("celsius")
98  self._attr_native_value_attr_native_value = round(sensor_value, 1)
99  except OSError:
100  _LOGGER.error(
101  "Failed to get temperature. The device address may"
102  "have changed. Attempting to reset device"
103  )
104  reset_devices()
def __init__(self, temper_device, name, scaling)
Definition: sensor.py:79
def set_temper_device(self, temper_device)
Definition: sensor.py:87
def add_entities(account, async_add_entities, tracked)
Definition: sensor.py:40
float|None get_temperature(MadVRCoordinator coordinator, str key)
Definition: sensor.py:57
None setup_platform(HomeAssistant hass, ConfigType config, AddEntitiesCallback add_entities, DiscoveryInfoType|None discovery_info=None)
Definition: sensor.py:50