Loadpoint: fix min soc energy fallback (#30461)

This commit is contained in:
MaIII Themd 2026-06-03 19:19:04 +07:00 • committed by GitHub
parent 98a4cd380c
commit 85ea408c15
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 60 additions and 1 deletions

View file

@ -1071,7 +1071,7 @@ func (lp *Loadpoint) minSocNotReached() bool {
return active
}
minEnergy := v.Capacity() * float64(minSoc) / 100 / soc.ChargeEfficiency
minEnergy := v.Capacity() * float64(minSoc) * 10 / soc.ChargeEfficiency
return minEnergy > 0 && lp.getChargedEnergy() < minEnergy
}

View file

@ -0,0 +1,59 @@
package core
import (
"testing"
"github.com/evcc-io/evcc/api"
"github.com/evcc-io/evcc/core/keys"
"github.com/evcc-io/evcc/core/soc"
"github.com/evcc-io/evcc/server/db/settings"
"github.com/evcc-io/evcc/util"
"github.com/evcc-io/evcc/util/config"
"github.com/stretchr/testify/require"
"go.uber.org/mock/gomock"
)
// TestMinSocNotReachedEnergyFallback covers the energy fallback path of
// minSocNotReached() that is used when no vehicle soc is available
// (vehicleSoc == 0). Capacity() is in kWh while getChargedEnergy() is in Wh, so
// the required minimum energy must be converted to Wh before the comparison.
//
// 10 kWh vehicle, minSoc 50%, charge efficiency 0.85:
//
// minEnergy = 10 * 1e3 * 50/100 / 0.85 = 5882.35 Wh
//
// With only 3000 Wh charged so far the minimum is not reached, so
// minSocNotReached() must return true.
func TestMinSocNotReachedEnergyFallback(t *testing.T) {
config.Reset()
t.Cleanup(config.Reset)
ctrl := gomock.NewController(t)
const vehicleName = "minsocvehicle"
const capacityKWh = 10.0
const minSocPct = 50
vehicle := api.NewMockVehicle(ctrl)
vehicle.EXPECT().Capacity().Return(capacityKWh).AnyTimes()
vehicle.EXPECT().GetTitle().Return("minsoc").AnyTimes()
// register the vehicle so its persisted settings (min soc) are used
require.NoError(t, config.Vehicles().Add(
config.NewStaticDevice(config.Named{Name: vehicleName}, api.Vehicle(vehicle)),
))
settings.SetInt("vehicle."+vehicleName+"."+keys.MinSoc, int64(minSocPct))
lp := NewLoadpoint(util.NewLogger("foo"), nil)
lp.vehicle = vehicle
lp.vehicleSoc = 0 // no soc reading- exercise the energy fallback
lp.energyMetrics.totalKWh = 3.0 // 3000 Wh charged so far
require.Equal(t, 3000.0, lp.getChargedEnergy())
wantMinEnergyWh := capacityKWh * 1e3 * float64(minSocPct) / 100 / soc.ChargeEfficiency
require.InDelta(t, 5882.35, wantMinEnergyWh, 0.1)
// 3000 Wh < 5882 Wh required => minimum not reached
require.True(t, lp.minSocNotReached())
}