Grid calibration: correct lever is output-priority SUB, add grid-cal-monitor

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>
This commit is contained in:
2026-06-25 12:35:51 -04:00
parent 34d34f6e6c
commit 76765a95ed
3 changed files with 116 additions and 11 deletions

View File

@@ -7,6 +7,12 @@
# / high-load stretches the bank may go weeks without a full charge and the coulomb
# counters drift (e.g. pack 6 read 76% while physically at ~53% on 2026-06-24).
#
# !!! DEPRECATED 2026-06-25 — DO NOT USE. The re_discharge lever does not work for
# grid calibration: firmware NAKs stop_charge_voltage above float (56 > 54), and it's
# the wrong mechanism anyway. The CORRECT grid-charge lever is output priority -> SUB
# (solar_utility_battery) via lvx-control — see the calibration-charge skill §3 and
# memory project_lvx6048_grid_charge_lever. Kept only as a record of the dead end.
#
# !!! 2026-06-24 FINDING — grid-assist lever corrected, still UNVALIDATED !!!
# The original idea (stop_charge_voltage: 0 = "Full") was REJECTED by the firmware:
# `flash.py apply` got an inverter NAK on `BUCD480,000` on BOTH units (no change made).