Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Platform for sensor integration."""
2 
3 from __future__ import annotations
4 
5 from devolo_home_control_api.devices.zwave import Zwave
6 from devolo_home_control_api.homecontrol import HomeControl
7 
9  SensorDeviceClass,
10  SensorEntity,
11  SensorStateClass,
12 )
13 from homeassistant.const import PERCENTAGE, EntityCategory
14 from homeassistant.core import HomeAssistant
15 from homeassistant.helpers.entity_platform import AddEntitiesCallback
16 
17 from . import DevoloHomeControlConfigEntry
18 from .entity import DevoloDeviceEntity
19 
20 DEVICE_CLASS_MAPPING = {
21  "battery": SensorDeviceClass.BATTERY,
22  "temperature": SensorDeviceClass.TEMPERATURE,
23  "humidity": SensorDeviceClass.HUMIDITY,
24  "current": SensorDeviceClass.POWER,
25  "total": SensorDeviceClass.ENERGY,
26  "voltage": SensorDeviceClass.VOLTAGE,
27 }
28 
29 STATE_CLASS_MAPPING = {
30  "battery": SensorStateClass.MEASUREMENT,
31  "temperature": SensorStateClass.MEASUREMENT,
32  "light": SensorStateClass.MEASUREMENT,
33  "humidity": SensorStateClass.MEASUREMENT,
34  "current": SensorStateClass.MEASUREMENT,
35  "total": SensorStateClass.TOTAL_INCREASING,
36  "voltage": SensorStateClass.MEASUREMENT,
37 }
38 
39 
41  hass: HomeAssistant,
42  entry: DevoloHomeControlConfigEntry,
43  async_add_entities: AddEntitiesCallback,
44 ) -> None:
45  """Get all sensor devices and setup them via config entry."""
46  entities: list[SensorEntity] = []
47 
48  for gateway in entry.runtime_data:
49  entities.extend(
51  homecontrol=gateway,
52  device_instance=device,
53  element_uid=multi_level_sensor,
54  )
55  for device in gateway.multi_level_sensor_devices
56  for multi_level_sensor in device.multi_level_sensor_property
57  )
58  entities.extend(
60  homecontrol=gateway,
61  device_instance=device,
62  element_uid=consumption,
63  consumption=consumption_type,
64  )
65  for device in gateway.devices.values()
66  if hasattr(device, "consumption_property")
67  for consumption in device.consumption_property
68  for consumption_type in ("current", "total")
69  )
70  entities.extend(
72  homecontrol=gateway,
73  device_instance=device,
74  element_uid=f"devolo.BatterySensor:{device.uid}",
75  )
76  for device in gateway.devices.values()
77  if hasattr(device, "battery_level")
78  )
79 
80  async_add_entities(entities)
81 
82 
84  """Abstract representation of a multi level sensor within devolo Home Control."""
85 
86  @property
87  def native_value(self) -> float:
88  """Return the state of the sensor."""
89  return self._value_value
90 
91 
93  """Representation of a generic multi level sensor within devolo Home Control."""
94 
95  def __init__(
96  self,
97  homecontrol: HomeControl,
98  device_instance: Zwave,
99  element_uid: str,
100  ) -> None:
101  """Initialize a devolo multi level sensor."""
102  self._multi_level_sensor_property_multi_level_sensor_property = device_instance.multi_level_sensor_property[
103  element_uid
104  ]
105 
106  super().__init__(
107  homecontrol=homecontrol,
108  device_instance=device_instance,
109  element_uid=element_uid,
110  )
111 
112  self._attr_device_class_attr_device_class = DEVICE_CLASS_MAPPING.get(
113  self._multi_level_sensor_property_multi_level_sensor_property.sensor_type
114  )
115  self._attr_state_class_attr_state_class = STATE_CLASS_MAPPING.get(
116  self._multi_level_sensor_property_multi_level_sensor_property.sensor_type
117  )
118  self._attr_native_unit_of_measurement_attr_native_unit_of_measurement = self._multi_level_sensor_property_multi_level_sensor_property.unit
119  self._attr_name_attr_name = self._multi_level_sensor_property_multi_level_sensor_property.sensor_type.capitalize()
120  self._value_value_value = self._multi_level_sensor_property_multi_level_sensor_property.value
121 
122  if element_uid.startswith("devolo.VoltageMultiLevelSensor:"):
123  self._attr_entity_registry_enabled_default_attr_entity_registry_enabled_default = False
124 
125 
127  """Representation of a battery entity within devolo Home Control."""
128 
129  _attr_entity_category = EntityCategory.DIAGNOSTIC
130  _attr_native_unit_of_measurement = PERCENTAGE
131  _attr_name = "Battery level"
132  _attr_device_class = SensorDeviceClass.BATTERY
133  _attr_state_class = SensorStateClass.MEASUREMENT
134 
135  def __init__(
136  self, homecontrol: HomeControl, device_instance: Zwave, element_uid: str
137  ) -> None:
138  """Initialize a battery sensor."""
139 
140  super().__init__(
141  homecontrol=homecontrol,
142  device_instance=device_instance,
143  element_uid=element_uid,
144  )
145 
146  self._value_value_value = device_instance.battery_level
147 
148 
150  """Representation of a consumption entity within devolo Home Control."""
151 
152  def __init__(
153  self,
154  homecontrol: HomeControl,
155  device_instance: Zwave,
156  element_uid: str,
157  consumption: str,
158  ) -> None:
159  """Initialize a devolo consumption sensor."""
160 
161  super().__init__(
162  homecontrol=homecontrol,
163  device_instance=device_instance,
164  element_uid=element_uid,
165  )
166 
167  self._sensor_type_sensor_type = consumption
168  self._attr_device_class_attr_device_class = DEVICE_CLASS_MAPPING.get(consumption)
169  self._attr_state_class_attr_state_class = STATE_CLASS_MAPPING.get(consumption)
170  self._attr_native_unit_of_measurement_attr_native_unit_of_measurement = getattr(
171  device_instance.consumption_property[element_uid], f"{consumption}_unit"
172  )
173 
174  self._value_value_value = getattr(
175  device_instance.consumption_property[element_uid], consumption
176  )
177 
178  self._attr_name_attr_name = f"{consumption.capitalize()} consumption"
179 
180  @property
181  def unique_id(self) -> str:
182  """Return the unique ID of the entity.
183 
184  As both sensor types share the same element_uid we need to extend original
185  self._attr_unique_id to be really unique.
186  """
187  return f"{self._attr_unique_id}_{self._sensor_type}"
188 
189  def _sync(self, message: tuple) -> None:
190  """Update the consumption sensor state."""
191  if message[0] == self._attr_unique_id_attr_unique_id:
192  self._value_value_value = getattr(
193  self._device_instance_device_instance.consumption_property[self._attr_unique_id_attr_unique_id],
194  self._sensor_type_sensor_type,
195  )
196  else:
197  self._generic_message_generic_message(message)
198  self.schedule_update_ha_stateschedule_update_ha_state()
None __init__(self, HomeControl homecontrol, Zwave device_instance, str element_uid)
Definition: sensor.py:137
None __init__(self, HomeControl homecontrol, Zwave device_instance, str element_uid, str consumption)
Definition: sensor.py:158
None __init__(self, HomeControl homecontrol, Zwave device_instance, str element_uid)
Definition: sensor.py:100
None schedule_update_ha_state(self, bool force_refresh=False)
Definition: entity.py:1244
None async_setup_entry(HomeAssistant hass, DevoloHomeControlConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:44