Synchronize range and odometer with soc updates (#1767)
This commit is contained in:
parent
e96e46b59e
commit
0500257e9c
2 changed files with 17 additions and 56 deletions
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue