Plugins: let charger support api.ChargerEx (#9331)

This commit is contained in:
andig 2023-08-10 18:30:08 +02:00 • committed by GitHub
parent befd9ed54b
commit c63bb70f06
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 165 additions and 12 deletions

View file

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

View file

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

View file

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