Skip to content

Commit 71e72c7

Browse files
authored
Add evse power reading (#327)
1 parent 2bdec13 commit 71e72c7

File tree

2 files changed

+87
-7
lines changed

2 files changed

+87
-7
lines changed

charger/evsewifi.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ func init() {
5454
registry.Add("evsewifi", NewEVSEWifiFromConfig)
5555
}
5656

57-
//go:generate go run ../cmd/tools/decorate.go -p charger -f decorateEVSE -b api.Charger -o evsewifi_decorators -t "api.MeterEnergy,TotalEnergy,func() (float64, error)" -t "api.MeterCurrent,Currents,func() (float64, float64, float64, error)"
57+
//go:generate go run ../cmd/tools/decorate.go -p charger -f decorateEVSE -b api.Charger -o evsewifi_decorators -t "api.Meter,CurrentPower,func() (float64, error)" -t "api.MeterEnergy,TotalEnergy,func() (float64, error)" -t "api.MeterCurrent,Currents,func() (float64, float64, float64, error)"
5858

5959
// NewEVSEWifiFromConfig creates a EVSEWifi charger from generic config
6060
func NewEVSEWifiFromConfig(other map[string]interface{}) (api.Charger, error) {
@@ -73,6 +73,12 @@ func NewEVSEWifiFromConfig(other map[string]interface{}) (api.Charger, error) {
7373
return evse, err
7474
}
7575

76+
// decorate Charger with Meter
77+
var currentPower func() (float64, error)
78+
if cc.Meter.Energy {
79+
currentPower = evse.currentPower
80+
}
81+
7682
// decorate Charger with MeterEnergy
7783
var totalEnergy func() (float64, error)
7884
if cc.Meter.Energy {
@@ -85,7 +91,7 @@ func NewEVSEWifiFromConfig(other map[string]interface{}) (api.Charger, error) {
8591
currents = evse.currents
8692
}
8793

88-
return decorateEVSE(evse, totalEnergy, currents), nil
94+
return decorateEVSE(evse, currentPower, totalEnergy, currents), nil
8995
}
9096

9197
// NewEVSEWifi creates EVSEWifi charger
@@ -187,6 +193,12 @@ func (evse *EVSEWifi) ChargingTime() (time.Duration, error) {
187193
return time.Duration(params.Duration) * time.Millisecond, err
188194
}
189195

196+
// CurrentPower implements the Meter interface
197+
func (evse *EVSEWifi) currentPower() (float64, error) {
198+
params, err := evse.getParameters()
199+
return 1000 * params.ActualPower, err
200+
}
201+
190202
// TotalEnergy implements the MeterEnergy interface
191203
func (evse *EVSEWifi) totalEnergy() (float64, error) {
192204
params, err := evse.getParameters()

charger/evsewifi_decorators.go

Lines changed: 73 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,40 +6,100 @@ import (
66
"github.com/andig/evcc/api"
77
)
88

9-
func decorateEVSE(base api.Charger, meterEnergy func() (float64, error), meterCurrent func() (float64, float64, float64, error)) api.Charger {
9+
func decorateEVSE(base api.Charger, meter func() (float64, error), meterEnergy func() (float64, error), meterCurrent func() (float64, float64, float64, error)) api.Charger {
1010
switch {
11-
case meterCurrent == nil && meterEnergy == nil:
11+
case meter == nil && meterCurrent == nil && meterEnergy == nil:
1212
return base
1313

14-
case meterCurrent == nil && meterEnergy != nil:
14+
case meter != nil && meterCurrent == nil && meterEnergy == nil:
1515
return &struct{
1616
api.Charger
17+
api.Meter
18+
}{
19+
Charger: base,
20+
Meter: &decorateEVSEMeterImpl{
21+
meter: meter,
22+
},
23+
}
24+
25+
case meter == nil && meterCurrent == nil && meterEnergy != nil:
26+
return &struct{
27+
api.Charger
28+
api.MeterEnergy
29+
}{
30+
Charger: base,
31+
MeterEnergy: &decorateEVSEMeterEnergyImpl{
32+
meterEnergy: meterEnergy,
33+
},
34+
}
35+
36+
case meter != nil && meterCurrent == nil && meterEnergy != nil:
37+
return &struct{
38+
api.Charger
39+
api.Meter
1740
api.MeterEnergy
1841
}{
1942
Charger: base,
43+
Meter: &decorateEVSEMeterImpl{
44+
meter: meter,
45+
},
2046
MeterEnergy: &decorateEVSEMeterEnergyImpl{
2147
meterEnergy: meterEnergy,
2248
},
2349
}
2450

25-
case meterCurrent != nil && meterEnergy == nil:
51+
case meter == nil && meterCurrent != nil && meterEnergy == nil:
52+
return &struct{
53+
api.Charger
54+
api.MeterCurrent
55+
}{
56+
Charger: base,
57+
MeterCurrent: &decorateEVSEMeterCurrentImpl{
58+
meterCurrent: meterCurrent,
59+
},
60+
}
61+
62+
case meter != nil && meterCurrent != nil && meterEnergy == nil:
63+
return &struct{
64+
api.Charger
65+
api.Meter
66+
api.MeterCurrent
67+
}{
68+
Charger: base,
69+
Meter: &decorateEVSEMeterImpl{
70+
meter: meter,
71+
},
72+
MeterCurrent: &decorateEVSEMeterCurrentImpl{
73+
meterCurrent: meterCurrent,
74+
},
75+
}
76+
77+
case meter == nil && meterCurrent != nil && meterEnergy != nil:
2678
return &struct{
2779
api.Charger
2880
api.MeterCurrent
81+
api.MeterEnergy
2982
}{
3083
Charger: base,
3184
MeterCurrent: &decorateEVSEMeterCurrentImpl{
3285
meterCurrent: meterCurrent,
3386
},
87+
MeterEnergy: &decorateEVSEMeterEnergyImpl{
88+
meterEnergy: meterEnergy,
89+
},
3490
}
3591

36-
case meterCurrent != nil && meterEnergy != nil:
92+
case meter != nil && meterCurrent != nil && meterEnergy != nil:
3793
return &struct{
3894
api.Charger
95+
api.Meter
3996
api.MeterCurrent
4097
api.MeterEnergy
4198
}{
4299
Charger: base,
100+
Meter: &decorateEVSEMeterImpl{
101+
meter: meter,
102+
},
43103
MeterCurrent: &decorateEVSEMeterCurrentImpl{
44104
meterCurrent: meterCurrent,
45105
},
@@ -52,6 +112,14 @@ func decorateEVSE(base api.Charger, meterEnergy func() (float64, error), meterCu
52112
return nil
53113
}
54114

115+
type decorateEVSEMeterImpl struct {
116+
meter func() (float64, error)
117+
}
118+
119+
func (impl *decorateEVSEMeterImpl) CurrentPower() (float64, error) {
120+
return impl.meter()
121+
}
122+
55123
type decorateEVSEMeterCurrentImpl struct {
56124
meterCurrent func() (float64, float64, float64, error)
57125
}

0 commit comments

Comments
 (0)