Synchronize range and odometer with soc updates (#1767)

This commit is contained in:
andig 2021-10-22 19:35:53 +02:00 • committed by GitHub
parent e96e46b59e
commit 0500257e9c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 17 additions and 56 deletions

View file

@ -136,8 +136,6 @@ type LoadPoint struct {
chargedEnergy float64 // Charged energy while connected in Wh
chargeRemainingDuration time.Duration // Remaining charge duration
chargeRemainingEnergy float64 // Remaining charge energy in Wh
tasks []func() error // task list for repeated execution
}
// NewLoadPointFromConfig creates a new loadpoint
@ -708,8 +706,7 @@ func (lp *LoadPoint) setActiveVehicle(vehicle api.Vehicle) {
lp.publish("vehiclePresent", true)
lp.publish("vehicleTitle", lp.vehicle.Title())
lp.publish("vehicleCapacity", lp.vehicle.Capacity())
lp.task(lp.odometer)
lp.publish("vehicleOdometer", 0.0)
} else {
lp.socEstimator = nil
@ -1182,6 +1179,22 @@ func (lp *LoadPoint) publishSoCAndRange() {
}
lp.setRemainingEnergy(1e3 * lp.socEstimator.RemainingChargeEnergy(lp.SoC.Target))
// range
if vs, ok := lp.vehicle.(api.VehicleRange); ok {
if rng, err := vs.Range(); err == nil {
lp.log.DEBUG.Printf("vehicle range: %vkm", rng)
lp.publish("vehicleRange", rng)
}
}
// odometer
if vs, ok := lp.vehicle.(api.VehicleOdometer); ok {
if odo, err := vs.Odometer(); err == nil {
lp.log.DEBUG.Printf("vehicle odometer: %vkm", odo)
lp.publish("vehicleOdometer", odo)
}
}
} else {
if errors.Is(err, api.ErrMustRetry) {
lp.socUpdated = time.Time{}
@ -1190,14 +1203,6 @@ func (lp *LoadPoint) publishSoCAndRange() {
}
}
// range
if vs, ok := lp.vehicle.(api.VehicleRange); ok {
if rng, err := vs.Range(); err == nil {
lp.log.DEBUG.Printf("vehicle range: %vkm", rng)
lp.publish("vehicleRange", rng)
}
}
return
}
@ -1248,9 +1253,6 @@ func (lp *LoadPoint) Update(sitePower float64, cheap bool, batteryBuffered bool)
}
}
// odometer etc, if active
lp.runTasks()
// publish soc after updating charger status to make sure
// initial update of connected state matches charger status
lp.publishSoCAndRange()

View file

@ -1,41 +0,0 @@
package core
import (
"errors"
"github.com/evcc-io/evcc/api"
)
// task adds a task to the list of running tasks
func (lp *LoadPoint) task(task func() error) {
lp.tasks = append(lp.tasks, task)
}
// runTasks runs all defined tasks
func (lp *LoadPoint) runTasks() {
var incomplete []func() error
for _, task := range lp.tasks {
err := task()
if errors.Is(err, api.ErrMustRetry) {
incomplete = append(incomplete, task)
}
}
lp.tasks = incomplete
}
func (lp *LoadPoint) odometer() error {
v, ok := lp.vehicle.(api.VehicleOdometer)
if !ok {
return nil
}
odo, err := v.Odometer()
switch err {
case nil:
lp.publish("vehicleOdometer", odo)
case api.ErrMustRetry:
default:
lp.log.ERROR.Printf("vehicle odometer: %v", err)
}
return err
}