Improve estimator resilience against outdated SoC values (#1562)

This commit is contained in:
premultiply 2021-10-11 08:11:51 +02:00 • committed by GitHub
parent 8baf2a3fab
commit 8d7a7b31bb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -143,9 +143,25 @@ func (s *Estimator) SoC(chargedEnergy float64) (float64, error) {
energyDelta := math.Max(chargedEnergy, 0) - s.prevChargedEnergy
if socDelta != 0 || energyDelta < 0 { // soc value change or unexpected energy reset
// compare ChargeState of vehicle and charger
var invalid bool
if vs, ok := s.vehicle.(api.ChargeState); ok {
ccs, err := s.charger.Status()
if err != nil {
return 0, err
}
vcs, err := vs.Status()
if err != nil {
vcs = ccs // sanitize vehicle errors
} else {
s.log.DEBUG.Printf("vehicle status: %s", vcs)
}
invalid = vcs != ccs
}
// calculate gradient, wh per soc %
// TODO: drop samples with unmatching state of evse and vehicle
if socDelta > 2 && energyDelta > 0 && s.prevSoC > 0 {
if !invalid && socDelta > 2 && energyDelta > 0 && s.prevSoC > 0 {
s.energyPerSocStep = energyDelta / socDelta
s.virtualCapacity = s.energyPerSocStep * 100
s.log.DEBUG.Printf("soc gradient updated: energyPerSocStep: %0.0fWh, virtualCapacity: %0.0fWh", s.energyPerSocStep, s.virtualCapacity)