Release v3.0.0
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: nowdict[int, Jet](previouslylist[Jet])Spa.light_zones: nowdict[int, LightZone](previouslylist[LightZone])Spa.energy_savings: nowdict[int, EnergySavingSchedule](previouslylist[...])
Migration:
# 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
-
LoRA Link Stability & Dropout Prevention (#19):
- Queries (
/status,/spaConnectStatus) are now executed sequentially instead of in parallel viaasyncio.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=0default). Polling failures now fail fast instead of locking up the radio for 30+ seconds. - Added automatic fallback for
spa_connectedif/spaConnectStatustemporarily drops while/statussucceeds.
- Queries (
-
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.
- 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
-
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.
-
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)