Switchsocket: add soc (#18333)

This commit is contained in:
andig 2025-01-21 16:19:52 +01:00 • committed by GitHub
parent b9c5072ede
commit afc038ed1f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 48 additions and 5 deletions

View file

@ -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) {

View file

@ -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)
}