logo elektroda
logo elektroda
X
logo elektroda

Tuya/IHSENO T1-U-HL Soil Tester Sensor: BK7238, MindMotion 32G0001 TuyaMCU, HGSEMI C5551 Analysis

divadiow  21 1791 Cool? (+4)
📢 Listen (AI):

TL;DR

  • Teardown of an IHSENO Tuya T1-U-HL soil tester sensor built around a Beken BK7238, MindMotion MM32G0001 TuyaMCU, and HGSEMI C5551 WSAH.
  • The PCB exposes the T1-U-HL module and test pads; flash reading worked in BK7238 mode, but the MM32 MCU blocked RX1/TX1 access unless the module was removed.
  • Boot logs were captured at 115200 baud from TX2, and the module was paired in the Tuya app using product ID rknwi0ctbbghzgla.
  • OpenBK7238 was flashed over factory firmware, the app revealed dpIDs, and the device ultimately behaved like a temperature and humidity sensor.
  • Keeping the factory bootloader broke OTA updates, and after reflashing the device gave only about 20 seconds before the MCU cut power, with no TuyaMCU replies yet.
Generated by the language model.
Tuya T1-U-HL module with labeled signal and power pins

Here I'll present my findings with a new Tuya device based on the Beken BK7238 MCU, packaged as a Tuya T1-U-HL module. For more general information relating to the T1 series and BK7238 uses see:

T1, T1-M, T1-3S Tuya BK7238 module datasheet, pinout and flashing, Home Assistant
NiceMCU XH-WB3S BK7238 Flashing, Testing, Pinout, Development, Porting
NiceMCU XH-WB3S BK7238 tutorial - quickstart, flashing, sensors, MQTT and Home Assistant
NiceMCU BK7238/T1 IR remote control support presentation tutorial - Home Assistant automations

This is a 'Soil Tester Sensor' from Ali Express.
Screenshot of Tuya soil sensor product page showing device, app, and function icons


Soil moisture sensor with package and user manual on a wooden table Side of green packaging box showing Zigbee 3.0, WiFi, and Bluetooth icons. Green box labeled “Take Good Care of Every Plant” lying on wooden surface. Smart sensor package label with manufacturer info and barcode Green box labeled “Soil Tester Sensor” with product model WF-TR-1 and barcode. Green soil moisture sensor box with specs list and QR codes

After popping off the battery cover, just 4 small cross-head screws allow for the removal of half the case

Close-up of a probe-style soil sensor with a plastic casing White sensor with plastic casing and metal probe lying on a wooden surface Soil sensor with white plastic housing and black probe, placed on wooden background Disassembled soil sensor case with battery holder and screws on wooden surface Open soil sensor case showing two AA battery slots with springs and cover Disassembled soil sensor with battery compartment open and terminals exposed Opened soil sensor with white casing and exposed battery compartment White plastic sensor with a button on top, lying on a wooden surface

to reveal the main module - the T1-U-HL, a 16kb MindMotion MM32G0001 Arm Cortex-M0 TuyaMCU (also seen here) and an HGSEMI C5551 WSAH SOIC8 chip.

Tuya T1-U-HL module and components on IHSENO TY_WiFi_Soil_V1 sensor PCB Tuya T1-U-HL module and IC on PCB of IHSENO TY WiFi Soil V1 device Close-up of PCB with push button, HGSEMI C5551 chip, and SMD components. Close-up of PCB with MM32G0001 chip and Tuya T1-U-HL module with exposed test pads

Unfortunately, the back of the PCB cannot be examined without de-soldering the battery terminals. There was little to be gained, however.

Bottom of black PCB with green wire and visible copper traces

T1-U-HL details - https://developer.tuya.com/en/docs/iot/T1-U-HL-Module-Datasheet?id=Kdfp5j893qwxg

Top view of Tuya T1-U-HL module with pin numbers and size measurements Bottom view of T1-U-HL module with labeled pins and mechanical dimensions

Pin No.SymbolI/O typeDescription
1P14I/OA normal GPIO pin, corresponding to Pin 19 on the IC. It can be reused as SPI_SCK.
2P16I/OA normal GPIO pin, corresponding to Pin 20 on the IC. It can be reused as SPI_MOSI.
3P23I/OA normal GPIO pin, corresponding to Pin 16 on the IC.
4P22I/OA normal GPIO pin, corresponding to Pin 15 on the IC.
5ADCI/OAn ADC pin, corresponding to P20 (Pin 13) on the IC.
6RX2I/OUART_RX2, corresponding to P1 (Pin 30) on the IC.
7TX2I/OUART_TX2 to print logs, corresponding to P0 (Pin 31) on the IC.
8P24I/OSupport hardware PWM4, corresponding to Pin 17 on the IC.
9P9I/OSupport hardware PWM3, corresponding to Pin 27 on the IC.
10P26I/OSupport hardware PWM5, corresponding to Pin 23 on the IC.
11P6I/OSupport hardware PWM0, corresponding to Pin 24 on the IC.
12P8I/OSupport hardware PWM2, corresponding to Pin 26 on the IC.
13GNDPGround pin.
143V3P3.3V power pin.
15TX1I/OUART_TX1 to send user data, corresponding to P11 on the IC (corresponding to Pin 29 on the IC).
16RX1I/OUART_RX1 to receive user data, corresponding to P10 on the IC (corresponding to Pin 28 on the IC).
17P28I/OA normal GPIO pin, corresponding to Pin 12 on the IC.
18CENI/OThe reset pin, active low, and pulled up internally. It is compatible with the designs of other modules. Corresponding to Pin 11 on the IC.
19P21I/OA normal GPIO pin, corresponding to Pin 14 on the IC.
20P17I/OA normal GPIO pin, corresponding to Pin 22 on the IC. It can be reused as SPI_MISO.
21P15I/OA normal GPIO pin, corresponding to Pin 21 on the IC. It can be reused as SPI_CS


Tuya T1-U-HL module with labeled signal and power pins

Feeding 3V through the batters terminals and from TX2 the boot log is captured at 115200 baud:
Code: Text
Log in, to see the code


Unfortunately, the MindMotion MCU gets in the way of any flash read efforts on RX1/TX1, even with the MCU Nrst held low, so the module had to be hot air gun removed for flashing away from the MCU.

Sensor with Tuya T1-U-HL module wired to programmer via test leads

Tuya T1-U-HL module with BK7238 MCU attached to a test board Close-up of PCB with TY_WiFi_Soil_V1 module and components under green coatingTuya T1-U-HL module with test wires soldered, placed on a blue surface

Easy Flasher reads whole flash successfully in BK7238 mode

Screenshot of BK7231 Easy UART Flasher showing “Reading success!” message
Code: Text
Log in, to see the code


As a precaution a backup is also taken with BKFIL
Code: Text
Log in, to see the code


Code: Text
Log in, to see the code





Regarding the TSSOP20 MM32 MCU (datasheet attached) we read this overview
Code: Text
Log in, to see the code


Comparison table of MM32G0001 microcontrollers highlighting TSSOP20 variant

And to put how it connects to the 4 test pads and to the T1-U-HL in context:
Close-up of PCB with Tuya module and labeled MM32G0001 microcontroller pins.

Maybe I should have another go at reading the flash with J-Link, I appear to have been unsuccessful with the other device.



With the backup flashed to the NiceMCU and setup to talk to the Tuya Module Debugging Assistant with product ID rknwi0ctbbghzgla we can pair it with the Tuya app to check firmware versions, device appearance, options and readings

View of MCU simulation in Tuya Module Debugging Assistant with diagnostic data

It seems it's just a glorified temperature and humidity sensor.

App screen showing successful addition of a soil sensor to Tuya systemApp screen showing soil sensor with 0% humidity and 0.0°C temperature readings Mobile app screenshot showing humidity graph for 2025/08/11 App settings screen showing battery level at 0% Device update screen indicating no updates available

with the Tuya app linked to a dev account we can retrieve the dpIDs, needed for OpenBK7238 setup
Code: JSON
Log in, to see the code


which when made pretty:

Code: JSON
Log in, to see the code


Interesting, separate dpIDs for Fahrenheit and a switcher dpID. I don't see a change function in the app. The manual offers no clues.
Tuya soil tester sensor manual with functions and app QR codes Soil sensor user manual with device diagram and usage instructions




OpenBK7238 flashed over the top of factory firmware. I chose to overwrite the bootloader because keeping the factory BL meant OTA updates were not successful.

Screenshot of Easy UART Flasher showing successful BK7238 flash operation

PCB and module cleaned up. Excess solder removed with solder braid.

T1-U-HL module next to TY_WiFi_Soil_V1 PCB, pads and microchips visible

It appears the top two pads are only there to secure module to PCB - no traces on either side. It looks like P21 goes somewhere but I've yet to get any continuity to any component.

With the module soldered back in and OBK unconfigured, you get 20s from button-push wake-up until the MCU withdraws power from the T1 module. This gives just about enough time to navigate to the web app, create autoexec and set a starting script

With a basic starter:
Code: Text
Log in, to see the code


I get no readings and no response to tuyaMcu_sendQueryState. Flag 26 ([UART] Use alternate UART for BL0942, CSE, TuyaMCU, etc) toggled doesn't change that.

This is where I will pause to investigate TuyaMCU comms to the NiceMCU with TMDA and to research the HGSEMI chip.
Attachments:
  • IMG_0172.JPG (2.28 MB) You must be logged in to download this attachment.
  • IMG_0171.JPG (2.22 MB) You must be logged in to download this attachment.
  • mm32g0001a1t-mindmotion-mcu.pdf (1.6 MB) You must be logged in to download this attachment.

About Author
divadiow
divadiow wrote 4736 posts with rating 836 , helped 412 times. Live in city Bristol. Been with us since 2023 year.

Comments

divadiow 11 Aug 2025 22:07

TMDA says it is receiving a heartbeat from the NiceMCU https://obrazki.elektroda.pl/6584532900_1754942580_bigthumb.jpg but OBK doesn't log a valid heartbeat ExtraDebug:TuyaMCU:TuyaMCU heartbeat_valid... [Read more]

p.kaczmarek2 14 Aug 2025 09:46

Very nice analysis, here's some little info from me - as far as I know, tuyaMcu_sendQueryState is only for core TuyaMCU (non-battery powered). So it is fully expected for battery powered (tmSensor) to... [Read more]

divadiow 14 Aug 2025 10:21

OK sure, but on NiceMCU with no tmsensor running I would expect to see TuyaMCU responses in OpenBK7238 log. No heartbeat or any commands manually sent from TMDA are shown as received. [Read more]

p.kaczmarek2 14 Aug 2025 10:29

If the device is using Battery Powered Tuya Serial Protocol, then it will not reply to classic TuyaMCU driver. tmSensor (Battery Powered Tuya Protocol) is different, and, as far as I remember, the MCU... [Read more]

divadiow 14 Aug 2025 10:33

but to be sure OBK7238 itself works alright with TuyaMCU I switched to NiceMCU and TMDA. BK-N dev receives commands OK, BK7238 does not. Same autoexec on both. No tmsensor running, only TuyaMCU. [Read more]

p.kaczmarek2 14 Aug 2025 10:48

So you are saying that you are sending non-battery powered commands from TMDA? That could mean UART driver is not working correctly in BK7238 build. [Read more]

divadiow 14 Aug 2025 10:54

yes sir. take soil sensor out of the equation. take battery tmsensor out of the equation = OBK7238 doesn't seem to receive responses from TuyaMCU simulator whereas OBK7231 does. I can do it again to... [Read more]

divadiow 21 Aug 2025 21:27

back again. NiceMCU / Tuya Module Debugging Assistant TX/RX over P0/P1: TuyaMCU driver only. TMDA acknowledges heartbeats and will send query state response to BK7238 but BK7238 only prints this... [Read more]

divadiow 24 Aug 2025 17:14

Info:TuyaMCU:Received: 55 AA 03 01 00 46 7B 22 70 22 3A 22 72 6B 6E 77 69 30 63 74 62 62 67 68 7A 67 6C 61 22 2C 22 76 22 3A 22 31 2E 30 2E 30 22 2C 22 6D 22 3A 31 2C 22 6D 74 22 3A 31 2C 22 6E 22 3A 30... [Read more]

mvz0209 16 Oct 2025 15:43

https://obrazki.elektroda.pl/2606030100_1760609181_thumb.jpg https://obrazki.elektroda.pl/6246030300_1760609133_thumb.jpg https://obrazki.elektroda.pl/1521551900_1760609184_thumb.jpg ... [Read more]

divadiow 17 Oct 2025 06:35

not sure what this means. You can only select one chip mode at a time in Easy Flasher https://obrazki.elektroda.pl/9803788000_1760675717_thumb.jpg T1-U-HL is BK7238 [Read more]

insmod 17 Oct 2025 06:54

And if you have multiple T1 devices, you should either do "Show advanced options" -> "Restore RF part", or "Show advanced options" -> "Custom operation" -> "Restore RF from backup". "Restore... [Read more]

mvz0209 18 Oct 2025 07:33

https://obrazki.elektroda.pl/1668353700_1760765466_thumb.jpg I don't have a T1 chip. How do I add it? [Read more]

divadiow 18 Oct 2025 07:35

use the latest Easy Flasher https://github.com/openshwprojects/BK7231GUIFlashTool/releases/ [Read more]

mvz0209 18 Oct 2025 07:42

Everything is clear) I'm stupid)) I'm using the 2023 firmware [Read more]

divadiow 18 Oct 2025 07:45

:) Added after 55 : don't forget to take a full backup first [Read more]

mvz0209 18 Oct 2025 07:55

Thanks, to be honest, I've never needed backups before) I'll try to post a few of my devices on the forum soon [Read more]

divadiow 18 Oct 2025 08:01

never say never! they could help with config setup and are useful for general analysis and, if shared, can go into the collection: https://github.com/openshwprojects/FlashDumps/tree/main/IoT [Read more]

mvz0209 18 Oct 2025 08:03

OK, I can make and share [Read more]

FAQ

