
Tuya devices using Zigbee model TS0601 communicate through a manufacturer-private cluster (0xEF00) documented in the
Tuya Zigbee Generic Interfaces.
Unlike standard Zigbee devices, TS0601 devices carry all their data in numbered Data Points (DPs) rather than standard cluster attributes. The plugin cannot auto-discover the meaning of each DP — you must provide a JSON configuration file that maps DP numbers to Domoticz widgets and actions.
This guide explains how to write or customize that JSON configuration file.
You need two strings from your device’s Zigbee announcement:
| Field | Example | Where to find it |
|---|---|---|
ZigbeeModel |
TS0601 |
Always TS0601 for this guide |
ManufacturerName |
_TZE200_lyetpprm |
Plugin logs or device page in Domoticz |
Use these to locate an existing file in z4d_certified_devices/Certified/Tuya/ or to create a new one.
Use the Tuya developer portal, a Zigbee sniffer, or community resources such as Zigbee2MQTT supported devices and Blakadder’s Zigbee Device Compatibility Repository to learn which DP number reports which sensor value or accepts which command.
{
"_comment": "Human-readable description of the device",
"_version": "1",
"_source": "URL of the issue or reference used",
"_blakadder": "https://zigbee.blakadder.com/...",
"_description": "Device marketing name",
"Identifier": [
[ "TS0601", "_TZE200_xxxxxxxx" ],
[ "TS0601", "_TZE204_yyyyyyyy" ]
],
"Ep": {
"01": {
"0000": "",
"0004": "",
"0005": "",
"ef00": "",
"000a": "",
"0019": "",
"Type": "Motion/Lux/Distance"
}
},
"Type": "",
"ClusterToBind": [],
"ConfigureReporting": {},
"ReadAttributes": {
"0000": [ "0004", "0000", "0001", "0005", "0007", "fffe" ],
"ef00": []
},
"TS0601_DP": {
"01": { "sensor_type": "motion", "DomoDeviceFormat": "str" },
"09": { "sensor_type": "distance", "EvalExp": "int((value//10)*10)" }
},
"TUYA_REGISTRATION": 13,
"TY_DATA_QUERY": true,
"BatteryDevice": 1,
"PollingEnabled": 1,
"Param": {
"SomeParameter": 7
}
}
| Field | Description |
|---|---|
_comment |
Free-text note (device name, model, etc.) |
_version |
Config file revision |
_source |
URL of the GitHub issue or forum post used as source |
_blakadder |
Link to the Blakadder device page |
_description |
Marketing description of the device |
IdentifierA list of [ZigbeeModel, ManufacturerName] pairs. The plugin uses this to automatically select the correct
configuration when a device announces itself.
"Identifier": [
[ "TS0601", "_TZE200_lyetpprm" ],
[ "TS0601", "_TZE204_ztc6ggyl" ]
]
A single JSON file can cover multiple hardware variants that share the same DP layout.
Ep — Endpoint and Widget Type DeclarationDeclares which Zigbee clusters are present on each endpoint and, most importantly, which Domoticz widget types
to create under the Type key.
"Ep": {
"01": {
"0000": "",
"ef00": "",
"Type": "Temp/ThermoSetpoint/ThermoMode_7/HeatingStatus"
}
}
The Type value is a /-separated list of Domoticz widget types. Common values for TS0601 devices:
| Widget Type string | Domoticz widget created |
|---|---|
Switch |
On/Off switch |
Motion |
Motion sensor |
Lux |
Illuminance (lux) |
Temp |
Temperature |
Humi |
Humidity |
TempHumi |
Combined Temperature + Humidity |
Distance |
Distance sensor |
Door |
Door/Window contact |
Smoke |
Smoke detector |
Meter |
Energy meter (kWh) |
Power |
Power (W) |
Voltage |
Voltage (V) |
Ampere |
Current (A) |
ThermoSetpoint |
Thermostat setpoint |
ThermoMode_2 |
Thermostat mode (TRV7 style) |
ThermoMode_7 |
Thermostat mode (TRV6 style) |
HeatingStatus |
Heating on/off indicator |
Valve |
TRV valve position |
TuyaSiren |
Siren/alarm control |
ClusterToBindList of cluster IDs to bind to the coordinator during pairing. For most TS0601 devices that only use ef00:
"ClusterToBind": [ "0000", "ef00" ]
TS0601_DP MappingTS0601_DP is the heart of the configuration. It maps each DP number (as a two-character hex string) to its
behaviour in Domoticz.
"TS0601_DP": {
"01": { ... },
"0f": { ... },
"68": { ... }
}
Important: DP keys must be lowercase two-character hex strings (e.g.
"01","0f","68").
Each DP entry is a JSON object that may contain any combination of the following fields:
sensor_type (string)Maps the incoming DP value to a Domoticz widget update. See the full reference table in §4.2.
"01": { "sensor_type": "motion" }
action_type (string)Enables Domoticz-to-device commands on this DP. When a user interacts with a widget, the plugin sends the appropriate Tuya command. See §4.3 for the full list.
"02": { "sensor_type": "TRV6SystemMode", "action_type": "TRV6SystemMode" }
store_tuya_attribute (string)Stores the raw (pre-evaluation) DP value in the device’s internal attribute store under the given name. No Domoticz widget is updated. Useful for configuration DPs that don’t map to a widget.
"03": { "store_tuya_attribute": "radar_min_range" }
store_tuya_value (string)Like store_tuya_attribute but stores the computed (post-EvalExp) value instead of the raw data.
EvalExp (string)A Python expression that transforms the raw received value before it is sent to Domoticz or stored.
The variable value holds the decoded numeric value.
Available functions: int, float, round, abs, min, max.
"09": { "sensor_type": "distance", "EvalExp": "int((value//10)*10)" }
"04": { "sensor_type": "setpoint", "EvalExp": "int((value//10)*10)", "domo_divisor": 10, "domo_round": 2 }
action_Exp (string)A Python expression that transforms the value coming from Domoticz before it is sent as a Tuya command.
The variable value holds the raw Domoticz value.
"04": { "action_type": "setpoint", "action_Exp": "int(((value/10)//10)*10)" }
domo_divisor (number)Divides the (possibly EvalExp-transformed) value by this number before sending to Domoticz.
Useful when the device reports values in tenths, hundredths, etc.
"05": { "sensor_type": "temperature", "domo_divisor": 10, "domo_round": 2 }
domo_round (integer)Number of decimal places to keep after dividing by domo_divisor.
DomoDeviceFormat (string)Applies a string conversion to the value before passing it to Domoticz. Useful when Domoticz expects a specific format.
| Value | Effect |
|---|---|
"str" |
Convert to plain string ("true" / "false" for booleans) |
"str_2digits" |
Zero-padded 2-digit integer string |
"str_4digits" |
Zero-padded 4-digit integer string |
"strhex" |
Lowercase hex string |
"str2hex" |
2-character hex string |
"str4hex" |
4-character hex string |
"01": { "sensor_type": "motion", "DomoDeviceFormat": "str" }
data_type (string)Overrides the Tuya data type used when sending a command. Values follow the Tuya DP type specification:
| Value | Tuya type |
|---|---|
"01" |
Boolean |
"02" |
32-bit signed integer |
"04" |
Enum |
domo_ep (string)Overrides the endpoint used when updating the Domoticz widget (advanced multi-endpoint devices).
sensor_type Referencesensor_type |
Domoticz widget | Notes |
|---|---|---|
temperature |
Temperature | Raw value ÷ domo_divisor |
humidity |
Humidity | |
illuminance |
Lux | |
illuminance_20min_average |
Lux | 20-minute rolling average |
distance |
Distance | |
co2 |
Air Quality (ppm CO₂) | |
voc |
VOC index | |
ch20 |
Formaldehyde (CH₂O) | |
mp25 |
PM2.5 particulate | |
rain_intensity |
Rain intensity |
sensor_type |
Domoticz widget | Notes |
|---|---|---|
voltage |
Voltage (V) | |
current |
Current (A) | |
power |
Instantaneous power (W) | |
power_factor |
Power factor | |
metering |
Energy meter (kWh) | Accumulates deltas |
cons_metering |
Energy meter (kWh) | Direct raw value |
prod_metering |
Energy meter (kWh) | Injection/production |
water_consumption |
Water meter |
sensor_type |
Domoticz widget | Notes |
|---|---|---|
motion |
Motion sensor | Use "DomoDeviceFormat": "str" when device reports text |
presence_state |
Motion / Presence | Tuya-specific presence output |
door |
Door/Window contact | |
tamper |
Tamper switch | |
smoke_state |
Smoke sensor (state) | |
smoke_ppm |
Smoke concentration (ppm) | |
vibration |
Vibration sensor | |
tilt |
Tilt angle | |
vibration_tilt_x |
Tilt X-axis | Raw acceleration axis |
vibration_tilt_y |
Tilt Y-axis | Raw acceleration axis |
vibration_tilt_z |
Tilt Z-axis | Raw acceleration axis |
charging_mode |
Battery charging status |
sensor_type |
Domoticz widget | Notes |
|---|---|---|
setpoint |
Thermostat setpoint | Usually combined with domo_divisor: 10 |
heatingstatus |
Heating status indicator | |
valveposition |
Valve position (%) | |
windowsopened |
Window open detection | |
calibration |
Temperature offset | |
TRV6SystemMode |
Thermostat mode | Avatto / Beca / ME167 style |
TRV7SystemMode |
Thermostat mode | GTZ06 style |
TRV8SystemMode |
Thermostat mode | Variant |
KeypadLockout |
Child lock |
sensor_type |
Domoticz widget | Notes |
|---|---|---|
curtain_state |
Blind / curtain | Open / Close / Stop |
curtain_level |
Blind position (%) | |
curtain_calibration |
Calibration state | |
curtain_motor_steering |
Motor direction |
sensor_type |
Domoticz widget | Notes |
|---|---|---|
switch |
On/Off switch | |
dimmer |
Dimmer (0–100%) | Device scale 0–1000 converted automatically |
lvl_percentage |
Level percentage |
sensor_type |
Domoticz widget | Notes |
|---|---|---|
liquid_installation_height |
— (stored) | Installation height configuration |
liquid_depth_max |
— (stored) | Maximum depth setting |
liquid_level_percent |
Fill level (%) | |
liquid_depth |
Liquid depth | |
liquid_state |
Level state | Low / Medium / High |
phMeter |
pH level | |
ec |
Electrical conductivity | |
orp |
Oxidation-Reduction Potential | |
freeChlorine |
Free chlorine | |
salinity |
Salinity | |
tds |
Total Dissolved Solids | |
phCalibration1 / phCalibration2 |
— (stored) | pH calibration points |
ecCalibration / orpCalibration |
— (stored) | EC / ORP calibration |
sensor_type |
Domoticz widget | Notes |
|---|---|---|
TuyaAlarmSwitch |
Siren switch | |
TuyaAlarmMelody |
Melody selector | |
TuyaAlarmDuration |
Duration selector | |
TuyaAlarmLevel |
Volume / level | |
TuyaTamperSwitch |
Tamper siren |
sensor_type |
Domoticz widget | Notes |
|---|---|---|
battery |
Battery level (%) | Also updates the Domoticz battery icon |
batteryState |
Battery state | Text: charging / low / etc. |
cleaning_reminder |
Maintenance reminder |
action_type Referenceaction_type on a DP entry means the plugin will send a Tuya command on that DP when the user
changes the corresponding widget in Domoticz.
action_type |
Widget that triggers it | Notes |
|---|---|---|
switch |
On/Off switch | |
setpoint |
Thermostat setpoint | Use with action_Exp if device uses a different scale |
calibration |
Calibration offset | Legacy format |
Calibration |
Calibration offset | Corrected/newer format |
TRV6SystemMode |
Thermostat mode (TRV6) | |
TRV7SystemMode |
Thermostat mode (TRV7) | |
TRV8SystemMode |
Thermostat mode (TRV8) | |
TuyaAlarmSwitch |
Siren switch | |
TuyaTamperSwitch |
Tamper siren | |
KeypadLockout |
Child lock switch |
TUYA_REGISTRATION (integer)Controls the Tuya-specific registration/handshake sequence the plugin uses when pairing the device.
| Value | Use case |
|---|---|
13 |
Standard Tuya TS0601 registration (most sensors, radars) |
19 |
Extended registration with data query (energy meters, some sensors) |
TY_DATA_QUERY (boolean)When true, the plugin sends a Tuya data query command after connection to force the device to report all
current DP values. Useful for devices that do not report spontaneously.
"TY_DATA_QUERY": true
BatteryDevice (integer)Set to 1 to indicate the device is battery-powered. The plugin will handle battery reporting correctly
and avoid unnecessary wake-up traffic.
"BatteryDevice": 1
PollingEnabled (integer)Set to 1 to enable periodic polling of the device. Required for TRV devices and others that do not push
updates automatically.
"PollingEnabled": 1
Param SectionParam holds default values for device-configurable settings. These are sent to the device during
pairing or when the user triggers a configuration action. The keys correspond to commands in the
plugin’s TS0601_COMMANDS table.
Common Param keys:
| Key | Description |
|---|---|
calibration |
Default temperature calibration offset |
TRV7WindowDetection |
Enable window detection on TRV7 (0/1) |
TRV7ChildLock |
Child lock default (0/1) |
RadarMotionSensitivity |
Radar sensitivity default |
RadarMotionMinRange |
Radar minimum detection range (cm) |
RadarMotionMaxRange |
Radar maximum detection range (cm) |
RadarMotionDelay |
Radar detection delay (s) |
RadarMotionFading |
Radar fading time (s) |
TuyaRadarSensitivity |
Radar sensitivity (alternative key) |
TuyaRadarMinRange |
Radar min range (alternative key) |
TuyaRadarMaxRange |
Radar max range (alternative key) |
TuyaFadingTime |
Fading time (alternative key) |
TuyaRadarDetectionDelay |
Detection delay (alternative key) |
PowerOnAfterOffOn |
Power-on state after power cut (255=previous) |
LightIndicator |
LED indicator on/off (0/1) |
{
"_description": "Human Presence Detector 5.8GHz Wall Mount",
"Identifier": [
[ "TS0601", "_TZE200_lyetpprm" ],
[ "TS0601", "_TZE204_ztc6ggyl" ]
],
"Ep": {
"01": {
"0000": "", "ef00": "",
"Type": "Motion/Lux/Distance"
}
},
"Type": "",
"ClusterToBind": [],
"ConfigureReporting": {},
"ReadAttributes": {
"0000": [ "0004", "0000", "0001", "0005", "0007", "fffe" ],
"ef00": []
},
"TS0601_DP": {
"01": { "sensor_type": "motion", "DomoDeviceFormat": "str" },
"02": { "store_tuya_attribute": "sensitivity" },
"03": { "store_tuya_attribute": "radar_min_range" },
"04": { "store_tuya_attribute": "radar_max_range" },
"09": { "sensor_type": "distance", "EvalExp": "int((value//10)*10)" },
"65": { "store_tuya_attribute": "radar_detection_delay" },
"66": { "store_tuya_attribute": "radar_fading_time" },
"68": { "sensor_type": "illuminance" }
},
"TUYA_REGISTRATION": 13,
"Param": {
"RadarMotionSensitivity": 7,
"RadarMotionMinRange": 60,
"RadarMotionMaxRange": 690,
"RadarMotionDelay": 1,
"RadarMotionFading": 150
}
}
Explanation:
01 → Motion widget. DomoDeviceFormat: "str" because the device sends "true"/"false".02–04, 65–66 → stored as attributes (device config values), no widget.09 → Distance widget, rounded down to the nearest 10 cm by EvalExp.68 → Lux widget.{
"_comment": "Tuya TRV / Avatto ME167",
"Identifier": [
[ "TS0601", "_TZE200_bvu2wnxz" ],
[ "TS0601", "_TZE200_6rdj8dzm" ]
],
"Ep": {
"01": {
"0000": "", "ef00": "",
"Type": "Temp/ThermoSetpoint/ThermoMode_7/HeatingStatus"
}
},
"Type": "",
"ClusterToBind": [ "0000", "ef00" ],
"ConfigureReporting": {},
"ReadAttributes": {
"0000": [ "0004", "0000", "0001", "0005", "0007", "fffe" ]
},
"TS0601_DP": {
"02": { "store_tuya_attribute": "SystemMode",
"sensor_type": "TRV6SystemMode", "action_type": "TRV6SystemMode" },
"03": { "store_tuya_attribute": "HeatingMode",
"sensor_type": "heatingstatus", "EvalExp": "int(not value)" },
"04": { "store_tuya_attribute": "SetPoint",
"sensor_type": "setpoint",
"EvalExp": "int((value//10)*10)", "domo_divisor": 10, "domo_round": 2,
"action_type": "setpoint", "action_Exp": "int(((value/10)//10)*10)" },
"05": { "store_tuya_attribute": "Temperature",
"sensor_type": "temperature",
"EvalExp": "int((value//10)*10)", "domo_divisor": 10, "domo_round": 2 },
"07": { "store_tuya_attribute": "ChildLock" },
"2f": { "store_tuya_attribute": "Calibration", "action_type": "calibration" }
},
"PollingEnabled": 1,
"Param": {}
}
Explanation:
02 → Both reads the system mode into the ThermoMode widget and accepts commands from it.03 → Heating status; EvalExp: "int(not value)" inverts the boolean (device sends 1 for idle).04 → Setpoint in tenths of a degree; domo_divisor: 10 converts to °C for Domoticz. action_Exp converts the Domoticz °C value back to tenths for sending.05 → Measured temperature, same scaling as setpoint.2f → Calibration offset, command-only (no widget).{
"_comment": "Tuya Zigbee Clamp Meter",
"Identifier": [
[ "TS0601", "_TZE204_cjbofhxw" ],
[ "TS0601", "_TZE284_cjbofhxw" ]
],
"Ep": {
"01": {
"0000": "", "ef00": "",
"Type": "Meter/Power/Voltage/Ampere"
}
},
"Type": "",
"ClusterToBind": [ "0019", "ef00" ],
"ConfigureReporting": {},
"ReadAttributes": {
"0000": [ "0000", "0001", "0002", "0003", "0004", "0005", "0007" ]
},
"TUYA_REGISTRATION": 19,
"TS0601_DP": {
"12": { "store_tuya_attribute": "Current",
"sensor_type": "current",
"EvalExp": "value / 1000", "domo_round": 2 },
"13": { "store_tuya_attribute": "Power",
"sensor_type": "power",
"EvalExp": "value / 10", "domo_round": 2 },
"14": { "store_tuya_attribute": "Voltage",
"sensor_type": "voltage",
"EvalExp": "value / 10", "domo_round": 2 },
"65": { "store_tuya_attribute": "Meter",
"sensor_type": "metering",
"EvalExp": "value" }
},
"Param": {}
}
Explanation:
TUYA_REGISTRATION: 19 — extended registration for metering devices.65 → accumulative energy meter (kWh).{
"_comment": "Tuya Soil sensor",
"Identifier": [
[ "TS0601", "_TZE200_myd45weu" ],
[ "TS0601", "_TZE284_myd45weu" ]
],
"Ep": {
"01": {
"0000": "", "0019": "",
"Type": "Temp/Humi"
}
},
"Type": "",
"ClusterToBind": [ "0000" ],
"ConfigureReporting": {},
"ReadAttributes": {
"0000": [ "0004", "0005", "0000", "0001", "0007", "ffe2", "fffe" ],
"ef00": []
},
"TS0601_DP": {
"03": { "store_tuya_attribute": "soil_moisture", "sensor_type": "humidity" },
"05": { "sensor_type": "temperature", "domo_round": 1 },
"0e": { "store_tuya_attribute": "battery_state" },
"0f": { "sensor_type": "battery" }
},
"BatteryDevice": 1,
"Param": {}
}
Explanation:
humidity widget (0–100%).0e stores the battery state text, DP 0f reports the numeric battery percentage.BatteryDevice: 1 tells the plugin this is battery-powered.TS0601_DP to confirm the mapping was loaded.store_tuya_attribute entry for it to capture its value for investigation.Once your configuration works, please open a Pull Request on
z4d-certified-devices with your JSON file under
z4d_certified_devices/Certified/Tuya/. Include:
TS0601-MyDevice-ModelXYZ.json_description, _comment, _source, and optionally _blakadder fieldIdentifier list covering all known manufacturer codes