Here is the zha quirks file I had to use to get this working. The above code was close, but I had to make a few tweaks to get this working for this device https://www.amazon.com/dp/B0DF7KZ4GT which uses Tuya TS000F _TZ3218_7fiyo3kv
"""tuya TS000F _TZ3218_7fiyo3kv On/Off In-line Switches with thermometer and humidity support."""
from zigpy.profiles import zgp, zha
from zigpy.zcl.clusters.general import (
Basic,
GreenPowerProxy,
Groups,
Identify,
OnOff,
Ota,
Scenes,
Time,
)
from zigpy.zcl.clusters.lightlink import LightLink
from zigpy.zcl.clusters.measurement import TemperatureMeasurement, RelativeHumidity
from zhaquirks.const import (
DEVICE_TYPE,
ENDPOINTS,
INPUT_CLUSTERS,
MODEL,
OUTPUT_CLUSTERS,
PROFILE_ID,
)
from zhaquirks.tuya import (
EnchantedDevice,
TuyaZBE000Cluster,
TuyaZBOnOffAttributeCluster,
TuyaLocalCluster,
TuyaZBExternalSwitchTypeCluster,
)
from zhaquirks.tuya.mcu import DPToAttributeMapping, TuyaMCUCluster
class TuyaTemperatureMeasurement(TemperatureMeasurement, TuyaLocalCluster):
"""Tuya local TemperatureMeasurement cluster."""
class TuyaHumidityMeasurement(RelativeHumidity, TuyaLocalCluster):
"""Tuya local Relative Humidity Measurement cluster."""
class TemperatureHumidityManufCluster(TuyaMCUCluster):
"""Tuya Manufacturer Cluster with Temperature and Humidity data points."""
dp_to_attribute: dict[int, DPToAttributeMapping] = {
102: DPToAttributeMapping(
TuyaTemperatureMeasurement.ep_attribute,
"measured_value",
converter=lambda x: x * 10,
),
103: DPToAttributeMapping(
TuyaHumidityMeasurement.ep_attribute,
"measured_value",
converter=lambda x: x * 100,
),
}
data_point_handlers = {
102: "_dp_2_attr_update",
103: "_dp_2_attr_update",
}
# ADDED: These attributes tell ZHA to request reporting for these clusters
client_clusters = {
TemperatureMeasurement,
RelativeHumidity,
}
manufacturer_specific = {
0xE001,
}
class Tuya_1G_Switch_Temperature(EnchantedDevice):
"""Tuya 1 gang switch with temperature and humidity measurement."""
signature = {
MODEL: "TS000F",
ENDPOINTS: {
1: {
PROFILE_ID: zha.PROFILE_ID,
DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,
INPUT_CLUSTERS: [
Basic.cluster_id,
Identify.cluster_id,
Groups.cluster_id,
Scenes.cluster_id,
OnOff.cluster_id,
TuyaZBE000Cluster.cluster_id,
TuyaZBExternalSwitchTypeCluster.cluster_id,
TemperatureHumidityManufCluster.cluster_id,
],
OUTPUT_CLUSTERS: [Time.cluster_id, Ota.cluster_id],
},
242: {
PROFILE_ID: zgp.PROFILE_ID,
DEVICE_TYPE: zgp.DeviceType.PROXY_BASIC,
INPUT_CLUSTERS: [],
OUTPUT_CLUSTERS: [GreenPowerProxy.cluster_id],
},
},
}
replacement = {
ENDPOINTS: {
1: {
PROFILE_ID: zha.PROFILE_ID,
DEVICE_TYPE: zha.DeviceType.SMART_PLUG,
INPUT_CLUSTERS: [
Basic.cluster_id,
Identify.cluster_id,
Groups.cluster_id,
Scenes.cluster_id,
TuyaZBOnOffAttributeCluster,
TuyaZBE000Cluster,
TuyaZBExternalSwitchTypeCluster,
TemperatureHumidityManufCluster,
TuyaTemperatureMeasurement,
TuyaHumidityMeasurement,
],
OUTPUT_CLUSTERS: [Time.cluster_id, Ota.cluster_id],
},
242: {
PROFILE_ID: zgp.PROFILE_ID,
DEVICE_TYPE: zgp.DeviceType.PROXY_BASIC,
INPUT_CLUSTERS: [],
OUTPUT_CLUSTERS: [GreenPowerProxy.cluster_id],
},
},
}```