v0.9.28
Dongle resilience (#201)
- Reconnect + retry on OSError in dongle
_send_receive(). Validated live (recovered from a real "Connection lost").
Per-model PV strings + pv4-6
- Explicit per-model
pv_string_count(0–n);pvN_{voltage,power}populated end-to-end (LOCAL + HTTP) when the model supports them. Residential 3-string models unchanged. - Count-aware
pv_total_power; cloudvpv4-6/ppv4-6fields + scaling.
Scaling
- Validated
maxChgCurr/maxDischgCurr= SCALE_100 (cloud 0.01A) ↔ modbus 0.1A → same physical amps (guard test added); fixed unused*Valuecompanion scale.
Internals
DongleTransport.read_runtime()serialized under reentrant_op_lock.- Fixed seasonally-flaky DST integration test (use production
detect_dst_status). - Repointed dangling
register_mapsimports in dev scripts.
Validated: full suite (1971), mypy --strict clean, CI green, live dev end-to-end.
🤖 Generated with Claude Code