Docs: reflect this session's findings across the repo

- top-level README.md (new): system overview, subsystem map, skills pointer,
  notable findings.
- eg4battery README/NOTES: 3 -> 6 packs (pack 6 oddball 0x01/115200); SoC drift
  + calibration section; closed-loop comms evaluated and rejected (loses per-pack
  telemetry, no native protocol, doesn't fix drift); how to force a grid charge
  via output-priority SUB.
- LVX6048 README: closed-loop pending item -> resolved decision; new "SoC
  calibration & known firmware quirks" section (POP single-digit/POP01, MCHGC
  charge-lock, re_discharge=re-discharge can't exceed float, PIRI lag, powermon
  adhoc wedge); skills pointer.
- lvx-control README: POP encoding fix, POP crc-but-applies quirk, verify-by-
  behavior, grid-charge-via-SUB usage.
- troubleshoot-inverter skill: corrected the stale "dead string per inverter"
  claim — both strings healthy; low PV is tilt/heat/shade/curtailment.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-25 21:46:02 -04:00
parent 4bfa021719
commit 8dafce7dfe
6 changed files with 168 additions and 23 deletions

View File

@@ -5,8 +5,9 @@ RS-485 and publishes per-pack telemetry to MQTT with HA auto-discovery.
## Status: live
All 3 packs publishing in `modbus_per_pack` mode, each on its own FTDI
RS-485 adapter. Per pack, ~70 named entities + 136 raw `register_NN` series:
All **6 packs** publishing in `modbus_per_pack` mode, each on its own FTDI
RS-485 adapter (packs 15 at addr `0x40`/9600; pack 6 is an oddball at addr
`0x01`/115200). Per pack, ~70 named entities + 136 raw `register_NN` series:
```
lifepower4_1_pack_voltage 52.56 V (16 cells × 3.285 V)
@@ -41,6 +42,18 @@ Set by `bus.mode` in `~/.config/eg4-battery/eg4-battery.yaml`:
See [`NOTES.md`](./NOTES.md) for architecture, register map, LVX6048
compatibility findings, and bring-up checklist.
## SoC drift & calibration
The per-pack BMS SoC is coulomb-counted and **drifts** because the conservative
LVX6048 charge profile rarely drives a true full charge, so the counters never
re-anchor to 100% (observed 870% spread across packs at an identical resting
voltage — they're all physically at the same charge; the spread is pure drift).
Fix is a periodic **full charge to absorption**, which re-anchors every pack to
100%. Automated by the `calibration-charge` skill (solar-only, or grid-assisted
via output-priority SUB on a cloudy day) — see
[`../.claude/skills/calibration-charge/`](../.claude/skills/calibration-charge/)
and `../.claude/skills/lib/grid-cal-monitor`.
## What's in the box
```