v3.4.0-beta.19
Pre-release
Pre-release
Requires pylxpweb 0.9.36b21 (installed automatically; the manifest requirement is bumped).
Fixed
- HYBRID/CLOUD: battery entities no longer flip unavailable in subsets (#258): on rotating >4-battery banks, a fresh cloud
getBatteryInfooccasionally omits or re-keys part of the bank for a cycle — and the hybrid merge rebuilt the battery dict from that cloud payload as its baseline, with entity availability being key-presence. The omitted packs' entities went unavailable within seconds of a cloud poll (both of the reporter's beta.18 drops followed a fresh cloud POST by ~4 s) even while the local register accumulator held valid data for every pack throughout. The merge now carries forward once-published batteries across transient omissions in every mode: carried packs keep their originalbattery_last_seen(staleness stays visible as data, never as availability flapping), the #252 registry migration and serial re-keying are explicitly protected, and a 6-hour staleness bound lets a genuinely removed pack converge without an HA restart. The LOCAL round-robin cache gets the same bound, and retirement is authoritative across both sticky layers. - A transient duplicate-serial register read can no longer mint a lasting phantom battery (#258, pylxpweb#200): corrupt serial bytes from a dongle misroute could make two slots report the same serial. The accumulator now disambiguates the collision (one latched WARNING) and re-verifies it on the next clean read of that bank position — a one-off corruption self-heals, while a genuine duplicate-serial pack pair stays protected at the library layer. Also fixes the battery debug dump printing 14 of 15 serial characters, which manufactured phantom "duplicate serials" in debug logs (the red herring in this investigation).
Verification
1659 tests passing; dual (Claude Opus + Codex) adversarial review gate with a fix round covering both confirmed P1s; hybrid-mode docker smoke passed against this exact build.
🤖 Generated with Claude Code