Skip to content

Commit 4c58948

Browse files
authored
Fix Tuya air sensor SQLite serialization error (#4250)
Remove CustomTemperature class that caused SQLite binding errors when saving device attributes. Replace with direct byte parsing to extract temperature values without creating non-serializable objects to avoid "type 'CustomTemperature' is not supported" SQLite binding errors. Fixes #3671
1 parent 53af0ae commit 4c58948

File tree

1 file changed

+9
-12
lines changed

1 file changed

+9
-12
lines changed

zhaquirks/tuya/tuya_co.py

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,13 @@
1313
)
1414

1515

16-
class CustomTemperature(t.Struct):
17-
"""Custom temperature wrapper."""
16+
def tuya_air_quality_temperature_converter(value: Any) -> int:
17+
"""Convert Tuya air quality temperature data to centidegrees.
1818
19-
field_1: t.int16s_be
20-
temperature: t.int16s_be
21-
22-
@classmethod
23-
def from_value(cls, value):
24-
"""Convert from a raw value to a Struct data."""
25-
return cls.deserialize(value.serialize())[0]
19+
Extract temperature from bytes 2-4 of the data payload and convert to centidegrees.
20+
The device sends a 4-byte structure: [field_1 (2 bytes), temperature (2 bytes)]
21+
"""
22+
return int.from_bytes(value.serialize()[2:4], byteorder="big", signed=True) * 10
2623

2724

2825
class TuyaPM25ConcentrationIgnoreValues(TuyaPM25Concentration):
@@ -41,7 +38,7 @@ def _update_attribute(self, attrid: int | t.uint16_t, value: Any) -> None:
4138
dp_id=18,
4239
ep_attribute=TuyaTemperatureMeasurement.ep_attribute,
4340
attribute_name=TuyaTemperatureMeasurement.AttributeDefs.measured_value.name,
44-
converter=lambda x: CustomTemperature.from_value(x).temperature * 10,
41+
converter=tuya_air_quality_temperature_converter,
4542
)
4643
.adds(TuyaTemperatureMeasurement)
4744
.tuya_humidity(dp_id=19, scale=10)
@@ -119,7 +116,7 @@ def _update_attribute(self, attrid: int | t.uint16_t, value: Any) -> None:
119116
dp_id=18,
120117
ep_attribute=TuyaTemperatureMeasurement.ep_attribute,
121118
attribute_name=TuyaTemperatureMeasurement.AttributeDefs.measured_value.name,
122-
converter=lambda x: CustomTemperature.from_value(x).temperature * 10,
119+
converter=tuya_air_quality_temperature_converter,
123120
)
124121
.adds(TuyaTemperatureMeasurement)
125122
.tuya_humidity(dp_id=19, scale=10)
@@ -135,7 +132,7 @@ def _update_attribute(self, attrid: int | t.uint16_t, value: Any) -> None:
135132
dp_id=18,
136133
ep_attribute=TuyaTemperatureMeasurement.ep_attribute,
137134
attribute_name=TuyaTemperatureMeasurement.AttributeDefs.measured_value.name,
138-
converter=lambda x: CustomTemperature.from_value(x).temperature * 10,
135+
converter=tuya_air_quality_temperature_converter,
139136
)
140137
.adds(TuyaTemperatureMeasurement)
141138
.tuya_humidity(dp_id=19, scale=10)

0 commit comments

Comments
 (0)