diff --git a/charger/switchsocket.go b/charger/switchsocket.go index 17107501e..25def7e5d 100644 --- a/charger/switchsocket.go +++ b/charger/switchsocket.go @@ -19,7 +19,7 @@ type SwitchSocket struct { *switchSocket } -//go:generate decorate -f decorateSwitchSocket -b *SwitchSocket -r api.Charger -t "api.MeterEnergy,TotalEnergy,func() (float64, error)" +//go:generate decorate -f decorateSwitchSocket -b *SwitchSocket -r api.Charger -t "api.MeterEnergy,TotalEnergy,func() (float64, error)" -t "api.Battery,Soc,func() (float64, error)" func NewSwitchSocketFromConfig(ctx context.Context, other map[string]interface{}) (api.Charger, error) { var cc struct { @@ -28,6 +28,7 @@ func NewSwitchSocketFromConfig(ctx context.Context, other map[string]interface{} Enable provider.Config Power provider.Config Energy *provider.Config + Soc *provider.Config StandbyPower float64 } @@ -58,13 +59,21 @@ func NewSwitchSocketFromConfig(ctx context.Context, other map[string]interface{} } } + var soc func() (float64, error) + if cc.Soc != nil { + soc, err = provider.NewFloatGetterFromConfig(ctx, *cc.Energy) + if err != nil { + return nil, err + } + } + c := &SwitchSocket{ enabled: enabled, enable: enable, switchSocket: NewSwitchSocket(&cc.embed, enabled, power, cc.StandbyPower), } - return decorateSwitchSocket(c, energy), nil + return decorateSwitchSocket(c, energy, soc), nil } func (c *SwitchSocket) Enabled() (bool, error) { diff --git a/charger/switchsocket_decorators.go b/charger/switchsocket_decorators.go index c94042b31..0bb7fe0b6 100644 --- a/charger/switchsocket_decorators.go +++ b/charger/switchsocket_decorators.go @@ -6,12 +6,12 @@ import ( "github.com/evcc-io/evcc/api" ) -func decorateSwitchSocket(base *SwitchSocket, meterEnergy func() (float64, error)) api.Charger { +func decorateSwitchSocket(base *SwitchSocket, meterEnergy func() (float64, error), battery func() (float64, error)) api.Charger { switch { - case meterEnergy == nil: + case battery == nil && meterEnergy == nil: return base - case meterEnergy != nil: + case battery == nil && meterEnergy != nil: return &struct { *SwitchSocket api.MeterEnergy @@ -21,11 +21,45 @@ func decorateSwitchSocket(base *SwitchSocket, meterEnergy func() (float64, error meterEnergy: meterEnergy, }, } + + case battery != nil && meterEnergy == nil: + return &struct { + *SwitchSocket + api.Battery + }{ + SwitchSocket: base, + Battery: &decorateSwitchSocketBatteryImpl{ + battery: battery, + }, + } + + case battery != nil && meterEnergy != nil: + return &struct { + *SwitchSocket + api.Battery + api.MeterEnergy + }{ + SwitchSocket: base, + Battery: &decorateSwitchSocketBatteryImpl{ + battery: battery, + }, + MeterEnergy: &decorateSwitchSocketMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + } } return nil } +type decorateSwitchSocketBatteryImpl struct { + battery func() (float64, error) +} + +func (impl *decorateSwitchSocketBatteryImpl) Soc() (float64, error) { + return impl.battery() +} + type decorateSwitchSocketMeterEnergyImpl struct { meterEnergy func() (float64, error) }