Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Support for the Airzone sensors."""
2 
3 from __future__ import annotations
4 
5 from typing import Any, Final
6 
7 from aioairzone.const import (
8  AZD_HOT_WATER,
9  AZD_HUMIDITY,
10  AZD_TEMP,
11  AZD_TEMP_UNIT,
12  AZD_WEBSERVER,
13  AZD_WIFI_RSSI,
14  AZD_ZONES,
15 )
16 
18  SensorDeviceClass,
19  SensorEntity,
20  SensorEntityDescription,
21  SensorStateClass,
22 )
23 from homeassistant.config_entries import ConfigEntry
24 from homeassistant.const import (
25  PERCENTAGE,
26  SIGNAL_STRENGTH_DECIBELS_MILLIWATT,
27  EntityCategory,
28  UnitOfTemperature,
29 )
30 from homeassistant.core import HomeAssistant, callback
31 from homeassistant.helpers.entity_platform import AddEntitiesCallback
32 
33 from . import AirzoneConfigEntry
34 from .const import TEMP_UNIT_LIB_TO_HASS
35 from .coordinator import AirzoneUpdateCoordinator
36 from .entity import (
37  AirzoneEntity,
38  AirzoneHotWaterEntity,
39  AirzoneWebServerEntity,
40  AirzoneZoneEntity,
41 )
42 
43 HOT_WATER_SENSOR_TYPES: Final[tuple[SensorEntityDescription, ...]] = (
45  device_class=SensorDeviceClass.TEMPERATURE,
46  key=AZD_TEMP,
47  native_unit_of_measurement=UnitOfTemperature.CELSIUS,
48  state_class=SensorStateClass.MEASUREMENT,
49  ),
50 )
51 
52 WEBSERVER_SENSOR_TYPES: Final[tuple[SensorEntityDescription, ...]] = (
54  device_class=SensorDeviceClass.SIGNAL_STRENGTH,
55  entity_category=EntityCategory.DIAGNOSTIC,
56  entity_registry_enabled_default=False,
57  key=AZD_WIFI_RSSI,
58  translation_key="rssi",
59  native_unit_of_measurement=SIGNAL_STRENGTH_DECIBELS_MILLIWATT,
60  state_class=SensorStateClass.MEASUREMENT,
61  ),
62 )
63 
64 ZONE_SENSOR_TYPES: Final[tuple[SensorEntityDescription, ...]] = (
66  device_class=SensorDeviceClass.TEMPERATURE,
67  key=AZD_TEMP,
68  native_unit_of_measurement=UnitOfTemperature.CELSIUS,
69  state_class=SensorStateClass.MEASUREMENT,
70  ),
72  device_class=SensorDeviceClass.HUMIDITY,
73  key=AZD_HUMIDITY,
74  native_unit_of_measurement=PERCENTAGE,
75  state_class=SensorStateClass.MEASUREMENT,
76  ),
77 )
78 
79 
81  hass: HomeAssistant,
82  entry: AirzoneConfigEntry,
83  async_add_entities: AddEntitiesCallback,
84 ) -> None:
85  """Add Airzone sensors from a config_entry."""
86  coordinator = entry.runtime_data
87 
88  added_zones: set[str] = set()
89 
90  def _async_entity_listener() -> None:
91  """Handle additions of sensors."""
92 
93  entities: list[AirzoneSensor] = []
94 
95  zones_data = coordinator.data.get(AZD_ZONES, {})
96  received_zones = set(zones_data)
97  new_zones = received_zones - added_zones
98  if new_zones:
99  entities.extend(
101  coordinator,
102  description,
103  entry,
104  system_zone_id,
105  zones_data.get(system_zone_id),
106  )
107  for system_zone_id in new_zones
108  for description in ZONE_SENSOR_TYPES
109  if description.key in zones_data.get(system_zone_id)
110  )
111  added_zones.update(new_zones)
112 
113  async_add_entities(entities)
114 
115  entities: list[AirzoneSensor] = []
116 
117  if AZD_HOT_WATER in coordinator.data:
118  entities.extend(
120  coordinator,
121  description,
122  entry,
123  )
124  for description in HOT_WATER_SENSOR_TYPES
125  if description.key in coordinator.data[AZD_HOT_WATER]
126  )
127 
128  if AZD_WEBSERVER in coordinator.data:
129  entities.extend(
131  coordinator,
132  description,
133  entry,
134  )
135  for description in WEBSERVER_SENSOR_TYPES
136  if description.key in coordinator.data[AZD_WEBSERVER]
137  )
138 
139  async_add_entities(entities)
140 
141  entry.async_on_unload(coordinator.async_add_listener(_async_entity_listener))
142  _async_entity_listener()
143 
144 
146  """Define an Airzone sensor."""
147 
148  @callback
149  def _handle_coordinator_update(self) -> None:
150  """Update attributes when the coordinator updates."""
151  self._async_update_attrs_async_update_attrs()
153 
154  @callback
155  def _async_update_attrs(self) -> None:
156  """Update sensor attributes."""
157  self._attr_native_value_attr_native_value = self.get_airzone_valueget_airzone_value(self.entity_description.key)
158 
159 
161  """Define an Airzone Hot Water sensor."""
162 
163  def __init__(
164  self,
165  coordinator: AirzoneUpdateCoordinator,
166  description: SensorEntityDescription,
167  entry: ConfigEntry,
168  ) -> None:
169  """Initialize."""
170  super().__init__(coordinator, entry)
171 
172  self._attr_unique_id_attr_unique_id_attr_unique_id = f"{self._attr_unique_id}_dhw_{description.key}"
173  self.entity_descriptionentity_description = description
174 
175  self._attr_native_unit_of_measurement_attr_native_unit_of_measurement = TEMP_UNIT_LIB_TO_HASS.get(
176  self.get_airzone_valueget_airzone_valueget_airzone_value(AZD_TEMP_UNIT)
177  )
178 
179  self._async_update_attrs_async_update_attrs()
180 
181 
183  """Define an Airzone WebServer sensor."""
184 
185  def __init__(
186  self,
187  coordinator: AirzoneUpdateCoordinator,
188  description: SensorEntityDescription,
189  entry: ConfigEntry,
190  ) -> None:
191  """Initialize."""
192  super().__init__(coordinator, entry)
193  self._attr_unique_id_attr_unique_id_attr_unique_id = f"{self._attr_unique_id}_ws_{description.key}"
194  self.entity_descriptionentity_description = description
195  self._async_update_attrs_async_update_attrs()
196 
197 
199  """Define an Airzone Zone sensor."""
200 
201  def __init__(
202  self,
203  coordinator: AirzoneUpdateCoordinator,
204  description: SensorEntityDescription,
205  entry: ConfigEntry,
206  system_zone_id: str,
207  zone_data: dict[str, Any],
208  ) -> None:
209  """Initialize."""
210  super().__init__(coordinator, entry, system_zone_id, zone_data)
211 
212  self._attr_unique_id_attr_unique_id_attr_unique_id = (
213  f"{self._attr_unique_id}_{system_zone_id}_{description.key}"
214  )
215  self.entity_descriptionentity_description = description
216 
217  if description.key == AZD_TEMP:
218  self._attr_native_unit_of_measurement_attr_native_unit_of_measurement = TEMP_UNIT_LIB_TO_HASS.get(
219  self.get_airzone_valueget_airzone_valueget_airzone_value(AZD_TEMP_UNIT)
220  )
221 
222  self._async_update_attrs_async_update_attrs()
None __init__(self, AirzoneUpdateCoordinator coordinator, SensorEntityDescription description, ConfigEntry entry)
Definition: sensor.py:168
None __init__(self, AirzoneUpdateCoordinator coordinator, SensorEntityDescription description, ConfigEntry entry)
Definition: sensor.py:190
None __init__(self, AirzoneUpdateCoordinator coordinator, SensorEntityDescription description, ConfigEntry entry, str system_zone_id, dict[str, Any] zone_data)
Definition: sensor.py:208
None async_setup_entry(HomeAssistant hass, AirzoneConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:84