# 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). # # !!! 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). # The field flash.py calls `stop_charge_voltage` is really the inverter's # **battery_re_discharge_voltage** (HA: sensor.lvx6048_*_battery_re_discharge_voltage) — # the voltage at which the inverter switches loads back to battery after grid charging. # At 54.0 V, grid tops the bank only to ~54 V. Raising it (below) lets grid charge # higher, BUT it may band-oscillate near the setpoint rather than hold a clean # absorption, so it's NOT guaranteed to give the full-charge termination the BMS needs # to re-anchor. SOLAR-ONLY is the known-good method (solar follows the full CC/CV curve # to bulk + absorption); use this grid profile only as a supervised experiment. # # Corrected (candidate) change vs canonical: stop_charge_voltage 54.0 -> 56.0 (was 0). # bulk_voltage stays 56.4 (absorption target). # # 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 # re-discharge voltage. 54.0 (canonical) tops grid charge to ~54 V; 56.0 lets grid # charge higher. NOT 0 — firmware NAKs 0/"Full". Range 48.0..58.0. UNVALIDATED lever. stop_charge_voltage: 56.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