Skip to content

Commit

Permalink
chore: use util.Monitor for tariffs (evcc-io#10729)
Browse files Browse the repository at this point in the history
Rate limit · GitHub

Whoa there!

You have triggered an abuse detection mechanism.

Please wait a few minutes before you try again;
in some cases this may take up to an hour.

andig authored Nov 12, 2023
1 parent 0098aa9 commit 5d0caa8
Showing 10 changed files with 119 additions and 156 deletions.
27 changes: 12 additions & 15 deletions tariff/awattar.go
Original file line number Diff line number Diff line change
@@ -16,11 +16,9 @@ import (

type Awattar struct {
*embed
mux sync.Mutex
log *util.Logger
uri string
data api.Rates
updated time.Time
log *util.Logger
uri string
data *util.Monitor[api.Rates]
}

var _ api.Tariff = (*Awattar)(nil)
@@ -73,29 +71,28 @@ func (t *Awattar) run(done chan error) {

once.Do(func() { close(done) })

t.mux.Lock()
t.updated = time.Now()

t.data = make(api.Rates, 0, len(res.Data))
data := make(api.Rates, 0, len(res.Data))
for _, r := range res.Data {
ar := api.Rate{
Start: r.StartTimestamp.Local(),
End: r.EndTimestamp.Local(),
Price: t.totalPrice(r.Marketprice / 1e3),
}
t.data = append(t.data, ar)
data = append(data, ar)
}
t.data.Sort()
data.Sort()

t.mux.Unlock()
t.data.Set(data)
}
}

// Rates implements the api.Tariff interface
func (t *Awattar) Rates() (api.Rates, error) {
t.mux.Lock()
defer t.mux.Unlock()
return slices.Clone(t.data), outdatedError(t.updated, time.Hour)
var res api.Rates
err := t.data.GetFunc(func(val api.Rates) {
res = slices.Clone(val)
})
return res, err
}

// Type implements the api.Tariff interface
30 changes: 14 additions & 16 deletions tariff/electricitymaps.go
Original file line number Diff line number Diff line change
@@ -17,12 +17,10 @@ import (

type ElectricityMaps struct {
*request.Helper
log *util.Logger
mux sync.Mutex
uri string
zone string
data api.Rates
updated time.Time
log *util.Logger
uri string
zone string
data *util.Monitor[api.Rates]
}

type CarbonIntensity struct {
@@ -62,6 +60,7 @@ func NewElectricityMapsFromConfig(other map[string]interface{}) (api.Tariff, err
Helper: request.NewHelper(log),
uri: util.DefaultScheme(strings.TrimRight(cc.Uri, "/"), "https"),
zone: strings.ToUpper(cc.Zone),
data: util.NewMonitor[api.Rates](2 * time.Hour),
}

t.Client.Transport = &transport.Decorator{
@@ -101,28 +100,27 @@ func (t *ElectricityMaps) run(done chan error) {

once.Do(func() { close(done) })

t.mux.Lock()
t.updated = time.Now()

t.data = make(api.Rates, 0, len(res.Forecast))
data := make(api.Rates, 0, len(res.Forecast))
for _, r := range res.Forecast {
ar := api.Rate{
Start: r.Datetime.Local(),
End: r.Datetime.Add(time.Hour).Local(),
Price: r.CarbonIntensity,
}
t.data = append(t.data, ar)
data = append(data, ar)
}
t.data.Sort()
data.Sort()

t.mux.Unlock()
t.data.Set(data)
}
}

func (t *ElectricityMaps) Rates() (api.Rates, error) {
t.mux.Lock()
defer t.mux.Unlock()
return slices.Clone(t.data), outdatedError(t.updated, time.Hour)
var res api.Rates
err := t.data.GetFunc(func(val api.Rates) {
res = slices.Clone(val)
})
return res, err
}

// Type implements the api.Tariff interface
32 changes: 14 additions & 18 deletions tariff/elering.go
Original file line number Diff line number Diff line change
@@ -18,11 +18,9 @@ import (

type Elering struct {
*embed
mux sync.Mutex
log *util.Logger
region string
data api.Rates
updated time.Time
log *util.Logger
region string
data *util.Monitor[api.Rates]
}

var _ api.Tariff = (*Elering)(nil)
@@ -49,6 +47,7 @@ func NewEleringFromConfig(other map[string]interface{}) (api.Tariff, error) {
embed: &cc.embed,
log: util.NewLogger("Elering"),
region: strings.ToLower(cc.Region),
data: util.NewMonitor[api.Rates](2 * time.Hour),
}

done := make(chan error)
@@ -82,33 +81,30 @@ func (t *Elering) run(done chan error) {

once.Do(func() { close(done) })

t.mux.Lock()
t.updated = time.Now()

data := res.Data[t.region]

t.data = make(api.Rates, 0, len(data))
for _, r := range data {
data := make(api.Rates, 0, len(res.Data[t.region]))
for _, r := range res.Data[t.region] {
ts := time.Unix(r.Timestamp, 0)

ar := api.Rate{
Start: ts.Local(),
End: ts.Add(time.Hour).Local(),
Price: t.totalPrice(r.Price / 1e3),
}
t.data = append(t.data, ar)
data = append(data, ar)
}
t.data.Sort()
data.Sort()

t.mux.Unlock()
t.data.Set(data)
}
}

// Rates implements the api.Tariff interface
func (t *Elering) Rates() (api.Rates, error) {
t.mux.Lock()
defer t.mux.Unlock()
return slices.Clone(t.data), outdatedError(t.updated, time.Hour)
var res api.Rates
err := t.data.GetFunc(func(val api.Rates) {
res = slices.Clone(val)
})
return res, err
}

// Type implements the api.Tariff interface
28 changes: 13 additions & 15 deletions tariff/energinet.go
Original file line number Diff line number Diff line change
@@ -17,11 +17,9 @@ import (

type Energinet struct {
*embed
mux sync.Mutex
log *util.Logger
region string
data api.Rates
updated time.Time
log *util.Logger
region string
data *util.Monitor[api.Rates]
}

var _ api.Tariff = (*Energinet)(nil)
@@ -48,6 +46,7 @@ func NewEnerginetFromConfig(other map[string]interface{}) (api.Tariff, error) {
embed: &cc.embed,
log: util.NewLogger("energinet"),
region: strings.ToLower(cc.Region),
data: util.NewMonitor[api.Rates](2 * time.Hour),
}

done := make(chan error)
@@ -82,30 +81,29 @@ func (t *Energinet) run(done chan error) {

once.Do(func() { close(done) })

t.mux.Lock()
t.updated = time.Now()

t.data = make(api.Rates, 0, len(res.Records))
data := make(api.Rates, 0, len(res.Records))
for _, r := range res.Records {
date, _ := time.Parse("2006-01-02T15:04:05", r.HourUTC)
ar := api.Rate{
Start: date.Local(),
End: date.Add(time.Hour).Local(),
Price: t.totalPrice(r.SpotPriceDKK / 1e3),
}
t.data = append(t.data, ar)
data = append(data, ar)
}
t.data.Sort()
data.Sort()

t.mux.Unlock()
t.data.Set(data)
}
}

// Rates implements the api.Tariff interface
func (t *Energinet) Rates() (api.Rates, error) {
t.mux.Lock()
defer t.mux.Unlock()
return slices.Clone(t.data), outdatedError(t.updated, time.Hour)
var res api.Rates
err := t.data.GetFunc(func(val api.Rates) {
res = slices.Clone(val)
})
return res, err
}

// Type implements the api.Tariff interface
29 changes: 13 additions & 16 deletions tariff/entsoe.go
Original file line number Diff line number Diff line change
@@ -21,12 +21,10 @@ import (
type Entsoe struct {
*request.Helper
*embed
mux sync.Mutex
log *util.Logger
token string
domain string
data api.Rates
updated time.Time
log *util.Logger
token string
domain string
data *util.Monitor[api.Rates]
}

var _ api.Tariff = (*Entsoe)(nil)
@@ -157,29 +155,28 @@ func (t *Entsoe) run(done chan error) {

once.Do(func() { close(done) })

t.mux.Lock()
t.updated = time.Now()

t.data = make(api.Rates, 0, len(res))
data := make(api.Rates, 0, len(res))
for _, r := range res {
ar := api.Rate{
Start: r.Start,
End: r.End,
Price: t.totalPrice(r.Value),
}
t.data = append(t.data, ar)
data = append(data, ar)
}
t.data.Sort()
data.Sort()

t.mux.Unlock()
t.data.Set(data)
}
}

// Rates implements the api.Tariff interface
func (t *Entsoe) Rates() (api.Rates, error) {
t.mux.Lock()
defer t.mux.Unlock()
return slices.Clone(t.data), outdatedError(t.updated, time.Hour)
var res api.Rates
err := t.data.GetFunc(func(val api.Rates) {
res = slices.Clone(val)
})
return res, err
}

// Type implements the api.Tariff interface
32 changes: 15 additions & 17 deletions tariff/gruenstromindex.go
Original file line number Diff line number Diff line change
@@ -14,11 +14,9 @@ import (
)

type GrünStromIndex struct {
log *util.Logger
mux sync.Mutex
zip string
data api.Rates
updated time.Time
log *util.Logger
zip string
data *util.Monitor[api.Rates]
}

type gsiForecast struct {
@@ -76,8 +74,9 @@ func NewGrünStromIndexFromConfig(other map[string]interface{}) (api.Tariff, err
log := util.NewLogger("gsi").Redact(cc.Zip)

t := &GrünStromIndex{
log: log,
zip: cc.Zip,
log: log,
zip: cc.Zip,
data: util.NewMonitor[api.Rates](2 * time.Hour),
}

done := make(chan error)
@@ -117,28 +116,27 @@ func (t *GrünStromIndex) run(done chan error) {

once.Do(func() { close(done) })

t.mux.Lock()
t.updated = time.Now()

t.data = make(api.Rates, 0, len(res.Forecast))
data := make(api.Rates, 0, len(res.Forecast))
for _, r := range res.Forecast {
t.data = append(t.data, api.Rate{
data = append(data, api.Rate{
Price: float64(r.Co2GStandard),
Start: time.UnixMilli(r.Timeframe.Start).Local(),
End: time.UnixMilli(r.Timeframe.End).Local(),
})
}
t.data.Sort()
data.Sort()

t.mux.Unlock()
t.data.Set(data)
}
}

// Rates implements the api.Tariff interface
func (t *GrünStromIndex) Rates() (api.Rates, error) {
t.mux.Lock()
defer t.mux.Unlock()
return slices.Clone(t.data), outdatedError(t.updated, time.Hour)
var res api.Rates
err := t.data.GetFunc(func(val api.Rates) {
res = slices.Clone(val)
})
return res, err
}

// Type implements the api.Tariff interface
Rate limit · GitHub

Whoa there!

You have triggered an abuse detection mechanism.

Please wait a few minutes before you try again;
in some cases this may take up to an hour.

0 comments on commit 5d0caa8

Please sign in to comment.