Align soc retry handling

This commit is contained in:
andig 2021-10-20 15:29:40 +02:00
parent 4ce8e5a72e
commit d9c15954e6
3 changed files with 29 additions and 53 deletions

View file

@ -65,12 +65,18 @@ func (d *dumper) Dump(name string, v interface{}) {
}
if v, ok := v.(api.Battery); ok {
soc, err := v.SoC()
var soc float64
var err error
for err != nil && errors.Is(err, api.ErrMustRetry) {
fmt.Fprint(w, ".")
time.Sleep(3 * time.Second)
soc, err = v.SoC()
// wait up to 1m for the vehicle to wakeup
start := time.Now()
for soc, err = v.SoC(); err != nil && errors.Is(err, api.ErrMustRetry); {
if time.Since(start) > time.Minute {
err = api.ErrTimeout
} else {
fmt.Fprint(w, ".")
time.Sleep(3 * time.Second)
}
}
if err != nil {
@ -116,10 +122,6 @@ func (d *dumper) Dump(name string, v interface{}) {
// vehicle
if v, ok := v.(api.Vehicle); ok {
fmt.Fprintf(w, "Capacity:\t%dkWh\n", v.Capacity())
}
if v, ok := v.(api.VehicleRange); ok {
if rng, err := v.Range(); err != nil {
fmt.Fprintf(w, "Range:\t%v\n", err)
@ -173,5 +175,9 @@ func (d *dumper) Dump(name string, v interface{}) {
v.Diagnose()
}
if v, ok := v.(api.Vehicle); ok {
fmt.Fprintf(w, "Capacity:\t%dkWh\n", v.Capacity())
}
w.Flush()
}

View file

@ -72,26 +72,24 @@ func main() {
}
case "soc":
var soc float64
var err error
start := time.Now()
for {
for soc, err = v.SoC(); err != nil && errors.Is(err, api.ErrMustRetry); {
if time.Since(start) > time.Minute {
log.Fatal(api.ErrTimeout)
err = api.ErrTimeout
} else {
time.Sleep(5 * time.Second)
}
soc, err := v.SoC()
if err != nil {
if errors.Is(err, api.ErrMustRetry) {
time.Sleep(5 * time.Second)
continue
}
log.Fatal(err)
}
fmt.Println(int(math.Round(soc)))
break
}
if err != nil {
log.Fatal(err)
}
fmt.Println(int(math.Round(soc)))
default:
log.Fatal("invalid action:", action)
}

View file

@ -1,10 +1,6 @@
package cmd
import (
"errors"
"fmt"
"time"
"github.com/evcc-io/evcc/api"
"github.com/evcc-io/evcc/server"
"github.com/evcc-io/evcc/util"
@ -49,32 +45,8 @@ func runVehicle(cmd *cobra.Command, args []string) {
}
d := dumper{len: len(vehicles)}
NEXT:
for name, v := range vehicles {
start := time.Now()
WAIT:
// wait up to 1m for the vehicle to wakeup
for {
if time.Since(start) > time.Minute {
log.ERROR.Println(api.ErrTimeout)
continue NEXT
}
if _, err := v.SoC(); err != nil {
if errors.Is(err, api.ErrMustRetry) {
time.Sleep(5 * time.Second)
fmt.Print(".")
continue WAIT
}
log.ERROR.Println(err)
continue NEXT
}
break
}
d.DumpWithHeader(name, v)
}
}