Anyone integrated the Kactoily / LKBird 7-in-1 smart pool/spa monitor? (Tuya-based)
tldr; Has anyone already got the Kactoily / LKBird / RYAKKA “7-in-1” floating pool & spa water monitor into Home Assistant? It looks like a stock Tuya device under the hood, so I’m hoping localtuya “just works”, but before I pull my local_key I’d love to hear from anyone who’s already mapped the datapoints (DPs), especially the scaling factors.
The device
A two-piece smart water monitor sold under several brands (Kactoily, LKBird, RYAKKA, BaiJiaDun; model family WM-7-I / PM00x). It reports 7 values: pH, ORP, free chlorine (CL), TDS, EC, salinity, and temperature, plus battery. Companion app is “Kactoily” (an OEM Tuya/Smart-Life-style app).
Physical setup:
- Floating probe with the actual electrodes (pH glass electrode, Pt ORP electrode, 2-pin conductivity cell, NTC thermistor) — talks LoRa to the display.
- Display hub — the WiFi device. Contains a Tuya T1-U-HL WiFi/BLE module (FCC ID 2ANDL-T1-U-HL) and an Ai-Thinker Ra-01SC LoRa module (FCC ID 2ATPO-RA-01SC).
So from the network’s point of view it’s one Tuya WiFi device (the display); the LoRa probe is invisible and its readings are just republished as Tuya DPs. Only 4 of the “7” values are real sensors — TDS and salinity are derived from EC, and CL is calculated from ORP + pH, not measured.
What I’ve found so far (static analysis of the iOS app)
I pulled apart the app binary. Every networking class is Tuya’s rebranded ThingSmart* / Thing* SDK, which tells me it’s a bog-standard Tuya cloud + LAN device:
- Cloud endpoints:
*.tuyaus.com,*.tuyaeu.com,*.tuyacn.com,*.tuyain.com,*.iot-dns.com - Cloud MQTT is TLS (8883) with DP payloads AES-encrypted by the
local_key(ThingMQTTTCPSSLTransport,mqttChannel:didReceiveMessage:topic:) - Tuya LAN protocol v3.3/3.5 is supported —
lanParseResponseWithData:...localKey:,lan 3.3 broadcast 0x40, TCP 6668, UDP discovery 6666/6667 - Tuya product category string:
water_quality
My takeaway: no need to reverse-engineer the MQTT (that’s just Tuya cloud). The clean path should be get device_id + local_key via a Tuya IoT project, then localtuya over LAN.
My plan (please sanity-check)
- Tuya IoT Platform project → Link App Account → read
device_id+local_key(ortuya-cli wizard). - Give the display a DHCP reservation.
- Add via hass-localtuya (the xZetsubou fork), cloud-assisted setup.
- Map DPs → sensors and set per-entity scaling (I expect pH/temp are ×10 or ×100 in the raw DP, e.g.
736→7.36).
Questions for the forum
- Has anyone already added this exact monitor (Kactoily/LKBird/RYAKKA 7-in-1 floating type) to HA? If so, would you share your DP map?
- What are the DP IDs and scaling factors for pH, ORP, CL, TDS, EC, salt, temp, battery on your unit? (I know OEMs shuffle DP numbers, but a reference point helps.)
- localtuya vs official cloud Tuya vs tuya-local — any reason to prefer one for this device? Does it push on-change or does HA need to poll?
- Does the display keep a persistent LAN connection, or does it sleep/only report periodically (battery-powered floater implications)?
- Anyone decrypted the LAN 6668 frames with tinytuya to confirm the raw DP values before trusting the scaling?
- Any gotchas with Tuya OTA renumbering DPs, or
local_keyrotation after re-pair?
Happy to share my full teardown notes (FCC modules, sensor breakdown, binary strings) if useful. Thanks in advance!
The probe sits in the water and communicates via LoRa to a "display". The display connects to WiFi, and that is what the app talks to. The display also supports Bluetooth. It is a pretty sexy board:

