Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/master'
Browse files Browse the repository at this point in the history
  • Loading branch information
weblate committed Nov 6, 2024
2 parents 6686f0d + bb8bf49 commit 577f8f8
Show file tree
Hide file tree
Showing 13 changed files with 114 additions and 3 deletions.
7 changes: 7 additions & 0 deletions evcc.dist.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,13 @@ tariffs:
# uri: https://example.org/price.json
# jq: .price.current

# type: template
# template: energy-charts-api # epex spot market prices
# bzn: DE-LU
# charges: 0.15
# tax: 0.1
# formula: math.Min((price + charges) * (1 + tax), 0.5)

feedin:
# rate for feeding excess (pv) energy to the grid
type: fixed
Expand Down
4 changes: 4 additions & 0 deletions tariff/awattar.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,10 @@ func NewAwattarFromConfig(other map[string]interface{}) (api.Tariff, error) {
return nil, err
}

if err := cc.init(); err != nil {
return nil, err
}

t := &Awattar{
embed: &cc.embed,
log: util.NewLogger("awattar"),
Expand Down
4 changes: 4 additions & 0 deletions tariff/edf-tempo.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,10 @@ func NewEdfTempoFromConfig(other map[string]interface{}) (api.Tariff, error) {
return nil, errors.New("missing credentials")
}

if err := cc.init(); err != nil {
return nil, err
}

basic := transport.BasicAuthHeader(cc.ClientID, cc.ClientSecret)
log := util.NewLogger("edf-tempo").Redact(basic)

Expand Down
4 changes: 4 additions & 0 deletions tariff/elering.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,10 @@ func NewEleringFromConfig(other map[string]interface{}) (api.Tariff, error) {
return nil, errors.New("missing region")
}

if err := cc.init(); err != nil {
return nil, err
}

t := &Elering{
embed: &cc.embed,
log: util.NewLogger("elering"),
Expand Down
65 changes: 62 additions & 3 deletions tariff/embed.go
Original file line number Diff line number Diff line change
@@ -1,12 +1,71 @@
package tariff

import (
"errors"
"fmt"

"github.com/traefik/yaegi/interp"
"github.com/traefik/yaegi/stdlib"
)

type embed struct {
Margin float64 `mapstructure:"margin"`
Charges float64 `mapstructure:"charges"`
Tax float64 `mapstructure:"tax"`
Uplifts float64 `mapstructure:"uplifts"`
Formula string `mapstructure:"formula"`

calc func(float64) (float64, error)
}

func (t *embed) init() error {
if t.Formula == "" {
return nil
}

vm := interp.New(interp.Options{})
if err := vm.Use(stdlib.Symbols); err != nil {
return err
}

if _, err := vm.Eval(`import "math"`); err != nil {
return err
}

if _, err := vm.Eval("var price, charges, tax float64"); err != nil {
return err
}

prg, err := vm.Compile(t.Formula)
if err != nil {
return err
}

t.calc = func(price float64) (float64, error) {
if _, err := vm.Eval(fmt.Sprintf("price = %f", price)); err != nil {
return 0, err
}

res, err := vm.Execute(prg)
if err != nil {
return 0, err
}

if !res.CanFloat() {
return 0, errors.New("formula did not return a float value")
}

return res.Float(), nil
}

// test the formula
_, err = t.calc(0)

return err
}

func (t *embed) totalPrice(price float64) float64 {
return (price*(1+t.Margin)+t.Charges)*(1+t.Tax) + t.Uplifts
if t.calc != nil {
res, _ := t.calc(price)
return res
}
return (price + t.Charges) * (1 + t.Tax)
}
4 changes: 4 additions & 0 deletions tariff/energinet.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@ func NewEnerginetFromConfig(other map[string]interface{}) (api.Tariff, error) {
return nil, errors.New("missing region")
}

if err := cc.init(); err != nil {
return nil, err
}

t := &Energinet{
embed: &cc.embed,
log: util.NewLogger("energinet"),
Expand Down
4 changes: 4 additions & 0 deletions tariff/entsoe.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,10 @@ func NewEntsoeFromConfig(other map[string]interface{}) (api.Tariff, error) {
return nil, errors.New("missing domain")
}

if err := cc.init(); err != nil {
return nil, err
}

domain, err := entsoe.Area(entsoe.BZN, strings.ToUpper(cc.Domain))
if err != nil {
return nil, err
Expand Down
4 changes: 4 additions & 0 deletions tariff/pun.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,10 @@ func NewPunFromConfig(other map[string]interface{}) (api.Tariff, error) {
return nil, err
}

if err := cc.init(); err != nil {
return nil, err
}

t := &Pun{
log: util.NewLogger("pun"),
embed: &cc,
Expand Down
4 changes: 4 additions & 0 deletions tariff/smartenergy.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,10 @@ func NewSmartEnergyFromConfig(other map[string]interface{}) (api.Tariff, error)
return nil, err
}

if err := cc.init(); err != nil {
return nil, err
}

t := &SmartEnergy{
embed: &cc.embed,
log: util.NewLogger("smartenergy"),
Expand Down
4 changes: 4 additions & 0 deletions tariff/tariff.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,10 @@ func NewConfigurableFromConfig(ctx context.Context, other map[string]interface{}
return nil, fmt.Errorf("must have either price or forecast")
}

if err := cc.init(); err != nil {
return nil, err
}

var (
err error
priceG func() (float64, error)
Expand Down
4 changes: 4 additions & 0 deletions tariff/tibber.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,10 @@ func NewTibberFromConfig(other map[string]interface{}) (api.Tariff, error) {
return nil, errors.New("missing token")
}

if err := cc.init(); err != nil {
return nil, err
}

log := util.NewLogger("tibber").Redact(cc.Token, cc.HomeID)

t := &Tibber{
Expand Down
6 changes: 6 additions & 0 deletions util/templates/defaults.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -333,6 +333,12 @@ presets:
help:
de: Zusätzlicher prozentualer Aufschlag (z.B. 0.2 für 20%)
en: Additional percentage charge (e.g. 0.2 for 20%)
- name: formula
type: string
help:
de: Individuelle Formel zur Berechnung des Preises
en: Individual formula for calculating the price
example: "math.Max((price + charges) * (1 + tax), 0.0)"
eebus:
params:
- name: ski
Expand Down
3 changes: 3 additions & 0 deletions util/templates/includes/tariff-base.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,7 @@ charges: {{ .charges }}
{{- if .tax }}
tax: {{ .tax }}
{{- end }}
{{- if .formula }}
formula: {{ .formula }}
{{- end }}
{{- end }}

0 comments on commit 577f8f8

Please sign in to comment.