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:
51
LVX6048/lvx-flash/profiles/eg4-lp4-v2-calibration.yaml
Normal file
51
LVX6048/lvx-flash/profiles/eg4-lp4-v2-calibration.yaml
Normal file
@@ -0,0 +1,51 @@
|
||||
# LVX6048 settings profile — TEMPORARY calibration charge for the EG4 LP4 v2 bank.
|
||||
#
|
||||
# Purpose: re-anchor drifted EG4 pack SoC counters (and top-balance) by letting the
|
||||
# bank reach a FULL charge with absorption hold. The EG4 BMS resets SoC to 100% only
|
||||
# on a real full-charge termination (high cell voltage + low taper current); the
|
||||
# conservative everyday profile stops grid charging at 54.0 V (mid-knee), so on cloudy
|
||||
# / 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).
|
||||
#
|
||||
# The ONLY change vs the canonical eg4-lp4-v2.yaml is:
|
||||
# stop_charge_voltage: 54.0 -> 0 (= "Full"; remove the grid-charge ceiling so a
|
||||
# full charge can complete even without strong sun)
|
||||
# bulk_voltage stays 56.4 (the absorption target). Solar already charges past 54 V on a
|
||||
# good day; this profile just lets GRID finish the top-off when solar can't.
|
||||
#
|
||||
# USE: this is a TEMPORARY profile driven by the `calibration-charge` skill. Apply to
|
||||
# BOTH inverters, run the full charge, verify all 6 packs hit 100%, then REVERT to
|
||||
# eg4-lp4-v2.yaml. Do not leave this profile applied — it removes the everyday
|
||||
# grid-charge ceiling.
|
||||
#
|
||||
# sudo systemctl stop powermon.service powermon2.service
|
||||
# ./flash.py apply --device /dev/lvx6048-1 --profile profiles/eg4-lp4-v2-calibration.yaml --confirm
|
||||
# ./flash.py apply --device /dev/lvx6048-2 --profile profiles/eg4-lp4-v2-calibration.yaml --confirm
|
||||
# ./flash.py compare --device-a /dev/lvx6048-1 --device-b /dev/lvx6048-2
|
||||
# sudo systemctl start powermon.service powermon2.service
|
||||
# # ... drive + verify the charge (see calibration-charge skill) ...
|
||||
# # REVERT when all packs read 100%:
|
||||
# sudo systemctl stop powermon.service powermon2.service
|
||||
# ./flash.py apply --device /dev/lvx6048-1 --profile profiles/eg4-lp4-v2.yaml --confirm
|
||||
# ./flash.py apply --device /dev/lvx6048-2 --profile profiles/eg4-lp4-v2.yaml --confirm
|
||||
# sudo systemctl start powermon.service powermon2.service
|
||||
|
||||
battery_type: USER
|
||||
|
||||
cutoff_voltage: 48.0
|
||||
stop_discharge_voltage: 48.0
|
||||
|
||||
# 0 = Full — let grid charge all the way to bulk (the calibration lever).
|
||||
stop_charge_voltage: 0
|
||||
|
||||
bulk_voltage: 56.4
|
||||
float_voltage: 54.0
|
||||
|
||||
max_charging_current: 60
|
||||
max_utility_charging_current: 30
|
||||
|
||||
output_source_priority: solar_battery_utility
|
||||
charger_priority: solar_first
|
||||
solar_power_priority: battery_load_utility_ac
|
||||
|
||||
grid_tie: disabled
|
||||
Reference in New Issue
Block a user