Discovered live 2026-06-25 driving an actual grid calibration: forcing a full
grid charge is done via OUTPUT PRIORITY, not voltage thresholds.
- SBU (everyday) won't grid-charge unless the bank is critically low; setting
charger_priority=solar_and_utility alone does nothing at 52V.
- SUB (output_priority=solar_utility_battery) runs loads on grid AND charges the
battery to full. Combined with charger_priority=solar_and_utility, grid charging
engages (device_mode->Hybrid/Line, line_dir->input, pack current jumps to ~120A).
- Both POP/PCP set via lvx-control (all-mode-safe, atomic, no flash/USB). Revert
POP->solar_battery_utility, PCP->solar_first when done.
The re_discharge/flash.py approach is dead (firmware NAKs stop_charge>float);
profile eg4-lp4-v2-calibration.yaml marked DEPRECATED.
- grid-cal-monitor: supervises a SUB grid charge, safety aborts (cell>3.60V/
temp>45C), detects re-anchor (all 6 packs ->100%), auto-reverts POP+PCP (trap).
- calibration-charge skill §3 rewritten to the POP lever.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Live run 2026-06-24: flash.py apply NAK'd BUCD480,000 on both inverters — the
firmware rejects stop_charge_voltage=0 ("Full"). flash.py aborts on first setter
failure, so nothing changed and the cluster stayed in sync (verified).
The field flash.py calls stop_charge_voltage is actually the inverter's
battery_re_discharge_voltage (HA: sensor.lvx6048_*_battery_re_discharge_voltage):
the V at which loads switch back to battery after grid charging. 54.0 tops grid
charge to ~54V; raising to 56.0 is the corrected (but UNVALIDATED) lever and may
band-oscillate rather than hold absorption.
- calibration profile: 0 -> 56.0, with the finding documented.
- skill: solar-only is now the RECOMMENDED/known-good method; grid-assist demoted
to advanced/unvalidated with a mandatory diff-preview gate.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The everyday profile caps grid charging at 54V, so the bank can go weeks
without a full charge and the EG4 BMS coulomb counters drift (proven: pack 6
read 76% SoC while at the same 53.4V/3.337V-per-cell as packs reading 50-55%
— all paralleled, so physically equal charge; the spread is pure drift).
- profiles/eg4-lp4-v2-calibration.yaml: temporary profile, identical to
canonical except stop_charge_voltage 54.0 -> 0 (Full), so grid can finish a
full charge to the 56.4V absorption hold that re-anchors every pack to 100%.
- calibration-charge skill: guided runbook (pre-flight safety, two methods
solar-only / grid-assist, live monitoring with cell-voltage/temp aborts,
re-anchor verification, mandatory revert).
- REFERENCE: scoped action-policy exception (this skill alone may flip
stop_charge, both units, user-confirmed, must revert); corrected pack-6 /
SoC-drift notes to the verified equal-voltage-different-SoC signature.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>