logo elektroda
logo elektroda
X
logo elektroda

How to Change Firmware on PH-W218 WiFi 8-in-1 Water Quality Tester with CB3S Chip?

Upright6771 13287 99
Best answers

How can I change the firmware on a PH-W218 water quality tester with a CB3S chip and get started with Home Assistant integration?

Treat it as a TuyaMCU device and start with the TuyaMCU flashing/setup guide for dpID mapping in Home Assistant; since you already know the datapoints, the integration should be straightforward [#21131597] Before changing anything, make a 2 MB backup with the BK7231GUIFlashTool so you can restore the original firmware later [#21132998] The display should keep working after flashing because the Wi‑Fi module only handles communication and the secondary MCU does the actual processing, so you mainly need to configure OpenBeken to send/receive the right data [#21134253] For the CB3S flashing step, use ltchiptool with TX→RX, RX→TX, GND→GND, VCC→VCC; start the read/flash process and then power the module, trying 3 V first and 5 V if needed [#21134490] If a channel type is missing, you can use ReadOnly or custom MQTT/Home Assistant discovery, and the firmware itself can be updated via OTA to the latest public release when needed [#21132998] [#21137789] [#21137820]
Generated by the language model.
ADVERTISEMENT
  • #1 21131505
    Upright6771
    Level 4  
    Posts: 20
    Rate: 1
    Board Language: german
    Hi there,

    I am interested to change Firmware of my PH-W218.

    There is an CB3S Chip on the Board.

    Datapoints, that the Device support:

    8: temp_current
    101: sensor_list
    102: temp_warn_max
    103: temp_warn_min
    106: ph_current
    107: ph_warn_max
    108: ph_warn_min
    111: tds_current
    112: tds_warn_max
    113: tds_warn_min
    116: ec_current
    117: ec_warn_max
    118: ec_warn_min
    121: salinity_current
    122: salinity_warn_max
    123: salinity_warn_min
    126: pro_current
    127: pro_warn_max
    128: pro_warn_min
    131: orp_current
    132: orp_warn_max
    133: orp_warn_min
    136: cf_current
    137: cf_warn_max
    138: cf_warn_min
    141: rh_current
    142: rh_warn_max
    143: rh_warn_min

    What is the best way, to start with that new Device? I am already familiar with ESPHome and Home Assistant.

    Close-up of the interior of a PH-W218 device showing a CB3S chip. Display of a PH-W218 water quality tester with three screens.
  • ADVERTISEMENT
  • #2 21131597
    p.kaczmarek2
    Moderator Smart Home
    Posts: 14400
    Help: 650
    Rate: 12330
    This looks like a TuyaMCU device. We have a very good TuyaMCU support. Please check out the following guide:
    TuyaMCU flashing, setup and configuration guide - configure dpIDs for Home Assistant
    It seems you already have done the most important part - you know the meaning of dpIDs. The futher integration should be very easy. I can still help, if something is not clear, but the guide should show the most basic steps.
    Helpful post? Buy me a coffee.
  • #3 21131623
    Upright6771
    Level 4  
    Posts: 20
    Rate: 1
    Board Language: german
    Thank you, I will check your link in a quiet moment with a cup of coffee. :-)

    Is there a way to backup the old firmware to go back to stock if there is something not working?

    Are you know which Channel Type I do need to map for Orp and PH for example?
  • #4 21132970
    Nordlicht77
    Level 9  
    Posts: 67
    Board Language: german
    @Upright6771

    Hi
    Haben es es geschafft das Gerät zu flashen

    Hi
    Were you able to flash the device?
  • ADVERTISEMENT
  • #5 21132998
    p.kaczmarek2
    Moderator Smart Home
    Posts: 14400
    Help: 650
    Rate: 12330
    Upright6771 wrote:

    Is there a way to backup the old firmware to go back to stock if there is something not working?

    Of course. You can take a 2MB backup with our flasher and restore it later:
    https://github.com/openshwprojects/BK7231GUIFlashTool


    Upright6771 wrote:

    Are you know which Channel Type I do need to map for Orp and PH for example?

    If a given channel type is missing, I can add it for you. You can also just use publishFile to make custom HASS Discovery packet, or just use ReadOnly channel type
    Helpful post? Buy me a coffee.
  • #6 21133907
    Upright6771
    Level 4  
    Posts: 20
    Rate: 1
    Board Language: german
    Good morning,
    First of all, thank you very much for your support.

    I still have a question that is bothering me and to which I have not found an answer.

    The device has 3 displays. Do I have to control these via Openbeken or will the display remain as it is with the original firmware?

    Can this be answered in general terms from other projects?

    Have attached a new Image in the First Post.
  • #7 21134253
    p.kaczmarek2
    Moderator Smart Home
    Posts: 14400
    Help: 650
    Rate: 12330
    Please consult TuyaMCU guide:
    TuyaMCU flashing, setup and configuration guide - configure dpIDs for Home Assistant
    TuyaMCU devices works in such a way that WiFI module only does the communication and the secondary MCU does all the processing. So, displays will keep working after migrating to OpenBeken, as in the original firmware, we just may need to configure OBK to send the require data to displays, but most of the data should be handled by the MCU itself.
    Helpful post? Buy me a coffee.
  • #8 21134490
    Nordlicht77
    Level 9  
    Posts: 67
    Board Language: german
    yes, everything can still be operated on the display
    After you do that TuyaMCU guide have processed
    Please download ltchiptool
    And connect the following pin
    CB3S FTDI
    TX -> RX
    RX -> TX
    GND -> GND
    VCC -> VCC
    Then try the following setting, see picture

    Screenshot of ltchiptool v4.1.1.1 program with settings for device operation.

    Press start and then pull VCC from FTDI
    If you also receive a window with chip data, we are one step further
    Try with 3 volts and if it doesn't work with 5 volts
    I want to know if it was just a coincidence for me, make sure the Get Chip Info item is selected
  • #9 21134728
    Upright6771
    Level 4  
    Posts: 20
    Rate: 1
    Board Language: german
    Hi,

    I have successfully created a Backup file and after that I wrote new firmware to the chip.

    I have tried to reset by switch power off and on, but the AP is not visible.

    I also have tried to write the OBK config.
  • #10 21134800
    p.kaczmarek2
    Moderator Smart Home
    Posts: 14400
    Help: 650
    Rate: 12330
    Is the WiFi module back in circuit or how do you power it? What does the TX2 log say? Have you tried writing your SSID/pass directly with OBK config tool via flash?
    Helpful post? Buy me a coffee.
  • ADVERTISEMENT
  • #11 21134812
    Upright6771
    Level 4  
    Posts: 20
    Rate: 1
    Board Language: german
    Thanks for the tip about the power supply. My UART converter wasn't supplying enough power. I can now see the AP on my lab power supply.
  • #12 21134847
    p.kaczmarek2
    Moderator Smart Home
    Posts: 14400
    Help: 650
    Rate: 12330
    I'm good to hear that we have a progress. Do you have a 2MB backup? If you've done that before pairing with Tuya, please consider sharing it. If it was paired with Tuya already ,then don't share - better safe than sorry. Now it's time to see if we can configure OBK...
    Helpful post? Buy me a coffee.
  • #13 21134942
    Upright6771
    Level 4  
    Posts: 20
    Rate: 1
    Board Language: german
    Yes, I have a backup, but device was connected with tuya cloud.

    My first autoexec.bat looks like:

    // Start TuyaMCu driver
    startDriver TuyaMCU
    // set TuyaMCU baud rate
    tuyaMcu_setBaudRate 9600
    // set TuyaMCU default wifi state 0x04, which means "paired",
    // because some TuyaMCU MCUs will not report all data
    // unless they think they are connected to cloud
    tuyaMcu_defWiFiState 4
    
    // temp_current
    setChannelType 1 temperature
    setChannelLabel 1 "Current Temperature"
    linkTuyaMCUOutputToChannel 6 val 1
    
    // ph_current
    setChannelType 2 ReadOnly
    setChannelLabel 2 "Current pH"
    linkTuyaMCUOutputToChannel 106 0 2
    
    // tds_current
    setChannelType 3 ReadOnly
    setChannelLabel 3 "Current TDS"
    linkTuyaMCUOutputToChannel 111 0 3
    
    // orp_current
    setChannelType 4 ReadOnly
    setChannelLabel 4 "Current ORP"
    linkTuyaMCUOutputToChannel 131 0 4
    


    But the Result:

    Screen of the OpenBK_BA8200022 interface displaying channel data and configuration options.

    Questions:
    1) Why are all values = 0?
    2) Where is Temperature 0.0C (8) come from? <- solved by myself by define the Channeltype in the Config Tab
    In the Log Browser, I can see some things like this: Info:TuyaMCU:Received: 55 AA 03 00 00 01 01 04
  • ADVERTISEMENT
  • #14 21134978
    Nordlicht77
    Level 9  
    Posts: 67
    Board Language: german
    It looks like this to me, but now the output doesn't exactly match the point in the display


    Code: Arduino
    Log in, to see the code
  • #15 21134987
    p.kaczmarek2
    Moderator Smart Home
    Posts: 14400
    Help: 650
    Rate: 12330
    
    linkTuyaMCUOutputToChannel 106 0 2
    

    The 0 here (raw) does not look correct.

    Can you try adding quering the state to see if it updates the values? tuyaMcu_sendQueryState

    You don't need tmSensor on non-battery powered device I guess.
    Helpful post? Buy me a coffee.
  • #16 21134989
    divadiow
    Level 38  
    Posts: 4846
    Help: 421
    Rate: 853
    Upright6771 wrote:
    Yes, I have a backup, but device was connected with tuya cloud.


    you could always upload the config file though
    OpenBK_BK7231N_CB2S_USB_PLUG user interface with control options for the plug and USB ports.
  • #17 21135004
    Nordlicht77
    Level 9  
    Posts: 67
    Board Language: german
    My data is here, it should be the same

    >>21124305
  • #18 21135009
    Upright6771
    Level 4  
    Posts: 20
    Rate: 1
    Board Language: german
    p.kaczmarek2 wrote:

    Can you try adding querying the state to see if it updates the values? tuyaMcu_sendQueryState

    I have - there is no update.

    Nordlicht77 wrote:
    My data is here, it should be the same
    >>21124305

    So you are no further ahead than me? ;-)
  • #19 21135019
    p.kaczmarek2
    Moderator Smart Home
    Posts: 14400
    Help: 650
    Rate: 12330
    It looks like you need channel types for things like SALT, etc, but I personally, at the moment, don't even know what those units mean.

    Would you be able to provide the preferred Home Assistant classes for the mentioned channel types? I can add them for you even today, but I am not sure which HA classes I should use for them...
    Helpful post? Buy me a coffee.
  • #20 21135022
    Upright6771
    Level 4  
    Posts: 20
    Rate: 1
    Board Language: german
    I can do that, but something as simple as temperature doesn't work.

    Shouldn't that at least work?
  • #21 21135029
    Nordlicht77
    Level 9  
    Posts: 67
    Board Language: german
    Yes
    I think you also have the values ​​problem with the point and that
    Apparently PH TDS and other water data icons are missing in the firmware
    There will definitely be more different devices to come
    I wrote about it in my config as it currently is in Gui
    and underneath as it should be
    //currently : Temperature 389.0C (PH current)
    //correct: 3.89 PH (PH current)
  • #22 21135039
    Upright6771
    Level 4  
    Posts: 20
    Rate: 1
    Board Language: german
    Upright6771 wrote:
    p.kaczmarek2 wrote:

    Can you try adding quering the state to see if it updates the values? tuyaMcu_sendQueryState

    I have - there is no update.

    Here a small copy from my Log. Maybe it helps?

    Info:TuyaMCU:Received: 55 AA 03 2B 00 00 2D 
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 43 (NetworkStatus) len 7
    Info:TuyaMCU:ProcessIncoming: (test for S09 calendar/IR device) received TUYA_CMD_NETWORK_STATUS 0x2B 
    Debug:TuyaMCU:SendNetworkStatus: sending status 0x3 to MCU 
    Info:TuyaMCU:Received: 55 AA 03 2B 00 00 2D 
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 43 (NetworkStatus) len 7
    Info:TuyaMCU:ProcessIncoming: (test for S09 calendar/IR device) received TUYA_CMD_NETWORK_STATUS 0x2B 
    Debug:TuyaMCU:SendNetworkStatus: sending status 0x3 to MCU 
    Info:TuyaMCU:Received: 55 AA 03 2B 00 00 2D 
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 43 (NetworkStatus) len 7
    Info:TuyaMCU:ProcessIncoming: (test for S09 calendar/IR device) received TUYA_CMD_NETWORK_STATUS 0x2B 
    Debug:TuyaMCU:SendNetworkStatus: sending status 0x3 to MCU 
    Info:TuyaMCU:Received: 55 AA 03 2B 00 00 2D 
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 43 (NetworkStatus) len 7
    Info:TuyaMCU:ProcessIncoming: (test for S09 calendar/IR device) received TUYA_CMD_NETWORK_STATUS 0x2B 
    Debug:TuyaMCU:SendNetworkStatus: sending status 0x3 to MCU 
    Info:TuyaMCU:Received: 55 AA 03 2B 00 00 2D 
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 43 (NetworkStatus) len 7
    Info:TuyaMCU:ProcessIncoming: (test for S09 calendar/IR device) received TUYA_CMD_NETWORK_STATUS 0x2B 
    Debug:TuyaMCU:SendNetworkStatus: sending status 0x3 to MCU 
    Info:TuyaMCU:Received: 55 AA 03 2B 00 00 2D 
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 43 (NetworkStatus) len 7
    Info:TuyaMCU:ProcessIncoming: (test for S09 calendar/IR device) received TUYA_CMD_NETWORK_STATUS 0x2B 
    Debug:TuyaMCU:SendNetworkStatus: sending status 0x3 to MCU 
    Info:TuyaMCU:Received: 55 AA 03 2B 00 00 2D 
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 43 (NetworkStatus) len 7
    Info:TuyaMCU:ProcessIncoming: (test for S09 calendar/IR device) received TUYA_CMD_NETWORK_STATUS 0x2B 
    Debug:TuyaMCU:SendNetworkStatus: sending status 0x3 to MCU 
    Info:TuyaMCU:Received: 55 AA 03 2B 00 00 2D 
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 43 (NetworkStatus) len 7
    Info:TuyaMCU:ProcessIncoming: (test for S09 calendar/IR device) received TUYA_CMD_NETWORK_STATUS 0x2B 
    Debug:TuyaMCU:SendNetworkStatus: sending status 0x3 to MCU 
    Info:TuyaMCU:Received: 55 AA 03 2B 00 00 2D 
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 43 (NetworkStatus) len 7
    Info:TuyaMCU:ProcessIncoming: (test for S09 calendar/IR device) received TUYA_CMD_NETWORK_STATUS 0x2B 
    Debug:TuyaMCU:SendNetworkStatus: sending status 0x3 to MCU 
    ExtraDebug:TuyaMCU:TuyaMCU heartbeat_valid = 1, product_information_valid=1, self_processing_mode = 1, wifi_state_valid = 1, wifi_state_timer=51
    Info:TuyaMCU:Received: 55 AA 03 00 00 01 01 04 
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 0 (Hearbeat) len 8
    ExtraDebug:TuyaMCU:TuyaMCU heartbeat_valid = 1, product_information_valid=1, self_processing_mode = 1, wifi_state_valid = 1, wifi_state_timer=51
    ExtraDebug:TuyaMCU:Will send TUYA_CMD_QUERY_STATE (state_updated==false, try 991).
    ExtraDebug:TuyaMCU:TuyaMCU heartbeat_valid = 1, product_information_valid=1, self_processing_mode = 1, wifi_state_valid = 1, wifi_state_timer=51
    ExtraDebug:TuyaMCU:TuyaMCU heartbeat_valid = 1, product_information_valid=1, self_processing_mode = 1, wifi_state_valid = 1, wifi_state_timer=52
    ExtraDebug:TuyaMCU:Will send TUYA_CMD_QUERY_STATE (state_updated==false, try 993).
    ExtraDebug:TuyaMCU:TuyaMCU heartbeat_valid = 1, product_information_valid=1, self_processing_mode = 1, wifi_state_valid = 1, wifi_state_timer=52
    Info:TuyaMCU:Received: 55 AA 03 00 00 01 01 04 
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 0 (Hearbeat) len 8
    ExtraDebug:TuyaMCU:TuyaMCU heartbeat_valid = 1, product_information_valid=1, self_processing_mode = 1, wifi_state_valid = 1, wifi_state_timer=52
    ExtraDebug:TuyaMCU:TuyaMCU heartbeat_valid = 1, product_information_valid=1, self_processing_mode = 1, wifi_state_valid = 1, wifi_state_timer=53
    ExtraDebug:TuyaMCU:Will send TUYA_CMD_QUERY_STATE (state_updated==false, try 995).
    ExtraDebug:TuyaMCU:TuyaMCU heartbeat_valid = 1, product_information_valid=1, self_processing_mode = 1, wifi_state_valid = 1, wifi_state_timer=53
    ExtraDebug:TuyaMCU:TuyaMCU heartbeat_valid = 1, product_information_valid=1, self_processing_mode = 1, wifi_state_valid = 1, wifi_state_timer=54
    Info:TuyaMCU:Received: 55 AA 03 00 00 01 01 04 
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 0 (Hearbeat) len 8
    ExtraDebug:TuyaMCU:TuyaMCU heartbeat_valid = 1, product_information_valid=1, self_processing_mode = 1, wifi_state_valid = 1, wifi_state_timer=54
    ExtraDebug:TuyaMCU:Will send TUYA_CMD_QUERY_STATE (state_updated==false, try 997).
    ExtraDebug:TuyaMCU:TuyaMCU heartbeat_valid = 1, product_information_valid=1, self_processing_mode = 1, wifi_state_valid = 1, wifi_state_timer=54
    ExtraDebug:TuyaMCU:TuyaMCU heartbeat_valid = 1, product_information_valid=1, self_processing_mode = 1, wifi_state_valid = 1, wifi_state_timer=55
    ExtraDebug:TuyaMCU:Will send TUYA_CMD_QUERY_STATE (state_updated==false, try 999).
    


    Hinzugefügt nach 2 [Stunden] 15 [Minuten]:

    New Update.

    I can set tuyaMcu_defWiFiState 4, but nothing happens (log say OK)

    BUT: After I configure my mqtt credentials, the CHannels will be filled with values.

    Now I have configured all Channels. Maybe it could help, that there are readOnly_div10, readOnly_div100, readOnly_div1000. After that we can finetune, to add new types for orp, salt and so on :-)
  • #23 21136053
    Nordlicht77
    Level 9  
    Posts: 67
    Board Language: german
    It would be nice if we could format the numbers.
    I also use openHAB
  • #24 21137789
    p.kaczmarek2
    Moderator Smart Home
    Posts: 14400
    Help: 650
    Rate: 12330
    No problem, I can add more ReadOnly types, here they are:
    https://github.com/openshwprojects/OpenBK7231...mmit/22dec3702f57f164b85204b2ca7a2c73a4c6b4e9

    That being said, you don't even need channelTypes to connect dpID data to HA or other environment. You can just script publish commands manually and publish data under the whatever names you want.
    You can also do:
    
    publishFloat myXYZ $CH10*0.1
    
    Helpful post? Buy me a coffee.
  • #25 21137796
    Upright6771
    Level 4  
    Posts: 20
    Rate: 1
    Board Language: german
    Thank you,

    I will try. How can I upload this commit into my Firmware?
  • #26 21137820
    p.kaczmarek2
    Moderator Smart Home
    Posts: 14400
    Help: 650
    Rate: 12330
    This is a public commit, so you can just do OTA to latest release:
    Screenshot of a GitHub repository showing file and release information.
    Helpful post? Buy me a coffee.
  • #27 21137829
    Upright6771
    Level 4  
    Posts: 20
    Rate: 1
    Board Language: german
    Oh, sorry. I could have seen that. I guess I was just too quick with writing...

    Looks good.

    Screen with pool data, including temperature, pH, ORP, and TDS.

    Tonight or tomorrow I will propose some native new data types (with suffix for MQTT so that the value arrives directly cleanly in Home Assistant)
  • #28 21138660
    Nordlicht77
    Level 9  
    Posts: 67
    Board Language: german
    Hello
    There is also a command that does round
    addRepeatingEvent 30 -1 publishFloat ph_aktuell $CH4/100
    Comes to me 7.400000
    it should be 7.40
  • #29 21138792
    p.kaczmarek2
    Moderator Smart Home
    Posts: 14400
    Help: 650
    Rate: 12330
    I see, I've added an argument for publishFloat so you can specify number of decimal places:
    https://github.com/openshwprojects/OpenBK7231...mmit/e9a092fa5848ae13c5728e0d3e387cd881d750ef
    Your code should be now:
    
    publishFloat ph_aktuell $CH4/100 0 2
    

    0 stands for "bRemoveGET" and 2 is "2 decimal places" so it will be 7.40
    Helpful post? Buy me a coffee.
  • #30 21139852
    Nordlicht77
    Level 9  
    Posts: 67
    Board Language: german
    I no longer get any data via sendQueryState

    clearConfig didn't work either

    tuyaMcu_sendRSSI

    Info:CMD:[WebApp Cmd 'tuyaMcu_sendRSSI' Result] OK
    Info:MAIN:Time 474, idle 190057/s, free 73584, MQTT 0(29), bWifi 1, secondsWithNoPing 400, socks 2/38

    tuyaMcu_sendQueryState
    Info:CMD:[WebApp Cmd 'tuyaMcu_sendQueryState' Result] OK
    Info:MAIN:Time 703, idle 206017/s, free 73400, MQTT 1(41), bWifi 1, secondsWithNoPing 629, socks 2/38

    It could be that something is wrong here

    ExtraDebug:TuyaMCU:TuyaMCU heartbeat_valid = 0, product_information_valid=0, self_processing_mode = 1, wifi_state_valid = 0, wifi_state_timer=0

