Skip to content

Instantly share code, notes, and snippets.

@Koenkk
Last active February 22, 2026 20:29
Show Gist options
  • Select an option

  • Save Koenkk/bfd4c3d1725a2cccacc11d6ba51008ba to your computer and use it in GitHub Desktop.

Select an option

Save Koenkk/bfd4c3d1725a2cccacc11d6ba51008ba to your computer and use it in GitHub Desktop.
Zigbee2MQTT latest-dev changelog

Improvements

  • #11543 ENGO E40: support OFF mode (@adorobis)
  • #11544 Tuya TS0601_fan_dimmer_and_light_switch: improve support (@rftafas)
  • #11524 Sunricher SR-ZG2868EK7-CCT: expose scene actions (@ctournayre)
  • #11523 Tuya F3Pro: add weather display support (@l1berat0r)
  • #11504 BITUO TECHNIK SPM02 and SDM01: add per-phase energy (@script0803)
  • #11384 ENGO EONE-230W: various improvements (@PaTara43)
  • #11500 Tuya M9Pro: support additional features (@l1berat0r)
  • #11477 Schneider Electric EKO07259: enhance device support (@svhelge)
  • #11444 Stello/Stelpro: expose additional features (@lit-af)
  • #10903 LiXee ZLinky: use reportable attribute for pricing period (LTARF) (@sbraz)
  • #11458 Schneider Electric 545D6102: add support for indicators and switch actions (@lajtmaN)
  • #11437 Shelly WS90: expose more sensors (@danielpetrovic)
  • #11455 Zemismart ZMS-206US-X: add support for setting switches names with UTF8 support (@aryelevin)
  • #11416 Moes ZHT-S01: improve schedule handling (@mr-brune)
  • #11438 Schneider Electric EKO07259: remove attributes not present and implement Schneider Electric custom clusters and attributes (@svhelge)

Fixes

  • #30978 Home Assistant: add measurement state_class to _count entities (@DataGhost)
  • #31022 Home Assistant: add state_class: measurement for external_humidity and occupancy_level (@Koenkk)
  • #31136 Home Assistant: add weather station sensor discovery lookup entries (@danielpetrovic)
  • #30862 Home Assistant: discover temperature_probe as temperature device_class (@Koenkk)
  • #31000 Home Assistant: expose siren entity for IAS warning devices (@snazzybean)
  • #31022 Home Assistant: set state_class measurement for external_temperature (@Koenkk)
  • #31126 Improve configure attempts lazy+cleanup (@Nerivec)
  • #11562 Senoro: improve expose descriptions (@senorosoftware)
  • #11568 Sinope SW2500ZB: disable unsupported metering power (@mar-kolya)
  • #11565 Smart Things IM6001-MPP01: fix configure failing (@Nerivec)
  • #30901 Fix multiple custom cluster extends not working (@Koenkk)
  • #11556 Lumi: fix dimmer_mode payload lookup (@absent42)
  • #11554 Nous E13: fix integration (@andrei-lazarov)
  • #11539 Refactor threePhase handling for exposes and toZigbee (@svhelge)
  • #11557 Yale YMC420-W: expose actions (@Koenkk)
  • #11549 HomeSeer DS150ZB: fix handling of poll check-in failed (@spudwebb)
  • #11538 Namron 4512783/4512784: fix time (@jingsno)
  • #11530 Nous A11Z: fix energy/power reporting (@andrei-lazarov)
  • #11550 SBER SBDV: make various attributes writeable (@avzasorin-sd)
  • #11547 Shelly remotes: fix binding to coordinator (@andrei-lazarov)
  • #11536 LiXee ZLinky: reduce poll chunk size default (4→2) (@sbraz)
  • #30941 Shelly SBBT-104CUS and SBBT-004CEU: fix no action (@Koenkk)
  • #11515 Tuya TS0601_water_meter: refactor fault handling (@Liionboy)
  • #11535 Tuya TS0726: add additional fingerprints (@hys89)
  • #28245 Tuya: fix read/write not working (@Koenkk)
  • #30768 Lumi: fix windowCoveringMode not writeable (@Koenkk)
  • #11527 Sinopé TH1124ZB-G2 and TH1123ZB-G2: fix configure failing (@cloutierjo)
  • #30384 Aqara UT-A01E: fix reported power value and remove current and voltage (@Koenkk)
  • #11502 ELKO 316GLEDRF: disable effect and power on behaviour (@svhelge)
  • #11506 PTVO: change converters (@ptvoinfo)
  • #31020 Sunricher HK-SENSOR-4IN1-A: fix battery percentage divided by 2 (@Koenkk)
  • #11503 Third Reality 3RWS18BZ: expose on/off (@3reality-support)
  • #30384 Aqara UT-A01E: fix configure reporting failing (@Koenkk)
  • #11499 Develco SIRZB-111: fix wrong siren modes and stop not working (@snazzybean)
  • #11496 Third Reality 3RSP02064Z: various updates (@3reality-support)
  • #30949 Bosch BSP-FZ2: fix reported energy value not correct (@Koenkk)
  • #11451 Excellux: cleanup (@Bjk8kds)
  • #11488 Generated definition inputs/outputs issues (@Nerivec)
  • #11489 SMCL01-ZB and 10024773: make a whitelabel of Tuya TS0502B (@z-master42)
  • #11479 AVATTO ZWSH16: fix battery % (@sch115)
  • #11475 Inovelli: fix data type for internalTemperature (@InovelliUSA)
  • #11480 Legrand: fix typo in vendor name (@andrei-lazarov)
  • #11476 Thermostats: set control_sequence_of_operation to level to ea.ALL (@svhelge)
  • #30973 TOMZN DDS238-1-Z1: fix energy value divided by 10 (@Koenkk)
  • #11148 Add re-configure mechanism through definition.version (@Koenkk)
  • #11420 Inovelli VZM36: improve integration (@rohankapoorcom)
  • #11459 LifeControl MCLH-08: fix invalid temperature value (@8k37)
  • #11462 Moes ZWV-YC: enable on/off reporting (@andrei-lazarov)
  • #11461 Set indicator_mode category to config (@mik-laj)
  • #30584 Tuya _TZB210_417ikxay: fix cannot maintain last RGB color when turn off then on (@Koenkk)
  • #30901 Bosch BTH-RA: fix local_temperature_calibration range (@Koenkk)
  • #11454 Sinope TH1123ZB-G2 and TH1124ZB-G2: swap sensing and off values for backlight dimming modes (@lemoinem)
  • #11457 Vesterent VES-ZB-REM-013: fix battery % divided by 2 (@mik-laj)
  • #11375 OSRAM 4058075816459: fix action for the long-press (@miltschek)
  • #11435 SONOFF SNZB-06P: fix occupancy_timeout description (@kstewart-lab)
  • #1647 Add serial options to findAllDevices return items (@Nerivec)
  • #1645 Perf: ensure manuf code unique (@Nerivec)
  • #1626 Improve Request superseded error (@rusty-art)
  • #1635 Fix custom cluster lost when calling device.addCustomCluster multiple times for the same cluster (@Koenkk)
  • #1636 OTA padding skip (@Nerivec)
  • #1633 ZCL cluster definition issues (@TheJulianJES)

