Skip to content

Releases: Hovborg/intex-pool

v0.20.0 — pump filtration switch, dirty-filter alarm, pump slot corrections

Choose a tag to compare

@Hovborg Hovborg released this 02 Jul 10:29

[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

Choose a tag to compare

@Hovborg Hovborg released this 02 Jul 09:31

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

Choose a tag to compare

@Hovborg Hovborg released this 02 Jul 09:25

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

Choose a tag to compare

@Hovborg Hovborg released this 02 Jul 09:11

[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 writing skdl_filter through 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

Choose a tag to compare

@Hovborg Hovborg released this 02 Jul 08:50

[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 the intex_pool.get_schedule service response (pump key).
    Write support can follow once slot semantics are verified on the hardware.

v0.17.0 — reauth reliability, IO serialization, manual device removal

Choose a tag to compare

@Hovborg Hovborg released this 02 Jul 08:13

[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

Choose a tag to compare

@Hovborg Hovborg released this 01 Jul 22:24

[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

Choose a tag to compare

@Hovborg Hovborg released this 01 Jul 20:28

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)

Choose a tag to compare

@Hovborg Hovborg released this 12 Jun 17:22

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

Choose a tag to compare

@Hovborg Hovborg released this 10 Jun 22:23

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.