From 02938e00d026e78e83cc5e3da52db94825fac697 Mon Sep 17 00:00:00 2001 From: andig Date: Tue, 1 Apr 2025 19:40:47 +0200 Subject: [PATCH] chore: log retries - revert me (#20311) --- cmd/dumper.go | 16 +++++++++++++++- core/site.go | 15 ++++++++++++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/cmd/dumper.go b/cmd/dumper.go index 885533b0c..5f1545f06 100644 --- a/cmd/dumper.go +++ b/cmd/dumper.go @@ -9,6 +9,7 @@ import ( "text/tabwriter" "time" + "github.com/cenkalti/backoff/v4" "github.com/evcc-io/evcc/api" "github.com/fatih/structs" ) @@ -34,6 +35,11 @@ func (d *dumper) DumpWithHeader(name string, device interface{}) { } } +// bo returns an exponential backoff for reading meter power quickly +func bo() *backoff.ExponentialBackOff { + return backoff.NewExponentialBackOff(backoff.WithInitialInterval(20*time.Millisecond), backoff.WithMaxElapsedTime(time.Second)) +} + func (d *dumper) Dump(name string, v interface{}) { w := tabwriter.NewWriter(os.Stdout, 0, 0, 1, ' ', 0) @@ -45,7 +51,15 @@ func (d *dumper) Dump(name string, v interface{}) { // meter if v, ok := v.(api.Meter); ok { - if power, err := v.CurrentPower(); err != nil { + power, err := backoff.RetryWithData(func() (float64, error) { + f, err := v.CurrentPower() + if err != nil { + fmt.Println(err) + } + return f, err + }, bo()) + + if err != nil { fmt.Fprintf(w, "Power:\t%v\n", err) } else { fmt.Fprintf(w, "Power:\t%.0fW\n", power) diff --git a/core/site.go b/core/site.go index 420f4937f..0297c9ff6 100644 --- a/core/site.go +++ b/core/site.go @@ -1,6 +1,7 @@ package core import ( + "bytes" "context" "fmt" "math" @@ -484,10 +485,22 @@ func (site *Site) collectMeters(key string, meters []config.Device[api.Meter]) [ meter := dev.Instance() // power - power, err := backoff.RetryWithData(meter.CurrentPower, bo()) + var b bytes.Buffer + start := time.Now() + power, err := backoff.RetryWithData(func() (float64, error) { + f, err := meter.CurrentPower() + if err != nil { + fmt.Fprintf(&b, "%v !! %v\n", time.Now(), err) + } + return f, err + }, bo()) if err == nil { site.log.DEBUG.Printf("%s %d power: %.0fW", key, i+1, power) } else { + if b.Len() > 0 { + site.log.ERROR.Println(start, "!!") + site.log.ERROR.Println(b.String()) + } site.log.ERROR.Printf("%s %d power: %v", key, i+1, err) }