Version `3.0.0` is a major release that significantly improves connection stability over the LoRA radio link, protects against device configuration errors, expands spa control capabilities, and modernizes collection data structures.
---
🚨 Breaking Changes & Migration Guide
- **Collections are now dictionaries keyed by hardware ID (`int`) instead of lists**:
- `Spa.jets`: now `dict[int, Jet]` (previously `list[Jet]`)
- `Spa.light_zones`: now `dict[int, LightZone]` (previously `list[LightZone]`)
- `Spa.energy_savings`: now `dict[int, EnergySavingSchedule]` (previously `list[...]`)
**Migration:**
python
Before (v2.x)
jet_1 = spa.jets[0]
for jet in spa.jets:
...
After (v3.0.0)
jet_1 = spa.jets[1] Direct access by hardware ID (1, 2, ...)
for jet in spa.jets.values(): Iterate values
...
---
🌟 Highlights & Key Improvements
1. **LoRA Link Stability & Dropout Prevention (19)**:
- Queries (`/status`, `/spaConnectStatus`) are now executed sequentially instead of in parallel via `asyncio.gather`, avoiding socket starvation and radio queue contention on the HNA's single-threaded web server.
- Removed aggressive backoff retry storms on routine polling (`request_retries=0` default). Polling failures now fail fast instead of locking up the radio for 30+ seconds.
- Added automatic fallback for `spa_connected` if `/spaConnectStatus` temporarily drops while `/status` succeeds.
2. **HNA vs. SNA Adapter Detection (18)**:
- Added automatic validation to ensure connections target the **Home Network Adapter (HNA)** rather than the **Spa Network Adapter (SNA)**. Connecting to an SNA will now raise a clear `HotSpringSNADetectedError`.
3. **Expanded Controls & Capabilities (13, 15)**:
- Added controls for spa locks (temperature lock, spa lock), clean cycle, and energy savings schedule configuration.
- Added jet speed types (single-speed, two-speed, blower), capabilities, and concurrent mode support.
4. **Telemetry, Diagnostics & Runtime Tracking (16)**:
- Added runtime hours tracking for the heater and individual jet pumps (with 16-bit hardware counter rollover handling).
- Added raw test point metrics (currents, voltages, sensor flow/limits, and board diagnostics).
---
What’s changed
- test: adopt syrupy snapshot testing for models and client Moustachauve (14)
🚨 Breaking changes
- refactor(models)!: store jets, light_zones, and energy_savings as dicts keyed by ID Moustachauve (17)
✨ New features
- feat(jets): expose jet capabilities, speed types, and runtime status Moustachauve (13)
- feat(controls): add switch, lock, and schedule controls Moustachauve (15)
- feat(models): add runtime tracking, fix counter overflow, and expand diagnostics Moustachauve (16)
- feat(client): detect HNA vs SNA and guard against connecting to SNA Moustachauve (18)
🐛 Bug fixes
- fix(client): serialize queries sequentially and prevent retry storms on LoRA link Moustachauve (19)