From c63bb70f0684d83c0880e84bdef962d94c70031b Mon Sep 17 00:00:00 2001 From: andig Date: Thu, 10 Aug 2023 18:30:08 +0200 Subject: [PATCH] Plugins: let charger support api.ChargerEx (#9331) --- charger/charger.go | 13 ++- charger/charger_decorators.go | 162 ++++++++++++++++++++++++++++++++-- vehicle/vehicle.go | 2 +- 3 files changed, 165 insertions(+), 12 deletions(-) diff --git a/charger/charger.go b/charger/charger.go index 9cdb117e0..06a59bb5a 100644 --- a/charger/charger.go +++ b/charger/charger.go @@ -22,13 +22,14 @@ func init() { registry.Add(api.Custom, NewConfigurableFromConfig) } -// go:generate go run ../cmd/tools/decorate.go -f decorateCustom -b *Charger -r api.Charger -t "api.Identifier,Identify,func() (string, error)" -t "api.PhaseSwitcher,Phases1p3p,func(int) (error)" -t "api.Resurrector,WakeUp,func() (error)" +// go:generate go run ../cmd/tools/decorate.go -f decorateCustom -b *Charger -r api.Charger -t "api.ChargerEx,MaxCurrentMillis,func(float64) error" -t "api.Identifier,Identify,func() (string, error)" -t "api.PhaseSwitcher,Phases1p3p,func(int) error" -t "api.Resurrector,WakeUp,func() error" // NewConfigurableFromConfig creates a new configurable charger func NewConfigurableFromConfig(other map[string]interface{}) (api.Charger, error) { var cc struct { embed `mapstructure:",squash"` Status, Enable, Enabled, MaxCurrent provider.Config + MaxCurrentMillis *provider.Config Identify, Phases1p3p *provider.Config Wakeup *provider.Config Tos bool @@ -65,6 +66,14 @@ func NewConfigurableFromConfig(other map[string]interface{}) (api.Charger, error c.embed = &cc.embed + var maxcurrentmillis func(float64) error + if cc.MaxCurrentMillis != nil { + maxcurrentmillis, err = provider.NewFloatSetterFromConfig("maxcurrentmillis", *cc.MaxCurrentMillis) + if err != nil { + return nil, fmt.Errorf("maxcurrentmillis: %w", err) + } + } + // decorate phases var phases1p3p func(int) error if cc.Phases1p3p != nil { @@ -104,7 +113,7 @@ func NewConfigurableFromConfig(other map[string]interface{}) (api.Charger, error } } - return decorateCustom(c, identify, phases1p3p, wakeup), nil + return decorateCustom(c, maxcurrentmillis, identify, phases1p3p, wakeup), nil } // NewConfigurable creates a new charger diff --git a/charger/charger_decorators.go b/charger/charger_decorators.go index 7cdd677fc..c25781059 100644 --- a/charger/charger_decorators.go +++ b/charger/charger_decorators.go @@ -6,12 +6,23 @@ import ( "github.com/evcc-io/evcc/api" ) -func decorateCustom(base *Charger, identifier func() (string, error), phaseSwitcher func(int) error, resurrector func() error) api.Charger { +func decorateCustom(base *Charger, chargerEx func(float64) error, identifier func() (string, error), phaseSwitcher func(int) error, resurrector func() error) api.Charger { switch { - case identifier == nil && phaseSwitcher == nil && resurrector == nil: + case chargerEx == nil && identifier == nil && phaseSwitcher == nil && resurrector == nil: return base - case identifier != nil && phaseSwitcher == nil && resurrector == nil: + case chargerEx != nil && identifier == nil && phaseSwitcher == nil && resurrector == nil: + return &struct { + *Charger + api.ChargerEx + }{ + Charger: base, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + } + + case chargerEx == nil && identifier != nil && phaseSwitcher == nil && resurrector == nil: return &struct { *Charger api.Identifier @@ -22,7 +33,22 @@ func decorateCustom(base *Charger, identifier func() (string, error), phaseSwitc }, } - case identifier == nil && phaseSwitcher != nil && resurrector == nil: + case chargerEx != nil && identifier != nil && phaseSwitcher == nil && resurrector == nil: + return &struct { + *Charger + api.ChargerEx + api.Identifier + }{ + Charger: base, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + } + + case chargerEx == nil && identifier == nil && phaseSwitcher != nil && resurrector == nil: return &struct { *Charger api.PhaseSwitcher @@ -33,7 +59,22 @@ func decorateCustom(base *Charger, identifier func() (string, error), phaseSwitc }, } - case identifier != nil && phaseSwitcher != nil && resurrector == nil: + case chargerEx != nil && identifier == nil && phaseSwitcher != nil && resurrector == nil: + return &struct { + *Charger + api.ChargerEx + api.PhaseSwitcher + }{ + Charger: base, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case chargerEx == nil && identifier != nil && phaseSwitcher != nil && resurrector == nil: return &struct { *Charger api.Identifier @@ -48,7 +89,26 @@ func decorateCustom(base *Charger, identifier func() (string, error), phaseSwitc }, } - case identifier == nil && phaseSwitcher == nil && resurrector != nil: + case chargerEx != nil && identifier != nil && phaseSwitcher != nil && resurrector == nil: + return &struct { + *Charger + api.ChargerEx + api.Identifier + api.PhaseSwitcher + }{ + Charger: base, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case chargerEx == nil && identifier == nil && phaseSwitcher == nil && resurrector != nil: return &struct { *Charger api.Resurrector @@ -59,7 +119,22 @@ func decorateCustom(base *Charger, identifier func() (string, error), phaseSwitc }, } - case identifier != nil && phaseSwitcher == nil && resurrector != nil: + case chargerEx != nil && identifier == nil && phaseSwitcher == nil && resurrector != nil: + return &struct { + *Charger + api.ChargerEx + api.Resurrector + }{ + Charger: base, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case chargerEx == nil && identifier != nil && phaseSwitcher == nil && resurrector != nil: return &struct { *Charger api.Identifier @@ -74,7 +149,26 @@ func decorateCustom(base *Charger, identifier func() (string, error), phaseSwitc }, } - case identifier == nil && phaseSwitcher != nil && resurrector != nil: + case chargerEx != nil && identifier != nil && phaseSwitcher == nil && resurrector != nil: + return &struct { + *Charger + api.ChargerEx + api.Identifier + api.Resurrector + }{ + Charger: base, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case chargerEx == nil && identifier == nil && phaseSwitcher != nil && resurrector != nil: return &struct { *Charger api.PhaseSwitcher @@ -89,7 +183,26 @@ func decorateCustom(base *Charger, identifier func() (string, error), phaseSwitc }, } - case identifier != nil && phaseSwitcher != nil && resurrector != nil: + case chargerEx != nil && identifier == nil && phaseSwitcher != nil && resurrector != nil: + return &struct { + *Charger + api.ChargerEx + api.PhaseSwitcher + api.Resurrector + }{ + Charger: base, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case chargerEx == nil && identifier != nil && phaseSwitcher != nil && resurrector != nil: return &struct { *Charger api.Identifier @@ -107,11 +220,42 @@ func decorateCustom(base *Charger, identifier func() (string, error), phaseSwitc resurrector: resurrector, }, } + + case chargerEx != nil && identifier != nil && phaseSwitcher != nil && resurrector != nil: + return &struct { + *Charger + api.ChargerEx + api.Identifier + api.PhaseSwitcher + api.Resurrector + }{ + Charger: base, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } } return nil } +type decorateCustomChargerExImpl struct { + chargerEx func(float64) error +} + +func (impl *decorateCustomChargerExImpl) MaxCurrentMillis(current float64) error { + return impl.chargerEx(current) +} + type decorateCustomIdentifierImpl struct { identifier func() (string, error) } diff --git a/vehicle/vehicle.go b/vehicle/vehicle.go index e63b5e457..0457c7bdc 100644 --- a/vehicle/vehicle.go +++ b/vehicle/vehicle.go @@ -8,7 +8,7 @@ import ( "github.com/evcc-io/evcc/util" ) -//go:generate go run ../cmd/tools/decorate.go -f decorateVehicle -b api.Vehicle -t "api.ChargeState,Status,func() (api.ChargeStatus, error)" -t "api.VehicleRange,Range,func() (int64, error)" -t "api.VehicleOdometer,Odometer,func() (float64, error)" -t "api.VehicleClimater,Climater,func() (bool, error)" -t "api.Resurrector,WakeUp,func() (error)" +//go:generate go run ../cmd/tools/decorate.go -f decorateVehicle -b api.Vehicle -t "api.ChargeState,Status,func() (api.ChargeStatus, error)" -t "api.VehicleRange,Range,func() (int64, error)" -t "api.VehicleOdometer,Odometer,func() (float64, error)" -t "api.VehicleClimater,Climater,func() (bool, error)" -t "api.Resurrector,WakeUp,func() error" // Vehicle is an api.Vehicle implementation with configurable getters and setters. type Vehicle struct {