Windfront

Frontend

New supported devices

This release adds support for 34 devices:

  • #11560 ADCBZI01 Moes Curtain Robot (@pranjal-joshi)
  • #11571 B6Z Nous 1 gang switch (@1tigris1)
  • #11566 LA-A60-CCT Ynoa Smart LED E27 CCT A60 (@ov-dl)
  • #11555 EC-SL-FK86ZPCS11 BSEED 1 gang switch with scene and backlight (no neutral line required) (@klejejs)
  • #11555 EC-SL-FK86ZPCS21 BSEED 2 gang switch with scene and backlight (no neutral line required) (@klejejs)
  • #11526 SA-4W Nova Digital Safira smart light switch - 4 gang (@alanmgomes)
  • #31075 TS0721 Zbeacon On/off switch (@Koenkk)
  • #11548 EKAT-T3074-6WZ Ekaza 6 gang switch (@juliomelo)
  • #11546 SonomaStyle Stelpro Style Fan Heater (@MikeAndHAL9000)
  • #11542 TRV26 AVATTO Thermostatic radiator valve (@marekwichtowski)
  • #11534 TS0203-z-Sld Slacky-DIY Tuya door/window sensor with custom firmware (@slacky1965)
  • #11520 TH-P0Z RKHK Smart thermostat for electric heater (@Phil-ibert)
  • #11521 X7726 Xenon Smart Smart Zigbee curtain motor (@fatihaslan1990)
  • #11528 YNDX-00591 Yandex Window cover (@kirovilya)
  • #31031 4512759 Namron Zigbee thermostat 16A (@Koenkk)
  • #11512 TH01-2-z ZBeacon ZBeacon TH01 v2.0 temperature & humidity sensor (@HuismAndre)
  • #11509 SR-ZG2868EK7-CCT Sunricher Zigbee lighting remote control (@ctournayre)
  • #11491 PLUG-001SPB2 NEO Coolcam Smart plug (with power monitoring) (@z-master42)
  • #11491 HT-SP-ZB-01 Haozee Smart plug (with power monitoring) (@z-master42)
  • #30966 ZMS-208US-2 Zemismart Smart screen switch 2 gang (@Koenkk)
  • #11456 3RPS01083Z Third Reality Smart presence sensor R2 (@3reality-support)
  • #11465 HS2IRC Heiman Smart IR Control (@Leo2442926161)
  • #11464 T-TWAV-60W-PSR Task Lighting WAV smart receiver LED lighting controller (@smenzer)
  • #11468 929004608003 Philips Hue OmniGlow lightstrip AU (3m) (@chris-1243)
  • #11468 929004608103 Philips Hue OmniGlow lightstrip AU (5m) (@chris-1243)
  • #11463 TRV603 Tuya Thermostatic Radiator Valve (@SaschaKP)
  • #11450 4512776/4512777 Namron Zigbee thermostat for panel heater PRO (white 4512776 / black 4512777) (@danielcherubini)
  • #11446 PM2.5_airbox Tuya PM2.5 air quality sensor (@tiankakeji-cloud)
  • #11447 ROB_200-030-1 ROBB Zigbee AC in wall switch 400W (2-wire) (normal switch) (@pieterhartgerink)
  • #11440 1005314 SLV QPAR111 GU10 tunable smart (@chris-1243)
  • #11433 9290031509 Philips Hue white PAR38 outdoor (@shawnheide)
  • #11439 MG1_5RZ SONOFF Zigbee human presence radar (5.8 GHz) (@nicdolgov)
  • #11436 ZBPB10BK Nedis Smart Zigbee SOS / Panic Button (@hwde)
  • #11441 ZNDDQDQ13LM Aqara T1 light strip controller (@thebants)

Fixed device detections

  • #11564 Detect _TZ3000_avotanj3 as AVATTO LZWSM16-3 (@andrei-lazarov)
  • #31098 Detect _TZ3000_veu2v775 as Moes ZM-104-M (@Koenkk)
  • #31093 Detect _TZE284_lnyz4a6v as Zemismart ZMS-206US-1 (@Koenkk)
  • #31108 Detect FDS315-AH as Owon FDS315 (@Koenkk)
  • #31084 Detect _TZ3002_tlsvxhxc as Tuya TS0726_2_gang (@Koenkk)
  • #31080 Detect _TZE284_bjzrowv2 as Tuya TS0601_cover_1 (@Koenkk)
  • #11529 Detect _TZE204_glk6viwg as ENGO E40 (@adorobis)
  • #11532 Detect _TZE204_3q3maeoo as PO-BOCO-ELEC (@Samt43)
  • #11531 Detect _TZE284_5m4nchbm as Tuya TS0601_din_4 (@diamondlim)
  • #11517 Detect _TZ3210_cjrngdr3 as MatSee Plus PJ-MINI-ZSW01 (@Toniob)
  • #11513 Detect _TZE200_bxoo2swd as Moes ZM-105B-M (@jonamb)
  • #11492 Detect _TZ3210_sgb0xhwn as Nova Digital NT-S2 (@rc125)
  • #30955 Detect _TZE200_tgeqdjgk as Tuya TS0601_knob_dimmer_switch (@Koenkk)
  • #11469 Detect _TZE284_68utemio as Zemismart ZN2S-US1-SD and _TZE284_dmckrsxg as Zemismart ZMS-206EU-2 (@aryelevin)
  • #30958 Detect 1740547P0 as Philips 9290018216 (@Koenkk)
  • #11460 Detect TZE204_7sjncirf as Tuya TS0601_switch_10 (@andrei-lazarov)
  • #30889 Detect _TZ3210_nhqka112 as Tuya TS011F_plug_2 (@Koenkk)
  • #11449 Detect _TZE200_k1tumq4t as Tuya TV02-Zigbee (@FoerschS)
  • #30927 Detect _TZE284_kdqrazmy as Tuya TS0601_temperature_humidity_sensor_3 (@Koenkk)
  • #30930 Detect _TZE284_ozf4e02o as Merrytek MSA201Z (@Koenkk)
  • #11453 Detect KAJPLATS E27 470lm smart WS as IKEA LED2411G3 (@lennartjoh)
  • #27188 Detect _TZE204_wzre8hu2 as Tuya TS0601_cover_1 (@Koenkk)

