Circuit: add retry (#20151)
This commit is contained in:
parent
a431b15d10
commit
36e8dce048
2 changed files with 26 additions and 8 deletions
|
|
@ -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
12
core/circuit/helper.go
Normal 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))
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue