LKBird 7-in-1 smart pool/spa monitor

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 supportedlanParseResponseWithData:...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)

  1. Tuya IoT Platform project → Link App Account → read device_id + local_key (or tuya-cli wizard).
  2. Give the display a DHCP reservation.
  3. Add via hass-localtuya (the xZetsubou fork), cloud-assisted setup.
  4. Map DPs → sensors and set per-entity scaling (I expect pH/temp are ×10 or ×100 in the raw DP, e.g. 7367.36).

Questions for the forum

  1. 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?
  2. 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.)
  3. 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?
  4. Does the display keep a persistent LAN connection, or does it sleep/only report periodically (battery-powered floater implications)?
  5. Anyone decrypted the LAN 6668 frames with tinytuya to confirm the raw DP values before trusting the scaling?
  6. Any gotchas with Tuya OTA renumbering DPs, or local_key rotation 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: