1 """Support for sensor entities."""
3 from __future__
import annotations
7 from thinqconnect
import DeviceType
8 from thinqconnect.devices.const
import Property
as ThinQProperty
9 from thinqconnect.integration
import ActiveMode, ThinQPropertyEx, TimerProperty
14 SensorEntityDescription,
18 CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
26 from .
import ThinqConfigEntry
27 from .coordinator
import DeviceDataUpdateCoordinator
28 from .entity
import ThinQEntity
30 AIR_QUALITY_SENSOR_DESC: dict[ThinQProperty, SensorEntityDescription] = {
32 key=ThinQProperty.PM1,
33 device_class=SensorDeviceClass.PM1,
34 native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
35 state_class=SensorStateClass.MEASUREMENT,
38 key=ThinQProperty.PM2,
39 device_class=SensorDeviceClass.PM25,
40 native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
41 state_class=SensorStateClass.MEASUREMENT,
44 key=ThinQProperty.PM10,
45 device_class=SensorDeviceClass.PM10,
46 native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
47 state_class=SensorStateClass.MEASUREMENT,
50 key=ThinQProperty.HUMIDITY,
51 device_class=SensorDeviceClass.HUMIDITY,
52 native_unit_of_measurement=PERCENTAGE,
53 state_class=SensorStateClass.MEASUREMENT,
56 key=ThinQProperty.MONITORING_ENABLED,
57 device_class=SensorDeviceClass.ENUM,
58 translation_key=ThinQProperty.MONITORING_ENABLED,
61 key=ThinQProperty.TEMPERATURE,
62 native_unit_of_measurement=UnitOfTemperature.CELSIUS,
63 state_class=SensorStateClass.MEASUREMENT,
64 translation_key=ThinQProperty.TEMPERATURE,
67 key=ThinQProperty.ODOR_LEVEL,
68 device_class=SensorDeviceClass.ENUM,
69 translation_key=ThinQProperty.ODOR_LEVEL,
72 key=ThinQProperty.TOTAL_POLLUTION_LEVEL,
73 device_class=SensorDeviceClass.ENUM,
74 translation_key=ThinQProperty.TOTAL_POLLUTION_LEVEL,
77 BATTERY_SENSOR_DESC: dict[ThinQProperty, SensorEntityDescription] = {
79 key=ThinQProperty.BATTERY_PERCENT,
80 translation_key=ThinQProperty.BATTERY_LEVEL,
83 DISH_WASHING_COURSE_SENSOR_DESC: dict[ThinQProperty, SensorEntityDescription] = {
85 key=ThinQProperty.CURRENT_DISH_WASHING_COURSE,
86 device_class=SensorDeviceClass.ENUM,
87 translation_key=ThinQProperty.CURRENT_DISH_WASHING_COURSE,
90 FILTER_INFO_SENSOR_DESC: dict[ThinQProperty, SensorEntityDescription] = {
92 key=ThinQProperty.FILTER_LIFETIME,
93 native_unit_of_measurement=UnitOfTime.HOURS,
94 translation_key=ThinQProperty.FILTER_LIFETIME,
97 HUMIDITY_SENSOR_DESC: dict[ThinQProperty, SensorEntityDescription] = {
99 key=ThinQProperty.CURRENT_HUMIDITY,
100 device_class=SensorDeviceClass.HUMIDITY,
101 native_unit_of_measurement=PERCENTAGE,
102 state_class=SensorStateClass.MEASUREMENT,
105 JOB_MODE_SENSOR_DESC: dict[ThinQProperty, SensorEntityDescription] = {
107 key=ThinQProperty.CURRENT_JOB_MODE,
108 device_class=SensorDeviceClass.ENUM,
109 translation_key=ThinQProperty.CURRENT_JOB_MODE,
112 key=ThinQProperty.CURRENT_JOB_MODE,
113 device_class=SensorDeviceClass.ENUM,
114 translation_key=ThinQPropertyEx.CURRENT_JOB_MODE_STICK_CLEANER,
117 key=ThinQProperty.PERSONALIZATION_MODE,
118 device_class=SensorDeviceClass.ENUM,
119 translation_key=ThinQProperty.PERSONALIZATION_MODE,
122 LIGHT_SENSOR_DESC: dict[ThinQProperty, SensorEntityDescription] = {
124 key=ThinQProperty.BRIGHTNESS,
125 translation_key=ThinQProperty.BRIGHTNESS,
128 key=ThinQProperty.DURATION,
129 native_unit_of_measurement=UnitOfTime.HOURS,
130 translation_key=ThinQProperty.DURATION,
133 POWER_SENSOR_DESC: dict[ThinQProperty, SensorEntityDescription] = {
135 key=ThinQProperty.POWER_LEVEL,
136 translation_key=ThinQProperty.POWER_LEVEL,
139 PREFERENCE_SENSOR_DESC: dict[ThinQProperty, SensorEntityDescription] = {
141 key=ThinQProperty.RINSE_LEVEL,
142 device_class=SensorDeviceClass.ENUM,
143 translation_key=ThinQProperty.RINSE_LEVEL,
146 key=ThinQProperty.SOFTENING_LEVEL,
147 device_class=SensorDeviceClass.ENUM,
148 translation_key=ThinQProperty.SOFTENING_LEVEL,
151 RECIPE_SENSOR_DESC: dict[ThinQProperty, SensorEntityDescription] = {
153 key=ThinQProperty.RECIPE_NAME,
154 device_class=SensorDeviceClass.ENUM,
155 translation_key=ThinQProperty.RECIPE_NAME,
158 key=ThinQProperty.WORT_INFO,
159 device_class=SensorDeviceClass.ENUM,
160 translation_key=ThinQProperty.WORT_INFO,
163 key=ThinQProperty.YEAST_INFO,
164 device_class=SensorDeviceClass.ENUM,
165 translation_key=ThinQProperty.YEAST_INFO,
168 key=ThinQProperty.HOP_OIL_INFO,
169 translation_key=ThinQProperty.HOP_OIL_INFO,
172 key=ThinQProperty.FLAVOR_INFO,
173 translation_key=ThinQProperty.FLAVOR_INFO,
176 key=ThinQProperty.BEER_REMAIN,
177 native_unit_of_measurement=PERCENTAGE,
178 translation_key=ThinQProperty.BEER_REMAIN,
181 REFRIGERATION_SENSOR_DESC: dict[ThinQProperty, SensorEntityDescription] = {
183 key=ThinQProperty.FRESH_AIR_FILTER,
184 device_class=SensorDeviceClass.ENUM,
185 translation_key=ThinQProperty.FRESH_AIR_FILTER,
188 RUN_STATE_SENSOR_DESC: dict[ThinQProperty, SensorEntityDescription] = {
190 key=ThinQProperty.CURRENT_STATE,
191 device_class=SensorDeviceClass.ENUM,
192 translation_key=ThinQProperty.CURRENT_STATE,
195 key=ThinQProperty.COCK_STATE,
196 device_class=SensorDeviceClass.ENUM,
197 translation_key=ThinQProperty.COCK_STATE,
200 key=ThinQProperty.STERILIZING_STATE,
201 device_class=SensorDeviceClass.ENUM,
202 translation_key=ThinQProperty.STERILIZING_STATE,
205 key=ThinQProperty.GROWTH_MODE,
206 device_class=SensorDeviceClass.ENUM,
207 translation_key=ThinQProperty.GROWTH_MODE,
210 key=ThinQProperty.WIND_VOLUME,
211 device_class=SensorDeviceClass.WIND_SPEED,
212 translation_key=ThinQProperty.WIND_VOLUME,
215 TEMPERATURE_SENSOR_DESC: dict[ThinQProperty, SensorEntityDescription] = {
217 key=ThinQProperty.TARGET_TEMPERATURE,
218 native_unit_of_measurement=UnitOfTemperature.CELSIUS,
219 translation_key=ThinQProperty.TARGET_TEMPERATURE,
222 key=ThinQProperty.DAY_TARGET_TEMPERATURE,
223 native_unit_of_measurement=UnitOfTemperature.CELSIUS,
224 state_class=SensorStateClass.MEASUREMENT,
225 translation_key=ThinQProperty.DAY_TARGET_TEMPERATURE,
228 key=ThinQProperty.NIGHT_TARGET_TEMPERATURE,
229 native_unit_of_measurement=UnitOfTemperature.CELSIUS,
230 state_class=SensorStateClass.MEASUREMENT,
231 translation_key=ThinQProperty.NIGHT_TARGET_TEMPERATURE,
234 key=ThinQProperty.TEMPERATURE_STATE,
235 device_class=SensorDeviceClass.ENUM,
236 translation_key=ThinQProperty.TEMPERATURE_STATE,
239 key=ThinQProperty.CURRENT_TEMPERATURE,
240 native_unit_of_measurement=UnitOfTemperature.CELSIUS,
241 state_class=SensorStateClass.MEASUREMENT,
242 translation_key=ThinQProperty.CURRENT_TEMPERATURE,
245 WATER_FILTER_INFO_SENSOR_DESC: dict[ThinQProperty, SensorEntityDescription] = {
247 key=ThinQProperty.USED_TIME,
248 native_unit_of_measurement=UnitOfTime.MONTHS,
249 translation_key=ThinQProperty.USED_TIME,
252 WATER_INFO_SENSOR_DESC: dict[ThinQProperty, SensorEntityDescription] = {
254 key=ThinQProperty.WATER_TYPE,
255 translation_key=ThinQProperty.WATER_TYPE,
259 WASHER_SENSORS: tuple[SensorEntityDescription, ...] = (
260 RUN_STATE_SENSOR_DESC[ThinQProperty.CURRENT_STATE],
262 DEVICE_TYPE_SENSOR_MAP: dict[DeviceType, tuple[SensorEntityDescription, ...]] = {
263 DeviceType.AIR_CONDITIONER: (
264 AIR_QUALITY_SENSOR_DESC[ThinQProperty.PM1],
265 AIR_QUALITY_SENSOR_DESC[ThinQProperty.PM2],
266 AIR_QUALITY_SENSOR_DESC[ThinQProperty.PM10],
267 AIR_QUALITY_SENSOR_DESC[ThinQProperty.HUMIDITY],
268 AIR_QUALITY_SENSOR_DESC[ThinQProperty.ODOR_LEVEL],
269 AIR_QUALITY_SENSOR_DESC[ThinQProperty.TOTAL_POLLUTION_LEVEL],
270 FILTER_INFO_SENSOR_DESC[ThinQProperty.FILTER_LIFETIME],
272 DeviceType.AIR_PURIFIER_FAN: (
273 AIR_QUALITY_SENSOR_DESC[ThinQProperty.PM1],
274 AIR_QUALITY_SENSOR_DESC[ThinQProperty.PM2],
275 AIR_QUALITY_SENSOR_DESC[ThinQProperty.PM10],
276 AIR_QUALITY_SENSOR_DESC[ThinQProperty.HUMIDITY],
277 AIR_QUALITY_SENSOR_DESC[ThinQProperty.TEMPERATURE],
278 AIR_QUALITY_SENSOR_DESC[ThinQProperty.MONITORING_ENABLED],
279 AIR_QUALITY_SENSOR_DESC[ThinQProperty.ODOR_LEVEL],
280 AIR_QUALITY_SENSOR_DESC[ThinQProperty.TOTAL_POLLUTION_LEVEL],
282 DeviceType.AIR_PURIFIER: (
283 AIR_QUALITY_SENSOR_DESC[ThinQProperty.PM1],
284 AIR_QUALITY_SENSOR_DESC[ThinQProperty.PM2],
285 AIR_QUALITY_SENSOR_DESC[ThinQProperty.PM10],
286 AIR_QUALITY_SENSOR_DESC[ThinQProperty.HUMIDITY],
287 AIR_QUALITY_SENSOR_DESC[ThinQProperty.MONITORING_ENABLED],
288 AIR_QUALITY_SENSOR_DESC[ThinQProperty.ODOR_LEVEL],
289 AIR_QUALITY_SENSOR_DESC[ThinQProperty.TOTAL_POLLUTION_LEVEL],
290 JOB_MODE_SENSOR_DESC[ThinQProperty.CURRENT_JOB_MODE],
291 JOB_MODE_SENSOR_DESC[ThinQProperty.PERSONALIZATION_MODE],
293 DeviceType.COOKTOP: (
294 RUN_STATE_SENSOR_DESC[ThinQProperty.CURRENT_STATE],
295 POWER_SENSOR_DESC[ThinQProperty.POWER_LEVEL],
297 DeviceType.DEHUMIDIFIER: (
298 JOB_MODE_SENSOR_DESC[ThinQProperty.CURRENT_JOB_MODE],
299 HUMIDITY_SENSOR_DESC[ThinQProperty.CURRENT_HUMIDITY],
301 DeviceType.DISH_WASHER: (
302 DISH_WASHING_COURSE_SENSOR_DESC[ThinQProperty.CURRENT_DISH_WASHING_COURSE],
303 PREFERENCE_SENSOR_DESC[ThinQProperty.RINSE_LEVEL],
304 PREFERENCE_SENSOR_DESC[ThinQProperty.SOFTENING_LEVEL],
305 RUN_STATE_SENSOR_DESC[ThinQProperty.CURRENT_STATE],
307 DeviceType.DRYER: WASHER_SENSORS,
308 DeviceType.HOME_BREW: (
309 RECIPE_SENSOR_DESC[ThinQProperty.RECIPE_NAME],
310 RECIPE_SENSOR_DESC[ThinQProperty.WORT_INFO],
311 RECIPE_SENSOR_DESC[ThinQProperty.YEAST_INFO],
312 RECIPE_SENSOR_DESC[ThinQProperty.HOP_OIL_INFO],
313 RECIPE_SENSOR_DESC[ThinQProperty.FLAVOR_INFO],
314 RECIPE_SENSOR_DESC[ThinQProperty.BEER_REMAIN],
315 RUN_STATE_SENSOR_DESC[ThinQProperty.CURRENT_STATE],
317 DeviceType.HUMIDIFIER: (
318 AIR_QUALITY_SENSOR_DESC[ThinQProperty.PM1],
319 AIR_QUALITY_SENSOR_DESC[ThinQProperty.PM2],
320 AIR_QUALITY_SENSOR_DESC[ThinQProperty.PM10],
321 AIR_QUALITY_SENSOR_DESC[ThinQProperty.HUMIDITY],
322 AIR_QUALITY_SENSOR_DESC[ThinQProperty.TEMPERATURE],
323 AIR_QUALITY_SENSOR_DESC[ThinQProperty.MONITORING_ENABLED],
324 AIR_QUALITY_SENSOR_DESC[ThinQProperty.TOTAL_POLLUTION_LEVEL],
326 DeviceType.KIMCHI_REFRIGERATOR: (
327 REFRIGERATION_SENSOR_DESC[ThinQProperty.FRESH_AIR_FILTER],
329 key=ThinQProperty.TARGET_TEMPERATURE,
330 translation_key=ThinQProperty.TARGET_TEMPERATURE,
333 DeviceType.MICROWAVE_OVEN: (RUN_STATE_SENSOR_DESC[ThinQProperty.CURRENT_STATE],),
335 RUN_STATE_SENSOR_DESC[ThinQProperty.CURRENT_STATE],
336 TEMPERATURE_SENSOR_DESC[ThinQProperty.TARGET_TEMPERATURE],
338 DeviceType.PLANT_CULTIVATOR: (
339 LIGHT_SENSOR_DESC[ThinQProperty.BRIGHTNESS],
340 LIGHT_SENSOR_DESC[ThinQProperty.DURATION],
341 RUN_STATE_SENSOR_DESC[ThinQProperty.CURRENT_STATE],
342 RUN_STATE_SENSOR_DESC[ThinQProperty.GROWTH_MODE],
343 RUN_STATE_SENSOR_DESC[ThinQProperty.WIND_VOLUME],
344 TEMPERATURE_SENSOR_DESC[ThinQProperty.DAY_TARGET_TEMPERATURE],
345 TEMPERATURE_SENSOR_DESC[ThinQProperty.NIGHT_TARGET_TEMPERATURE],
346 TEMPERATURE_SENSOR_DESC[ThinQProperty.TEMPERATURE_STATE],
348 DeviceType.REFRIGERATOR: (
349 REFRIGERATION_SENSOR_DESC[ThinQProperty.FRESH_AIR_FILTER],
350 WATER_FILTER_INFO_SENSOR_DESC[ThinQProperty.USED_TIME],
352 DeviceType.ROBOT_CLEANER: (
353 RUN_STATE_SENSOR_DESC[ThinQProperty.CURRENT_STATE],
354 JOB_MODE_SENSOR_DESC[ThinQProperty.CURRENT_JOB_MODE],
356 DeviceType.STICK_CLEANER: (
357 BATTERY_SENSOR_DESC[ThinQProperty.BATTERY_PERCENT],
358 JOB_MODE_SENSOR_DESC[ThinQPropertyEx.CURRENT_JOB_MODE_STICK_CLEANER],
359 RUN_STATE_SENSOR_DESC[ThinQProperty.CURRENT_STATE],
361 DeviceType.STYLER: WASHER_SENSORS,
362 DeviceType.WASHCOMBO_MAIN: WASHER_SENSORS,
363 DeviceType.WASHCOMBO_MINI: WASHER_SENSORS,
364 DeviceType.WASHER: WASHER_SENSORS,
365 DeviceType.WASHTOWER_DRYER: WASHER_SENSORS,
366 DeviceType.WASHTOWER: WASHER_SENSORS,
367 DeviceType.WASHTOWER_WASHER: WASHER_SENSORS,
368 DeviceType.WATER_HEATER: (
369 TEMPERATURE_SENSOR_DESC[ThinQProperty.CURRENT_TEMPERATURE],
371 DeviceType.WATER_PURIFIER: (
372 RUN_STATE_SENSOR_DESC[ThinQProperty.COCK_STATE],
373 RUN_STATE_SENSOR_DESC[ThinQProperty.STERILIZING_STATE],
374 WATER_INFO_SENSOR_DESC[ThinQProperty.WATER_TYPE],
378 _LOGGER = logging.getLogger(__name__)
383 entry: ThinqConfigEntry,
384 async_add_entities: AddEntitiesCallback,
386 """Set up an entry for sensor platform."""
387 entities: list[ThinQSensorEntity] = []
388 for coordinator
in entry.runtime_data.coordinators.values():
390 descriptions := DEVICE_TYPE_SENSOR_MAP.get(
391 coordinator.api.device.device_type
394 for description
in descriptions:
397 for property_id
in coordinator.api.get_active_idx(
402 coordinator.api.device.device_type == DeviceType.COOKTOP
403 or isinstance(description.key, TimerProperty)
405 else ActiveMode.READ_ONLY
415 """Represent a thinq sensor platform."""
419 coordinator: DeviceDataUpdateCoordinator,
420 entity_description: SensorEntityDescription,
423 """Initialize a sensor entity."""
424 super().
__init__(coordinator, entity_description, property_id)
426 if entity_description.device_class == SensorDeviceClass.ENUM:
430 """Update status itself."""
440 "[%s:%s] update status: %s -> %s, options:%s, unit:%s",
441 self.coordinator.device_name,
str|None _get_unit_of_measurement(self, str|None unit)
_attr_native_unit_of_measurement
None _update_status(self)
None __init__(self, DeviceDataUpdateCoordinator coordinator, SensorEntityDescription entity_description, str property_id)
list[str]|None options(self)
StateType|date|datetime|Decimal native_value(self)
str|None native_unit_of_measurement(self)
None async_setup_entry(HomeAssistant hass, ThinqConfigEntry entry, AddEntitiesCallback async_add_entities)