Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Support for Tuya sensors."""
2 
3 from __future__ import annotations
4 
5 from dataclasses import dataclass
6 
7 from tuya_sharing import CustomerDevice, Manager
8 from tuya_sharing.device import DeviceStatusRange
9 
11  SensorDeviceClass,
12  SensorEntity,
13  SensorEntityDescription,
14  SensorStateClass,
15 )
16 from homeassistant.const import (
17  PERCENTAGE,
18  EntityCategory,
19  UnitOfElectricCurrent,
20  UnitOfElectricPotential,
21  UnitOfPower,
22  UnitOfTime,
23 )
24 from homeassistant.core import HomeAssistant, callback
25 from homeassistant.helpers.dispatcher import async_dispatcher_connect
26 from homeassistant.helpers.entity_platform import AddEntitiesCallback
27 from homeassistant.helpers.typing import StateType
28 
29 from . import TuyaConfigEntry
30 from .const import (
31  DEVICE_CLASS_UNITS,
32  DOMAIN,
33  TUYA_DISCOVERY_NEW,
34  DPCode,
35  DPType,
36  UnitOfMeasurement,
37 )
38 from .entity import ElectricityTypeData, EnumTypeData, IntegerTypeData, TuyaEntity
39 
40 
41 @dataclass(frozen=True)
43  """Describes Tuya sensor entity."""
44 
45  subkey: str | None = None
46 
47 
48 # Commonly used battery sensors, that are re-used in the sensors down below.
49 BATTERY_SENSORS: tuple[TuyaSensorEntityDescription, ...] = (
51  key=DPCode.BATTERY_PERCENTAGE,
52  translation_key="battery",
53  native_unit_of_measurement=PERCENTAGE,
54  device_class=SensorDeviceClass.BATTERY,
55  state_class=SensorStateClass.MEASUREMENT,
56  entity_category=EntityCategory.DIAGNOSTIC,
57  ),
59  key=DPCode.BATTERY, # Used by non-standard contact sensor implementations
60  translation_key="battery",
61  native_unit_of_measurement=PERCENTAGE,
62  device_class=SensorDeviceClass.BATTERY,
63  state_class=SensorStateClass.MEASUREMENT,
64  entity_category=EntityCategory.DIAGNOSTIC,
65  ),
67  key=DPCode.BATTERY_STATE,
68  translation_key="battery_state",
69  entity_category=EntityCategory.DIAGNOSTIC,
70  ),
72  key=DPCode.BATTERY_VALUE,
73  translation_key="battery",
74  device_class=SensorDeviceClass.BATTERY,
75  entity_category=EntityCategory.DIAGNOSTIC,
76  state_class=SensorStateClass.MEASUREMENT,
77  ),
79  key=DPCode.VA_BATTERY,
80  translation_key="battery",
81  device_class=SensorDeviceClass.BATTERY,
82  entity_category=EntityCategory.DIAGNOSTIC,
83  state_class=SensorStateClass.MEASUREMENT,
84  ),
85 )
86 
87 # All descriptions can be found here. Mostly the Integer data types in the
88 # default status set of each category (that don't have a set instruction)
89 # end up being a sensor.
90 # https://developer.tuya.com/en/docs/iot/standarddescription?id=K9i5ql6waswzq
91 SENSORS: dict[str, tuple[TuyaSensorEntityDescription, ...]] = {
92  # Multi-functional Sensor
93  # https://developer.tuya.com/en/docs/iot/categorydgnbj?id=Kaiuz3yorvzg3
94  "dgnbj": (
96  key=DPCode.GAS_SENSOR_VALUE,
97  translation_key="gas",
98  state_class=SensorStateClass.MEASUREMENT,
99  ),
101  key=DPCode.CH4_SENSOR_VALUE,
102  translation_key="gas",
103  name="Methane",
104  state_class=SensorStateClass.MEASUREMENT,
105  ),
107  key=DPCode.VOC_VALUE,
108  translation_key="voc",
109  device_class=SensorDeviceClass.VOLATILE_ORGANIC_COMPOUNDS,
110  state_class=SensorStateClass.MEASUREMENT,
111  ),
113  key=DPCode.PM25_VALUE,
114  translation_key="pm25",
115  device_class=SensorDeviceClass.PM25,
116  state_class=SensorStateClass.MEASUREMENT,
117  ),
119  key=DPCode.CO_VALUE,
120  translation_key="carbon_monoxide",
121  device_class=SensorDeviceClass.CO,
122  state_class=SensorStateClass.MEASUREMENT,
123  ),
125  key=DPCode.CO2_VALUE,
126  translation_key="carbon_dioxide",
127  device_class=SensorDeviceClass.CO2,
128  state_class=SensorStateClass.MEASUREMENT,
129  ),
131  key=DPCode.CH2O_VALUE,
132  translation_key="formaldehyde",
133  state_class=SensorStateClass.MEASUREMENT,
134  ),
136  key=DPCode.BRIGHT_STATE,
137  translation_key="luminosity",
138  ),
140  key=DPCode.BRIGHT_VALUE,
141  translation_key="illuminance",
142  device_class=SensorDeviceClass.ILLUMINANCE,
143  state_class=SensorStateClass.MEASUREMENT,
144  ),
146  key=DPCode.TEMP_CURRENT,
147  translation_key="temperature",
148  device_class=SensorDeviceClass.TEMPERATURE,
149  state_class=SensorStateClass.MEASUREMENT,
150  ),
152  key=DPCode.HUMIDITY_VALUE,
153  translation_key="humidity",
154  device_class=SensorDeviceClass.HUMIDITY,
155  state_class=SensorStateClass.MEASUREMENT,
156  ),
158  key=DPCode.SMOKE_SENSOR_VALUE,
159  translation_key="smoke_amount",
160  entity_category=EntityCategory.DIAGNOSTIC,
161  state_class=SensorStateClass.MEASUREMENT,
162  ),
163  *BATTERY_SENSORS,
164  ),
165  # Smart Kettle
166  # https://developer.tuya.com/en/docs/iot/fbh?id=K9gf484m21yq7
167  "bh": (
169  key=DPCode.TEMP_CURRENT,
170  translation_key="current_temperature",
171  device_class=SensorDeviceClass.TEMPERATURE,
172  state_class=SensorStateClass.MEASUREMENT,
173  ),
175  key=DPCode.TEMP_CURRENT_F,
176  translation_key="current_temperature",
177  device_class=SensorDeviceClass.TEMPERATURE,
178  state_class=SensorStateClass.MEASUREMENT,
179  ),
181  key=DPCode.STATUS,
182  translation_key="status",
183  ),
184  ),
185  # CO2 Detector
186  # https://developer.tuya.com/en/docs/iot/categoryco2bj?id=Kaiuz3wes7yuy
187  "co2bj": (
189  key=DPCode.HUMIDITY_VALUE,
190  translation_key="humidity",
191  device_class=SensorDeviceClass.HUMIDITY,
192  state_class=SensorStateClass.MEASUREMENT,
193  ),
195  key=DPCode.TEMP_CURRENT,
196  translation_key="temperature",
197  device_class=SensorDeviceClass.TEMPERATURE,
198  state_class=SensorStateClass.MEASUREMENT,
199  ),
201  key=DPCode.CO2_VALUE,
202  translation_key="carbon_dioxide",
203  device_class=SensorDeviceClass.CO2,
204  state_class=SensorStateClass.MEASUREMENT,
205  ),
207  key=DPCode.CH2O_VALUE,
208  translation_key="formaldehyde",
209  state_class=SensorStateClass.MEASUREMENT,
210  ),
212  key=DPCode.VOC_VALUE,
213  translation_key="voc",
214  device_class=SensorDeviceClass.VOLATILE_ORGANIC_COMPOUNDS,
215  state_class=SensorStateClass.MEASUREMENT,
216  ),
218  key=DPCode.PM25_VALUE,
219  translation_key="pm25",
220  device_class=SensorDeviceClass.PM25,
221  state_class=SensorStateClass.MEASUREMENT,
222  ),
223  *BATTERY_SENSORS,
224  ),
225  # Two-way temperature and humidity switch
226  # "MOES Temperature and Humidity Smart Switch Module MS-103"
227  # Documentation not found
228  "wkcz": (
230  key=DPCode.HUMIDITY_VALUE,
231  translation_key="humidity",
232  device_class=SensorDeviceClass.HUMIDITY,
233  state_class=SensorStateClass.MEASUREMENT,
234  ),
236  key=DPCode.TEMP_CURRENT,
237  translation_key="temperature",
238  device_class=SensorDeviceClass.TEMPERATURE,
239  state_class=SensorStateClass.MEASUREMENT,
240  ),
242  key=DPCode.CUR_CURRENT,
243  translation_key="current",
244  device_class=SensorDeviceClass.CURRENT,
245  state_class=SensorStateClass.MEASUREMENT,
246  entity_registry_enabled_default=False,
247  ),
249  key=DPCode.CUR_POWER,
250  translation_key="power",
251  device_class=SensorDeviceClass.POWER,
252  state_class=SensorStateClass.MEASUREMENT,
253  entity_registry_enabled_default=False,
254  ),
256  key=DPCode.CUR_VOLTAGE,
257  translation_key="voltage",
258  device_class=SensorDeviceClass.VOLTAGE,
259  state_class=SensorStateClass.MEASUREMENT,
260  entity_registry_enabled_default=False,
261  ),
262  ),
263  # Single Phase power meter
264  # Note: Undocumented
265  "aqcz": (
267  key=DPCode.CUR_CURRENT,
268  translation_key="current",
269  device_class=SensorDeviceClass.CURRENT,
270  state_class=SensorStateClass.MEASUREMENT,
271  entity_registry_enabled_default=False,
272  ),
274  key=DPCode.CUR_POWER,
275  translation_key="power",
276  device_class=SensorDeviceClass.POWER,
277  state_class=SensorStateClass.MEASUREMENT,
278  entity_registry_enabled_default=False,
279  ),
281  key=DPCode.CUR_VOLTAGE,
282  translation_key="voltage",
283  device_class=SensorDeviceClass.VOLTAGE,
284  state_class=SensorStateClass.MEASUREMENT,
285  entity_registry_enabled_default=False,
286  ),
287  ),
288  # CO Detector
289  # https://developer.tuya.com/en/docs/iot/categorycobj?id=Kaiuz3u1j6q1v
290  "cobj": (
292  key=DPCode.CO_VALUE,
293  translation_key="carbon_monoxide",
294  device_class=SensorDeviceClass.CO,
295  state_class=SensorStateClass.MEASUREMENT,
296  ),
297  *BATTERY_SENSORS,
298  ),
299  # Smart Pet Feeder
300  # https://developer.tuya.com/en/docs/iot/categorycwwsq?id=Kaiuz2b6vydld
301  "cwwsq": (
303  key=DPCode.FEED_REPORT,
304  translation_key="last_amount",
305  state_class=SensorStateClass.MEASUREMENT,
306  ),
307  ),
308  # Air Quality Monitor
309  # https://developer.tuya.com/en/docs/iot/hjjcy?id=Kbeoad8y1nnlv
310  "hjjcy": (
312  key=DPCode.AIR_QUALITY_INDEX,
313  translation_key="air_quality_index",
314  ),
316  key=DPCode.TEMP_CURRENT,
317  translation_key="temperature",
318  device_class=SensorDeviceClass.TEMPERATURE,
319  state_class=SensorStateClass.MEASUREMENT,
320  ),
322  key=DPCode.HUMIDITY_VALUE,
323  translation_key="humidity",
324  device_class=SensorDeviceClass.HUMIDITY,
325  state_class=SensorStateClass.MEASUREMENT,
326  ),
328  key=DPCode.CO2_VALUE,
329  translation_key="carbon_dioxide",
330  device_class=SensorDeviceClass.CO2,
331  state_class=SensorStateClass.MEASUREMENT,
332  ),
334  key=DPCode.CH2O_VALUE,
335  translation_key="formaldehyde",
336  state_class=SensorStateClass.MEASUREMENT,
337  ),
339  key=DPCode.VOC_VALUE,
340  translation_key="voc",
341  device_class=SensorDeviceClass.VOLATILE_ORGANIC_COMPOUNDS,
342  state_class=SensorStateClass.MEASUREMENT,
343  ),
345  key=DPCode.PM25_VALUE,
346  translation_key="pm25",
347  device_class=SensorDeviceClass.PM25,
348  state_class=SensorStateClass.MEASUREMENT,
349  ),
351  key=DPCode.PM10,
352  translation_key="pm10",
353  device_class=SensorDeviceClass.PM10,
354  state_class=SensorStateClass.MEASUREMENT,
355  ),
356  *BATTERY_SENSORS,
357  ),
358  # Formaldehyde Detector
359  # Note: Not documented
360  "jqbj": (
362  key=DPCode.CO2_VALUE,
363  translation_key="carbon_dioxide",
364  device_class=SensorDeviceClass.CO2,
365  state_class=SensorStateClass.MEASUREMENT,
366  ),
368  key=DPCode.VOC_VALUE,
369  translation_key="voc",
370  device_class=SensorDeviceClass.VOLATILE_ORGANIC_COMPOUNDS,
371  state_class=SensorStateClass.MEASUREMENT,
372  ),
374  key=DPCode.PM25_VALUE,
375  translation_key="pm25",
376  device_class=SensorDeviceClass.PM25,
377  state_class=SensorStateClass.MEASUREMENT,
378  ),
380  key=DPCode.VA_HUMIDITY,
381  translation_key="humidity",
382  device_class=SensorDeviceClass.HUMIDITY,
383  state_class=SensorStateClass.MEASUREMENT,
384  ),
386  key=DPCode.VA_TEMPERATURE,
387  translation_key="temperature",
388  device_class=SensorDeviceClass.TEMPERATURE,
389  state_class=SensorStateClass.MEASUREMENT,
390  ),
392  key=DPCode.CH2O_VALUE,
393  translation_key="formaldehyde",
394  state_class=SensorStateClass.MEASUREMENT,
395  ),
396  *BATTERY_SENSORS,
397  ),
398  # Methane Detector
399  # https://developer.tuya.com/en/docs/iot/categoryjwbj?id=Kaiuz40u98lkm
400  "jwbj": (
402  key=DPCode.CH4_SENSOR_VALUE,
403  translation_key="methane",
404  state_class=SensorStateClass.MEASUREMENT,
405  ),
406  *BATTERY_SENSORS,
407  ),
408  # Switch
409  # https://developer.tuya.com/en/docs/iot/s?id=K9gf7o5prgf7s
410  "kg": (
412  key=DPCode.CUR_CURRENT,
413  translation_key="current",
414  device_class=SensorDeviceClass.CURRENT,
415  state_class=SensorStateClass.MEASUREMENT,
416  entity_registry_enabled_default=False,
417  ),
419  key=DPCode.CUR_POWER,
420  translation_key="power",
421  device_class=SensorDeviceClass.POWER,
422  state_class=SensorStateClass.MEASUREMENT,
423  entity_registry_enabled_default=False,
424  ),
426  key=DPCode.CUR_VOLTAGE,
427  translation_key="voltage",
428  device_class=SensorDeviceClass.VOLTAGE,
429  state_class=SensorStateClass.MEASUREMENT,
430  entity_registry_enabled_default=False,
431  ),
432  ),
433  # IoT Switch
434  # Note: Undocumented
435  "tdq": (
437  key=DPCode.CUR_CURRENT,
438  translation_key="current",
439  device_class=SensorDeviceClass.CURRENT,
440  state_class=SensorStateClass.MEASUREMENT,
441  entity_registry_enabled_default=False,
442  ),
444  key=DPCode.CUR_POWER,
445  translation_key="power",
446  device_class=SensorDeviceClass.POWER,
447  state_class=SensorStateClass.MEASUREMENT,
448  entity_registry_enabled_default=False,
449  ),
451  key=DPCode.CUR_VOLTAGE,
452  translation_key="voltage",
453  device_class=SensorDeviceClass.VOLTAGE,
454  state_class=SensorStateClass.MEASUREMENT,
455  entity_registry_enabled_default=False,
456  ),
457  ),
458  # Luminance Sensor
459  # https://developer.tuya.com/en/docs/iot/categoryldcg?id=Kaiuz3n7u69l8
460  "ldcg": (
462  key=DPCode.BRIGHT_STATE,
463  translation_key="luminosity",
464  ),
466  key=DPCode.BRIGHT_VALUE,
467  translation_key="illuminance",
468  device_class=SensorDeviceClass.ILLUMINANCE,
469  state_class=SensorStateClass.MEASUREMENT,
470  ),
472  key=DPCode.TEMP_CURRENT,
473  translation_key="temperature",
474  device_class=SensorDeviceClass.TEMPERATURE,
475  state_class=SensorStateClass.MEASUREMENT,
476  ),
478  key=DPCode.HUMIDITY_VALUE,
479  translation_key="humidity",
480  device_class=SensorDeviceClass.HUMIDITY,
481  state_class=SensorStateClass.MEASUREMENT,
482  ),
484  key=DPCode.CO2_VALUE,
485  translation_key="carbon_dioxide",
486  device_class=SensorDeviceClass.CO2,
487  state_class=SensorStateClass.MEASUREMENT,
488  ),
489  *BATTERY_SENSORS,
490  ),
491  # Door and Window Controller
492  # https://developer.tuya.com/en/docs/iot/s?id=K9gf48r5zjsy9
493  "mc": BATTERY_SENSORS,
494  # Door Window Sensor
495  # https://developer.tuya.com/en/docs/iot/s?id=K9gf48hm02l8m
496  "mcs": BATTERY_SENSORS,
497  # Sous Vide Cooker
498  # https://developer.tuya.com/en/docs/iot/categorymzj?id=Kaiuz2vy130ux
499  "mzj": (
501  key=DPCode.TEMP_CURRENT,
502  translation_key="current_temperature",
503  device_class=SensorDeviceClass.TEMPERATURE,
504  state_class=SensorStateClass.MEASUREMENT,
505  ),
507  key=DPCode.STATUS,
508  translation_key="sous_vide_status",
509  ),
511  key=DPCode.REMAIN_TIME,
512  translation_key="remaining_time",
513  native_unit_of_measurement=UnitOfTime.MINUTES,
514  ),
515  ),
516  # PIR Detector
517  # https://developer.tuya.com/en/docs/iot/categorypir?id=Kaiuz3ss11b80
518  "pir": BATTERY_SENSORS,
519  # PM2.5 Sensor
520  # https://developer.tuya.com/en/docs/iot/categorypm25?id=Kaiuz3qof3yfu
521  "pm2.5": (
523  key=DPCode.PM25_VALUE,
524  translation_key="pm25",
525  device_class=SensorDeviceClass.PM25,
526  state_class=SensorStateClass.MEASUREMENT,
527  ),
529  key=DPCode.CH2O_VALUE,
530  translation_key="formaldehyde",
531  state_class=SensorStateClass.MEASUREMENT,
532  ),
534  key=DPCode.VOC_VALUE,
535  translation_key="voc",
536  device_class=SensorDeviceClass.VOLATILE_ORGANIC_COMPOUNDS,
537  state_class=SensorStateClass.MEASUREMENT,
538  ),
540  key=DPCode.TEMP_CURRENT,
541  translation_key="temperature",
542  device_class=SensorDeviceClass.TEMPERATURE,
543  state_class=SensorStateClass.MEASUREMENT,
544  ),
546  key=DPCode.CO2_VALUE,
547  translation_key="carbon_dioxide",
548  device_class=SensorDeviceClass.CO2,
549  state_class=SensorStateClass.MEASUREMENT,
550  ),
552  key=DPCode.HUMIDITY_VALUE,
553  translation_key="humidity",
554  device_class=SensorDeviceClass.HUMIDITY,
555  state_class=SensorStateClass.MEASUREMENT,
556  ),
558  key=DPCode.PM1,
559  translation_key="pm1",
560  device_class=SensorDeviceClass.PM1,
561  state_class=SensorStateClass.MEASUREMENT,
562  ),
564  key=DPCode.PM10,
565  translation_key="pm10",
566  device_class=SensorDeviceClass.PM10,
567  state_class=SensorStateClass.MEASUREMENT,
568  ),
569  *BATTERY_SENSORS,
570  ),
571  # Heater
572  # https://developer.tuya.com/en/docs/iot/categoryqn?id=Kaiuz18kih0sm
573  "qn": (
575  key=DPCode.WORK_POWER,
576  translation_key="power",
577  device_class=SensorDeviceClass.POWER,
578  state_class=SensorStateClass.MEASUREMENT,
579  ),
580  ),
581  # Gas Detector
582  # https://developer.tuya.com/en/docs/iot/categoryrqbj?id=Kaiuz3d162ubw
583  "rqbj": (
585  key=DPCode.GAS_SENSOR_VALUE,
586  name=None,
587  translation_key="gas",
588  state_class=SensorStateClass.MEASUREMENT,
589  ),
590  *BATTERY_SENSORS,
591  ),
592  # Smart Water Timer
593  "sfkzq": (
594  # Total seconds of irrigation. Read-write value; the device appears to ignore the write action (maybe firmware bug)
596  key=DPCode.TIME_USE,
597  translation_key="total_watering_time",
598  state_class=SensorStateClass.TOTAL_INCREASING,
599  entity_category=EntityCategory.DIAGNOSTIC,
600  ),
601  *BATTERY_SENSORS,
602  ),
603  # Irrigator
604  # https://developer.tuya.com/en/docs/iot/categoryggq?id=Kaiuz1qib7z0k
605  "ggq": BATTERY_SENSORS,
606  # Water Detector
607  # https://developer.tuya.com/en/docs/iot/categorysj?id=Kaiuz3iub2sli
608  "sj": BATTERY_SENSORS,
609  # Emergency Button
610  # https://developer.tuya.com/en/docs/iot/categorysos?id=Kaiuz3oi6agjy
611  "sos": BATTERY_SENSORS,
612  # Smart Camera
613  # https://developer.tuya.com/en/docs/iot/categorysp?id=Kaiuz35leyo12
614  "sp": (
616  key=DPCode.SENSOR_TEMPERATURE,
617  translation_key="temperature",
618  device_class=SensorDeviceClass.TEMPERATURE,
619  state_class=SensorStateClass.MEASUREMENT,
620  ),
622  key=DPCode.SENSOR_HUMIDITY,
623  translation_key="humidity",
624  device_class=SensorDeviceClass.HUMIDITY,
625  state_class=SensorStateClass.MEASUREMENT,
626  ),
628  key=DPCode.WIRELESS_ELECTRICITY,
629  translation_key="battery",
630  device_class=SensorDeviceClass.BATTERY,
631  entity_category=EntityCategory.DIAGNOSTIC,
632  state_class=SensorStateClass.MEASUREMENT,
633  ),
634  ),
635  # Fingerbot
636  "szjqr": BATTERY_SENSORS,
637  # Solar Light
638  # https://developer.tuya.com/en/docs/iot/tynd?id=Kaof8j02e1t98
639  "tyndj": BATTERY_SENSORS,
640  # Volatile Organic Compound Sensor
641  # Note: Undocumented in cloud API docs, based on test device
642  "voc": (
644  key=DPCode.CO2_VALUE,
645  translation_key="carbon_dioxide",
646  device_class=SensorDeviceClass.CO2,
647  state_class=SensorStateClass.MEASUREMENT,
648  ),
650  key=DPCode.PM25_VALUE,
651  translation_key="pm25",
652  device_class=SensorDeviceClass.PM25,
653  state_class=SensorStateClass.MEASUREMENT,
654  ),
656  key=DPCode.CH2O_VALUE,
657  translation_key="formaldehyde",
658  state_class=SensorStateClass.MEASUREMENT,
659  ),
661  key=DPCode.HUMIDITY_VALUE,
662  translation_key="humidity",
663  device_class=SensorDeviceClass.HUMIDITY,
664  state_class=SensorStateClass.MEASUREMENT,
665  ),
667  key=DPCode.TEMP_CURRENT,
668  translation_key="temperature",
669  device_class=SensorDeviceClass.TEMPERATURE,
670  state_class=SensorStateClass.MEASUREMENT,
671  ),
673  key=DPCode.VOC_VALUE,
674  translation_key="voc",
675  device_class=SensorDeviceClass.VOLATILE_ORGANIC_COMPOUNDS,
676  state_class=SensorStateClass.MEASUREMENT,
677  ),
678  *BATTERY_SENSORS,
679  ),
680  # Thermostatic Radiator Valve
681  # Not documented
682  "wkf": BATTERY_SENSORS,
683  # Temperature and Humidity Sensor
684  # https://developer.tuya.com/en/docs/iot/categorywsdcg?id=Kaiuz3hinij34
685  "wsdcg": (
687  key=DPCode.VA_TEMPERATURE,
688  translation_key="temperature",
689  device_class=SensorDeviceClass.TEMPERATURE,
690  state_class=SensorStateClass.MEASUREMENT,
691  ),
693  key=DPCode.TEMP_CURRENT,
694  translation_key="temperature",
695  device_class=SensorDeviceClass.TEMPERATURE,
696  state_class=SensorStateClass.MEASUREMENT,
697  ),
699  key=DPCode.VA_HUMIDITY,
700  translation_key="humidity",
701  device_class=SensorDeviceClass.HUMIDITY,
702  state_class=SensorStateClass.MEASUREMENT,
703  ),
705  key=DPCode.HUMIDITY_VALUE,
706  translation_key="humidity",
707  device_class=SensorDeviceClass.HUMIDITY,
708  state_class=SensorStateClass.MEASUREMENT,
709  ),
711  key=DPCode.BRIGHT_VALUE,
712  translation_key="illuminance",
713  device_class=SensorDeviceClass.ILLUMINANCE,
714  state_class=SensorStateClass.MEASUREMENT,
715  ),
716  *BATTERY_SENSORS,
717  ),
718  # Pressure Sensor
719  # https://developer.tuya.com/en/docs/iot/categoryylcg?id=Kaiuz3kc2e4gm
720  "ylcg": (
722  key=DPCode.PRESSURE_VALUE,
723  name=None,
724  device_class=SensorDeviceClass.PRESSURE,
725  state_class=SensorStateClass.MEASUREMENT,
726  ),
727  *BATTERY_SENSORS,
728  ),
729  # Smoke Detector
730  # https://developer.tuya.com/en/docs/iot/categoryywbj?id=Kaiuz3f6sf952
731  "ywbj": (
733  key=DPCode.SMOKE_SENSOR_VALUE,
734  translation_key="smoke_amount",
735  entity_category=EntityCategory.DIAGNOSTIC,
736  state_class=SensorStateClass.MEASUREMENT,
737  ),
738  *BATTERY_SENSORS,
739  ),
740  # Vibration Sensor
741  # https://developer.tuya.com/en/docs/iot/categoryzd?id=Kaiuz3a5vrzno
742  "zd": BATTERY_SENSORS,
743  # Smart Electricity Meter
744  # https://developer.tuya.com/en/docs/iot/smart-meter?id=Kaiuz4gv6ack7
745  "zndb": (
747  key=DPCode.FORWARD_ENERGY_TOTAL,
748  translation_key="total_energy",
749  device_class=SensorDeviceClass.ENERGY,
750  state_class=SensorStateClass.TOTAL_INCREASING,
751  ),
753  key=DPCode.REVERSE_ENERGY_TOTAL,
754  translation_key="total_energy",
755  device_class=SensorDeviceClass.ENERGY,
756  state_class=SensorStateClass.TOTAL_INCREASING,
757  ),
759  key=DPCode.TOTAL_POWER,
760  translation_key="total_power",
761  device_class=SensorDeviceClass.POWER,
762  state_class=SensorStateClass.MEASUREMENT,
763  native_unit_of_measurement=UnitOfPower.KILO_WATT,
764  subkey="power",
765  ),
767  key=DPCode.PHASE_A,
768  translation_key="phase_a_current",
769  device_class=SensorDeviceClass.CURRENT,
770  native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
771  state_class=SensorStateClass.MEASUREMENT,
772  subkey="electriccurrent",
773  ),
775  key=DPCode.PHASE_A,
776  translation_key="phase_a_power",
777  device_class=SensorDeviceClass.POWER,
778  state_class=SensorStateClass.MEASUREMENT,
779  native_unit_of_measurement=UnitOfPower.KILO_WATT,
780  subkey="power",
781  ),
783  key=DPCode.PHASE_A,
784  translation_key="phase_a_voltage",
785  device_class=SensorDeviceClass.VOLTAGE,
786  state_class=SensorStateClass.MEASUREMENT,
787  native_unit_of_measurement=UnitOfElectricPotential.VOLT,
788  subkey="voltage",
789  ),
791  key=DPCode.PHASE_B,
792  translation_key="phase_b_current",
793  device_class=SensorDeviceClass.CURRENT,
794  native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
795  state_class=SensorStateClass.MEASUREMENT,
796  subkey="electriccurrent",
797  ),
799  key=DPCode.PHASE_B,
800  translation_key="phase_b_power",
801  device_class=SensorDeviceClass.POWER,
802  state_class=SensorStateClass.MEASUREMENT,
803  native_unit_of_measurement=UnitOfPower.KILO_WATT,
804  subkey="power",
805  ),
807  key=DPCode.PHASE_B,
808  translation_key="phase_b_voltage",
809  device_class=SensorDeviceClass.VOLTAGE,
810  state_class=SensorStateClass.MEASUREMENT,
811  native_unit_of_measurement=UnitOfElectricPotential.VOLT,
812  subkey="voltage",
813  ),
815  key=DPCode.PHASE_C,
816  translation_key="phase_c_current",
817  device_class=SensorDeviceClass.CURRENT,
818  native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
819  state_class=SensorStateClass.MEASUREMENT,
820  subkey="electriccurrent",
821  ),
823  key=DPCode.PHASE_C,
824  translation_key="phase_c_power",
825  device_class=SensorDeviceClass.POWER,
826  state_class=SensorStateClass.MEASUREMENT,
827  native_unit_of_measurement=UnitOfPower.KILO_WATT,
828  subkey="power",
829  ),
831  key=DPCode.PHASE_C,
832  translation_key="phase_c_voltage",
833  device_class=SensorDeviceClass.VOLTAGE,
834  state_class=SensorStateClass.MEASUREMENT,
835  native_unit_of_measurement=UnitOfElectricPotential.VOLT,
836  subkey="voltage",
837  ),
838  ),
839  # Circuit Breaker
840  # https://developer.tuya.com/en/docs/iot/dlq?id=Kb0kidk9enyh8
841  "dlq": (
843  key=DPCode.TOTAL_FORWARD_ENERGY,
844  translation_key="total_energy",
845  device_class=SensorDeviceClass.ENERGY,
846  state_class=SensorStateClass.TOTAL_INCREASING,
847  ),
849  key=DPCode.CUR_NEUTRAL,
850  translation_key="total_production",
851  device_class=SensorDeviceClass.ENERGY,
852  state_class=SensorStateClass.TOTAL_INCREASING,
853  ),
855  key=DPCode.PHASE_A,
856  translation_key="phase_a_current",
857  device_class=SensorDeviceClass.CURRENT,
858  native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
859  state_class=SensorStateClass.MEASUREMENT,
860  subkey="electriccurrent",
861  ),
863  key=DPCode.PHASE_A,
864  translation_key="phase_a_power",
865  device_class=SensorDeviceClass.POWER,
866  state_class=SensorStateClass.MEASUREMENT,
867  native_unit_of_measurement=UnitOfPower.KILO_WATT,
868  subkey="power",
869  ),
871  key=DPCode.PHASE_A,
872  translation_key="phase_a_voltage",
873  device_class=SensorDeviceClass.VOLTAGE,
874  state_class=SensorStateClass.MEASUREMENT,
875  native_unit_of_measurement=UnitOfElectricPotential.VOLT,
876  subkey="voltage",
877  ),
879  key=DPCode.PHASE_B,
880  translation_key="phase_b_current",
881  device_class=SensorDeviceClass.CURRENT,
882  native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
883  state_class=SensorStateClass.MEASUREMENT,
884  subkey="electriccurrent",
885  ),
887  key=DPCode.PHASE_B,
888  translation_key="phase_b_power",
889  device_class=SensorDeviceClass.POWER,
890  state_class=SensorStateClass.MEASUREMENT,
891  native_unit_of_measurement=UnitOfPower.KILO_WATT,
892  subkey="power",
893  ),
895  key=DPCode.PHASE_B,
896  translation_key="phase_b_voltage",
897  device_class=SensorDeviceClass.VOLTAGE,
898  state_class=SensorStateClass.MEASUREMENT,
899  native_unit_of_measurement=UnitOfElectricPotential.VOLT,
900  subkey="voltage",
901  ),
903  key=DPCode.PHASE_C,
904  translation_key="phase_c_current",
905  device_class=SensorDeviceClass.CURRENT,
906  native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
907  state_class=SensorStateClass.MEASUREMENT,
908  subkey="electriccurrent",
909  ),
911  key=DPCode.PHASE_C,
912  translation_key="phase_c_power",
913  device_class=SensorDeviceClass.POWER,
914  state_class=SensorStateClass.MEASUREMENT,
915  native_unit_of_measurement=UnitOfPower.KILO_WATT,
916  subkey="power",
917  ),
919  key=DPCode.PHASE_C,
920  translation_key="phase_c_voltage",
921  device_class=SensorDeviceClass.VOLTAGE,
922  state_class=SensorStateClass.MEASUREMENT,
923  native_unit_of_measurement=UnitOfElectricPotential.VOLT,
924  subkey="voltage",
925  ),
927  key=DPCode.CUR_CURRENT,
928  translation_key="current",
929  device_class=SensorDeviceClass.CURRENT,
930  state_class=SensorStateClass.MEASUREMENT,
931  entity_registry_enabled_default=False,
932  ),
934  key=DPCode.CUR_POWER,
935  translation_key="power",
936  device_class=SensorDeviceClass.POWER,
937  state_class=SensorStateClass.MEASUREMENT,
938  entity_registry_enabled_default=False,
939  ),
941  key=DPCode.CUR_VOLTAGE,
942  translation_key="voltage",
943  device_class=SensorDeviceClass.VOLTAGE,
944  state_class=SensorStateClass.MEASUREMENT,
945  entity_registry_enabled_default=False,
946  ),
947  ),
948  # Robot Vacuum
949  # https://developer.tuya.com/en/docs/iot/fsd?id=K9gf487ck1tlo
950  "sd": (
952  key=DPCode.CLEAN_AREA,
953  translation_key="cleaning_area",
954  state_class=SensorStateClass.MEASUREMENT,
955  ),
957  key=DPCode.CLEAN_TIME,
958  translation_key="cleaning_time",
959  state_class=SensorStateClass.MEASUREMENT,
960  ),
962  key=DPCode.TOTAL_CLEAN_AREA,
963  translation_key="total_cleaning_area",
964  state_class=SensorStateClass.TOTAL_INCREASING,
965  ),
967  key=DPCode.TOTAL_CLEAN_TIME,
968  translation_key="total_cleaning_time",
969  state_class=SensorStateClass.TOTAL_INCREASING,
970  ),
972  key=DPCode.TOTAL_CLEAN_COUNT,
973  translation_key="total_cleaning_times",
974  state_class=SensorStateClass.TOTAL_INCREASING,
975  ),
977  key=DPCode.DUSTER_CLOTH,
978  translation_key="duster_cloth_life",
979  state_class=SensorStateClass.MEASUREMENT,
980  ),
982  key=DPCode.EDGE_BRUSH,
983  translation_key="side_brush_life",
984  state_class=SensorStateClass.MEASUREMENT,
985  ),
987  key=DPCode.FILTER_LIFE,
988  translation_key="filter_life",
989  state_class=SensorStateClass.MEASUREMENT,
990  ),
992  key=DPCode.ROLL_BRUSH,
993  translation_key="rolling_brush_life",
994  state_class=SensorStateClass.MEASUREMENT,
995  ),
996  ),
997  # Smart Gardening system
998  # https://developer.tuya.com/en/docs/iot/categorysz?id=Kaiuz4e6h7up0
999  "sz": (
1001  key=DPCode.TEMP_CURRENT,
1002  translation_key="temperature",
1003  device_class=SensorDeviceClass.TEMPERATURE,
1004  state_class=SensorStateClass.MEASUREMENT,
1005  ),
1007  key=DPCode.HUMIDITY_CURRENT,
1008  translation_key="humidity",
1009  device_class=SensorDeviceClass.HUMIDITY,
1010  state_class=SensorStateClass.MEASUREMENT,
1011  ),
1012  ),
1013  # Curtain
1014  # https://developer.tuya.com/en/docs/iot/s?id=K9gf48qy7wkre
1015  "cl": (
1017  key=DPCode.TIME_TOTAL,
1018  translation_key="last_operation_duration",
1019  entity_category=EntityCategory.DIAGNOSTIC,
1020  ),
1021  ),
1022  # Humidifier
1023  # https://developer.tuya.com/en/docs/iot/s?id=K9gf48qwjz0i3
1024  "jsq": (
1026  key=DPCode.HUMIDITY_CURRENT,
1027  translation_key="humidity",
1028  device_class=SensorDeviceClass.HUMIDITY,
1029  state_class=SensorStateClass.MEASUREMENT,
1030  ),
1032  key=DPCode.TEMP_CURRENT,
1033  translation_key="temperature",
1034  device_class=SensorDeviceClass.TEMPERATURE,
1035  state_class=SensorStateClass.MEASUREMENT,
1036  ),
1038  key=DPCode.TEMP_CURRENT_F,
1039  translation_key="temperature",
1040  device_class=SensorDeviceClass.TEMPERATURE,
1041  state_class=SensorStateClass.MEASUREMENT,
1042  ),
1044  key=DPCode.LEVEL_CURRENT,
1045  translation_key="water_level",
1046  entity_category=EntityCategory.DIAGNOSTIC,
1047  ),
1048  ),
1049  # Air Purifier
1050  # https://developer.tuya.com/en/docs/iot/s?id=K9gf48r41mn81
1051  "kj": (
1053  key=DPCode.FILTER,
1054  translation_key="filter_utilization",
1055  entity_category=EntityCategory.DIAGNOSTIC,
1056  ),
1058  key=DPCode.PM25,
1059  translation_key="pm25",
1060  device_class=SensorDeviceClass.PM25,
1061  state_class=SensorStateClass.MEASUREMENT,
1062  ),
1064  key=DPCode.TEMP,
1065  translation_key="temperature",
1066  device_class=SensorDeviceClass.TEMPERATURE,
1067  state_class=SensorStateClass.MEASUREMENT,
1068  ),
1070  key=DPCode.HUMIDITY,
1071  translation_key="humidity",
1072  device_class=SensorDeviceClass.HUMIDITY,
1073  state_class=SensorStateClass.MEASUREMENT,
1074  ),
1076  key=DPCode.TVOC,
1077  translation_key="total_volatile_organic_compound",
1078  device_class=SensorDeviceClass.VOLATILE_ORGANIC_COMPOUNDS,
1079  state_class=SensorStateClass.MEASUREMENT,
1080  ),
1082  key=DPCode.ECO2,
1083  translation_key="concentration_carbon_dioxide",
1084  device_class=SensorDeviceClass.CO2,
1085  state_class=SensorStateClass.MEASUREMENT,
1086  ),
1088  key=DPCode.TOTAL_TIME,
1089  translation_key="total_operating_time",
1090  state_class=SensorStateClass.TOTAL_INCREASING,
1091  entity_category=EntityCategory.DIAGNOSTIC,
1092  ),
1094  key=DPCode.TOTAL_PM,
1095  translation_key="total_absorption_particles",
1096  state_class=SensorStateClass.TOTAL_INCREASING,
1097  entity_category=EntityCategory.DIAGNOSTIC,
1098  ),
1100  key=DPCode.AIR_QUALITY,
1101  translation_key="air_quality",
1102  ),
1103  ),
1104  # Fan
1105  # https://developer.tuya.com/en/docs/iot/s?id=K9gf48quojr54
1106  "fs": (
1108  key=DPCode.TEMP_CURRENT,
1109  translation_key="temperature",
1110  device_class=SensorDeviceClass.TEMPERATURE,
1111  state_class=SensorStateClass.MEASUREMENT,
1112  ),
1113  ),
1114  # eMylo Smart WiFi IR Remote
1115  # Air Conditioner Mate (Smart IR Socket)
1116  "wnykq": (
1118  key=DPCode.VA_TEMPERATURE,
1119  translation_key="temperature",
1120  device_class=SensorDeviceClass.TEMPERATURE,
1121  state_class=SensorStateClass.MEASUREMENT,
1122  ),
1124  key=DPCode.VA_HUMIDITY,
1125  translation_key="humidity",
1126  device_class=SensorDeviceClass.HUMIDITY,
1127  state_class=SensorStateClass.MEASUREMENT,
1128  ),
1130  key=DPCode.CUR_CURRENT,
1131  translation_key="current",
1132  device_class=SensorDeviceClass.CURRENT,
1133  state_class=SensorStateClass.MEASUREMENT,
1134  entity_category=EntityCategory.DIAGNOSTIC,
1135  entity_registry_enabled_default=False,
1136  ),
1138  key=DPCode.CUR_POWER,
1139  translation_key="power",
1140  device_class=SensorDeviceClass.POWER,
1141  state_class=SensorStateClass.MEASUREMENT,
1142  entity_category=EntityCategory.DIAGNOSTIC,
1143  entity_registry_enabled_default=False,
1144  ),
1146  key=DPCode.CUR_VOLTAGE,
1147  translation_key="voltage",
1148  device_class=SensorDeviceClass.VOLTAGE,
1149  state_class=SensorStateClass.MEASUREMENT,
1150  entity_category=EntityCategory.DIAGNOSTIC,
1151  entity_registry_enabled_default=False,
1152  ),
1153  ),
1154  # Dehumidifier
1155  # https://developer.tuya.com/en/docs/iot/s?id=K9gf48r6jke8e
1156  "cs": (
1158  key=DPCode.TEMP_INDOOR,
1159  translation_key="temperature",
1160  device_class=SensorDeviceClass.TEMPERATURE,
1161  state_class=SensorStateClass.MEASUREMENT,
1162  ),
1164  key=DPCode.HUMIDITY_INDOOR,
1165  translation_key="humidity",
1166  device_class=SensorDeviceClass.HUMIDITY,
1167  state_class=SensorStateClass.MEASUREMENT,
1168  ),
1169  ),
1170  # Soil sensor (Plant monitor)
1171  "zwjcy": (
1173  key=DPCode.TEMP_CURRENT,
1174  translation_key="temperature",
1175  device_class=SensorDeviceClass.TEMPERATURE,
1176  state_class=SensorStateClass.MEASUREMENT,
1177  ),
1179  key=DPCode.HUMIDITY,
1180  translation_key="humidity",
1181  device_class=SensorDeviceClass.HUMIDITY,
1182  state_class=SensorStateClass.MEASUREMENT,
1183  ),
1184  *BATTERY_SENSORS,
1185  ),
1186  # VESKA-micro inverter
1187  "znnbq": (
1189  key=DPCode.REVERSE_ENERGY_TOTAL,
1190  translation_key="total_energy",
1191  device_class=SensorDeviceClass.ENERGY,
1192  state_class=SensorStateClass.TOTAL_INCREASING,
1193  ),
1195  key=DPCode.POWER_TOTAL,
1196  translation_key="power",
1197  device_class=SensorDeviceClass.POWER,
1198  state_class=SensorStateClass.MEASUREMENT,
1199  native_unit_of_measurement=UnitOfPower.WATT,
1200  suggested_display_precision=0,
1201  suggested_unit_of_measurement=UnitOfPower.WATT,
1202  ),
1203  ),
1204  # Pool HeatPump
1205  "znrb": (
1207  key=DPCode.TEMP_CURRENT,
1208  translation_key="temperature",
1209  device_class=SensorDeviceClass.TEMPERATURE,
1210  state_class=SensorStateClass.MEASUREMENT,
1211  ),
1212  ),
1213 }
1214 
1215 # Socket (duplicate of `kg`)
1216 # https://developer.tuya.com/en/docs/iot/s?id=K9gf7o5prgf7s
1217 SENSORS["cz"] = SENSORS["kg"]
1218 
1219 # Power Socket (duplicate of `kg`)
1220 # https://developer.tuya.com/en/docs/iot/s?id=K9gf7o5prgf7s
1221 SENSORS["pc"] = SENSORS["kg"]
1222 
1223 
1225  hass: HomeAssistant, entry: TuyaConfigEntry, async_add_entities: AddEntitiesCallback
1226 ) -> None:
1227  """Set up Tuya sensor dynamically through Tuya discovery."""
1228  hass_data = entry.runtime_data
1229 
1230  @callback
1231  def async_discover_device(device_ids: list[str]) -> None:
1232  """Discover and add a discovered Tuya sensor."""
1233  entities: list[TuyaSensorEntity] = []
1234  for device_id in device_ids:
1235  device = hass_data.manager.device_map[device_id]
1236  if descriptions := SENSORS.get(device.category):
1237  entities.extend(
1238  TuyaSensorEntity(device, hass_data.manager, description)
1239  for description in descriptions
1240  if description.key in device.status
1241  )
1242 
1243  async_add_entities(entities)
1244 
1245  async_discover_device([*hass_data.manager.device_map])
1246 
1247  entry.async_on_unload(
1248  async_dispatcher_connect(hass, TUYA_DISCOVERY_NEW, async_discover_device)
1249  )
1250 
1251 
1253  """Tuya Sensor Entity."""
1254 
1255  entity_description: TuyaSensorEntityDescription
1256 
1257  _status_range: DeviceStatusRange | None = None
1258  _type: DPType | None = None
1259  _type_data: IntegerTypeData | EnumTypeData | None = None
1260  _uom: UnitOfMeasurement | None = None
1261 
1263  self,
1264  device: CustomerDevice,
1265  device_manager: Manager,
1266  description: TuyaSensorEntityDescription,
1267  ) -> None:
1268  """Init Tuya sensor."""
1269  super().__init__(device, device_manager)
1270  self.entity_descriptionentity_description = description
1271  self._attr_unique_id_attr_unique_id_attr_unique_id = (
1272  f"{super().unique_id}{description.key}{description.subkey or ''}"
1273  )
1274 
1275  if int_type := self.find_dpcodefind_dpcodefind_dpcodefind_dpcodefind_dpcode(description.key, dptype=DPType.INTEGER):
1276  self._type_data_type_data = int_type
1277  self._type_type = DPType.INTEGER
1278  if description.native_unit_of_measurement is None:
1279  self._attr_native_unit_of_measurement_attr_native_unit_of_measurement = int_type.unit
1280  elif enum_type := self.find_dpcodefind_dpcodefind_dpcodefind_dpcodefind_dpcode(
1281  description.key, dptype=DPType.ENUM, prefer_function=True
1282  ):
1283  self._type_data_type_data = enum_type
1284  self._type_type = DPType.ENUM
1285  else:
1286  self._type_type = self.get_dptypeget_dptype(DPCode(description.key))
1287 
1288  # Logic to ensure the set device class and API received Unit Of Measurement
1289  # match Home Assistants requirements.
1290  if (
1291  self.device_classdevice_classdevice_class is not None
1292  and not self.device_classdevice_classdevice_class.startswith(DOMAIN)
1293  and description.native_unit_of_measurement is None
1294  ):
1295  # We cannot have a device class, if the UOM isn't set or the
1296  # device class cannot be found in the validation mapping.
1297  if (
1298  self.native_unit_of_measurementnative_unit_of_measurement is None
1299  or self.device_classdevice_classdevice_class not in DEVICE_CLASS_UNITS
1300  ):
1301  self._attr_device_class_attr_device_class = None
1302  return
1303 
1304  uoms = DEVICE_CLASS_UNITS[self.device_classdevice_classdevice_class]
1305  self._uom_uom = uoms.get(self.native_unit_of_measurementnative_unit_of_measurement) or uoms.get(
1306  self.native_unit_of_measurementnative_unit_of_measurement.lower()
1307  )
1308 
1309  # Unknown unit of measurement, device class should not be used.
1310  if self._uom_uom is None:
1311  self._attr_device_class_attr_device_class = None
1312  return
1313 
1314  # Found unit of measurement, use the standardized Unit
1315  # Use the target conversion unit (if set)
1316  self._attr_native_unit_of_measurement_attr_native_unit_of_measurement = (
1317  self._uom_uom.conversion_unit or self._uom_uom.unit
1318  )
1319 
1320  @property
1321  def native_value(self) -> StateType:
1322  """Return the value reported by the sensor."""
1323  # Only continue if data type is known
1324  if self._type_type not in (
1325  DPType.INTEGER,
1326  DPType.STRING,
1327  DPType.ENUM,
1328  DPType.JSON,
1329  DPType.RAW,
1330  ):
1331  return None
1332 
1333  # Raw value
1334  value = self.devicedevice.status.get(self.entity_descriptionentity_description.key)
1335  if value is None:
1336  return None
1337 
1338  # Scale integer/float value
1339  if isinstance(self._type_data_type_data, IntegerTypeData):
1340  scaled_value = self._type_data_type_data.scale_value(value)
1341  if self._uom_uom and self._uom_uom.conversion_fn is not None:
1342  return self._uom_uom.conversion_fn(scaled_value)
1343  return scaled_value
1344 
1345  # Unexpected enum value
1346  if (
1347  isinstance(self._type_data_type_data, EnumTypeData)
1348  and value not in self._type_data_type_data.range
1349  ):
1350  return None
1351 
1352  # Get subkey value from Json string.
1353  if self._type_type is DPType.JSON:
1354  if self.entity_descriptionentity_description.subkey is None:
1355  return None
1356  values = ElectricityTypeData.from_json(value)
1357  return getattr(values, self.entity_descriptionentity_description.subkey)
1358 
1359  if self._type_type is DPType.RAW:
1360  if self.entity_descriptionentity_description.subkey is None:
1361  return None
1362  values = ElectricityTypeData.from_raw(value)
1363  return getattr(values, self.entity_descriptionentity_description.subkey)
1364 
1365  # Valid string or enum value
1366  return value
SensorDeviceClass|None device_class(self)
Definition: __init__.py:313
DPCode|EnumTypeData|IntegerTypeData|None find_dpcode(self, str|DPCode|tuple[DPCode,...]|None dpcodes, *bool prefer_function=False, DPType|None dptype=None)
Definition: entity.py:206
IntegerTypeData|None find_dpcode(self, str|DPCode|tuple[DPCode,...]|None dpcodes, *bool prefer_function=False, Literal[DPType.INTEGER] dptype)
Definition: entity.py:190
DPCode|None find_dpcode(self, str|DPCode|tuple[DPCode,...]|None dpcodes, *bool prefer_function=False)
Definition: entity.py:198
EnumTypeData|None find_dpcode(self, str|DPCode|tuple[DPCode,...]|None dpcodes, *bool prefer_function=False, Literal[DPType.ENUM] dptype)
Definition: entity.py:181
DPType|None get_dptype(self, DPCode|None dpcode, bool prefer_function=False)
Definition: entity.py:260
None __init__(self, CustomerDevice device, Manager device_manager, TuyaSensorEntityDescription description)
Definition: sensor.py:1267
ElkSystem|None async_discover_device(HomeAssistant hass, str host)
Definition: discovery.py:78
None async_setup_entry(HomeAssistant hass, TuyaConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:1226
Callable[[], None] async_dispatcher_connect(HomeAssistant hass, str signal, Callable[..., Any] target)
Definition: dispatcher.py:103