logo elektroda
logo elektroda
X
logo elektroda

Home Heating Gas Thermostats Compatible with OpenBeken or Custom Firmware

gandi69 2055 37
Best answers

Which home heating gas thermostat models are known to work with OpenBeken or similar custom firmware, and can an existing Tuya thermostat config be reused?

No specific gas-boiler thermostat was confirmed as plug-and-play in the thread; the main advice is that almost any Tuya device can often be modified to run OpenBeken, but newer models usually need a custom flash and dpID/config work rather than just flashing firmware [#21734047][#21734680][#21734745] The ME81H template was suggested as a possible reference, but it was not recommended as a purchase because there were reports it may die after about a year, and it still would not be plug-and-play without matching dpIDs [#21734178][#21735774] OBK’s default release was said to support TuyaMCU in theory, so reusing a similar TuyaMCU configuration may work if the hardware matches, but manual Home Assistant config may still be needed [#21734745][#21735774] One participant did report a proven flashed thermostat setup with Avatto WT100 units using soldered-in ESP-12F / ESP8684-WROOM-01C modules, but that example is for electric heating rather than gas [#21735774]
Generated by the language model.
ADVERTISEMENT
  • #31 21737091
    gandi69
    Level 2  
    Info:CMD:[WebApp Cmd 'tuyaMcu_sendQueryState' Result] OK
    Info:TuyaMCU:Received: 55 AA 03 07 00 05 01 01 00 01 01 12
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 7 (State) len 12
    Info:TuyaMCU:ParseState: id 1 type 1-bool len 1
    Info:TuyaMCU:ParseState: byte 1
    Info:TuyaMCU:Received: 55 AA 03 07 00 08 03 02 00 04 00 00 00 B6 D0
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 7 (State) len 15
    Info:TuyaMCU:ParseState: id 3 type 2-val len 4
    Info:TuyaMCU:ParseState: int32 182
    Info:TuyaMCU:Received: 55 AA 03 07 00 05 04 04 00 01 01 18
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 7 (State) len 12
    Info:TuyaMCU:ParseState: id 4 type 4-enum len 1
    Info:TuyaMCU:ParseState: byte 1
    Info:TuyaMCU:Received: 55 AA 03 07 00 05 05 04 00 01 00 18
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 7 (State) len 12
    Info:TuyaMCU:ParseState: id 5 type 4-enum len 1
    Info:TuyaMCU:ParseState: byte 0
    Info:TuyaMCU:Received: 55 AA 03 07 00 05 08 01 00 01 00 18
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 7 (State) len 12
    Info:TuyaMCU:ParseState: id 8 type 1-bool len 1
    Info:TuyaMCU:ParseState: byte 0
    Info:TuyaMCU:Received: 55 AA 03 07 00 05 0D 01 00 01 00 1D
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 7 (State) len 12
    Info:TuyaMCU:ParseState: id 13 type 1-bool len 1
    Info:TuyaMCU:ParseState: byte 0
    Info:TuyaMCU:Received: 55 AA 03 07 00 05 10 05 00 01 00 24
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 7 (State) len 12
    Info:TuyaMCU:ParseState: id 16 type 5-bitmap len 1
    Info:TuyaMCU:ParseState: byte 0
    Info:TuyaMCU:Received: 55 AA 03 07 00 08 14 02 00 04 FF FF FF FB 23
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 7 (State) len 15
    Info:TuyaMCU:ParseState: id 20 type 2-val len 4
    Info:TuyaMCU:ParseState: int32 -5
    Info:TuyaMCU:Received: 55 AA 03 07 00 08 15 02 00 04 00 00 00 1C 48
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 7 (State) len 15
    Info:TuyaMCU:ParseState: id 21 type 2-val len 4
    Info:TuyaMCU:ParseState: int32 28
    Info:TuyaMCU:Received: 55 AA 03 07 00 05 19 04 00 01 00 2C
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 7 (State) len 12
    Info:TuyaMCU:ParseState: id 25 type 4-enum len 1
    Info:TuyaMCU:ParseState: byte 0
    Info:TuyaMCU:Received: 55 AA 03 07 00 05 1A 01 00 01 00 2A
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 7 (State) len 12
    Info:TuyaMCU:ParseState: id 26 type 1-bool len 1
    Info:TuyaMCU:ParseState: byte 0
    Info:TuyaMCU:Received: 55 AA 03 07 00 05 1F 01 00 01 00 2F
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 7 (State) len 12
    Info:TuyaMCU:ParseState: id 31 type 1-bool len 1
    Info:TuyaMCU:ParseState: byte 0
    Info:TuyaMCU:Received: 55 AA 03 07 00 05 29 04 00 01 01 3D
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 7 (State) len 12
    Info:TuyaMCU:ParseState: id 41 type 4-enum len 1
    Info:TuyaMCU:ParseState: byte 1
    Info:TuyaMCU:Received: 55 AA 03 07 00 05 2A 04 00 01 02 3F
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 7 (State) len 12
    Info:TuyaMCU:ParseState: id 42 type 4-enum len 1
    Info:TuyaMCU:ParseState: byte 2
    Info:TuyaMCU:Received: 55 AA 03 07 00 24 2B 00 00 20 02 02 00 78 06 1E 00 D2 07 1E 00 78 0C 1E 00 78 11 00 00 78 17 00 00 78 08 00 00 78 17 00 00 78 50
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 7 (State) len 43
    Info:TuyaMCU:ParseState: id 43 type 0-raw len 32
    Info:TuyaMCU:Received: 55 AA 03 07 00 05 65 01 00 01 00 75
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 7 (State) len 12
    Info:TuyaMCU:ParseState: id 101 type 1-bool len 1
    Info:TuyaMCU:ParseState: byte 0
    Info:TuyaMCU:Received: 55 AA 03 07 00 08 69 02 00 04 00 00 00 05 85
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 7 (State) len 15
    Info:TuyaMCU:ParseState: id 105 type 2-val len 4
    Info:TuyaMCU:ParseState: int32 5
    Info:TuyaMCU:Received: 55 AA 03 07 00 08 6B 02 00 04 00 00 00 1C 9E
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 7 (State) len 15
    Info:TuyaMCU:ParseState: id 107 type 2-val len 4
    Info:TuyaMCU:ParseState: int32 28
    Info:TuyaMCU:Received: 55 AA 03 07 00 08 02 02 00 04 00 00 00 78 91
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 7 (State) len 15
    Info:TuyaMCU:ParseState: id 2 type 2-val len 4
    Info:TuyaMCU:ParseState: int32 120

    Added after 3 [minutes]:

    And this is the config from the newer unit along with its firmware backup

    Info:CMD:[WebApp Cmd 'tuyaMcu_sendQueryState' Result] OK
    Info:TuyaMCU:Received: 55 AA 03 07 00 05 01 01 00 01 01 12
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 7 (State) len 12
    Info:TuyaMCU:ParseState: id 1 type 1-bool len 1
    Info:TuyaMCU:ParseState: byte 1
    Info:TuyaMCU:Received: 55 AA 03 07 00 08 02 02 00 04 00 00 00 EB 04
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 7 (State) len 15
    Info:TuyaMCU:ParseState: id 2 type 2-val len 4
    Info:TuyaMCU:ParseState: int32 235
    Info:TuyaMCU:Received: 55 AA 03 07 00 08 03 02 00 04 00 00 00 A7 C1
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 7 (State) len 15
    Info:TuyaMCU:ParseState: id 3 type 2-val len 4
    Info:TuyaMCU:ParseState: int32 167
    Info:TuyaMCU:Received: 55 AA 03 07 00 05 04 04 00 01 00 17
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 7 (State) len 12
    Info:TuyaMCU:ParseState: id 4 type 4-enum len 1
    Info:TuyaMCU:ParseState: byte 0
    Info:TuyaMCU:Received: 55 AA 03 07 00 05 05 04 00 01 01 19
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 7 (State) len 12
    Info:TuyaMCU:ParseState: id 5 type 4-enum len 1
    Info:TuyaMCU:ParseState: byte 1
    Info:TuyaMCU:Received: 55 AA 03 07 00 05 09 01 00 01 00 19
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 7 (State) len 12
    Info:TuyaMCU:ParseState: id 9 type 1-bool len 1
    Info:TuyaMCU:ParseState: byte 0
    Info:TuyaMCU:Received: 55 AA 03 07 00 05 0B 05 00 01 00 1F
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 7 (State) len 12
    Info:TuyaMCU:ParseState: id 11 type 5-bitmap len 1
    Info:TuyaMCU:ParseState: byte 0
    Info:TuyaMCU:Received: 55 AA 03 07 00 08 0F 02 00 04 00 00 00 3C 62
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 7 (State) len 15
    Info:TuyaMCU:ParseState: id 15 type 2-val len 4
    Info:TuyaMCU:ParseState: int32 60
    Info:TuyaMCU:Received: 55 AA 03 07 00 08 13 02 00 04 FF FF FF F6 1D
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 7 (State) len 15
    Info:TuyaMCU:ParseState: id 19 type 2-val len 4
    Info:TuyaMCU:ParseState: int32 -10
    Info:TuyaMCU:Received: 55 AA 03 07 00 24 69 00 00 20 06 00 00 C8 08 00 00 A0 0B 1E 00 A0 0C 1E 00 A0 11 00 00 DC 16 00 00 A0 08 00 00 DC 17 00 00 A0 FD
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 7 (State) len 43
    Info:TuyaMCU:ParseState: id 105 type 0-raw len 32
    Info:TuyaMCU:Received: 55 AA 03 07 00 08 66 02 00 04 00 00 00 3C B9
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 7 (State) len 15
    Info:TuyaMCU:ParseState: id 102 type 2-val len 4
    Info:TuyaMCU:ParseState: int32 60
    Info:TuyaMCU:Received: 55 AA 03 07 00 08 65 02 00 04 00 00 00 0A 86
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 7 (State) len 15
    Info:TuyaMCU:ParseState: id 101 type 2-val len 4
    Info:TuyaMCU:ParseState: int32 10
    Info:TuyaMCU:Received: 55 AA 03 07 00 05 67 01 00 01 00 77
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 7 (State) len 12
    Info:TuyaMCU:ParseState: id 103 type 1-bool len 1
    Info:TuyaMCU:ParseState: byte 0
    Info:TuyaMCU:Received: 55 AA 03 07 00 05 6D 01 00 01 01 7E
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 7 (State) len 12
    Info:TuyaMCU:ParseState: id 109 type 1-bool len 1
    Info:TuyaMCU:ParseState: byte 1
    Info:TuyaMCU:Received: 55 AA 03 07 00 05 6C 01 00 01 00 7C
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 7 (State) len 12
    Info:TuyaMCU:ParseState: id 108 type 1-bool len 1
    Info:TuyaMCU:ParseState: byte 0
    Info:TuyaMCU:Received: 55 AA 03 07 00 05 6A 04 00 01 03 80
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 7 (State) len 12
    Info:TuyaMCU:ParseState: id 106 type 4-enum len 1
    Info:TuyaMCU:ParseState: byte 3
    Info:TuyaMCU:Received: 55 AA 03 07 00 05 6E 04 00 01 00 81
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 7 (State) len 12
    Info:TuyaMCU:ParseState: id 110 type 4-enum len 1
    Info:TuyaMCU:ParseState: byte 0
    Info:TuyaMCU:Received: 55 AA 03 07 00 05 6B 04 00 01 01 7F
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 7 (State) len 12
    Info:TuyaMCU:ParseState: id 107 type 4-enum len 1
    Info:TuyaMCU:ParseState: byte 1
    Info:TuyaMCU:Received: 55 AA 03 07 00 05 68 01 00 01 00 78
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 7 (State) len 12
    Info:TuyaMCU:ParseState: id 104 type 1-bool len 1
    Info:TuyaMCU:ParseState: byte 0
    Attachments:
    • readResult_RTL87X0C_2025-30-10-21-53-24.bin (2 MB) You must be logged in to download this attachment.
  • ADVERTISEMENT
  • #32 21737264
    gandi69
    Level 2  
    Does anyone have a config I can use a base from another thermostat maybe?

    mine is currently like this yet it doesnt really behave itself:

    // ======================================================
    // TuyaMCU Configuration for Thermostat
    // Fixed Target Temperature Slider + Clean Rules
    // ======================================================

    // -------------------- Startup --------------------
    startDriver TuyaMCU
    tuyaMcu_defWiFiState 4
    // tuyaMcu_setBaudRate 115200 // Uncomment if required for your MCU


    // =====================================================
    // POWER (DPID 1)
    // =====================================================
    setChannelLabel 1 "Power"
    setChannelType 1 Toggle
    linkTuyaMCUOutputToChannel 1 val 1
    linkTuyaMCUInputToChannel 1 val 1



    // =====================================================
    // TARGET TEMPERATURE (DPID 2)
    // =====================================================

    // ---- Channel 2: Dimmer-type slider linked directly to MCU ----
    setChannelLabel 2 "Target Temperature"
    setChannelType 2 Dimmer
    // MCU expects °C×10. We'll map 5.0–35.0 °C → 50–350
    tuyaMcu_setDimmerRange 50 350
    setChannelMin 2 50
    setChannelMax 2 350
    setChannelStep 2 5
    // Automatically synchronize both directions
    linkTuyaMCUOutputToChannel 2 val 2
    linkTuyaMCUInputToChannel 2 val 2

    // ---- Channel 21: readback in °C (converted from x10) ----
    setChannelLabel 21 "Target °C →"
    setChannelType 21 Temperature_div10
    linkTuyaMCUOutputToChannel 2 val 21



    // =====================================================
    // CURRENT TEMPERATURE (DPID 3)
    // =====================================================
    setChannelLabel 3 "← Current °C"
    setChannelType 3 Temperature_div10
    linkTuyaMCUOutputToChannel 3 val 3



    // =====================================================
    // WORK MODE (DPID 4) + STATE (DPID 5)
    // =====================================================
    setChannelLabel 4 "Work Mode"
    setChannelType 4 Enum
    setEnumLabel 4 0 "Home"
    setEnumLabel 4 1 "Auto"
    setEnumLabel 4 2 "Temporary"
    linkTuyaMCUOutputToChannel 4 val 4
    linkTuyaMCUInputToChannel 4 val 4

    setChannelLabel 5 "Work State"
    setChannelType 5 Enum
    linkTuyaMCUOutputToChannel 5 val 5



    // =====================================================
    // EXTRAS
    // =====================================================
    setChannelLabel 6 "Child Lock"
    setChannelType 6 Toggle
    linkTuyaMCUOutputToChannel 9 val 6
    linkTuyaMCUInputToChannel 6 val 9

    setChannelLabel 7 "Fault Alarm"
    setChannelType 7 Fault
    linkTuyaMCUOutputToChannel 11 val 7

    setChannelLabel 8 "Upper Temp Limit"
    setChannelType 8 Temperature
    linkTuyaMCUOutputToChannel 15 val 8
    linkTuyaMCUInputToChannel 8 val 15

    setChannelLabel 9 "Temp Correction"
    setChannelType 9 Temperature_div10
    linkTuyaMCUOutputToChannel 19 val 9
    linkTuyaMCUInputToChannel 9 val 19

    setChannelLabel 10 "Start Differential"
    setChannelType 10 Temperature_div10
    linkTuyaMCUOutputToChannel 101 val 10
    linkTuyaMCUInputToChannel 10 val 101

    setChannelLabel 11 "Sensor Limit Temp"
    setChannelType 11 Temperature
    linkTuyaMCUOutputToChannel 102 val 11
    linkTuyaMCUInputToChannel 11 val 102

    setChannelLabel 12 "Anti-Frost"
    setChannelType 12 Toggle
    linkTuyaMCUOutputToChannel 103 val 12
    linkTuyaMCUInputToChannel 12 val 103

    setChannelLabel 13 "Factory Reset"
    setChannelType 13 Button
    addEventHandler OnClick13 sendTuyaMCUValue 104 1

    setChannelLabel 15 "Backlight"
    setChannelType 15 Enum
    linkTuyaMCUOutputToChannel 106 val 15

    setChannelLabel 16 "Workdays"
    setChannelType 16 Enum
    linkTuyaMCUOutputToChannel 107 val 16

    setChannelLabel 17 "Output Polarity"
    setChannelType 17 Toggle
    linkTuyaMCUOutputToChannel 108 val 17
    linkTuyaMCUInputToChannel 17 val 108

    setChannelLabel 18 "Sound"
    setChannelType 18 Toggle
    linkTuyaMCUOutputToChannel 109 val 18
    linkTuyaMCUInputToChannel 18 val 109

    setChannelLabel 19 "Sensor Select"
    setChannelType 19 Enum
    linkTuyaMCUOutputToChannel 110 val 19
    linkTuyaMCUInputToChannel 19 val 110



    // =====================================================
    // RULES (Work-mode presets)
    // =====================================================
    removeEventHandlerAll

    // Mode 0 = Home → 21.0 °C
    addEventHandler Channel4==0 sendTuyaMCUValue 2 210

    // Mode 1 = Auto → 27.0 °C
    addEventHandler Channel4==1 sendTuyaMCUValue 2 270

    // Mode 2 = Temporary → 18.0 °C
    addEventHandler Channel4==2 sendTuyaMCUValue 2 180

    // ======================================================
  • ADVERTISEMENT
  • ADVERTISEMENT
  • #34 21737711
    gandi69
    Level 2  
    when you guys get chance can see if you can have a look at the second backup? thanks in advance
  • ADVERTISEMENT
  • #36 21737755
    gandi69
    Level 2  
    Thank you, doesn’t look like these dpld values align to me. Id2 is not the set the desired temperature
  • #37 21737835
    divadiow
    Level 38  
    hmm OK. I'm not too sure what's amiss.

    I don't know if this'll help but here something new:

    I've started again with each backup, pairing with the product key the MCU sends for each device. On initial pairing of the backup you sent me, the motif was grey again, but I noticed in the Get Update Information return from Tuya that a different firmware key (not product key - firmware key always starts with "key") was listed - key30d7e434e7084 instead of keyjkajwawthq4f5. keyjkajwawthq4f5 is seen in the boot log of your 1st device.

    Upon second pairing (in this session - probably 4th/5th total) the motif is now yellow in the app. I can't explain why.

    App screen for heating control showing 20.0°C set temperature

    BUT the schema remains the same. So seemingly nothing else to go on with that.

    I made a gandi69 pack of each firmware dump (1st one is new reset dump) alongside the raw responses from Tuya for each. 1_alt named json files are the yellow motif session responses.

    Ultimately might not help where you're at now, but it's at least a bunch of resources.

    List of JSON and BIN files related to thermostats and device data

    backup file naming logic is xxxx_<firmwarekey>_<productkey>_<factory_pin>.xxx.bin
    Attachments:
    • gandi69_thermostats.zip (1.9 MB) You must be logged in to download this attachment.
  • #38 21740130
    gandi69
    Level 2  
    is there any way I can bind a button to just pass a simple command to the mcu?

    ie: this tuyaMcu_sendState 1 bool 0

    or tuyaMcu_sendState 1 bool 1

    Ive got a few bits working on this but I cant turn the thermostat off and on without manually entering the above commands

    this is my autoexec:

    # ======================================================
    # OpenBeken Thermostat Config
    # ======================================================

    # --- Start Tuya driver and free UART TX ---
    startDriver TuyaMCU
    tuyaMcu_defWiFiState 4
    tuyaMcu_setBaudRate 9600
    logger
    baud_rate 0

    # =====================================================
    # POWER (DPID 1)
    # =====================================================
    setChannelLabel 1 "Power"
    setChannelType 1 Toggle
    linkTuyaMCUInputToChannel 1 val 1
    linkTuyaMCUOutputToChannel 1 val 1
    setFlag 10 1
    setChannelFlag 1 0

    # --- Power control rules ---
    removeEventHandlerAll
    addEventHandler Channel1==0 tuyaMcu_sendState 1 bool 0
    addEventHandler Channel1==1 tuyaMcu_sendState 1 bool 1

    # =====================================================
    # TARGET TEMPERATURE (DPID 2)
    # =====================================================
    setChannelLabel 2 "Target °C"
    setChannelType 2 Dimmer1000
    setChannelMin 2 100
    setChannelMax 2 300
    setChannelStep 2 10
    tuyaMcu_setDimmerRange 100 300
    linkTuyaMCUOutputToChannel 2 val 2
    linkTuyaMCUInputToChannel 2 val 2

    # =====================================================
    # CURRENT TEMPERATURE (DPID 3)
    # =====================================================
    setChannelLabel 3 "Current °C"
    setChannelType 3 Readonly
    setChannelMultiplier 3 0.1
    linkTuyaMCUOutputToChannel 3 val 3

    # =====================================================
    # MODE SELECTION (DPID 4)
    # =====================================================
    setChannelLabel 4 "Mode"
    setChannelType 4 Enum
    setEnumLabel 4 0 "Manual"
    setEnumLabel 4 1 "Program"
    setEnumLabel 4 2 "Temporary"
    setEnumLabel 4 3 "Leave Home"
    linkTuyaMCUOutputToChannel 4 val 4
    linkTuyaMCUInputToChannel 4 val 4

    # =====================================================
    # HEATING ACTIVE STATE (DPID 5)
    # =====================================================
    setChannelLabel 5 "Heating"
    setChannelType 5 Readonly
    linkTuyaMCUOutputToChannel 5 val 5
    setChannelHide 5 1

    # =====================================================
    # ANTI-FROST (DPID 103)
    # =====================================================
    setChannelLabel 6 "Anti-frost"
    setChannelType 6 Toggle
    linkTuyaMCUOutputToChannel 6 val 103
    linkTuyaMCUInputToChannel 6 val 103

    # =====================================================
    # BACKLIGHT (DPID 106)
    # =====================================================
    setChannelLabel 7 "Backlight"
    setChannelType 7 Enum
    setEnumLabel 7 0 "Dark"
    setEnumLabel 7 1 "Low"
    setEnumLabel 7 2 "Middle"
    setEnumLabel 7 3 "High"
    linkTuyaMCUOutputToChannel 7 val 106
    linkTuyaMCUInputToChannel 7 val 106

    # =====================================================
    # OUTPUT INVERSE (DPID 108)
    # =====================================================
    setChannelLabel 8 "Output Inverse"
    setChannelType 8 Toggle
    linkTuyaMCUOutputToChannel 8 val 108
    linkTuyaMCUInputToChannel 8 val 108

    # =====================================================
    # SOUND (DPID 109)
    # =====================================================
    setChannelLabel 9 "Sound"
    setChannelType 9 Toggle
    linkTuyaMCUOutputToChannel 9 val 109
    linkTuyaMCUInputToChannel 9 val 109

    # =====================================================
    # SENSOR SELECTION (DPID 110)
    # =====================================================
    setChannelLabel 10 "Sensor"
    setChannelType 10 Enum
    setEnumLabel 10 0 "Internal"
    setEnumLabel 10 1 "External"
    setEnumLabel 10 2 "Both"
    linkTuyaMCUOutputToChannel 10 val 110
    linkTuyaMCUInputToChannel 10 val 110

    # =====================================================
    # ERROR STATUS (DPID 11)
    # =====================================================
    setChannelLabel 11 "Error"
    setChannelType 11 Readonly
    linkTuyaMCUOutputToChannel 11 val 11
    setChannelHide 11 1

    # =====================================================
    # MODE PRESET RULES
    # =====================================================
    addEventHandler Channel4==0 tuyaMcu_sendState 2 val 210
    addEventHandler Channel4==1 tuyaMcu_sendState 2 val 230
    addEventHandler Channel4==2 tuyaMcu_sendState 2 val 180
    addEventHandler Channel4==3 tuyaMcu_sendState 2 val 150

    # =====================================================
    # DONE
    # =====================================================
    logger.log Thermostat configuration applied (no delay)

    Added after 16 [minutes]:

    AddEvent Handler is non existent so that out of the window.

    I think this device may have to be strictly MQTT from Home Assistant or manual controls, nothing really works too well via the webui on the device itself.

Topic summary

✨ The discussion focuses on identifying home heating gas thermostats compatible with OpenBeken (OBK) or similar custom firmware to replace inflexible Tuya-based units. Most Tuya devices can be flashed with OBK, but newer or less common models may require additional hardware modifications. The ME81H thermostat is referenced as a known model with existing configurations, though it is not recommended due to reliability concerns. Alternatives such as Minco and Moes thermostats are explored, with Minco units favored for their similarity to ME81H and better build quality. Users report soldering ESP8266/ESP32 modules (e.g., ESP-12F, ESP8684-WROOM-01C) to enable custom firmware. The Realtek 8710c MCU is discussed as a target for firmware replacement, with TuyaMCU protocol support in OpenRTL allowing communication over UART (RX, TX, VCC, GND). Extracting and mapping Tuya datapoint IDs (dpIDs) is critical for configuring device functions like power and temperature control. Backups of device firmware and keys (product key, factory pin) are used with tools like Tuya MCU Debugging Assistant to obtain dpID schemas. Challenges include hardware fragility during desoldering and differences in app motifs linked to firmware keys. Community members share partial configs and suggest developing tools to convert Tuya JSON schemas into OpenBeken autoexec scripts for easier setup. Overall, the process involves hardware modification, firmware flashing, dpID extraction, and manual configuration to achieve cloud-free, customizable thermostat control.
Generated by the language model.

FAQ

TL;DR: For gas-heat thermostats you can decloud Tuya models with OpenBeken/OpenRTL; one user runs an Avatto WT100 rated 16A, and an expert warns, "I wouldn't recommend ME81H... it might die after about a year." [Elektroda, insmod, post #21735774]

Why it matters: This FAQ helps DIYers pick a flashable thermostat, map dpIDs, and avoid fragile hardware pitfalls while keeping heating online.

Quick Facts

Which thermostats are people actually using with custom firmware?

In this thread, one contributor runs two Avatto WT100 units (electric heat, 16A) after soldering ESP-12F and ESP8684 modules. Another user evaluated Moes and Minco variants, plus the ME81H pattern, but reliability concerns were raised for ME81H. This gives a practical path: choose hardware others confirmed, or be ready to remap dpIDs yourself. [Elektroda, insmod, post #21735774]

Is ME81H a safe pick for flashing?

A knowledgeable user does not recommend the ME81H. They cite reviews indicating units can fail about a year in. If you still try one, plan a fallback thermostat so your heating stays online during tinkering. "I wouldn't recommend ME81H... might die after about a year." [Elektroda, insmod, post #21735774]

Does OpenBeken/OpenRTL support TuyaMCU out of the box?

Yes. The default OpenBeken release includes TuyaMCU support. That means you can start the TuyaMCU driver, query the MCU, and bind dpIDs to channels through config, without custom forks. [Elektroda, DeDaMrAz, post #21734745]

What is OpenBeken (OBK) and what is OpenRTL?

OpenBeken is community firmware for Beken-based IoT devices; OpenRTL targets Realtek RTL87xx variants. Both integrate a TuyaMCU driver so the Wi‑Fi module can exchange dpID states with the thermostat’s MCU, enabling local control and MQTT. [Elektroda, DeDaMrAz, post #21734745]

How do I discover dpIDs on my thermostat?

Start the TuyaMCU driver in the OBK/OpenRTL WebApp, then run tuyaMcu_sendQueryState. The log prints dpIDs, types, and current values, which you can map to channels. This requires the module to be soldered back. [Elektroda, divadiow, post #21736961]

What does a TuyaMCU product info key look like, and why do I care?

When you start TuyaMCU, the device reports product info including a product key (p) and version. Example: {"p":"22m2ytawuenfen5b","v":"1.0.0","m":0}. That key influences app schema and helps interpret dpIDs for local control. [Elektroda, gandi69, post #21736994]

How are temperatures encoded over TuyaMCU?

Tuya encodes temperatures as integers scaled by 10. For example, 250 means 25.0°C. Many configs therefore set Dimmer ranges like 50–350 to represent 5.0–35.0°C. "Integer value; e.g., 250 means 25.0°." [Elektroda, divadiow, post #21736672]

My PCB pads lifted during rework—what minimum connections are required to flash?

You need only four lines to talk to the module: RX, TX, VCC, and GND. If pads lift, carefully scrape traces and solder to exposed copper, but consider a sacrificial unit for testing since mechanical integrity may be compromised. [Elektroda, insmod, post #21736417]

Can I control power with a button or rule instead of typing commands?

Yes. Users bind Channel1 (Toggle) to dpID 1 and add rules that send tuyaMcu_sendState 1 bool 0/1 on changes. This enables on/off from the WebUI, MQTT, or Home Assistant. Ensure addEventHandler syntax matches your firmware build. [Elektroda, gandi69, post #21740130]

What baud rate should I use on the UART between Wi‑Fi module and MCU?

Thread examples show 9600 or 115200. One working OpenBeken autoexec sets tuyaMcu_setBaudRate 9600 and frees UART TX, while others reference 115200 as a comment. Start with 9600, then adjust if logs show framing errors. [Elektroda, gandi69, post #21740130]

How do I map dpIDs to friendly channels in OpenBeken?

Use linkTuyaMCUOutputToChannel and linkTuyaMCUInputToChannel to bind dpIDs to labeled channels. Set ChannelType to match (Toggle, Enum, Temperature_div10, etc.). Then apply ranges, steps, and labels for clean UI and MQTT. [Elektroda, gandi69, post #21737264]

What’s an example 3-step flow to fetch and compare dpIDs?

  1. Start TuyaMCU driver in the Logs tab. 2. Run tuyaMcu_sendQueryState and copy the printed dpID list. 3. Compare results to the schema you extracted or were given, then update channel bindings accordingly. [Elektroda, divadiow, post #21737012]

Why do app motifs differ (grey vs yellow) even with the same hardware?

Motifs can switch after pairing due to firmware key and schema pulled during onboarding. One user saw grey first, then yellow after another pairing, but the schema stayed the same. Visuals can differ while dpIDs remain constant. [Elektroda, divadiow, post #21737835]

Can I keep heating online while experimenting?

Yes. One approach is to buy a replacement thermostat to run the boiler, then modify your original unit offline. This prevents heat outages if flashing fails or a board suffers pad damage. [Elektroda, gandi69, post #21733936]

Edge case: Why does my ‘Target Temperature’ not respond on dpID 2?

Different product keys can remap dpIDs. A user found dpID 2 did not set the target on a newer unit despite similar UI. Always re-query dpIDs after flashing and bind the live map, not a template. [Elektroda, gandi69, post #21737755]

What are typical modes and extras I can expose to Home Assistant?

Common dpIDs include power (1), set temp, current temp, mode, work state, child lock, sound, frost, backlight, sensor select, differential, and output polarity. OBK can auto-discover, or you can add manually in HA. [Elektroda, insmod, post #21735774]
Generated by the language model.
ADVERTISEMENT