Releases: Hovborg/intex-pool
Release list
v0.20.0 — pump filtration switch, dirty-filter alarm, pump slot corrections
[0.20.0] - 2026-07-02
Pump corrections from the live thing model (fetched from the cloud).
Added
- Filtration switch (DP106) is now enabled by default and properly named —
the thing model confirms it is a writable start/stop control distinct from
master power (like the chlorinator's power/production pair). - Pump-specific alarm codes: the pump's DP127 enum differs from the
chlorinator's (normal / E93 / dirty / unnormal) — "dirty" = clean the
filter. The alarm sensor now uses the correct option set with translations.
Fixed
- The pump has no Boost cycle: slot 1 is a regular timed slot (the pump
app writes one-shot runs into any slot), so it now gets a normal name, a
start-time editor, and no boost-suspend behavior. Boost stays
chlorinator-only. - Stale-device deletion: the leftover virtual "Linked pump" device from
entity mode could never be deleted after switching to a real Tuya pump —
the removal guard now only protects it while the pump is entity-linked.
v0.19.2 — sensor reconfigure model-field fix
The sensor step's reconfigure prefill dropped the extended schema, rejecting the optional model field with a 400. Fixed + regression test.
v0.19.1 — pump start-time editors
0.19.0 shipped the pump slot switches/durations but not the start-time editors; fixed.
v0.19.0 — editable pump timer + device model picker
[0.19.0] - 2026-07-02
Full pump-timer editing + choose your device models.
Added
- Editable pump schedule: the Tuya pump's internal timer program now gets
the same editors as the chlorinator — one on/off switch per slot, start
times (slots 2-7) and durations, all writingskdl_filterthrough the
cloud. The write path was live-verified on an SX2100 (round-trip, no-op
write, field change + readback, restore) before shipping. - Model selection: the sensor/salt/pump setup and reconfigure steps offer
an optional model picker (suggestions + free text). The chosen model is
shown on the device page instead of the generic fallback.
v0.18.0 — pump status/alarm/runtime entities + read-only pump schedule
[0.18.0] - 2026-07-02
The Tuya sand-filter pump is now a first-class device.
Added
- Pump entities (live-verified against the SX2100 via the cloud shadow
API): status (DP125), alarm code (DP127), error code (DP114), time
remaining (DP110), mesh/link diagnostic (DP119), and the thing-model's
second toggle DP106 ("Filter switch", disabled by default — its standalone
effect is unverified). - Pump schedule (read-only): the pump's internal timer program
(skdl_filter, same 7-slot blob as the chlorinator's) is polled from the
cloud and exposed as a "Schedules" sensor with full slot details, and
included in theintex_pool.get_scheduleservice response (pumpkey).
Write support can follow once slot semantics are verified on the hardware.
v0.17.0 — reauth reliability, IO serialization, manual device removal
[0.17.0] - 2026-07-02
Robustness round: the remaining review-backlog plus regressions caught by a
fresh /code-review of the fixes themselves.
Fixed
- Reauth now actually triggers for permanently bad credentials: the
transient-tolerance counters persist across setup retries (HA rebuilds the
coordinators on every ConfigEntryNotReady), so bad creds escalate to a
reauth prompt instead of looping "not ready" forever. Counters are cleared
on unload. - CloudClient detects rejected credentials: tinytuya's Cloud never raises
on bad creds (it just leaves token unset) — the client now raises an auth
error at construction, so setup and the config flow can distinguish bad
credentials (reauth) from a dead link (retry). - Version auto-detect vs. reauth ordering: a locked-in protocol version
re-enters auto-detection after 5 consecutive failures, and the reauth
threshold now leaves room for a full candidate cycle after that unlock — a
device firmware protocol change no longer escalates into a reauth prompt
for a key that was never wrong. - Local poll and manual writes are serialized per device (one TCP session
at a time), so a switch write can no longer race the 15s poll. - Setup survives a dead Tuya cloud at boot: CloudClient construction
failures become ConfigEntryNotReady (retry with backoff) instead of an
unhandled setup error requiring a manual reload. - intex_pool.set_schedule picks a writable entry in multi-entry setups
instead of erroring on an entry that only has the read-only analyzer
schedule. - Unknown DP127 alarm codes are logged (once per code) instead of
silently normalizing to "unknown" — a fault combination missing from the
enum no longer disappears without a trace.
Added
- Manual reconfigure preserves unticked devices (merge) instead of
silently dropping them, with explicit "Remove …" checkboxes for actual
removal — the only removal path for setups without cloud credentials. - Reconfigure credentials prompt prefills the stored region/Access ID
(never the secret).
v0.16.1 — review fixes: pump interlock, schedule race, DP126, key masking, card offline state
[0.16.1] - 2026-07-02
Fixes from a full adversarially-verified code review (28 findings; the
correctness/safety ones land here).
Fixed
- Pump auto mode now keys on chlorine production (DP103), not master power
(DP104), and keeps the pump running for 1 hour after production stops
(after-run flush per the manual) instead of cutting it immediately. With
master power deliberately left on 24/7, the old logic would have run the
pump constantly. - Schedule edits no longer overwrite each other: writes are serialized and
the just-written slots are published optimistically, so a second edit inside
the cloud's settle window no longer builds on the stale blob and silently
undoes the first edit. - Pump mesh status (DP126) polarity: the wire value is inverted
(1 = link down); the binary sensor now reports proper connectivity
semantics (on = connected) with the connectivity device class. - Self-clean cycle select now offers the full documented range: the legal
8 h setting was missing, and a device set to 8 h showed an empty select. - Card: no more false green "OK" — when the chlorinator's entities are
unavailable (device offline) the status pill now shows a grey "Offline"
instead of a reassuring OK (this hid a real 4-day outage). - Stale card bundle: the built frontend JS is regenerated as part of the
release again (0.16.0 shipped a 0.15.0 bundle).
Security
- The Tuya local key is now masked (password field) in the manual
salt/pump setup, reconfigure and reauth forms, and stored secrets
(local_key / access_secret) are no longer embedded as suggested values
in reconfigure forms sent to the frontend.
v0.16.0 — reconfigure heals moved devices + manual escape for other VLANs
Reconfigure can now heal a moved device and reach devices on other VLANs.
Added
- Manual reconfigure escape: both the reconfigure credentials prompt and the device picker now offer "Enter device details manually instead" — needed when a device sits on another VLAN/subnet the LAN broadcast scan cannot see (real-world case: the chlorinator re-joined WiFi on an SSID mapped to a different VLAN and got a new IP the scan could not discover). The manual chain pre-fills the entry's current device selections and values.
Fixed
- Stale IP/key after a network change: the discover step kept the stored host/key whenever the device id was unchanged, so a device that moved to a new IP (new DHCP lease, other subnet) or rotated its local key could never be repaired by reconfigure. A live LAN-scan hit now takes precedence over the stored config; the stored config is only reused when the scan cannot see the device. A Tuya pump keeps its configured on-DP when refreshed this way.
v0.15.1 — tolerate transient auth errors (no more spurious reauth)
Fixed
- Spurious "reauth required" on flaky Wi-Fi. A single rejected local poll on a known protocol version escalated straight to a reauth flow. On a marginal Wi-Fi link a truncated/garbled reply decrypts to the same Tuya 914 "check key or version" error, so the integration could demand a new local key while the stored key was still perfectly valid (observed live: cloud key unchanged, device intermittently unreachable, ping RTT 600-950 ms). The coordinator now requires 3 consecutive auth rejects — after any protocol-version cycling — before starting reauth, and a single successful poll resets the counter. Genuine key rotations still reach reauth within 3 poll intervals.
v0.15.0 — LSI water balance from your own test results
Added
- LSI sensor (Langelier Saturation Index): computed live from the (calibrated) pH + water temperature and your manual test results — enter them in the new Total alkalinity / Calcium hardness / Cyanuric acid / TDS (test) entities after each strip/drop test. The math is pinned to the published industry standards (CDC MAHC 2024 Annex table, Taylor/CPO charts, Wojtowicz closed forms, PHTA's pH-dependent CYA correction — including the classic CF=log₁₀(0.4·CH) chart factor that most naive implementations get wrong by +0.4). For saltwater pools the TDS term automatically uses the live salinity reading.
- Water balance sensor interpreting the LSI: severely corrosive / slightly corrosive / balanced (−0.3…+0.3) / slightly scaling (+0.3…+0.5) / scale forming.
- Test coverage for the last untested paths from the audit (card/service registration, cloud-secret re-auth, pump-auto restore after restart).
Notes
- Measurement-history backfill via Tuya's log APIs was investigated against a live project and dropped: the free IoT Core tier returns no data-point history (only online/offline events). Documented in the README.
No breaking changes. After updating via HACS, restart Home Assistant. To get an LSI: fill in at least Total alkalinity + Calcium hardness from your latest water test.