evcc-io/meter/meter.go
2020-04-26 15:40:41 +02:00

67 lines
1.6 KiB
Go

package meter
import (
"github.com/andig/evcc/api"
"github.com/andig/evcc/provider"
)
// CompositeMeter decorates a Meter with MeterEnergy.
type CompositeMeter struct {
api.Meter
api.MeterEnergy
}
// NewConfigurableFromConfig creates api.Meter from config
func NewConfigurableFromConfig(log *api.Logger, other map[string]interface{}) api.Meter {
cc := struct {
Power provider.Config
Energy *provider.Config // optional
}{}
api.DecodeOther(log, other, &cc)
m := NewConfigurable(provider.NewFloatGetterFromConfig(log, cc.Power))
// decorate Meter with MeterEnergy
if cc.Energy != nil {
m = &CompositeMeter{
Meter: m,
MeterEnergy: NewMeterEnergy(provider.NewFloatGetterFromConfig(log, *cc.Energy)),
}
}
return m
}
// NewConfigurable creates a new charger
func NewConfigurable(currentPowerG provider.FloatGetter) api.Meter {
return &Meter{
currentPowerG: currentPowerG,
}
}
// Meter is an api.Meter implementation with configurable getters and setters.
type Meter struct {
currentPowerG provider.FloatGetter
}
// CurrentPower implements the Meter.CurrentPower interface
func (m *Meter) CurrentPower() (float64, error) {
return m.currentPowerG()
}
// MeterEnergy is an api.MeterEnergy implementation with configurable getters and setters.
type MeterEnergy struct {
totalEnergyG provider.FloatGetter
}
// NewMeterEnergy creates a new charger
func NewMeterEnergy(totalEnergyG provider.FloatGetter) api.MeterEnergy {
return &MeterEnergy{
totalEnergyG: totalEnergyG,
}
}
// TotalEnergy implements the Meter.TotalEnergy interface
func (m *MeterEnergy) TotalEnergy() (float64, error) {
return m.totalEnergyG()
}