New control entities: number (salt output level 0–10) and switch (lights, jets). The read-only salt sensor is replaced by the settable number.
App-traffic mimicry: every request now looks identical to the official app — Dalvik UA on REST, okhttp/4.12.0 on the mTLS creds fetch, mqtt-<uuid> client ids — so we don't get flagged/banned.
Constants consolidation: all constant values in one commented constants.py; protocol.py keeps only command builders; const.py removed.
Optional local read path: a local_status_url config option polls the dongle's local /status endpoint for telemetry instead of the cloud MQTT subscription (control stays cloud MQTT). State getters handle both schemas.
Deployed and validated on the lodge HA: all entities live, control works through HA (self-correcting temp test reflected via the local poll in ~31s), and the reset automation runs.
No private/internal values in the repo — the spa's local IP is runtime config only.
Fixes bug-41mqxddz7zeh
Builds on the initial integration:
- **New control entities**: `number` (salt output level 0–10) and `switch` (lights, jets). The read-only salt sensor is replaced by the settable number.
- **App-traffic mimicry**: every request now looks identical to the official app — Dalvik UA on REST, `okhttp/4.12.0` on the mTLS creds fetch, `mqtt-<uuid>` client ids — so we don't get flagged/banned.
- **Constants consolidation**: all constant values in one commented `constants.py`; `protocol.py` keeps only command builders; `const.py` removed.
- **Optional local read path**: a `local_status_url` config option polls the dongle's local `/status` endpoint for telemetry instead of the cloud MQTT subscription (control stays cloud MQTT). State getters handle both schemas.
Deployed and validated on the lodge HA: all entities live, control works through HA (self-correcting temp test reflected via the local poll in ~31s), and the reset automation runs.
No private/internal values in the repo — the spa's local IP is runtime config only.
Fixes bug-41mqxddz7zeh
- New entities: number (salt output level 0-10), switch (lights, jets); the
read-only salt sensor is replaced by the settable number.
- Look identical to the official app on the wire: send the app's Dalvik UA on
REST, okhttp/4.12.0 on the mTLS creds fetch, and "mqtt-<uuid>" client ids.
- Consolidate every constant value into constants.py (well commented); protocol.py
keeps only the command builders; const.py removed.
- Optional local read path: a `local_status_url` config option polls the dongle's
local /status endpoint for telemetry instead of the cloud MQTT subscription
(control stays cloud MQTT). State getters handle both schemas.
No private/internal values in the repo (the spa IP is runtime config only).
Fixes bug-41mqxddz7zeh
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F6B8b3iYNv6QUftK2FDfYb
dfritz
merged commit 46a353071d into main2026-09-01 15:15:15 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Builds on the initial integration:
number(salt output level 0–10) andswitch(lights, jets). The read-only salt sensor is replaced by the settable number.okhttp/4.12.0on the mTLS creds fetch,mqtt-<uuid>client ids — so we don't get flagged/banned.constants.py;protocol.pykeeps only command builders;const.pyremoved.local_status_urlconfig option polls the dongle's local/statusendpoint for telemetry instead of the cloud MQTT subscription (control stays cloud MQTT). State getters handle both schemas.Deployed and validated on the lodge HA: all entities live, control works through HA (self-correcting temp test reflected via the local poll in ~31s), and the reset automation runs.
No private/internal values in the repo — the spa's local IP is runtime config only.
Fixes bug-41mqxddz7zeh