v3.4.0-beta.18
Pre-release
Pre-release
Requires pylxpweb 0.9.36b20 (installed automatically; the manifest requirement is bumped). The #282 HYBRID early-retry gating and the #254 Fast block-size mode are inert on older pylxpweb versions.
Added
- AC Charge schedule time entities (#277): the portal's AC charge start/end times as native HA time entities — all three windows (window 1 enabled, 2/3 created disabled), so automations can reshape charging windows (e.g. weekday peak/off-peak vs weekend 00:00-23:59). Backed by holding registers 68-73 (packed hour/minute); LOCAL/HYBRID write the packed register, CLOUD writes the portal's own named parameters. Created for EG4_OFFGRID (6000/12000XP, SNA), EG4_HYBRID, and LXP families. Overnight windows accepted. Requested by @mjstrand.
- Start Discharge / Start Charge power threshold numbers (#272): HOLD 116 as Start Discharge Power Threshold (whole watts, 50-10000 W — the raw register is 1 W scale, not the 100 W encoding of other power registers) on CT-equipped grid-tied families, readable/writable in every mode. The companion Start Charge Power Threshold (HOLD 117, signed watts, default -50 W) is LOCAL/HYBRID-only and disabled by default — the cloud API has no name for that register; enable it to field-test. Requested by @ivanfmartinez.
- Configurable Modbus read block size (#254): new option with Conservative (default — byte-identical to today) and Fast (up to 120-register reads, ~4 fewer round-trips per poll per inverter, what lets other tooling poll at 15 s). Older dongle firmware that only supports ~40-register reads triggers one warning and an automatic permanent fallback to the conservative reads. GridBOSS and battery reads unchanged. Requested by @ivanfmartinez.
- Fast Zero Export switch (#274): the Grid Sell tab's toggle (HOLD 110 bit 1) on grid-tied EG4_HYBRID and LXP inverters, wired to the same function-control parameter the vendor web UIs use.
Fixed
- Multi-station cloud accounts can be added again (#275): the station-selection dropdown rejected every choice ("value must be one of [ids]") because the cloud returns integer station ids and the HA frontend submits strings. String-keyed selector with tolerant coercion; pre-fix entries normalized on load. Reported by @SimmerV (incorporating their #276).
- Parameter-backed controls no longer go unknown for an hour after one bad read (#282): a failed holding-register range (dongle misroute storms) replaced the full parameter set and armed the hourly throttle anyway. Now partial reads carry forward last-known values, the throttle only arms on a fully successful cycle (per-device retry set, ~2-minute retry floor), and one INFO names the failed ranges. Long-standing behavior, not a beta.17 regression. Reported by @ivanfmartinez.
- One battery identity across Cloud/Local/Hybrid (#252): mode changes no longer duplicate battery devices — all modes derive the same serial-first key, existing positional devices are re-identified in place (automations, dashboards, history preserved), and cloud→hybrid duplicates are cleaned up. Reported by @ivanfmartinez.
- HYBRID: battery outage cycles stay in the hybrid merge (#258 defense-in-depth): a momentarily empty local battery list no longer swaps the cycle to the cloud-only extraction path. The 9-hour freeze mechanism is root-fixed in pylxpweb (failed block reads serve last-known accumulated batteries; rotation-stall watchdog; supplemental cloud refresh stays alive). Reported by @ivanfmartinez.
- Grid Sell Back Power is a kW control, not a percent (#274): the reg-103 export cap was mis-scaled (protocol PDF + cloud key name both mislabel it); it is kilowatts with 100 W raw units — live-verified. The entity now displays kW (0-25.5); on LXP units it was permanently unknown before. Review automations that set this number: values are now kW.
- Battery firmware version no longer flaps between "1.3" and "1.03" in HYBRID (#287): local decode now zero-pads to match the cloud rendering (pylxpweb#199). Reported by @ivanfmartinez.
Verification
1650 tests passing; every PR passed a dual (Claude Opus + Codex) adversarial review gate; cloud- and hybrid-mode docker smoke tests passed against this exact build (setup success, all transports attached, new time/number platforms live).
🤖 Generated with Claude Code