Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Support for AquaLogic sensors."""
2 
3 from __future__ import annotations
4 
5 from dataclasses import dataclass
6 
7 import voluptuous as vol
8 
10  PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA,
11  SensorDeviceClass,
12  SensorEntity,
13  SensorEntityDescription,
14 )
15 from homeassistant.const import (
16  CONF_MONITORED_CONDITIONS,
17  PERCENTAGE,
18  UnitOfPower,
19  UnitOfTemperature,
20 )
21 from homeassistant.core import HomeAssistant, callback
23 from homeassistant.helpers.dispatcher import async_dispatcher_connect
24 from homeassistant.helpers.entity_platform import AddEntitiesCallback
25 from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
26 
27 from . import DOMAIN, UPDATE_TOPIC, AquaLogicProcessor
28 
29 
30 @dataclass(frozen=True)
32  """Describes AquaLogic sensor entity."""
33 
34  unit_metric: str | None = None
35  unit_imperial: str | None = None
36 
37 
38 # keys correspond to property names in aqualogic.core.AquaLogic
39 SENSOR_TYPES: tuple[AquaLogicSensorEntityDescription, ...] = (
41  key="air_temp",
42  name="Air Temperature",
43  unit_metric=UnitOfTemperature.CELSIUS,
44  unit_imperial=UnitOfTemperature.FAHRENHEIT,
45  device_class=SensorDeviceClass.TEMPERATURE,
46  ),
48  key="pool_temp",
49  name="Pool Temperature",
50  unit_metric=UnitOfTemperature.CELSIUS,
51  unit_imperial=UnitOfTemperature.FAHRENHEIT,
52  icon="mdi:oil-temperature",
53  device_class=SensorDeviceClass.TEMPERATURE,
54  ),
56  key="spa_temp",
57  name="Spa Temperature",
58  unit_metric=UnitOfTemperature.CELSIUS,
59  unit_imperial=UnitOfTemperature.FAHRENHEIT,
60  icon="mdi:oil-temperature",
61  device_class=SensorDeviceClass.TEMPERATURE,
62  ),
64  key="pool_chlorinator",
65  name="Pool Chlorinator",
66  unit_metric=PERCENTAGE,
67  unit_imperial=PERCENTAGE,
68  icon="mdi:gauge",
69  ),
71  key="spa_chlorinator",
72  name="Spa Chlorinator",
73  unit_metric=PERCENTAGE,
74  unit_imperial=PERCENTAGE,
75  icon="mdi:gauge",
76  ),
78  key="salt_level",
79  name="Salt Level",
80  unit_metric="g/L",
81  unit_imperial="PPM",
82  icon="mdi:gauge",
83  ),
85  key="pump_speed",
86  name="Pump Speed",
87  unit_metric=PERCENTAGE,
88  unit_imperial=PERCENTAGE,
89  icon="mdi:speedometer",
90  ),
92  key="pump_power",
93  name="Pump Power",
94  unit_metric=UnitOfPower.WATT,
95  unit_imperial=UnitOfPower.WATT,
96  device_class=SensorDeviceClass.POWER,
97  ),
99  key="status",
100  name="Status",
101  icon="mdi:alert",
102  ),
103 )
104 
105 SENSOR_KEYS: list[str] = [desc.key for desc in SENSOR_TYPES]
106 
107 PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend(
108  {
109  vol.Required(CONF_MONITORED_CONDITIONS, default=SENSOR_KEYS): vol.All(
110  cv.ensure_list, [vol.In(SENSOR_KEYS)]
111  )
112  }
113 )
114 
115 
117  hass: HomeAssistant,
118  config: ConfigType,
119  async_add_entities: AddEntitiesCallback,
120  discovery_info: DiscoveryInfoType | None = None,
121 ) -> None:
122  """Set up the sensor platform."""
123  processor: AquaLogicProcessor = hass.data[DOMAIN]
124  monitored_conditions = config[CONF_MONITORED_CONDITIONS]
125 
126  entities = [
127  AquaLogicSensor(processor, description)
128  for description in SENSOR_TYPES
129  if description.key in monitored_conditions
130  ]
131 
132  async_add_entities(entities)
133 
134 
136  """Sensor implementation for the AquaLogic component."""
137 
138  entity_description: AquaLogicSensorEntityDescription
139  _attr_should_poll = False
140 
141  def __init__(
142  self,
143  processor: AquaLogicProcessor,
144  description: AquaLogicSensorEntityDescription,
145  ) -> None:
146  """Initialize sensor."""
147  self.entity_descriptionentity_description = description
148  self._processor_processor = processor
149  self._attr_name_attr_name = f"AquaLogic {description.name}"
150 
151  async def async_added_to_hass(self) -> None:
152  """Register callbacks."""
153  self.async_on_removeasync_on_remove(
155  self.hasshass, UPDATE_TOPIC, self.async_update_callbackasync_update_callback
156  )
157  )
158 
159  @callback
160  def async_update_callback(self) -> None:
161  """Update callback."""
162  if (panel := self._processor_processor.panel) is not None:
163  if panel.is_metric:
164  self._attr_native_unit_of_measurement_attr_native_unit_of_measurement = (
165  self.entity_descriptionentity_description.unit_metric
166  )
167  else:
168  self._attr_native_unit_of_measurement_attr_native_unit_of_measurement = (
169  self.entity_descriptionentity_description.unit_imperial
170  )
171 
172  self._attr_native_value_attr_native_value = getattr(panel, self.entity_descriptionentity_description.key)
173  self.async_write_ha_stateasync_write_ha_state()
174  else:
175  self._attr_native_unit_of_measurement_attr_native_unit_of_measurement = None
None __init__(self, AquaLogicProcessor processor, AquaLogicSensorEntityDescription description)
Definition: sensor.py:145
None async_on_remove(self, CALLBACK_TYPE func)
Definition: entity.py:1331
None async_setup_platform(HomeAssistant hass, ConfigType config, AddEntitiesCallback async_add_entities, DiscoveryInfoType|None discovery_info=None)
Definition: sensor.py:121
Callable[[], None] async_dispatcher_connect(HomeAssistant hass, str signal, Callable[..., Any] target)
Definition: dispatcher.py:103