Add calibration-charge skill to fix EG4 SoC counter drift (improvement #1)

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>
This commit is contained in:
2026-06-24 12:11:47 -04:00
parent aa97d65b0c
commit 56b2cc2bf1
3 changed files with 172 additions and 2 deletions

View File

@@ -114,9 +114,13 @@ MQTT — compute them yourself from the raw entities when working off the Pi.
untrustworthy and use the `lifepower4_*` pack entities for any battery math; if it
reads ~10 V right now, a powermon (or inverter) restart may clear it — worth testing.
- **Pack 6 is an oddball**: Modbus addr `0x01` @ 115200 (packs 15 are `0x40` @
9600); ran 65 % SoC while 15 sat 4044 %. Treat as a distinct member.
9600). It reads SoC high (76 % on 2026-06-24 vs 5055 % on packs 15) — but at the
SAME pack_voltage (53.4 V) and cell voltage (3.337 V), so that's **counter drift,
not real imbalance**: all packs are paralleled and physically at the same charge.
- **EG4 SoC never re-anchors** (drifts because packs rarely hit 100 % to reset the
coulomb counter). See memory `project_eg4_soc_drift_remediation`.
coulomb counter). Verified live via the equal-voltage/different-SoC signature above.
Fix = the `calibration-charge` skill (periodic full charge). See memory
`project_eg4_soc_drift_remediation`.
- **RS485 daisy-chain silences slave packs** — each pack needs its own FTDI; an
inter-pack chain demotes slaves. See memory `project_eg4_daisy_chain_silences_slaves`.
- **No per-day inverter energy** — PI18 only gives `ET` (lifetime Wh); ED/EM/EY NAK.
@@ -143,3 +147,9 @@ MQTT — compute them yourself from the raw entities when working off the Pi.
When a fix is outside the allowed set, report the finding and hand the user the
precise command(s) to run.
**Scoped exception — `calibration-charge` skill only:** that one skill may change
exactly one setting (`stop_charge_voltage` → Full and back) via the prepared
`eg4-lp4-v2-calibration.yaml` profile, on BOTH inverters, and ONLY after explicit
in-session user confirmation, and it must REVERT afterward. No other skill and no
other setting. This does not loosen the policy above for anything else.