Changelog generator error

  • add: HS8MIS, HS8MLS, HS2IRC, HS2RM (#11465) (68efbfd) (model 'HS8MIS' does not exist)
  • add: HS8MIS, HS8MLS, HS2IRC, HS2RM (#11465) (68efbfd) (model ' HS8MLS' does not exist)
  • add: HS8MIS, HS8MLS, HS2IRC, HS2RM (#11465) (68efbfd) (model ' HS2RM' does not exist)
  • NO_ISSUE Add re-configure mechanism through definition.version (@null)
@Kaktus317
Copy link

Kaktus317 commented Aug 11, 2025

Hi, I can see people requests in this post, not sure if this is appropriate place so sorry if not in advance. I would love to ask for support for Aqara Floor Heating Thermostat W500.

Manufacturer: Aqara Model: UT‑A01D

Note. It seems like the Aqara Floor Heating Thermostat W100 (TH‑S04D) is already supported and from my knowledge these two models are identical but one (W500) can be mounted on the wall only to the power circuit, the second one (W100) works with battery. From newbie perspective I believe it should not be hard to add something similar, but I am probably wrong. Thank you!

I am looking forward to this as well.

@AmitSmall
Copy link

Hello, can you please add:
Zigbee Model: TS0601
Vendor: _TZE284_7a5ob7xq
WhatsApp Image 2025-08-14 at 16 44 00_27252968
Smart lights / shutters switch

@maiandrei
Copy link

maiandrei commented Sep 5, 2025

Hi!
Please add Tongou RCBO TOQSMR1, similar to TOWSMR1
image

It might seem a little confusing, as the picture shows the same TOWSMR1, but there is a tiny difference:
image
TOQSMR1 is Type AC RCBO and identifies with vendor: '_TZE204_432zhuwe',
TOWSMR1 is Type A RCBO and identifies with vendor: '_TZE284_432zhuwe' and others.

OR it might be enough to add "_TZE204_432zhuwe" to fingerprint for TOWSMR1?

export default {
    zigbeeModel: ['TS0601'],
    model: 'TS0601',
    vendor: '_TZE204_432zhuwe',
    description: 'Automatically generated definition',
    extend: [],
    meta: {},
};

Meanwhile, for n00bs like me:

  1. Using Studio Code Server or other editor, locate zigbee2mqttt/configuration.yaml and add (pay attention to indentation):
external_converters:
  - rcbo_tongou.js
  1. Create a new folder external_converters . Here you create the new rcbo_tongou.js file: /homeassistant/zigbee2mqtt/external_converters/rcbo_tongou.js and

  2. Paste this code into the new file:

const fz = require('zigbee-herdsman-converters/converters/fromZigbee');
const tz = require('zigbee-herdsman-converters/converters/toZigbee');
const exposes = require('zigbee-herdsman-converters/lib/exposes');
const reporting = require('zigbee-herdsman-converters/lib/reporting');
const modernExtend = require('zigbee-herdsman-converters/lib/modernExtend');
const e = exposes.presets;
const ea = exposes.access;
const tuya = require('zigbee-herdsman-converters/lib/tuya');

const definition = {
    // Since a lot of Tuya devices use the same modelID, but use different datapoints
    // it's necessary to provide a fingerprint instead of a zigbeeModel
    fingerprint: [
        {
            // The model ID from: Device with modelID 'TS0601' is not supported
            // You may need to add \u0000 at the end of the name in some cases
            modelID: 'TS0601',
            // The manufacturer name from: Device with modelID 'TS0601' is not supported.
            manufacturerName: '_TZE204_432zhuwe',
        },
    ],
    model: 'TO-Q-SMR1-40JZT',
    vendor: 'Tongou',
    description: 'Single-phase RCBO 30-100mA 1-40A (DIN Module)',
    fromZigbee: [tuya.fz.datapoints],
    toZigbee: [tuya.tz.datapoints],
    onEvent: tuya.onEvent({
        respondToMcuVersionResponse: false,
        queryIntervalSeconds: 10,
        }),
    configure: tuya.configureMagicPacket,
    exposes: [
        tuya.exposes.switch(), 
        e.energy(), 
        e.temperature(), 
        e.power(), 
        e.voltage(), 
        e.current(),
        e.numeric("leakage_current", ea.STATE).withUnit("mA").withDescription("Current leakage"),
        e
            .enum("event", ea.STATE, [
                "normal",
                "over_current_trip",
                "over_power_trip",
                "high_temp_trip",
                "over_voltage_trip",
                "under_voltage_trip",
                "over_current_alarm",
                "over_power_alarm",
                "high_temp_alarm",
                "over_voltage_alarm",
                "under_voltage_alarm",
                "remote_on",
                "remote_off",
                "manual_on",
                "manual_off",
                "leakage_trip",
                "leakage_alarm",
                "restore_default",
                "automatic_closing",
                "electricity_shortage",
                "electricity_shortage_alarm",
                "timing_switch_On",
                "timing_switch_off",
            ])
            .withDescription("Last event of the device"),
        e.enum("over_current_setting", ea.STATE_SET, ["Ignore", "Alarm", "Trip"]).withDescription("Over current setting"),
        e
            .numeric("over_current_threshold", ea.STATE_SET)
            .withUnit("A")
            .withDescription("Setup the value on the device")
            .withValueMin(1)
            .withValueMax(40),
        e.enum("over_voltage_setting", ea.STATE_SET, ["Ignore", "Alarm", "Trip"]).withDescription("Over voltage setting"),
        e
            .numeric("over_voltage_threshold", ea.STATE_SET)
            .withUnit("V")
            .withDescription("Setup value on the device")
            .withValueMin(240)
            .withValueMax(295),
        e.enum("under_voltage_setting", ea.STATE_SET, ["Ignore", "Alarm", "Trip"]).withDescription("Under voltage setting"),
        e
            .numeric("under_voltage_threshold", ea.STATE_SET)
            .withUnit("V")
            .withDescription("Setup value on the device")
            .withValueMin(145)
            .withValueMax(220),
        e.enum("leakage_setting", ea.STATE_SET, ["Ignore", "Alarm", "Trip"]).withDescription("Leakage setting"),
        e
            .numeric("leakage_threshold", ea.STATE_SET)
            .withUnit("mA")
            .withDescription("Setup value on the device")
            .withValueMin(30)
            .withValueMax(100),
        e.enum("temperature_setting", ea.STATE_SET, ["Ignore", "Alarm", "Trip"]).withDescription("Temperature setting"),
        e
            .numeric("temperature_threshold", ea.STATE_SET)
            .withUnit("°C")
            .withDescription("Setup value on the device")
            .withValueMin(-25)
            .withValueMax(100),
        e.enum("over_power_setting", ea.STATE_SET, ["Ignore", "Alarm", "Trip"]).withDescription("Over power setting"),
        e
            .numeric("over_power_threshold", ea.STATE_SET)
            .withUnit("W")
            .withDescription("Setup value on the device")
            .withValueMin(1)
            .withValueMax(25000),
        e
            .binary("auto_reclosing", ea.STATE_SET, "ON", "OFF")
            .withLabel("Auto reclosing")
            .withDescription(
                "When the circuit breaker trips due to voltage protection, it will automatically close when the circuit voltage returns to normal",
            ),
        e
            .binary("overcurrent_recloser", ea.STATE_SET, "ON", "OFF")
            .withLabel("Overcurrent Recloser")
            .withDescription(
                "When the circuit breaker trips due to overcurrent protection, it will automatically close when the circuit voltage returns to normal",
            ),
        e
            .binary("leakage_recloser", ea.STATE_SET, "ON", "OFF")
            .withLabel("Leakage Recloser")
            .withDescription(
                "When the circuit breaker trips due to leakage protection, it will automatically close when the circuit voltage returns to normal",
            ),
        e
            .binary("overpower_recloser", ea.STATE_SET, "ON", "OFF")
            .withLabel("Overpower Recloser")
            .withDescription(
                "When the circuit breaker trips due to overpower protection, it will automatically close when the circuit voltage returns to normal",
            ),
        e.binary("restore_default", ea.STATE_SET, "ON", "OFF").withDescription("Turn ON to restore default settings"),
    ],
    meta: {
        tuyaDatapoints: [
            [1, "energy", tuya.valueConverter.divideBy100],
            [6, null, tuya.valueConverter.phaseVariant2], // voltage and current
            [15, "leakage_current", tuya.valueConverter.raw],
            [16, "state", tuya.valueConverter.onOff],
            [
                110,
                "event",
                tuya.valueConverterBasic.lookup({
                    normal: 0,
                    over_current_trip: 1,
                    over_power_trip: 2,
                    high_temp_trip: 3,
                    over_voltage_trip: 4,
                    under_voltage_trip: 5,
                    over_current_alarm: 6,
                    over_power_alarm: 7,
                    high_temp_alarm: 8,
                    over_voltage_alarm: 9,
                    under_voltage_alarm: 10,
                    remote_on: 11,
                    remote_off: 12,
                    manual_on: 13,
                    manual_off: 14,
                    leakage_trip: 15,
                    leakage_alarm: 16,
                    restore_default: 17,
                    automatic_closing: 18,
                    electricity_shortage: 19,
                    electricity_shortage_alarm: 20,
                    timing_switch_on: 21,
                    timing_switch_off: 22,
                }),
            ],
            [
                102,
                "over_voltage_setting",
                tuya.valueConverterBasic.lookup({
                    Ignore: tuya.enum(0),
                    Alarm: tuya.enum(1),
                    Trip: tuya.enum(2),
                }),
            ],
            [
                103,
                "under_voltage_setting",
                tuya.valueConverterBasic.lookup({
                    Ignore: tuya.enum(0),
                    Alarm: tuya.enum(1),
                    Trip: tuya.enum(2),
                }),
            ],
            [
                104,
                "over_current_setting",
                tuya.valueConverterBasic.lookup({
                    Ignore: tuya.enum(0),
                    Alarm: tuya.enum(1),
                    Trip: tuya.enum(2),
                }),
            ],
            [
                105,
                "over_power_setting",
                tuya.valueConverterBasic.lookup({
                    Ignore: tuya.enum(0),
                    Alarm: tuya.enum(1),
                    Trip: tuya.enum(2),
                }),
            ],
            [
                107,
                "temperature_setting",
                tuya.valueConverterBasic.lookup({
                    Ignore: tuya.enum(0),
                    Alarm: tuya.enum(1),
                    Trip: tuya.enum(2),
                }),
            ],
            [
                108,
                "leakage_setting",
                tuya.valueConverterBasic.lookup({
                    Ignore: tuya.enum(0),
                    Alarm: tuya.enum(1),
                    Trip: tuya.enum(2),
                }),
            ],
            [112, "auto_reclosing", tuya.valueConverter.onOff],
            [113, "restore_default", tuya.valueConverter.onOff],
            [114, "over_current_threshold", tuya.valueConverter.raw],
            [115, "over_voltage_threshold", tuya.valueConverter.raw],
            [116, "under_voltage_threshold", tuya.valueConverter.raw],
            [117, "leakage_threshold", tuya.valueConverter.raw],
            [118, "temperature_threshold", tuya.valueConverter.divideBy10],
            [119, "over_power_threshold", tuya.valueConverter.raw],
            [131, "temperature", tuya.valueConverter.divideBy10],
            [143, "overcurrent_recloser", tuya.valueConverter.onOff],
            [144, "leakage_recloser", tuya.valueConverter.onOff],
            [145, "overpower_recloser", tuya.valueConverter.onOff],
        ],
    },
};

module.exports = definition;
  1. Restart Zigbee2MQTT addon;

  2. Enjoy!

This is the AC Type device
This is the A Type device
S123a0b45a6514275b539130772da995dd

@frohaut
Copy link

frohaut commented Sep 8, 2025

Hi
I purchased this module
https://fr.aliexpress.com/item/1005009242917566.html?spm=a2g0o.order_list.order_list_main.34.607a5e5bGE77fU&gatewayAdapt=glo2fra
it doesn't seem to be supported, do you have a planned update for this module?
Best regards,
Franck
export default {
zigbeeModel: ['TS0601'],
model: 'TS0601',
vendor: '_TZE284_mxujdmxo',
description: 'Automatically generated definition',
extend: [],
meta: {},
};

@Ankhwatcher
Copy link

@maiandrei Thanks for the guide!

I managed to get mine working by following it. I did have to use your original onEvent: tuya.onEventSetTime, // Add this if you are getting no converter for 'commandMcuSyncTime' though.

Otherwise Zigbee2Mqtt kept renaming my file to tongou.js.invalid.

@xion2000
Copy link

Hi purchased this Zigbee Room Thermostat recently and unfortunately it's not currently supported
https://www.aliexpress.com/item/1005007126805419.html?spm=a2g0o.order_list.order_list_main.28.6b2c18024rzB2W
Zigbee Model: TS0601
Zigbee Manufacturer: _TZE284_zjhoqbrd
Hope it can be added and I'm struggling to sort out a work around
Regards
Graham

@maiandrei
Copy link

maiandrei commented Sep 23, 2025

@maiandrei Thanks for the guide!

I managed to get mine working by following it. I did have to use your original onEvent: tuya.onEventSetTime, // Add this if you are getting no converter for 'commandMcuSyncTime' though.

Otherwise Zigbee2Mqtt kept renaming my file to tongou.js.invalid.

You're right, 2 days later I found the devices unsupported and the file invalid.
With that version of onEvent I didn't receive any feedback from device in HA. Do you?
Now I copied code from https://github.com/Koenkk/zigbee-herdsman-converters/blob/eb0faa7c71c6c184cb925f20145c5b2c619fae79/src/devices/tuya.ts#L14797
and, for the moment, everything is OK again.

@BelkinDzmitry
Copy link

Hello! I have 4 gang+2 scene (6 buttons) switch.
Not supported yet. Can you add it?

zigbeeModel: ['TS0601'],
model: 'TS0601',
vendor: '_TZE200_mk3mlurj',
description: 'CombZSwitch4A2',

@bugac
Copy link

bugac commented Sep 24, 2025

Please add to supported list:

https://www.aliexpress.com/item/1005009024318979.html

`const {iasZoneAlarm, temperature, humidity, battery, illuminance} = require('zigbee-herdsman-converters/lib/modernExtend');

const definition = {
zigbeeModel: ['TS0601'],
model: 'TS0601',
vendor: '_TZE200_rhgsbacq',
description: 'Automatically generated definition',
extend: [iasZoneAlarm({"zoneType":"generic","zoneAttributes":["alarm_1","alarm_2","tamper","battery_low"]}), temperature(), humidity(), battery(), illuminance()],
meta: {},
};

module.exports = definition;`

image

@MattiaMarchiorato
Copy link

Hi purchased this Zigbee Room Thermostat recently and unfortunately it's not currently supported https://www.aliexpress.com/item/1005007126805419.html?spm=a2g0o.order_list.order_list_main.28.6b2c18024rzB2W Zigbee Model: TS0601 Zigbee Manufacturer: _TZE284_zjhoqbrd Hope it can be added and I'm struggling to sort out a work around Regards Graham

i have the same problem

@xion2000
Copy link

Hi purchased this Zigbee Room Thermostat recently and unfortunately it's not currently supported https://www.aliexpress.com/item/1005007126805419.html?spm=a2g0o.order_list.order_list_main.28.6b2c18024rzB2W Zigbee Model: TS0601 Zigbee Manufacturer: _TZE284_zjhoqbrd Hope it can be added and I'm struggling to sort out a work around Regards Graham

i have the same problem

I've managed to get it working with zigbee2mqtt using an external converter

I named to file "_TZE284_zjhoqbrd.js"
then put it in /homeassistant/zigbee2mqtt/external_converters/

Below is the contents of the .js file

const fz = require('zigbee-herdsman-converters/converters/fromZigbee');
const tz = require('zigbee-herdsman-converters/converters/toZigbee');
const exposes = require('zigbee-herdsman-converters/lib/exposes');
const reporting = require('zigbee-herdsman-converters/lib/reporting');
const modernExtend = require('zigbee-herdsman-converters/lib/modernExtend');
const e = exposes.presets;
const ea = exposes.access;
const tuya = require('zigbee-herdsman-converters/lib/tuya');

const definition = {
// Since a lot of Tuya devices use the same modelID, but use different datapoints
// it's necessary to provide a fingerprint instead of a zigbeeModel
fingerprint: [
{
// The model ID from: Device with modelID 'TS0601' is not supported
// You may need to add \u0000 at the end of the name in some cases
modelID: 'TS0601',
// The manufacturer name from: Device with modelID 'TS0601' is not supported.
manufacturerName: '_TZE284_zjhoqbrd',
},
],
model: 'TS0601_ZWT198',
vendor: 'Tuya',
icon: '/icons/ts0601_zwt198.jpg',
description: 'Central Heating Thermostat',
fromZigbee: [tuya.fz.datapoints],
toZigbee: [tuya.tz.datapoints],
onEvent: tuya.onEventSetTime, // Add this if you are getting no converter for 'commandMcuSyncTime'
configure: tuya.configureMagicPacket,
exposes: [
e.binary("factory_reset", ea.STATE_SET, "ON", "OFF").withDescription("Full factory reset, use with caution!"),
e.child_lock(),
e.temperature_sensor_select(["internal", "external", "both"]),
e
.climate()
.withSystemMode(["off", "heat"], ea.STATE_SET)
.withPreset(["manual", "auto", "temporary_manual"])
.withSetpoint("current_heating_setpoint", 5, 35, 0.5, ea.STATE_SET)
.withRunningState(["idle", "heat"], ea.STATE)
.withLocalTemperature(ea.STATE)
.withLocalTemperatureCalibration(-9.9, 9.9, 0.1, ea.STATE_SET),
e.binary("frost_protection", ea.STATE_SET, "ON", "OFF").withDescription("Antifreeze function"),
e
.max_temperature_limit()
.withUnit("°C")
.withValueMin(15)
.withValueMax(90)
.withValueStep(0.5)
.withPreset("default", 60, "Default value")
.withDescription("Maximum upper temperature"),
e
.numeric("deadzone_temperature", ea.STATE_SET)
.withUnit("°C")
.withValueMax(10)
.withValueMin(0.1)
.withValueStep(0.1)
.withPreset("default", 1, "Default value")
.withDescription("The delta between local_temperature (5<t<35)and current_heating_setpoint to trigger Heat"),
e.enum("backlight_mode", ea.STATE_SET, ["off", "low", "medium", "high"]).withDescription("Intensity of the backlight"),
e.enum("working_day", ea.STATE_SET, ["disabled", "6-1", "5-2", "7"]).withDescription("Workday setting"),
e.text("schedule_weekday", ea.STATE_SET).withDescription("Workdays (6 times hh:mm/cc.c°C)"),
e
.text("schedule_holiday", ea.STATE_SET)
.withDescription("Holidays (2 times hh:mm/cc.c°C)"),
// ============== exposes for found, but not functional datapoints:
/*
e.min_temperature_limit() // dp 16
.withValueMin(5)
.withValueMax(15)
.withValueStep(0.5)
.withPreset('default', 10, 'Default value')
.withDescription('dp16 is listed in Tuya, but no communication from device'),

    e.binary('dp105', ea.STATE_SET, 'ON', 'OFF')
        .withDescription('dp105 is not listed in Tuya, but device sends datapoint, binary: true/false'),

    e.binary('dp111', ea.STATE_SET, 'ON', 'OFF')
        .withDescription('dp111 is not listed in Tuya, but device sends datapoint, binary: true/false'),
    */
],
meta: {
    tuyaDatapoints: [
        [1, "system_mode", tuya.valueConverterBasic.lookup({heat: true, off: false})],
        [2, "current_heating_setpoint", tuya.valueConverter.divideBy10],
        [3, "local_temperature", tuya.valueConverter.divideBy10],
        [
            4,
            "preset",
            tuya.valueConverterBasic.lookup((_, device) => {
                // https://github.com/Koenkk/zigbee2mqtt/issues/21353#issuecomment-1938328429
                // https://github.com/Koenkk/zigbee2mqtt/issues/28035
                if (device.manufacturerName === "_TZE204_lzriup1j" || device.manufacturerName === "_TZE204_gops3slb") {
                    return {
                        auto: tuya.enum(1),
                        manual: tuya.enum(0),
                        temporary_manual: tuya.enum(2),
                    };
                }
                return {
                    auto: tuya.enum(0),
                    manual: tuya.enum(1),
                    temporary_manual: tuya.enum(2),
                };
            }),
        ],
        [9, "child_lock", tuya.valueConverter.lockUnlock],
        [11, "faultalarm", tuya.valueConverter.raw],
        [15, "max_temperature_limit", tuya.valueConverter.divideBy10],
        [19, "local_temperature_calibration", tuya.valueConverter.localTempCalibration3],
        [
            101,
            "running_state",
            tuya.valueConverterBasic.lookup({
                heat: tuya.enum(1),
                idle: tuya.enum(0),
            }),
        ],
        [102, "frost_protection", tuya.valueConverter.onOff],
        [103, "factory_reset", tuya.valueConverter.onOff],
        [
            104,
            "working_day",
            tuya.valueConverterBasic.lookup((_, device) => {
                // https://github.com/Koenkk/zigbee2mqtt/issues/23979
                if (device.manufacturerName === "_TZE200_viy9ihs7") {
                    return {
                        disabled: tuya.enum(0),
                        "6-1": tuya.enum(1),
                        "5-2": tuya.enum(2),
                        "7": tuya.enum(3),
                    };
                }
                return {
                    disabled: tuya.enum(0),
                    "6-1": tuya.enum(2),
                    "5-2": tuya.enum(1),
                    "7": tuya.enum(3),
                };
            }),
        ],
        [
            106,
            "sensor",
            tuya.valueConverterBasic.lookup({
                internal: tuya.enum(0),
                external: tuya.enum(1),
                both: tuya.enum(2),
            }),
        ],
        [107, "deadzone_temperature", tuya.valueConverter.divideBy10],
        [109, null, tuya.valueConverter.ZWT198_schedule],
        [109, "schedule_weekday", tuya.valueConverter.ZWT198_schedule],
        [109, "schedule_holiday", tuya.valueConverter.ZWT198_schedule],
        [110, "backlight_mode", tuya.valueConverter.backlightModeOffLowMediumHigh],
        // ============== found but not functional datapoints:

        // [16, 'min_temperature_limit', tuya.valueConverter.divideBy10],  // datapoint listed in Tuya, but no communication from device
        // [105, 'dp105', tuya.valueConverter.onOff],                      // not listed in Tuya, but device sends datapoint
        // [111, 'dp111', tuya.valueConverter.onOff],                      // not listed in Tuya, but device sends datapoint

        // These are the schedule values in bytes, 8 periods in total (4 bytes per period).
        // For each period:
        // 1st byte: hour
        // 2nd byte: minute
        // 3rd, 4th bytes: temperature multiplied by 10
        // On the device last 2 periods are ignored if schedule_mode is 7day. When schedule_mode is disabled,
        // scheduling can't be configured at all on the device.
        // For example, if schedule_mode is weekday/sat+sun and this byte array is received:
        // [6,10,1,144,8,10,0,170,11,40,0,170,12,40,0,170,17,10,0,230,22,10,0,170,8,5,0,200,23,0,0,160]
        // Then the schedule is:
        // Mon-Fri: 6:10 --> 40C, 8:10 --> 17C, 11:40 --> 17C, 12:40 --> 17C, 17:10 --> 23C, 22:10 --> 17C
        // Sat-Sun: 8:05 --> 20C, 23:00 --> 16C
    ],
},

};

module.exports = definition;

@MattiaMarchiorato
Copy link

@xion2000 many thanks, is working!

@rytecbe
Copy link

rytecbe commented Sep 26, 2025

@xion2000 thank you very much to made this and info where to place this in the system. It worked for me too. The only thing which is not showing is the battery, I don't have it connected with an USB-C cable but working with 3x AAA batteries.
Is there a possibility to have this info working in your file?

@douternitou
Copy link

douternitou commented Oct 7, 2025

Hi,

I just purchased the EcoDim DIM.06 dimmer but found that is not supported yet.
Would it be possible to add this one?
Thanks in advance.

https://www.123led.nl/EcoDim-Zigbee-stekkerdimmer-0-100W-Fase-afsnijding-RC-EcoDim-DIM-06-i7926-t4329.html

image image

{
"description": "Automatically generated definition",
"exposes": [
{
"features": [
{
"access": 7,
"description": "On/off state of this light",
"label": "State",
"name": "state",
"property": "state",
"type": "binary",
"value_off": "OFF",
"value_on": "ON",
"value_toggle": "TOGGLE"
},
{
"access": 7,
"description": "Brightness of this light",
"label": "Brightness",
"name": "brightness",
"property": "brightness",
"type": "numeric",
"value_max": 254,
"value_min": 0
}
],
"type": "light"
},
{
"access": 2,
"description": "Triggers an effect on the light (e.g. make light blink for a few seconds)",
"label": "Effect",
"name": "effect",
"property": "effect",
"type": "enum",
"values": [
"blink",
"breathe",
"okay",
"channel_change",
"finish_effect",
"stop_effect"
]
},
{
"access": 7,
"category": "config",
"description": "Controls the behavior when the device is powered on after power loss",
"label": "Power-on behavior",
"name": "power_on_behavior",
"property": "power_on_behavior",
"type": "enum",
"values": [
"off",
"on",
"toggle",
"previous"
]
},
{
"access": 1,
"category": "diagnostic",
"description": "Link quality (signal strength)",
"label": "Linkquality",
"name": "linkquality",
"property": "linkquality",
"type": "numeric",
"unit": "lqi",
"value_max": 255,
"value_min": 0
}
],
"model": "eco-dim06-zigbee",
"options": [
{
"access": 2,
"description": "Controls the transition time (in seconds) of on/off, brightness, color temperature (if applicable) and color (if applicable) changes. Defaults to 0 (no transition).",
"label": "Transition",
"name": "transition",
"property": "transition",
"type": "numeric",
"value_min": 0
},
{
"access": 2,
"description": "State actions will also be published as 'action' when true (default false).",
"label": "State action",
"name": "state_action",
"property": "state_action",
"type": "binary",
"value_off": false,
"value_on": true
}
],
"source": "generated",
"supports_ota": false,
"vendor": "EcoDim BV"
}

@xion2000
Copy link

@xion2000 thank you very much to made this and info where to place this in the system. It worked for me too. The only thing which is not showing is the battery, I don't have it connected with an USB-C cable but working with 3x AAA batteries. Is there a possibility to have this info working in your file?

I have mine working of batteries only also and have the same problem with batteries NOT showing in Zigbee2MQTT unfortunately

@mattia9508
Copy link

Buonasera a tutti, chiedo gentilmente se è possibile aggiungere il seguente dispositivo:

image

https://italian.alibaba.com/product-detail/subject-1600753083531.html?from=share&ckvia=share_80DFED87F71A45E98E35F2B59887F5D0&needReward=true

export default {
zigbeeModel: ['TS0601'],
model: 'TS0601',
vendor: '_TZE204_o9d1hdma',
description: 'Automatically generated definition',
extend: [],
meta: {},
};

il dispositivo in questione è praticamente identico ad un dispositivo presente nella lista dispositivi supportati, ne ho 6 in casa mi piacerebbe tantissimo vederli funzionare
https://www.zigbee2mqtt.io/devices/AE-669K.html

Grazie per il vostro prezioso aiuto

Mattia

@MattiaMarchiorato
Copy link

@mattia9508 ciao,

puoi usare un external converter

guarda qui

@mattia9508
Copy link

mattia9508 commented Oct 13, 2025 via email

@Norbertcb
Copy link

Bonjour
Pouvez vous ajouter cet appareil SMT10020 de schneider svp, c'est un capteur d'echauffement des cables

@lalik77
Copy link

lalik77 commented Oct 23, 2025

Hi can you add motion and light sensor.
This is the generated external converter :

const {identify, iasZoneAlarm, battery, illuminance} = require('zigbee-herdsman-converters/lib/modernExtend');


const definition = {
    zigbeeModel: ['TS0601'],
    model: 'TS0601',
    vendor: '_TZE200_na5qlzow',
    description: 'Automatically generated definition',
    extend: [identify(), iasZoneAlarm({"zoneType":"generic","zoneAttributes":["alarm_1","alarm_2","tamper","battery_low"]}), battery(), illuminance()],
    meta: {},
};

module.exports = definition;
2025-10-20_19-06-18 2025-10-20_19-24-36

@raduten
Copy link

raduten commented Oct 26, 2025

Another tuya temp/humidity with clock device

export default {
zigbeeModel: ['TS0601'],
model: 'TS0601',
vendor: '_TZE284_cwyqwqbf',
description: 'Automatically generated definition',
extend: [],
};
image

@jeanlouisbiset
Copy link

Hello can you add the necessary definition for an AVATTO ZDMS16-2
It is a Zigbee Module 2 channels Dimmer.
This is the generated external converter :

{
"last_seen": "2025-11-04T18:34:39.089Z",
"linkquality": 160,
"device": {
"applicationVersion": 78,
"dateCode": "",
"friendlyName": "0xa4c1385b98ce2ed7",
"hardwareVersion": 1,
"ieeeAddr": "0xa4c1385b98ce2ed7",
"manufacturerID": 4417,
"manufacturerName": "_TZE284_jtbgusdc",
"networkAddress": 12724,
"powerSource": "Mains (single phase)",
"stackVersion": 0,
"type": "Router",
"zclVersion": 3
}
}

const definition = {
zigbeeModel: ['TS0601'],
model: 'TS0601',
vendor: '_TZE284_jtbgusdc',
description: 'Automatically generated definition',
extend: [],
meta: {},
};

module.exports = definition;

Thanks for your efforts.
Kind regards.

@bernardesarthur
Copy link

Hello can you add the necessary definition for an AVATTO ZDMS16-2 It is a Zigbee Module 2 channels Dimmer. This is the generated external converter :

{ "last_seen": "2025-11-04T18:34:39.089Z", "linkquality": 160, "device": { "applicationVersion": 78, "dateCode": "", "friendlyName": "0xa4c1385b98ce2ed7", "hardwareVersion": 1, "ieeeAddr": "0xa4c1385b98ce2ed7", "manufacturerID": 4417, "manufacturerName": "_TZE284_jtbgusdc", "networkAddress": 12724, "powerSource": "Mains (single phase)", "stackVersion": 0, "type": "Router", "zclVersion": 3 } }

const definition = { zigbeeModel: ['TS0601'], model: 'TS0601', vendor: '_TZE284_jtbgusdc', description: 'Automatically generated definition', extend: [], meta: {}, };

module.exports = definition;

Thanks for your efforts. Kind regards.

That manufacturerID is already supported. Are you using the last version of Zigbee2MQTT?

@jeanlouisbiset
Copy link

Reading your answer I went back to my Jeedom and saw that my Zigbee2MQTT version was 1.42.0.
I upgraded to 2.6.3 and then miracle, the module is correctly working.
Many thanks for your quick reaction. I will now buy several modules to go further.
Have a nice day!
Zigbee2MQTT WindFront

@Frikk
Copy link

Frikk commented Nov 23, 2025

Could anyone more skilled than me in Z2M add the new Namron Zigbee Thermostat?
Article No: 4512776
Name: Namron Zigbee termostat for panelovn PRO hvit
Product page link: https://www.elektroimportoren.no/namron-zigbee-termostat-for-panelovn-pro-hvit/4512776/Product.html

I have a Namron Zigbee panel heater released before the new thermostats + oven line were released. I suspect this new thermostat would act much the same way as the existing Namron 540139X would (https://www.zigbee2mqtt.io/devices/540139X.html)

If i could help in any way, please let me know.

Generated external definition (from Z2M Dev Console)

import * as m from 'zigbee-herdsman-converters/lib/modernExtend';

export default {
    zigbeeModel: ['Panel Heater'],
    model: 'Panel Heater',
    vendor: 'NAMRON AS',
    description: 'Automatically generated definition',
    extend: [m.electricityMeter()],
};
{
    "description": "Automatically generated definition",
    "exposes": [
        {
            "access": 5,
            "description": "Instantaneous measured power",
            "label": "Power",
            "name": "power",
            "property": "power",
            "type": "numeric",
            "unit": "W"
        },
        {
            "access": 5,
            "description": "Measured electrical potential value",
            "label": "Voltage",
            "name": "voltage",
            "property": "voltage",
            "type": "numeric",
            "unit": "V"
        },
        {
            "access": 5,
            "description": "Instantaneous measured electrical current",
            "label": "Current",
            "name": "current",
            "property": "current",
            "type": "numeric",
            "unit": "A"
        },
        {
            "access": 5,
            "description": "Sum of consumed energy",
            "label": "Energy",
            "name": "energy",
            "property": "energy",
            "type": "numeric",
            "unit": "kWh"
        },
        {
            "access": 1,
            "category": "diagnostic",
            "description": "Link quality (signal strength)",
            "label": "Linkquality",
            "name": "linkquality",
            "property": "linkquality",
            "type": "numeric",
            "unit": "lqi",
            "value_max": 255,
            "value_min": 0
        }
    ],
    "model": "Panel Heater",
    "options": [
        {
            "access": 2,
            "description": "Calibrates the power value (percentual offset), takes into effect on next report of device.",
            "label": "Power calibration",
            "name": "power_calibration",
            "property": "power_calibration",
            "type": "numeric",
            "value_step": 0.1
        },
        {
            "access": 2,
            "description": "Number of digits after decimal point for power, takes into effect on next report of device. This option can only decrease the precision, not increase it.",
            "label": "Power precision",
            "name": "power_precision",
            "property": "power_precision",
            "type": "numeric",
            "value_max": 3,
            "value_min": 0
        },
        {
            "access": 2,
            "description": "Calibrates the voltage value (percentual offset), takes into effect on next report of device.",
            "label": "Voltage calibration",
            "name": "voltage_calibration",
            "property": "voltage_calibration",
            "type": "numeric",
            "value_step": 0.1
        },
        {
            "access": 2,
            "description": "Number of digits after decimal point for voltage, takes into effect on next report of device. This option can only decrease the precision, not increase it.",
            "label": "Voltage precision",
            "name": "voltage_precision",
            "property": "voltage_precision",
            "type": "numeric",
            "value_max": 3,
            "value_min": 0
        },
        {
            "access": 2,
            "description": "Calibrates the current value (percentual offset), takes into effect on next report of device.",
            "label": "Current calibration",
            "name": "current_calibration",
            "property": "current_calibration",
            "type": "numeric",
            "value_step": 0.1
        },
        {
            "access": 2,
            "description": "Number of digits after decimal point for current, takes into effect on next report of device. This option can only decrease the precision, not increase it.",
            "label": "Current precision",
            "name": "current_precision",
            "property": "current_precision",
            "type": "numeric",
            "value_max": 3,
            "value_min": 0
        },
        {
            "access": 2,
            "description": "Calibrates the energy value (percentual offset), takes into effect on next report of device.",
            "label": "Energy calibration",
            "name": "energy_calibration",
            "property": "energy_calibration",
            "type": "numeric",
            "value_step": 0.1
        },
        {
            "access": 2,
            "description": "Number of digits after decimal point for energy, takes into effect on next report of device. This option can only decrease the precision, not increase it.",
            "label": "Energy precision",
            "name": "energy_precision",
            "property": "energy_precision",
            "type": "numeric",
            "value_max": 3,
            "value_min": 0
        }
    ],
    "source": "generated",
    "supports_ota": false,
    "vendor": "NAMRON AS"
}

@OM17-haos
Copy link

Any progress, this i working with ZHA??

@richardsg307
Copy link

First time I've bought something and it's not been 'Supported'. Is this something I can do myself as a complete numpty? I'll have a look at the Instructions! It's connected as a TS0601, but it looks like every unsupported thing does!

Bi-Directional Power Meter and DIN Circuit Breaker from Ali Express

DINPowerMeter

@m-shafiq
Copy link

m-shafiq commented Feb 4, 2026 via email

@richardsg307
Copy link

I have 4 of those already and they have been working flawlessly for a couple of years now. But I wanted a bi-directional one.

I'm making progress with a bit of searching and a lot of AI. Got it working for Power, voltage, energy etc but trying to get more of the features like setting trip current. It's slow going as have no idea what i'm doing! Nor the language in the External Definition. I get the feeling AI is guessing most of the time.

@m-shafiq
Copy link

m-shafiq commented Feb 5, 2026 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment