Skip to content

Commit 27e3180

Browse files
authored
Add delta plugin (#26897)
1 parent 8fc2b59 commit 27e3180

File tree

1 file changed

+102
-0
lines changed

1 file changed

+102
-0
lines changed

plugin/delta.go

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
package plugin
2+
3+
import (
4+
"context"
5+
6+
"github.com/evcc-io/evcc/plugin/pipeline"
7+
"github.com/evcc-io/evcc/util"
8+
)
9+
10+
type deltaPlugin struct {
11+
ctx context.Context
12+
total float64
13+
set Config
14+
get *Config
15+
}
16+
17+
func init() {
18+
registry.AddCtx("delta", NewDeltaFromConfig)
19+
}
20+
21+
// NewDeltaFromConfig creates delta provider
22+
func NewDeltaFromConfig(ctx context.Context, other map[string]any) (Plugin, error) {
23+
var cc struct {
24+
pipeline.Settings `mapstructure:",squash"`
25+
Set Config
26+
Get *Config
27+
}
28+
29+
if err := util.DecodeOther(other, &cc); err != nil {
30+
return nil, err
31+
}
32+
33+
p := &deltaPlugin{
34+
ctx: ctx,
35+
set: cc.Set,
36+
get: cc.Get,
37+
}
38+
39+
return p, nil
40+
}
41+
42+
var _ IntSetter = (*deltaPlugin)(nil)
43+
44+
func (p *deltaPlugin) IntSetter(param string) (func(int64) error, error) {
45+
set, err := p.set.IntSetter(p.ctx, param)
46+
if err != nil {
47+
return nil, err
48+
}
49+
50+
get, err := p.get.IntGetter(p.ctx)
51+
if err != nil {
52+
return nil, err
53+
}
54+
55+
return func(val int64) error {
56+
if get != nil {
57+
total, err := get()
58+
if err != nil {
59+
return err
60+
}
61+
p.total = float64(total)
62+
}
63+
64+
delta := float64(val) - p.total
65+
err := set(int64(delta))
66+
if err == nil {
67+
p.total = float64(val)
68+
}
69+
return err
70+
}, err
71+
}
72+
73+
var _ FloatSetter = (*deltaPlugin)(nil)
74+
75+
func (p *deltaPlugin) FloatSetter(param string) (func(float64) error, error) {
76+
set, err := p.set.FloatSetter(p.ctx, param)
77+
if err != nil {
78+
return nil, err
79+
}
80+
81+
get, err := p.get.FloatGetter(p.ctx)
82+
if err != nil {
83+
return nil, err
84+
}
85+
86+
return func(val float64) error {
87+
if get != nil {
88+
total, err := get()
89+
if err != nil {
90+
return err
91+
}
92+
p.total = total
93+
}
94+
95+
delta := val - p.total
96+
err := set(delta)
97+
if err == nil {
98+
p.total = val
99+
}
100+
return err
101+
}, err
102+
}

0 commit comments

Comments
 (0)