From 2f0c720b49103d19e7ea4d2232ae2d0788b7ab99 Mon Sep 17 00:00:00 2001 From: andig Date: Sun, 21 Sep 2025 10:42:43 +0200 Subject: [PATCH] Optimizer: ignore batteries of unknown capacity, fix soc limits infeasible --- core/site_optimizer.go | 52 +++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/core/site_optimizer.go b/core/site_optimizer.go index 97f5043ab..18a1f4f52 100644 --- a/core/site_optimizer.go +++ b/core/site_optimizer.go @@ -130,6 +130,11 @@ func (site *Site) optimizerUpdate(battery []measurement) error { continue } + v := lp.GetVehicle() + if v == nil || v.Capacity() == 0 { + continue + } + bat := evopt.BatteryConfig{ ChargeFromGrid: true, CMin: float32(lp.EffectiveMinPower()), @@ -148,32 +153,31 @@ func (site *Site) optimizerUpdate(battery []measurement) error { Title: lp.GetTitle(), } - if v := lp.GetVehicle(); v != nil { - limit := v.Capacity() * 1e3 // Wh - if v := lp.EffectiveLimitSoc(); v > 0 { - limit *= float64(v) / 100 - } else if v := lp.GetLimitEnergy(); v > 0 { - limit = v * 1e3 + // vehicle + maxSoc := v.Capacity() * 1e3 // Wh + if v := lp.EffectiveLimitSoc(); v > 0 { + maxSoc *= float64(v) / 100 + } else if v := lp.GetLimitEnergy(); v > 0 { + maxSoc = v * 1e3 + } + + bat.SInitial = float32(v.Capacity() * lp.GetSoc() * 10) // Wh + bat.SMax = max(bat.SInitial, float32(maxSoc)) // prevent infeasible if current soc above maximum + + detail.Type = batteryTypeVehicle + detail.Capacity = v.Capacity() + + if vt := v.GetTitle(); vt != "" { + if detail.Title != "" { + detail.Title += " – " } + detail.Title += vt + } - bat.SMax = float32(limit) - bat.SInitial = float32(v.Capacity() * lp.GetSoc() * 10) // Wh - - detail.Type = batteryTypeVehicle - detail.Capacity = v.Capacity() - - if vt := v.GetTitle(); vt != "" { - if detail.Title != "" { - detail.Title += " – " - } - detail.Title += vt - } - - // find vehicle name/id - for _, dev := range config.Vehicles().Devices() { - if dev.Instance() == v { - detail.Name = dev.Config().Name - } + // find vehicle name/id + for _, dev := range config.Vehicles().Devices() { + if dev.Instance() == v { + detail.Name = dev.Config().Name } }