TL;DR: BK7238 T1-U-HL soil tester dumped 2MB SPI flash with verified CRC; "It seems it's just a glorified temperature and humidity sensor." Use OpenBK7238 with TuyaMCU/TMSensor drivers. [Elektroda, divadiow, post #21632460]

Why it matters: Battery-powered Tuya sensors use a different serial protocol, so classic TuyaMCU queries won’t return data.

For: DIY IoT tinkerers, firmware modders, and Home Assistant users fixing Tuya BK7238 soil/TH sensors that won’t report data or update OTA.

Quick Facts

What chips are inside the Tuya/IHSENO T1-U-HL soil tester?

It uses a Beken BK7238 Wi-Fi/BT module (T1-U-HL), a MindMotion MM32G0001 (16KB Cortex-M0) as TuyaMCU, an HGSEMI C5551, and a Puya P25Q16HBK 2MB SPI flash. The board exposes RX2/TX2 and other GPIOs from the T1 module. Photos and logs confirm each part and interconnects. [Elektroda, divadiow, post #21632460]

How do I dump the BK7238 flash safely (and verify it)?

Use Easy Flasher in BK7238 mode and trigger CEN to get the bus, then read the full 0x200000 bytes and verify CRC. Optionally back up again with BKFIL; one read took 190.912 s. If the MM32 blocks UART, remove the T1-U-HL with hot air and dump off-board. 1) Detach or isolate T1-U-HL. 2) Read 2MB, confirm CRC 0xB826D068. 3) Store both Easy Flasher and BKFIL backups. [Elektroda, divadiow, post #21632460]

Why doesn’t tuyaMcu_sendQueryState return anything on this device?

It’s battery-powered and follows the Battery Powered Tuya Serial Protocol, not the classic TuyaMCU poll/heartbeat flow. “tuyaMcu_sendQueryState is only for core TuyaMCU (non-battery powered).” Use the tmSensor driver and its startup exchange instead. [Elektroda, p.kaczmarek2, post #21634557]

TMDA shows a heartbeat, but OpenBK7238 logs nothing—what’s happening?

The Tuya Module Debugging Assistant displays a heartbeat from the NiceMCU, yet BK7238 builds showed no received data, while a BK7231N build enumerated many replies. That observation indicates the transport is alive, but the BK7238 side isn’t ingesting frames as expected. [Elektroda, divadiow, post #21632492]

Could this be a BK7238 UART driver issue in OpenBK?

Yes. If you are sending non-battery commands and see nothing in BK7238 logs while other chips work, “That could mean UART driver is not working correctly in BK7238 build.” Test with BK7231N or switch to tmSensor on BK7238. [Elektroda, p.kaczmarek2, post #21634639]

How should I configure OpenBK7238 autoexec for this board?

Load TuyaMCU and TMSensor, set 115200 baud, and fake a paired Wi-Fi state so the MCU reports data. Map dpIDs to channels for temp and humidity. Example essentials: startDriver TuyaMCU; startDriver TMSensor; tuyaMcu_setBaudRate 115200; tuyaMcu_defWiFiState 4; setChannelType 5 temperature_div10; link dpID 5→ch5; setChannelType 3 Humidity; link dpID 3→ch3. [Elektroda, divadiow, post #21632460]

What dpIDs map to temperature, humidity, battery, and units?

Humidity is dpID 3 (%). Temperature °C is dpID 5 (scale/10). Battery percentage is dpID 15. Fahrenheit is exposed separately as dpID 101, and dpID 9 toggles units (c/f). The mobile app UI may not expose a unit switch, despite dpID 9 existing. [Elektroda, divadiow, post #21632460]

What UART settings and pads should I use to capture logs?

Capture the boot log at 115200 baud from TX2. Power the board at 3V on battery terminals. You will see SoftAP startup, BLE advertising, and product identifiers. Keep ground common and observe the 20-second wake window after button press. [Elektroda, divadiow, post #21632460]

Why can’t I read flash over RX1/TX1 even with the MM32 reset held low?

The MM32G0001 still interfered on RX1/TX1, blocking access. Holding NRST low didn’t help. The fix was to hot-air remove the T1-U-HL and flash it away from the MCU. That edge case can save hours of failed reads. [Elektroda, divadiow, post #21632460]

What are the key T1-U-HL pins for development?

RX2/TX2 provide logs; 3V3 and GND power; CEN is active-low reset. ADC maps to P20; UART1 TX/RX are P11/P10; various PWM-capable GPIOs exist. The two top module pads act as mechanical anchors only. P21 appears routed but lacked continuity in testing. [Elektroda, divadiow, post #21632460]

How do I pair and inspect dpIDs using TMDA and the Tuya app?

Flash the backup to a NiceMCU, connect it to the Tuya Module Debugging Assistant, and pair the device in the Tuya app using its product key (e.g., rknwi0ctbbghzgla). The app linked to a dev account returns model schema and dpIDs for mapping. [Elektroda, divadiow, post #21632460]

How do I make OTA updates work on this BK7238 device?

Overwrite the factory Tuya bootloader when flashing OpenBK7238. Keeping the stock bootloader prevented successful OTA. After reflowing the T1-U-HL and cleaning excess solder, OTA proceeded normally under OpenBK’s bootloader. [Elektroda, divadiow, post #21632460]

What does the boot telemetry show (Wi‑Fi/BLE/region)?

Logs show SoftAP cycling and SSID SmartLife-6608, EU regulatory domain 1–13, BLE MAC announcement, and adv start. You’ll also see product key, firmware key, and serial printed during TuyaOS initialization. Use this to validate RF bring-up. [Elektroda, divadiow, post #21632460]

What flash details were confirmed during backup?

The flasher identified mid 0x152085 (Puya P25Q16HBK) with 2MB size. A full-dump CRC matched 0xB826D068. OBK config was not present; Tuya config decrypt failed to extract keys, which is normal for many retail Tuya images. Keep raw dumps safe. [Elektroda, divadiow, post #21632460]
Generated by the language model.
%}