Circuit: add retry (#20151)

This commit is contained in:
andig 2025-03-27 09:01:15 +01:00 • committed by GitHub
parent a431b15d10
commit 36e8dce048
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 26 additions and 8 deletions

View file

@ -7,6 +7,7 @@ import (
"sync"
"time"
"github.com/cenkalti/backoff/v4"
"github.com/evcc-io/evcc/api"
"github.com/evcc-io/evcc/plugin"
"github.com/evcc-io/evcc/util"
@ -234,7 +235,7 @@ func (c *Circuit) overloadOnError(t time.Time, val *float64) {
}
func (c *Circuit) updateMeters() error {
if f, err := c.meter.CurrentPower(); err == nil {
if f, err := backoff.RetryWithData(c.meter.CurrentPower, bo()); err == nil {
c.power = f
c.powerUpdated = time.Now()
} else {
@ -243,6 +244,16 @@ func (c *Circuit) updateMeters() error {
}
if phaseMeter, ok := c.meter.(api.PhaseCurrents); ok {
var i1, i2, i3 float64
if err := backoff.Retry(func() error {
var err error
i1, i2, i3, err = phaseMeter.Currents()
return err
}, bo()); err != nil {
c.overloadOnError(c.currentUpdated, &c.current)
return fmt.Errorf("circuit currents: %w", err)
}
var p1, p2, p3 float64
if phaseMeter, ok := c.meter.(api.PhasePowers); ok {
var err error // phases needed for signed currents
@ -251,13 +262,8 @@ func (c *Circuit) updateMeters() error {
}
}
if i1, i2, i3, err := phaseMeter.Currents(); err == nil {
c.current = max(util.SignFromPower(i1, p1), util.SignFromPower(i2, p2), util.SignFromPower(i3, p3))
c.currentUpdated = time.Now()
} else {
c.overloadOnError(c.currentUpdated, &c.current)
return fmt.Errorf("circuit currents: %w", err)
}
c.current = max(util.SignFromPower(i1, p1), util.SignFromPower(i2, p2), util.SignFromPower(i3, p3))
c.currentUpdated = time.Now()
}
return nil

12
core/circuit/helper.go Normal file
View file

@ -0,0 +1,12 @@
package circuit
import (
"time"
"github.com/cenkalti/backoff/v4"
)
// 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))
}