Topic summary

✨ The discussion focuses on changing the firmware of the PH-W218 WiFi 8-in-1 Water Quality Tester equipped with a CB3S chip, which uses a TuyaMCU architecture. Users share experiences and solutions for flashing the device with OpenBeken firmware, integrating it with Home Assistant, and handling TuyaMCU datapoints (dpIDs) for various water quality parameters such as temperature, pH, TDS, ORP, salinity, and others. Key technical points include establishing reliable UART communication between the WiFi module and the secondary MCU, setting the correct baud rate (commonly 9600), and ensuring physical RX/TX connections are intact to receive TuyaMCU heartbeat packets. Firmware backup and restoration using BK7231GUIFlashTool is recommended before flashing. Configuration involves scripting autoexec.bat with commands to start drivers, define channel types, link dpIDs, and publish data with proper formatting and decimal precision. Challenges discussed include initial lack of data updates due to connection issues, formatting numeric values correctly, and occasional unreliability of tuyaMcu_sendState commands. Users also explore disabling unnecessary drivers like tmSensor and managing button labels. OTA updates and applying recent OpenBeken commits add support for missing channel types and improve functionality. For calibration reset issues on the original Tuya firmware, suggestions include using the Tuya app's "Remove and wipe data" option. Overall, successful firmware replacement and integration require careful hardware inspection, correct UART settings, and tailored configuration scripts to map sensor data accurately to Home Assistant.
Generated by the language model.

FAQ

TL;DR: With a 2MB backup and the right baud rate, the PH-W218 can be moved to OpenBeken; as one expert put it, "fakeTuyaPacket simulated TuyaMCU" and should not be used to write real thresholds. This FAQ helps Home Assistant and OpenBeken users flash the CB3S module, confirm TuyaMCU communication, and map pH, ORP, TDS, EC, and temperature correctly. [#21146899]

Why it matters: The thread shows that most PH-W218 failures come from power, baud, UART traces, or wrong command choice, not from the sensor hardware itself.

Option Use it for Worked result in thread Main risk
9600 baud Normal TuyaMCU link on this device Stable values reported after full setup No data if the module is miswired
115200 baud Diagnostic retry when 9600 fails Some users saw values, but also more errors Noisy logs and unstable parsing
fakeTuyaPacket Testing parser input only Changes Wi-Fi-side values only Does not write real MCU settings
tuyaMcu_sendState Writing real dpID values to TuyaMCU Correct method for thresholds Can fail if sent too early after boot

Key insight: OpenBeken replaces only the CB3S Wi-Fi module. The PH-W218’s secondary MCU still runs the measurement logic and keeps the built-in displays working, so success depends on reliable TuyaMCU serial communication, not on rewriting the whole device. [#21134253]

Quick Facts

  • The recommended safety step is a 2MB firmware backup with the BK7231 GUI flasher before any flashing, so you can restore stock later if needed. [#21132998]
  • The PH-W218 thread maps at least 17 dpIDs, including 8 for temperature, 106 for pH, 111 for TDS, 116 for EC, 121 for salinity, 131 for ORP, and 141 for RH. [#21131505]
  • The device has 3 built-in displays, and they continue to work after migrating to OpenBeken because the secondary MCU still handles most processing. [#21134253]
  • A practical startup script in the thread uses tuyaMcu_setBaudRate 9600, delay_s 120 on first start, and a 15-second loop for periodic checks and MQTT publishing. [#21203138]
  • For Home Assistant formatting, publishFloat gained a decimal-place argument, so publishFloat ph_aktuell $CH4/100 0 2 publishes 7.40 instead of 7.400000. [#21138792]

How do I start flashing and configuring a PH-W218 WiFi 8-in-1 water quality tester with a CB3S chip for OpenBeken and Home Assistant?

Start by treating the PH-W218 as a TuyaMCU device with a CB3S Wi-Fi module. 1. Make a full backup first, then flash OpenBeken to the CB3S. 2. Start the TuyaMCU driver, set the baud, and map dpIDs such as 8, 106, and 111 to channels. 3. Check the Web App log and only then add MQTT or Home Assistant publishing. The thread’s working examples use tuyaMcu_defWiFiState 4, then channel mapping, then tuyaMcu_sendQueryState. [#21131597]

What is TuyaMCU, and how does it affect firmware replacement on the PH-W218 water quality tester?

"TuyaMCU" is a device architecture that uses a separate secondary MCU to run measurements and local logic, while the Wi-Fi module only handles communication. On the PH-W218, OpenBeken replaces the CB3S Wi-Fi firmware, not the main measurement controller. That is why the three displays keep working after migration, and why success depends on UART communication between the Wi-Fi board and the original MCU. [#21134253]

What are Tuya dpIDs in the PH-W218, and how do I map datapoints like pH, ORP, TDS, EC, and temperature to OpenBeken channels?

"dpID" is a Tuya datapoint identifier that labels one sensor or setting value, such as pH, temperature, or an alarm threshold, and lets OpenBeken bind that value to a channel. In this thread, temperature is dpID 8, pH is 106, TDS is 111, EC is 116, salinity is 121, ORP is 131, and RH is 141. Use setChannelType, setChannelLabel, and linkTuyaMCUOutputToChannel [dpID] val [channel] to map them. [#21131505]

What is the best way to back up the original PH-W218 firmware before flashing OpenBeken, and how can I restore it later?

Use the flasher to make a 2MB backup before you change anything. The thread explicitly recommends the BK7231 GUI Flash Tool for this job, and the same tool can later restore the saved image if you want to return to stock firmware. One warning from the thread: do not share a backup if the device was already paired to Tuya Cloud. [#21132998]

Why does the OpenBeken AP sometimes not appear after flashing a CB3S module, and how can I fix power supply problems during setup?

The AP can stay invisible when the UART adapter does not supply enough current. In the thread, the flashed module booted correctly only after the user switched from a weak UART converter supply to a lab power supply. If the flash succeeds but no AP appears, first check power quality before changing firmware again. [#21134812]

How do I check whether the PH-W218 WiFi module is actually communicating with the TuyaMCU, including heartbeats and query-state responses in the Web App log?

Open the Web App log and look for real TuyaMCU traffic, not just command results. 1. Start TuyaMCU, save the config, and power the whole device fully off and on. 2. In the log, look for heartbeat or state lines such as cmd 0 (Hearbeat) or cmd 7 (State). 3. If needed, run tuyaMcu_sendQueryState and verify that the MCU actually answers. A console OK only means the command was accepted, not that the MCU replied. [#21202813]

Why do all sensor values stay at zero in OpenBeken even though the PH-W218 display still shows readings?

Values stay at zero when the Wi-Fi module is not receiving usable TuyaMCU state packets. In the thread, this happened with wrong mapping syntax, missing MQTT-triggered state behavior, missing product information, bad UART links, and even a hairline crack on the RX/TX path. The display still showed readings because the original MCU continued measuring locally. [#21146858]

How should I choose between 9600 and 115200 baud rate for TuyaMCU communication on the PH-W218, and what symptoms indicate the wrong setting?

Use 9600 baud as the preferred setting for this PH-W218, and test 115200 only as a fallback. The thread ended with a stable working setup at tuyaMcu_setBaudRate 9600, while 115200 produced values for one user but also “a lot of errors.” If neither speed shows TuyaMCU messages after a full power cycle, suspect flags, broken traces, or lost UART connection instead of firmware logic. [#21203138]

What happens to the three built-in displays after replacing the PH-W218 WiFi firmware with OpenBeken, and what still remains controlled by the original MCU?

The three displays normally keep working after the Wi-Fi firmware change. The PH-W218 uses a secondary MCU for processing, so the MCU continues handling most measurement and display behavior while OpenBeken handles Wi-Fi, MQTT, and Home Assistant integration on the CB3S. That separation is why the device can still look normal on its screen even when OpenBeken sees zero values. [#21134253]

How can I send or set alarm threshold values like temperature max/min, pH max/min, TDS max/min, and ORP max/min correctly in OpenBeken without misusing fakeTuyaPacket?

Send real threshold values with tuyaMcu_sendState, not with simulated packets. The maintainer’s example was a short boot sequence such as delay_s 1, then tuyaMcu_sendState 103 2 2300, then another delay before the next dpID. He also warned that addRepeatingEvent 15 -1 tuyaMcu_sendState ... sends forever every 15 seconds, which is usually wrong for fixed alarm limits. [#21147072]

Why is fakeTuyaPacket not the right way to write real values back to the PH-W218 TuyaMCU, and when should tuyaMcu_sendState be used instead?

fakeTuyaPacket is the wrong tool because it only simulates packets arriving from the MCU to the Wi-Fi module. It can change what OpenBeken displays or publishes, but it does not write real settings into the PH-W218 controller. Use tuyaMcu_sendState [dpID] [dpType] [value] whenever you want the actual TuyaMCU to receive a threshold or setting and calculate the checksum automatically. [#21146899]

How can I format PH, temperature, TDS, and ORP values correctly for MQTT and Home Assistant, including decimal scaling and publishFloat rounding?

Use channel scaling plus publishFloat formatting. The thread shows pH published as $CH4/100 0 2, so a raw value like 740 becomes 7.40; temperature used /10, while ORP was often published with 0 decimals. For PH specifically, the maintainer added a decimal-place argument, so publishFloat ph_aktuell $CH4/100 0 2 fixes outputs like 7.400000 and publishes 7.40 instead. [#21138792]

What causes Home Assistant to reject the PH sensor discovery message with 'unit of measurement Ph is not valid together with device class ph', and how can I fix it?

Home Assistant rejects it when the discovery payload still contains unit_of_measurement: Ph together with device class ph. In the thread, a fix was proposed so the PH channel type stops publishing unit_of_meas, and the maintainer later said current releases should not send it for PH. If the error returns, remove the device and re-pair through Home Assistant discovery so stale discovery data is cleared. [#21645909]

How can I troubleshoot a PH-W218 that stopped reporting TuyaMCU data after flashing, including checking UART flags, broken RX/TX traces, and full power-cycle behavior?

First verify physical UART integrity, then settings. 1. Fully cut power for about 15 seconds, not just a soft restart. 2. Check that no wrong flag redirects communication, such as using the second UART. 3. Inspect RX/TX lines closely; one user found a hairline crack only with a magnifier and restored communication by bridging it with solder. If no TuyaMCU messages appear at 9600 or 115200, the fault is usually wiring, flags, or a broken trace. [#21146858]

How do I open the PH-W218 enclosure safely after removing the four visible screws, and where are the hidden clips or internal fixings that still hold it together?

The thread does not provide a confirmed opening procedure after the four visible screws. A later user asked whether hidden fixings or clips still held the enclosure, but no posted answer in the supplied thread explains where those clips are or how to release them safely. The safest conclusion from this thread alone is that the enclosure may have additional internal retention points beyond the four screws. [#21763873]
Generated by the language model.
ADVERTISEMENT