57 lines
1.2 KiB
Go
57 lines
1.2 KiB
Go
package tariff
|
|
|
|
import (
|
|
"errors"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/cenkalti/backoff/v4"
|
|
"github.com/evcc-io/evcc/api"
|
|
"github.com/evcc-io/evcc/util"
|
|
"github.com/evcc-io/evcc/util/request"
|
|
)
|
|
|
|
func bo() backoff.BackOff {
|
|
return backoff.NewExponentialBackOff(
|
|
backoff.WithInitialInterval(time.Second),
|
|
backoff.WithMaxElapsedTime(time.Minute),
|
|
)
|
|
}
|
|
|
|
// backoffPermanentError returns a permanent error in case of HTTP 400
|
|
func backoffPermanentError(err error) error {
|
|
var se request.StatusError
|
|
if errors.As(err, &se) {
|
|
if code := se.StatusCode(); code >= 400 && code < 500 {
|
|
return backoff.Permanent(se)
|
|
}
|
|
}
|
|
if err != nil && strings.HasPrefix(err.Error(), "jq: query failed") {
|
|
return backoff.Permanent(err)
|
|
}
|
|
return err
|
|
}
|
|
|
|
// mergeRates merges new rates into existing rates,
|
|
// keeping current slots from the existing rates.
|
|
func mergeRates(data *util.Monitor[api.Rates], new api.Rates) {
|
|
new.Sort()
|
|
|
|
var newStart time.Time
|
|
if len(new) > 0 {
|
|
newStart = new[0].Start
|
|
}
|
|
|
|
data.SetFunc(func(old api.Rates) api.Rates {
|
|
now := time.Now()
|
|
|
|
var between api.Rates
|
|
for _, r := range old {
|
|
if (r.Start.Before(newStart) || newStart.IsZero()) && r.End.After(now) {
|
|
between = append(between, r)
|
|
}
|
|
}
|
|
|
|
return append(between, new...)
|
|
})
|
|
}
|