Plugins: let charger support api.ChargerEx (#9331)
This commit is contained in:
parent
befd9ed54b
commit
c63bb70f06
3 changed files with 165 additions and 12 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue