From 950a27d6ef8cbea46bdc5ba720d2ebed32bcf002 Mon Sep 17 00:00:00 2001 From: andig Date: Tue, 18 Mar 2025 07:27:24 +0100 Subject: [PATCH] RCT: refactor retry (#19800) --- go.mod | 4 +- go.sum | 4 +- meter/rct.go | 81 +++++++++++++++++------ templates/definition/meter/rct-power.yaml | 2 +- 4 files changed, 63 insertions(+), 28 deletions(-) diff --git a/go.mod b/go.mod index ab9a83771..6736947b4 100644 --- a/go.mod +++ b/go.mod @@ -30,6 +30,7 @@ require ( github.com/enbility/eebus-go v0.7.0 github.com/enbility/ship-go v0.6.0 github.com/enbility/spine-go v0.7.0 + github.com/evcc-io/rct v0.1.2-0.20250315164247-d2f41b161785 github.com/evcc-io/tesla-proxy-client v0.0.0-20240221194046-4168b3759701 github.com/fatih/structs v1.1.0 github.com/glebarez/sqlite v1.11.0 @@ -65,7 +66,6 @@ require ( github.com/lunixbochs/struc v0.0.0-20241101090106-8d528fa2c543 github.com/mabunixda/wattpilot v1.8.4 github.com/mitchellh/go-homedir v1.1.0 - github.com/mlnoga/rct v0.1.2-0.20250202175314-91abcbf32e53 github.com/muka/go-bluetooth v0.0.0-20240701044517-04c4f09c514e github.com/mxschmitt/golang-combinations v1.2.0 github.com/nicksnyder/go-i18n/v2 v2.5.1 @@ -221,5 +221,3 @@ replace gopkg.in/yaml.v3 => github.com/andig/yaml v0.0.0-20240531135838-1ff5761a replace github.com/grid-x/modbus => github.com/evcc-io/modbus v0.0.0-20241027151224-722a7a5ae529 replace github.com/lorenzodonini/ocpp-go => github.com/evcc-io/ocpp-go v0.0.0-20241230132027-815870498cc3 - -replace github.com/mlnoga/rct => github.com/andig/rct v0.1.2-0.20250304151343-a31971ce3e06 diff --git a/go.sum b/go.sum index b65df6e14..dcffa7323 100644 --- a/go.sum +++ b/go.sum @@ -39,8 +39,6 @@ github.com/andig/gosunspec v0.0.0-20240918203654-860ce51d602b h1:81UMfM949I7StrR github.com/andig/gosunspec v0.0.0-20240918203654-860ce51d602b/go.mod h1:c6P6szcR+ROkqZruOR4f6qbDKFjZX6OitPpj+yJ/r8k= github.com/andig/mbserver v0.0.0-20230310211055-1d29cbb5820e h1:m/NTP3JWpR7M0ljLxiQU4fzR25jjhe1LDtxLMNcoNJQ= github.com/andig/mbserver v0.0.0-20230310211055-1d29cbb5820e/go.mod h1:4VtYzTm//oUipwvO3yh0g/udTE7pYJM+U/kyAuFDsgM= -github.com/andig/rct v0.1.2-0.20250304151343-a31971ce3e06 h1:2tTH5epAWlGfdnHmQRnrBthL36F2MuNhBFEUn5i3q10= -github.com/andig/rct v0.1.2-0.20250304151343-a31971ce3e06/go.mod h1:LIyCLUydqQXBiCipA0/cURUNPzO/33//LS0UqiAY8qc= github.com/andig/yaml v0.0.0-20240531135838-1ff5761ab467 h1:JqIoHxsQSV39xaemvVRu3HOkSf5AbhQ1YEENJa2cL3Q= github.com/andig/yaml v0.0.0-20240531135838-1ff5761ab467/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= github.com/andybalholm/cascadia v1.3.3 h1:AG2YHrzJIm4BZ19iwJ/DAua6Btl3IwJX+VI4kktS1LM= @@ -159,6 +157,8 @@ github.com/evcc-io/modbus v0.0.0-20241027151224-722a7a5ae529 h1:18rLAN7zm3AmY2OP github.com/evcc-io/modbus v0.0.0-20241027151224-722a7a5ae529/go.mod h1:swrNGAVgI1r/3d/sEKE7qgujdRR9aHVPYKyc3gvpVTc= github.com/evcc-io/ocpp-go v0.0.0-20241230132027-815870498cc3 h1:W086rzYedGdIQhYSW63M8GyZIx5qMxXEV+qZEzG3Eno= github.com/evcc-io/ocpp-go v0.0.0-20241230132027-815870498cc3/go.mod h1:PDT3uxaVPtcFQv0qdwO0v/zdVbrUZiSbLYifBVdrIEA= +github.com/evcc-io/rct v0.1.2-0.20250315164247-d2f41b161785 h1:OWCBVMcPsVTffdiZN3VYaq9p4fsWlzd490J6pekaKLA= +github.com/evcc-io/rct v0.1.2-0.20250315164247-d2f41b161785/go.mod h1:n6MTBU36QOadGlxxiADu86VaT5l0eYdbmFBHF14AD/s= github.com/evcc-io/tesla-proxy-client v0.0.0-20240221194046-4168b3759701 h1:3JplY3KS6KMDVDNAU+3+KWmSWmoHIU34qwuIpW6SiHk= github.com/evcc-io/tesla-proxy-client v0.0.0-20240221194046-4168b3759701/go.mod h1:zWtAweBqXJTk3HSrPSecz3Q3a2hAUQ4vOE6paJfn03I= github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= diff --git a/meter/rct.go b/meter/rct.go index 3989b0b62..c4bd57f4a 100644 --- a/meter/rct.go +++ b/meter/rct.go @@ -13,7 +13,8 @@ import ( "github.com/cenkalti/backoff/v4" "github.com/evcc-io/evcc/api" "github.com/evcc-io/evcc/util" - "github.com/mlnoga/rct" + "github.com/evcc-io/rct" + "golang.org/x/sync/errgroup" ) // RCT implements the api.Meter interface @@ -41,7 +42,7 @@ func NewRCTFromConfig(ctx context.Context, other map[string]interface{}) (api.Me MinSoc, MaxSoc int Cache time.Duration }{ - Cache: time.Second, + Cache: 30 * time.Second, } if err := util.DecodeOther(other, &cc); err != nil { @@ -160,15 +161,28 @@ func (m *RCT) CurrentPower() (float64, error) { return m.queryFloat(rct.TotalGridPowerW) case "pv": - a, err := m.queryFloat(rct.SolarGenAPowerW) - if err != nil { - return 0, err - } - b, err := m.queryFloat(rct.SolarGenBPowerW) - if err != nil { - return 0, err - } - c, err := m.queryFloat(rct.S0ExternalPowerW) + var eg errgroup.Group + var a, b, c float64 + + eg.Go(func() error { + var err error + a, err = m.queryFloat(rct.SolarGenAPowerW) + return err + }) + + eg.Go(func() error { + var err error + b, err = m.queryFloat(rct.SolarGenBPowerW) + return err + }) + + eg.Go(func() error { + var err error + c, err = m.queryFloat(rct.S0ExternalPowerW) + return err + }) + + err := eg.Wait() return a + b + c, err case "battery": @@ -187,19 +201,41 @@ func (m *RCT) totalEnergy() (float64, error) { return res / 1000, err case "pv": - a, err := m.queryFloat(rct.TotalEnergySolarGenAWh) - if err != nil { - return 0, err - } - b, err := m.queryFloat(rct.TotalEnergySolarGenBWh) + var eg errgroup.Group + var a, b float64 + + eg.Go(func() error { + var err error + a, err = m.queryFloat(rct.TotalEnergySolarGenAWh) + return err + }) + + eg.Go(func() error { + var err error + b, err = m.queryFloat(rct.TotalEnergySolarGenBWh) + return err + }) + + err := eg.Wait() return (a + b) / 1000, err case "battery": - in, err := m.queryFloat(rct.TotalEnergyBattInWh) - if err != nil { - return 0, err - } - out, err := m.queryFloat(rct.TotalEnergyBattOutWh) + var eg errgroup.Group + var in, out float64 + + eg.Go(func() error { + var err error + in, err = m.queryFloat(rct.TotalEnergyBattInWh) + return err + }) + + eg.Go(func() error { + var err error + out, err = m.queryFloat(rct.TotalEnergyBattOutWh) + return err + }) + + err := eg.Wait() return (in - out) / 1000, err default: @@ -215,7 +251,8 @@ func (m *RCT) batterySoc() (float64, error) { func (m *RCT) bo() *backoff.ExponentialBackOff { return backoff.NewExponentialBackOff( - backoff.WithInitialInterval(100*time.Millisecond), + backoff.WithInitialInterval(500*time.Millisecond), + backoff.WithMaxInterval(2*time.Second), backoff.WithMaxElapsedTime(10*time.Second)) } diff --git a/templates/definition/meter/rct-power.yaml b/templates/definition/meter/rct-power.yaml index 159b145f9..495d8b6c1 100644 --- a/templates/definition/meter/rct-power.yaml +++ b/templates/definition/meter/rct-power.yaml @@ -22,7 +22,7 @@ params: advanced: true - name: cache advanced: true - default: 10s + default: 30s render: | type: rct uri: {{ .host }}