1 """The Aprilaire sensor component."""
3 from __future__
import annotations
5 from dataclasses
import dataclass
6 from typing
import cast
8 from pyaprilaire.const
import Attribute
13 SensorEntityDescription,
21 from .coordinator
import AprilaireConfigEntry, AprilaireCoordinator
22 from .entity
import BaseAprilaireEntity
24 DEHUMIDIFICATION_STATUS_MAP: dict[StateType, str] = {
32 HUMIDIFICATION_STATUS_MAP: dict[StateType, str] = {
39 VENTILATION_STATUS_MAP: dict[StateType, str] = {
49 AIR_CLEANING_STATUS_MAP: dict[StateType, str] = {
56 FAN_STATUS_MAP: dict[StateType, str] = {0:
"off", 1:
"on"}
60 entity_class: type[BaseAprilaireSensor],
61 coordinator: AprilaireCoordinator,
63 descriptions: tuple[AprilaireSensorDescription, ...],
64 ) -> list[BaseAprilaireSensor]:
65 """Get the entities for a list of sensor descriptions."""
68 entity_class(coordinator, description, unique_id)
69 for description
in descriptions
72 return [entity
for entity
in entities
if entity.exists]
77 config_entry: AprilaireConfigEntry,
78 async_add_entities: AddEntitiesCallback,
80 """Set up Aprilaire sensor devices."""
82 coordinator = config_entry.runtime_data
84 assert config_entry.unique_id
is not None
88 AprilaireHumiditySensor,
90 config_entry.unique_id,
94 AprilaireTemperatureSensor,
96 config_entry.unique_id,
100 AprilaireStatusSensor, coordinator, config_entry.unique_id, STATUS_SENSORS
107 @dataclass(frozen=True, kw_only=True)
109 """Class describing Aprilaire sensor entities."""
111 status_key: str |
None
115 @dataclass(frozen=True, kw_only=True)
117 """Class describing Aprilaire status sensor entities."""
119 status_map: dict[StateType, str]
122 HUMIDITY_SENSORS: tuple[AprilaireSensorDescription, ...] = (
124 key=
"indoor_humidity_controlling_sensor",
125 translation_key=
"indoor_humidity_controlling_sensor",
126 device_class=SensorDeviceClass.HUMIDITY,
127 state_class=SensorStateClass.MEASUREMENT,
128 native_unit_of_measurement=PERCENTAGE,
129 status_key=Attribute.INDOOR_HUMIDITY_CONTROLLING_SENSOR_STATUS,
130 value_key=Attribute.INDOOR_HUMIDITY_CONTROLLING_SENSOR_VALUE,
133 key=
"outdoor_humidity_controlling_sensor",
134 translation_key=
"outdoor_humidity_controlling_sensor",
135 device_class=SensorDeviceClass.HUMIDITY,
136 state_class=SensorStateClass.MEASUREMENT,
137 native_unit_of_measurement=PERCENTAGE,
138 status_key=Attribute.OUTDOOR_HUMIDITY_CONTROLLING_SENSOR_STATUS,
139 value_key=Attribute.OUTDOOR_HUMIDITY_CONTROLLING_SENSOR_VALUE,
143 TEMPERATURE_SENSORS: tuple[AprilaireSensorDescription, ...] = (
145 key=
"indoor_temperature_controlling_sensor",
146 translation_key=
"indoor_temperature_controlling_sensor",
147 device_class=SensorDeviceClass.TEMPERATURE,
148 state_class=SensorStateClass.MEASUREMENT,
149 native_unit_of_measurement=UnitOfTemperature.CELSIUS,
150 status_key=Attribute.INDOOR_TEMPERATURE_CONTROLLING_SENSOR_STATUS,
151 value_key=Attribute.INDOOR_TEMPERATURE_CONTROLLING_SENSOR_VALUE,
154 key=
"outdoor_temperature_controlling_sensor",
155 translation_key=
"outdoor_temperature_controlling_sensor",
156 device_class=SensorDeviceClass.TEMPERATURE,
157 state_class=SensorStateClass.MEASUREMENT,
158 native_unit_of_measurement=UnitOfTemperature.CELSIUS,
159 status_key=Attribute.OUTDOOR_TEMPERATURE_CONTROLLING_SENSOR_STATUS,
160 value_key=Attribute.OUTDOOR_TEMPERATURE_CONTROLLING_SENSOR_VALUE,
164 STATUS_SENSORS: tuple[AprilaireSensorDescription, ...] = (
166 key=
"dehumidification_status",
167 translation_key=
"dehumidification_status",
168 device_class=SensorDeviceClass.ENUM,
169 status_key=Attribute.DEHUMIDIFICATION_AVAILABLE,
170 value_key=Attribute.DEHUMIDIFICATION_STATUS,
171 status_map=DEHUMIDIFICATION_STATUS_MAP,
172 options=
list(set(DEHUMIDIFICATION_STATUS_MAP.values())),
175 key=
"humidification_status",
176 translation_key=
"humidification_status",
177 device_class=SensorDeviceClass.ENUM,
178 status_key=Attribute.HUMIDIFICATION_AVAILABLE,
179 value_key=Attribute.HUMIDIFICATION_STATUS,
180 status_map=HUMIDIFICATION_STATUS_MAP,
181 options=
list(set(HUMIDIFICATION_STATUS_MAP.values())),
184 key=
"ventilation_status",
185 translation_key=
"ventilation_status",
186 device_class=SensorDeviceClass.ENUM,
187 status_key=Attribute.VENTILATION_AVAILABLE,
188 value_key=Attribute.VENTILATION_STATUS,
189 status_map=VENTILATION_STATUS_MAP,
190 options=
list(set(VENTILATION_STATUS_MAP.values())),
193 key=
"air_cleaning_status",
194 translation_key=
"air_cleaning_status",
195 device_class=SensorDeviceClass.ENUM,
196 status_key=Attribute.AIR_CLEANING_AVAILABLE,
197 value_key=Attribute.AIR_CLEANING_STATUS,
198 status_map=AIR_CLEANING_STATUS_MAP,
199 options=
list(set(AIR_CLEANING_STATUS_MAP.values())),
203 translation_key=
"fan_status",
204 device_class=SensorDeviceClass.ENUM,
206 value_key=Attribute.FAN_STATUS,
207 status_map=FAN_STATUS_MAP,
208 options=
list(set(FAN_STATUS_MAP.values())),
214 """Base sensor entity for Aprilaire."""
216 entity_description: AprilaireSensorDescription
217 status_sensor_available_value: int |
None =
None
218 status_sensor_exists_values: list[int]
222 coordinator: AprilaireCoordinator,
223 description: AprilaireSensorDescription,
226 """Initialize a sensor for an Aprilaire device."""
230 super().
__init__(coordinator, unique_id)
234 """Return True if the sensor exists."""
241 in self.status_sensor_exists_values
246 """Return True if the sensor is available."""
250 or self.status_sensor_available_value
is None
254 if not super().available:
259 == self.status_sensor_available_value
264 """Return the value reported by the sensor."""
268 StateType, self.coordinator.data.get(self.
entity_descriptionentity_description.value_key)
273 """Humidity sensor entity for Aprilaire."""
275 status_sensor_available_value = 0
276 status_sensor_exists_values = [0, 1, 2]
280 """Temperature sensor entity for Aprilaire."""
282 status_sensor_available_value = 0
283 status_sensor_exists_values = [0, 1, 2]
287 """Return the suggested number of decimal digits for display."""
295 """Status sensor entity for Aprilaire."""
297 status_sensor_exists_values = [1, 2]
298 entity_description: AprilaireStatusSensorDescription
302 """Return the value reported by the sensor mapped to the status option."""
304 raw_value = super().native_value
StateType native_value(self)
int|None suggested_display_precision(self)
StateType native_value(self)
None __init__(self, AprilaireCoordinator coordinator, AprilaireSensorDescription description, str unique_id)
str|None unit_of_measurement(self)
str|None unit_of_measurement(self)
None async_setup_entry(HomeAssistant hass, AprilaireConfigEntry config_entry, AddEntitiesCallback async_add_entities)
list[BaseAprilaireSensor] get_entities(type[BaseAprilaireSensor] entity_class, AprilaireCoordinator coordinator, str unique_id, tuple[AprilaireSensorDescription,...] descriptions)