1 """Constants for the Tuya integration."""
3 from __future__
import annotations
5 from collections.abc
import Callable
6 from dataclasses
import dataclass, field
7 from enum
import StrEnum
12 CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
13 CONCENTRATION_MILLIGRAMS_PER_CUBIC_METER,
14 CONCENTRATION_PARTS_PER_BILLION,
15 CONCENTRATION_PARTS_PER_MILLION,
18 SIGNAL_STRENGTH_DECIBELS,
19 SIGNAL_STRENGTH_DECIBELS_MILLIWATT,
21 UnitOfElectricCurrent,
22 UnitOfElectricPotential,
31 LOGGER = logging.getLogger(__package__)
33 CONF_APP_TYPE =
"tuya_app_type"
34 CONF_ENDPOINT =
"endpoint"
35 CONF_TERMINAL_ID =
"terminal_id"
36 CONF_TOKEN_INFO =
"token_info"
37 CONF_USER_CODE =
"user_code"
38 CONF_USERNAME =
"username"
40 TUYA_CLIENT_ID =
"HA_3y9q4ak7g4ephrvke"
41 TUYA_SCHEMA =
"haauthorize"
43 TUYA_DISCOVERY_NEW =
"tuya_discovery_new"
44 TUYA_HA_SIGNAL_UPDATE_ENTITY =
"tuya_entry_update"
46 TUYA_RESPONSE_CODE =
"code"
47 TUYA_RESPONSE_MSG =
"msg"
48 TUYA_RESPONSE_QR_CODE =
"qrcode"
49 TUYA_RESPONSE_RESULT =
"result"
50 TUYA_RESPONSE_SUCCESS =
"success"
53 Platform.ALARM_CONTROL_PANEL,
54 Platform.BINARY_SENSOR,
82 """Data point types."""
93 """Data Point Codes used by Tuya.
95 https://developer.tuya.com/en/docs/iot/standarddescription?id=K9i5ql6waswzq
98 AIR_QUALITY =
"air_quality"
99 AIR_QUALITY_INDEX =
"air_quality_index"
100 ALARM_SWITCH =
"alarm_switch"
101 ALARM_TIME =
"alarm_time"
102 ALARM_VOLUME =
"alarm_volume"
103 ALARM_MESSAGE =
"alarm_message"
104 ANGLE_HORIZONTAL =
"angle_horizontal"
105 ANGLE_VERTICAL =
"angle_vertical"
107 ARM_DOWN_PERCENT =
"arm_down_percent"
108 ARM_UP_PERCENT =
"arm_up_percent"
109 BASIC_ANTI_FLICKER =
"basic_anti_flicker"
110 BASIC_DEVICE_VOLUME =
"basic_device_volume"
111 BASIC_FLIP =
"basic_flip"
112 BASIC_INDICATOR =
"basic_indicator"
113 BASIC_NIGHTVISION =
"basic_nightvision"
114 BASIC_OSD =
"basic_osd"
115 BASIC_PRIVATE =
"basic_private"
116 BASIC_WDR =
"basic_wdr"
118 BATTERY_PERCENTAGE =
"battery_percentage"
119 BATTERY_STATE =
"battery_state"
120 BATTERY_VALUE =
"battery_value"
121 BRIGHT_CONTROLLER =
"bright_controller"
122 BRIGHT_STATE =
"bright_state"
123 BRIGHT_VALUE =
"bright_value"
124 BRIGHT_VALUE_1 =
"bright_value_1"
125 BRIGHT_VALUE_2 =
"bright_value_2"
126 BRIGHT_VALUE_3 =
"bright_value_3"
127 BRIGHT_VALUE_V2 =
"bright_value_v2"
128 BRIGHTNESS_MAX_1 =
"brightness_max_1"
129 BRIGHTNESS_MAX_2 =
"brightness_max_2"
130 BRIGHTNESS_MAX_3 =
"brightness_max_3"
131 BRIGHTNESS_MIN_1 =
"brightness_min_1"
132 BRIGHTNESS_MIN_2 =
"brightness_min_2"
133 BRIGHTNESS_MIN_3 =
"brightness_min_3"
135 CH2O_STATE =
"ch2o_state"
136 CH2O_VALUE =
"ch2o_value"
137 CH4_SENSOR_STATE =
"ch4_sensor_state"
138 CH4_SENSOR_VALUE =
"ch4_sensor_value"
139 CHILD_LOCK =
"child_lock"
141 CLEAN_AREA =
"clean_area"
142 CLEAN_TIME =
"clean_time"
143 CLICK_SUSTAIN_TIME =
"click_sustain_time"
144 CLOUD_RECIPE_NUMBER =
"cloud_recipe_number"
145 CLOSED_OPENED_KIT =
"closed_opened_kit"
146 CO_STATE =
"co_state"
147 CO_STATUS =
"co_status"
148 CO_VALUE =
"co_value"
149 CO2_STATE =
"co2_state"
150 CO2_VALUE =
"co2_value"
151 COLLECTION_MODE =
"collection_mode"
152 COLOR_DATA_V2 =
"color_data_v2"
153 COLOUR_DATA =
"colour_data"
154 COLOUR_DATA_HSV =
"colour_data_hsv"
155 COLOUR_DATA_V2 =
"colour_data_v2"
156 COOK_TEMPERATURE =
"cook_temperature"
157 COOK_TIME =
"cook_time"
158 CONCENTRATION_SET =
"concentration_set"
160 CONTROL_2 =
"control_2"
161 CONTROL_3 =
"control_3"
162 CONTROL_BACK =
"control_back"
163 CONTROL_BACK_MODE =
"control_back_mode"
164 COUNTDOWN =
"countdown"
165 COUNTDOWN_LEFT =
"countdown_left"
166 COUNTDOWN_SET =
"countdown_set"
167 CRY_DETECTION_SWITCH =
"cry_detection_switch"
168 CUP_NUMBER =
"cup_number"
169 CUR_CURRENT =
"cur_current"
170 CUR_NEUTRAL =
"cur_neutral"
171 CUR_POWER =
"cur_power"
172 CUR_VOLTAGE =
"cur_voltage"
173 DECIBEL_SENSITIVITY =
"decibel_sensitivity"
174 DECIBEL_SWITCH =
"decibel_switch"
175 DEHUMIDITY_SET_ENUM =
"dehumidify_set_enum"
176 DEHUMIDITY_SET_VALUE =
"dehumidify_set_value"
177 DISINFECTION =
"disinfection"
178 DO_NOT_DISTURB =
"do_not_disturb"
179 DOORCONTACT_STATE =
"doorcontact_state"
180 DOORCONTACT_STATE_2 =
"doorcontact_state_2"
181 DOORCONTACT_STATE_3 =
"doorcontact_state_3"
182 DUSTER_CLOTH =
"duster_cloth"
184 EDGE_BRUSH =
"edge_brush"
185 ELECTRICITY_LEFT =
"electricity_left"
186 FAN_BEEP =
"fan_beep"
187 FAN_COOL =
"fan_cool"
188 FAN_DIRECTION =
"fan_direction"
189 FAN_HORIZONTAL =
"fan_horizontal"
190 FAN_SPEED =
"fan_speed"
191 FAN_SPEED_ENUM =
"fan_speed_enum"
192 FAN_SPEED_PERCENT =
"fan_speed_percent"
193 FAN_SWITCH =
"fan_switch"
194 FAN_MODE =
"fan_mode"
195 FAN_VERTICAL =
"fan_vertical"
196 FAR_DETECTION =
"far_detection"
198 FEED_REPORT =
"feed_report"
199 FEED_STATE =
"feed_state"
201 FILTER_LIFE =
"filter"
202 FILTER_RESET =
"filter_reset"
203 FLOODLIGHT_LIGHTNESS =
"floodlight_lightness"
204 FLOODLIGHT_SWITCH =
"floodlight_switch"
205 FORWARD_ENERGY_TOTAL =
"forward_energy_total"
206 GAS_SENSOR_STATE =
"gas_sensor_state"
207 GAS_SENSOR_STATUS =
"gas_sensor_status"
208 GAS_SENSOR_VALUE =
"gas_sensor_value"
209 HUMIDIFIER =
"humidifier"
210 HUMIDITY =
"humidity"
211 HUMIDITY_CURRENT =
"humidity_current"
212 HUMIDITY_INDOOR =
"humidity_indoor"
213 HUMIDITY_SET =
"humidity_set"
214 HUMIDITY_VALUE =
"humidity_value"
215 IPC_WORK_MODE =
"ipc_work_mode"
216 LED_TYPE_1 =
"led_type_1"
217 LED_TYPE_2 =
"led_type_2"
218 LED_TYPE_3 =
"led_type_3"
220 LEVEL_CURRENT =
"level_current"
222 LIGHT_MODE =
"light_mode"
224 MASTER_MODE =
"master_mode"
225 MACH_OPERATE =
"mach_operate"
226 MANUAL_FEED =
"manual_feed"
227 MATERIAL =
"material"
229 MOODLIGHTING =
"moodlighting"
230 MOTION_RECORD =
"motion_record"
231 MOTION_SENSITIVITY =
"motion_sensitivity"
232 MOTION_SWITCH =
"motion_switch"
233 MOTION_TRACKING =
"motion_tracking"
234 MOVEMENT_DETECT_PIC =
"movement_detect_pic"
235 MUFFLING =
"muffling"
236 NEAR_DETECTION =
"near_detection"
237 OPPOSITE =
"opposite"
239 PERCENT_CONTROL =
"percent_control"
240 PERCENT_CONTROL_2 =
"percent_control_2"
241 PERCENT_CONTROL_3 =
"percent_control_3"
242 PERCENT_STATE =
"percent_state"
243 PERCENT_STATE_2 =
"percent_state_2"
244 PERCENT_STATE_3 =
"percent_state_3"
245 POSITION =
"position"
253 PM25_STATE =
"pm25_state"
254 PM25_VALUE =
"pm25_value"
255 POWDER_SET =
"powder_set"
257 POWER_GO =
"power_go"
258 POWER_TOTAL =
"power_total"
259 PRESENCE_STATE =
"presence_state"
260 PRESSURE_STATE =
"pressure_state"
261 PRESSURE_VALUE =
"pressure_value"
263 PUMP_RESET =
"pump_reset"
265 RECORD_MODE =
"record_mode"
266 RECORD_SWITCH =
"record_switch"
267 RELAY_STATUS =
"relay_status"
268 REMAIN_TIME =
"remain_time"
269 RESET_DUSTER_CLOTH =
"reset_duster_cloth"
270 RESET_EDGE_BRUSH =
"reset_edge_brush"
271 RESET_FILTER =
"reset_filter"
272 RESET_MAP =
"reset_map"
273 RESET_ROLL_BRUSH =
"reset_roll_brush"
274 REVERSE_ENERGY_TOTAL =
"reverse_energy_total"
275 ROLL_BRUSH =
"roll_brush"
277 SENSITIVITY =
"sensitivity"
278 SENSOR_HUMIDITY =
"sensor_humidity"
279 SENSOR_TEMPERATURE =
"sensor_temperature"
281 SHOCK_STATE =
"shock_state"
282 SIREN_SWITCH =
"siren_switch"
283 SITUATION_SET =
"situation_set"
285 SLOW_FEED =
"slow_feed"
286 SMOKE_SENSOR_STATE =
"smoke_sensor_state"
287 SMOKE_SENSOR_STATUS =
"smoke_sensor_status"
288 SMOKE_SENSOR_VALUE =
"smoke_sensor_value"
290 SOS_STATE =
"sos_state"
292 SPRAY_MODE =
"spray_mode"
295 STERILIZATION =
"sterilization"
299 SWITCH_1 =
"switch_1"
300 SWITCH_2 =
"switch_2"
301 SWITCH_3 =
"switch_3"
302 SWITCH_4 =
"switch_4"
303 SWITCH_5 =
"switch_5"
304 SWITCH_6 =
"switch_6"
305 SWITCH_7 =
"switch_7"
306 SWITCH_8 =
"switch_8"
307 SWITCH_BACKLIGHT =
"switch_backlight"
308 SWITCH_CHARGE =
"switch_charge"
309 SWITCH_CONTROLLER =
"switch_controller"
310 SWITCH_DISTURB =
"switch_disturb"
311 SWITCH_FAN =
"switch_fan"
312 SWITCH_HORIZONTAL =
"switch_horizontal"
313 SWITCH_LED =
"switch_led"
314 SWITCH_LED_1 =
"switch_led_1"
315 SWITCH_LED_2 =
"switch_led_2"
316 SWITCH_LED_3 =
"switch_led_3"
317 SWITCH_NIGHT_LIGHT =
"switch_night_light"
318 SWITCH_SAVE_ENERGY =
"switch_save_energy"
319 SWITCH_SOUND =
"switch_sound"
320 SWITCH_SPRAY =
"switch_spray"
321 SWITCH_USB1 =
"switch_usb1"
322 SWITCH_USB2 =
"switch_usb2"
323 SWITCH_USB3 =
"switch_usb3"
324 SWITCH_USB4 =
"switch_usb4"
325 SWITCH_USB5 =
"switch_usb5"
326 SWITCH_USB6 =
"switch_usb6"
327 SWITCH_VERTICAL =
"switch_vertical"
328 SWITCH_VOICE =
"switch_voice"
329 TARGET_DIS_CLOSEST =
"target_dis_closest"
331 TEMP_BOILING_C =
"temp_boiling_c"
332 TEMP_BOILING_F =
"temp_boiling_f"
333 TEMP_CONTROLLER =
"temp_controller"
334 TEMP_CURRENT =
"temp_current"
335 TEMP_CURRENT_F =
"temp_current_f"
336 TEMP_INDOOR =
"temp_indoor"
337 TEMP_SET =
"temp_set"
338 TEMP_SET_F =
"temp_set_f"
339 TEMP_UNIT_CONVERT =
"temp_unit_convert"
340 TEMP_VALUE =
"temp_value"
341 TEMP_VALUE_V2 =
"temp_value_v2"
342 TEMPER_ALARM =
"temper_alarm"
343 TIME_TOTAL =
"time_total"
344 TIME_USE =
"time_use"
345 TOTAL_CLEAN_AREA =
"total_clean_area"
346 TOTAL_CLEAN_COUNT =
"total_clean_count"
347 TOTAL_CLEAN_TIME =
"total_clean_time"
348 TOTAL_FORWARD_ENERGY =
"total_forward_energy"
349 TOTAL_TIME =
"total_time"
350 TOTAL_PM =
"total_pm"
351 TOTAL_POWER =
"total_power"
353 UPPER_TEMP =
"upper_temp"
354 UPPER_TEMP_F =
"upper_temp_f"
356 VA_BATTERY =
"va_battery"
357 VA_HUMIDITY =
"va_humidity"
358 VA_TEMPERATURE =
"va_temperature"
359 VOC_STATE =
"voc_state"
360 VOC_VALUE =
"voc_value"
361 VOICE_SWITCH =
"voice_switch"
362 VOICE_TIMES =
"voice_times"
363 VOLUME_SET =
"volume_set"
365 WARM_TIME =
"warm_time"
367 WATER_RESET =
"water_reset"
368 WATER_SET =
"water_set"
369 WATERSENSOR_STATE =
"watersensor_state"
370 WEATHER_DELAY =
"weather_delay"
372 WINDOW_CHECK =
"window_check"
373 WINDOW_STATE =
"window_state"
374 WINDSPEED =
"windspeed"
375 WIRELESS_BATTERYLOCK =
"wireless_batterylock"
376 WIRELESS_ELECTRICITY =
"wireless_electricity"
377 WORK_MODE =
"work_mode"
378 WORK_POWER =
"work_power"
383 """Describes a unit of measurement."""
386 device_classes: set[str]
388 aliases: set[str] = field(default_factory=set)
389 conversion_unit: str |
None =
None
390 conversion_fn: Callable[[float], float] |
None =
None
402 SensorDeviceClass.AQI,
403 SensorDeviceClass.DATE,
404 SensorDeviceClass.MONETARY,
405 SensorDeviceClass.TIMESTAMP,
410 aliases={
"pct",
"percent",
"% RH"},
412 SensorDeviceClass.BATTERY,
413 SensorDeviceClass.HUMIDITY,
414 SensorDeviceClass.POWER_FACTOR,
418 unit=CONCENTRATION_PARTS_PER_MILLION,
420 SensorDeviceClass.CO,
421 SensorDeviceClass.CO2,
425 unit=CONCENTRATION_PARTS_PER_BILLION,
427 SensorDeviceClass.CO,
428 SensorDeviceClass.CO2,
430 conversion_unit=CONCENTRATION_PARTS_PER_MILLION,
431 conversion_fn=
lambda x: x / 1000,
434 unit=UnitOfElectricCurrent.AMPERE,
435 aliases={
"a",
"ampere"},
436 device_classes={SensorDeviceClass.CURRENT},
439 unit=UnitOfElectricCurrent.MILLIAMPERE,
440 aliases={
"ma",
"milliampere"},
441 device_classes={SensorDeviceClass.CURRENT},
442 conversion_unit=UnitOfElectricCurrent.AMPERE,
443 conversion_fn=
lambda x: x / 1000,
446 unit=UnitOfEnergy.WATT_HOUR,
447 aliases={
"wh",
"watthour"},
448 device_classes={SensorDeviceClass.ENERGY},
451 unit=UnitOfEnergy.KILO_WATT_HOUR,
452 aliases={
"kwh",
"kilowatt-hour",
"kW·h",
"kW.h"},
453 device_classes={SensorDeviceClass.ENERGY},
456 unit=UnitOfVolume.CUBIC_FEET,
458 device_classes={SensorDeviceClass.GAS},
461 unit=UnitOfVolume.CUBIC_METERS,
463 device_classes={SensorDeviceClass.GAS},
468 device_classes={SensorDeviceClass.ILLUMINANCE},
471 unit=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
472 aliases={
"ug/m3",
"µg/m3",
"ug/m³"},
474 SensorDeviceClass.NITROGEN_DIOXIDE,
475 SensorDeviceClass.NITROGEN_MONOXIDE,
476 SensorDeviceClass.NITROUS_OXIDE,
477 SensorDeviceClass.OZONE,
478 SensorDeviceClass.PM1,
479 SensorDeviceClass.PM25,
480 SensorDeviceClass.PM10,
481 SensorDeviceClass.SULPHUR_DIOXIDE,
482 SensorDeviceClass.VOLATILE_ORGANIC_COMPOUNDS,
486 unit=CONCENTRATION_MILLIGRAMS_PER_CUBIC_METER,
489 SensorDeviceClass.NITROGEN_DIOXIDE,
490 SensorDeviceClass.NITROGEN_MONOXIDE,
491 SensorDeviceClass.NITROUS_OXIDE,
492 SensorDeviceClass.OZONE,
493 SensorDeviceClass.PM1,
494 SensorDeviceClass.PM25,
495 SensorDeviceClass.PM10,
496 SensorDeviceClass.SULPHUR_DIOXIDE,
497 SensorDeviceClass.VOLATILE_ORGANIC_COMPOUNDS,
499 conversion_unit=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
500 conversion_fn=
lambda x: x * 1000,
503 unit=UnitOfPower.WATT,
505 device_classes={SensorDeviceClass.POWER},
508 unit=UnitOfPower.KILO_WATT,
509 aliases={
"kilowatt"},
510 device_classes={SensorDeviceClass.POWER},
513 unit=UnitOfPressure.BAR,
514 device_classes={SensorDeviceClass.PRESSURE},
517 unit=UnitOfPressure.MBAR,
518 aliases={
"millibar"},
519 device_classes={SensorDeviceClass.PRESSURE},
522 unit=UnitOfPressure.HPA,
523 aliases={
"hpa",
"hectopascal"},
524 device_classes={SensorDeviceClass.PRESSURE},
527 unit=UnitOfPressure.INHG,
529 device_classes={SensorDeviceClass.PRESSURE},
532 unit=UnitOfPressure.PSI,
533 device_classes={SensorDeviceClass.PRESSURE},
536 unit=UnitOfPressure.PA,
537 device_classes={SensorDeviceClass.PRESSURE},
540 unit=SIGNAL_STRENGTH_DECIBELS,
542 device_classes={SensorDeviceClass.SIGNAL_STRENGTH},
545 unit=SIGNAL_STRENGTH_DECIBELS_MILLIWATT,
547 device_classes={SensorDeviceClass.SIGNAL_STRENGTH},
550 unit=UnitOfTemperature.CELSIUS,
551 aliases={
"°c",
"c",
"celsius",
"℃"},
552 device_classes={SensorDeviceClass.TEMPERATURE},
555 unit=UnitOfTemperature.FAHRENHEIT,
556 aliases={
"°f",
"f",
"fahrenheit"},
557 device_classes={SensorDeviceClass.TEMPERATURE},
560 unit=UnitOfElectricPotential.VOLT,
562 device_classes={SensorDeviceClass.VOLTAGE},
565 unit=UnitOfElectricPotential.MILLIVOLT,
566 aliases={
"mv",
"millivolt"},
567 device_classes={SensorDeviceClass.VOLTAGE},
568 conversion_unit=UnitOfElectricPotential.VOLT,
569 conversion_fn=
lambda x: x / 1000,
574 DEVICE_CLASS_UNITS: dict[str, dict[str, UnitOfMeasurement]] = {}
576 for device_class
in uom.device_classes:
577 DEVICE_CLASS_UNITS.setdefault(device_class, {})[uom.unit] = uom
578 for unit_alias
in uom.aliases:
579 DEVICE_CLASS_UNITS[device_class][unit_alias] = uom