diff --git a/charger/charger.go b/charger/charger.go index 3196ea8d9..e1031e7d3 100644 --- a/charger/charger.go +++ b/charger/charger.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/evcc-io/evcc/api" + "github.com/evcc-io/evcc/meter" "github.com/evcc-io/evcc/provider" "github.com/evcc-io/evcc/util" ) @@ -22,7 +23,7 @@ func init() { registry.Add(api.Custom, NewConfigurableFromConfig) } -//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" -t "api.Battery,Soc,func() (float64, 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" -t "api.Battery,Soc,func() (float64, error)" -t "api.Meter,CurrentPower,func() (float64, error)" -t "api.MeterEnergy,TotalEnergy,func() (float64, error)" // NewConfigurableFromConfig creates a new configurable charger func NewConfigurableFromConfig(other map[string]interface{}) (api.Charger, error) { @@ -34,6 +35,13 @@ func NewConfigurableFromConfig(other map[string]interface{}) (api.Charger, error Wakeup *provider.Config Soc *provider.Config Tos bool + + // optional measurements + Power *provider.Config + Energy *provider.Config + + // phase values, currently not supported (https://github.com/evcc-io/evcc/pull/14546) + // Currents, Voltages, Powers []provider.Config } if err := util.DecodeOther(other, &cc); err != nil { @@ -123,7 +131,13 @@ func NewConfigurableFromConfig(other map[string]interface{}) (api.Charger, error } } - return decorateCustom(c, maxcurrentmillis, identify, phases1p3p, wakeup, soc), nil + // decorate measurements + powerG, energyG, _, _, _, err := meter.BuildMeasurements(cc.Power, cc.Energy, nil, nil, nil) + if err != nil { + return nil, err + } + + return decorateCustom(c, maxcurrentmillis, identify, phases1p3p, wakeup, soc, powerG, energyG), nil } // NewConfigurable creates a new charger diff --git a/charger/charger_decorators.go b/charger/charger_decorators.go index faf30c44c..a2ecb3644 100644 --- a/charger/charger_decorators.go +++ b/charger/charger_decorators.go @@ -6,12 +6,12 @@ import ( "github.com/evcc-io/evcc/api" ) -func decorateCustom(base *Charger, chargerEx func(float64) error, identifier func() (string, error), phaseSwitcher func(int) error, resurrector func() error, battery func() (float64, error)) api.Charger { +func decorateCustom(base *Charger, chargerEx func(float64) error, identifier func() (string, error), phaseSwitcher func(int) error, resurrector func() error, battery func() (float64, error), meter func() (float64, error), meterEnergy func() (float64, error)) api.Charger { switch { - case battery == nil && chargerEx == nil && identifier == nil && phaseSwitcher == nil && resurrector == nil: + case battery == nil && chargerEx == nil && identifier == nil && meter == nil && meterEnergy == nil && phaseSwitcher == nil && resurrector == nil: return base - case battery == nil && chargerEx != nil && identifier == nil && phaseSwitcher == nil && resurrector == nil: + case battery == nil && chargerEx != nil && identifier == nil && meter == nil && meterEnergy == nil && phaseSwitcher == nil && resurrector == nil: return &struct { *Charger api.ChargerEx @@ -22,7 +22,7 @@ func decorateCustom(base *Charger, chargerEx func(float64) error, identifier fun }, } - case battery == nil && chargerEx == nil && identifier != nil && phaseSwitcher == nil && resurrector == nil: + case battery == nil && chargerEx == nil && identifier != nil && meter == nil && meterEnergy == nil && phaseSwitcher == nil && resurrector == nil: return &struct { *Charger api.Identifier @@ -33,7 +33,7 @@ func decorateCustom(base *Charger, chargerEx func(float64) error, identifier fun }, } - case battery == nil && chargerEx != nil && identifier != nil && phaseSwitcher == nil && resurrector == nil: + case battery == nil && chargerEx != nil && identifier != nil && meter == nil && meterEnergy == nil && phaseSwitcher == nil && resurrector == nil: return &struct { *Charger api.ChargerEx @@ -48,7 +48,7 @@ func decorateCustom(base *Charger, chargerEx func(float64) error, identifier fun }, } - case battery == nil && chargerEx == nil && identifier == nil && phaseSwitcher != nil && resurrector == nil: + case battery == nil && chargerEx == nil && identifier == nil && meter == nil && meterEnergy == nil && phaseSwitcher != nil && resurrector == nil: return &struct { *Charger api.PhaseSwitcher @@ -59,7 +59,7 @@ func decorateCustom(base *Charger, chargerEx func(float64) error, identifier fun }, } - case battery == nil && chargerEx != nil && identifier == nil && phaseSwitcher != nil && resurrector == nil: + case battery == nil && chargerEx != nil && identifier == nil && meter == nil && meterEnergy == nil && phaseSwitcher != nil && resurrector == nil: return &struct { *Charger api.ChargerEx @@ -74,7 +74,7 @@ func decorateCustom(base *Charger, chargerEx func(float64) error, identifier fun }, } - case battery == nil && chargerEx == nil && identifier != nil && phaseSwitcher != nil && resurrector == nil: + case battery == nil && chargerEx == nil && identifier != nil && meter == nil && meterEnergy == nil && phaseSwitcher != nil && resurrector == nil: return &struct { *Charger api.Identifier @@ -89,7 +89,7 @@ func decorateCustom(base *Charger, chargerEx func(float64) error, identifier fun }, } - case battery == nil && chargerEx != nil && identifier != nil && phaseSwitcher != nil && resurrector == nil: + case battery == nil && chargerEx != nil && identifier != nil && meter == nil && meterEnergy == nil && phaseSwitcher != nil && resurrector == nil: return &struct { *Charger api.ChargerEx @@ -108,7 +108,7 @@ func decorateCustom(base *Charger, chargerEx func(float64) error, identifier fun }, } - case battery == nil && chargerEx == nil && identifier == nil && phaseSwitcher == nil && resurrector != nil: + case battery == nil && chargerEx == nil && identifier == nil && meter == nil && meterEnergy == nil && phaseSwitcher == nil && resurrector != nil: return &struct { *Charger api.Resurrector @@ -119,7 +119,7 @@ func decorateCustom(base *Charger, chargerEx func(float64) error, identifier fun }, } - case battery == nil && chargerEx != nil && identifier == nil && phaseSwitcher == nil && resurrector != nil: + case battery == nil && chargerEx != nil && identifier == nil && meter == nil && meterEnergy == nil && phaseSwitcher == nil && resurrector != nil: return &struct { *Charger api.ChargerEx @@ -134,7 +134,7 @@ func decorateCustom(base *Charger, chargerEx func(float64) error, identifier fun }, } - case battery == nil && chargerEx == nil && identifier != nil && phaseSwitcher == nil && resurrector != nil: + case battery == nil && chargerEx == nil && identifier != nil && meter == nil && meterEnergy == nil && phaseSwitcher == nil && resurrector != nil: return &struct { *Charger api.Identifier @@ -149,7 +149,7 @@ func decorateCustom(base *Charger, chargerEx func(float64) error, identifier fun }, } - case battery == nil && chargerEx != nil && identifier != nil && phaseSwitcher == nil && resurrector != nil: + case battery == nil && chargerEx != nil && identifier != nil && meter == nil && meterEnergy == nil && phaseSwitcher == nil && resurrector != nil: return &struct { *Charger api.ChargerEx @@ -168,7 +168,7 @@ func decorateCustom(base *Charger, chargerEx func(float64) error, identifier fun }, } - case battery == nil && chargerEx == nil && identifier == nil && phaseSwitcher != nil && resurrector != nil: + case battery == nil && chargerEx == nil && identifier == nil && meter == nil && meterEnergy == nil && phaseSwitcher != nil && resurrector != nil: return &struct { *Charger api.PhaseSwitcher @@ -183,7 +183,7 @@ func decorateCustom(base *Charger, chargerEx func(float64) error, identifier fun }, } - case battery == nil && chargerEx != nil && identifier == nil && phaseSwitcher != nil && resurrector != nil: + case battery == nil && chargerEx != nil && identifier == nil && meter == nil && meterEnergy == nil && phaseSwitcher != nil && resurrector != nil: return &struct { *Charger api.ChargerEx @@ -202,7 +202,7 @@ func decorateCustom(base *Charger, chargerEx func(float64) error, identifier fun }, } - case battery == nil && chargerEx == nil && identifier != nil && phaseSwitcher != nil && resurrector != nil: + case battery == nil && chargerEx == nil && identifier != nil && meter == nil && meterEnergy == nil && phaseSwitcher != nil && resurrector != nil: return &struct { *Charger api.Identifier @@ -221,7 +221,7 @@ func decorateCustom(base *Charger, chargerEx func(float64) error, identifier fun }, } - case battery == nil && chargerEx != nil && identifier != nil && phaseSwitcher != nil && resurrector != nil: + case battery == nil && chargerEx != nil && identifier != nil && meter == nil && meterEnergy == nil && phaseSwitcher != nil && resurrector != nil: return &struct { *Charger api.ChargerEx @@ -244,7 +244,7 @@ func decorateCustom(base *Charger, chargerEx func(float64) error, identifier fun }, } - case battery != nil && chargerEx == nil && identifier == nil && phaseSwitcher == nil && resurrector == nil: + case battery != nil && chargerEx == nil && identifier == nil && meter == nil && meterEnergy == nil && phaseSwitcher == nil && resurrector == nil: return &struct { *Charger api.Battery @@ -255,7 +255,7 @@ func decorateCustom(base *Charger, chargerEx func(float64) error, identifier fun }, } - case battery != nil && chargerEx != nil && identifier == nil && phaseSwitcher == nil && resurrector == nil: + case battery != nil && chargerEx != nil && identifier == nil && meter == nil && meterEnergy == nil && phaseSwitcher == nil && resurrector == nil: return &struct { *Charger api.Battery @@ -270,7 +270,7 @@ func decorateCustom(base *Charger, chargerEx func(float64) error, identifier fun }, } - case battery != nil && chargerEx == nil && identifier != nil && phaseSwitcher == nil && resurrector == nil: + case battery != nil && chargerEx == nil && identifier != nil && meter == nil && meterEnergy == nil && phaseSwitcher == nil && resurrector == nil: return &struct { *Charger api.Battery @@ -285,7 +285,7 @@ func decorateCustom(base *Charger, chargerEx func(float64) error, identifier fun }, } - case battery != nil && chargerEx != nil && identifier != nil && phaseSwitcher == nil && resurrector == nil: + case battery != nil && chargerEx != nil && identifier != nil && meter == nil && meterEnergy == nil && phaseSwitcher == nil && resurrector == nil: return &struct { *Charger api.Battery @@ -304,7 +304,7 @@ func decorateCustom(base *Charger, chargerEx func(float64) error, identifier fun }, } - case battery != nil && chargerEx == nil && identifier == nil && phaseSwitcher != nil && resurrector == nil: + case battery != nil && chargerEx == nil && identifier == nil && meter == nil && meterEnergy == nil && phaseSwitcher != nil && resurrector == nil: return &struct { *Charger api.Battery @@ -319,7 +319,7 @@ func decorateCustom(base *Charger, chargerEx func(float64) error, identifier fun }, } - case battery != nil && chargerEx != nil && identifier == nil && phaseSwitcher != nil && resurrector == nil: + case battery != nil && chargerEx != nil && identifier == nil && meter == nil && meterEnergy == nil && phaseSwitcher != nil && resurrector == nil: return &struct { *Charger api.Battery @@ -338,7 +338,7 @@ func decorateCustom(base *Charger, chargerEx func(float64) error, identifier fun }, } - case battery != nil && chargerEx == nil && identifier != nil && phaseSwitcher != nil && resurrector == nil: + case battery != nil && chargerEx == nil && identifier != nil && meter == nil && meterEnergy == nil && phaseSwitcher != nil && resurrector == nil: return &struct { *Charger api.Battery @@ -357,7 +357,7 @@ func decorateCustom(base *Charger, chargerEx func(float64) error, identifier fun }, } - case battery != nil && chargerEx != nil && identifier != nil && phaseSwitcher != nil && resurrector == nil: + case battery != nil && chargerEx != nil && identifier != nil && meter == nil && meterEnergy == nil && phaseSwitcher != nil && resurrector == nil: return &struct { *Charger api.Battery @@ -380,7 +380,7 @@ func decorateCustom(base *Charger, chargerEx func(float64) error, identifier fun }, } - case battery != nil && chargerEx == nil && identifier == nil && phaseSwitcher == nil && resurrector != nil: + case battery != nil && chargerEx == nil && identifier == nil && meter == nil && meterEnergy == nil && phaseSwitcher == nil && resurrector != nil: return &struct { *Charger api.Battery @@ -395,7 +395,7 @@ func decorateCustom(base *Charger, chargerEx func(float64) error, identifier fun }, } - case battery != nil && chargerEx != nil && identifier == nil && phaseSwitcher == nil && resurrector != nil: + case battery != nil && chargerEx != nil && identifier == nil && meter == nil && meterEnergy == nil && phaseSwitcher == nil && resurrector != nil: return &struct { *Charger api.Battery @@ -414,7 +414,7 @@ func decorateCustom(base *Charger, chargerEx func(float64) error, identifier fun }, } - case battery != nil && chargerEx == nil && identifier != nil && phaseSwitcher == nil && resurrector != nil: + case battery != nil && chargerEx == nil && identifier != nil && meter == nil && meterEnergy == nil && phaseSwitcher == nil && resurrector != nil: return &struct { *Charger api.Battery @@ -433,7 +433,7 @@ func decorateCustom(base *Charger, chargerEx func(float64) error, identifier fun }, } - case battery != nil && chargerEx != nil && identifier != nil && phaseSwitcher == nil && resurrector != nil: + case battery != nil && chargerEx != nil && identifier != nil && meter == nil && meterEnergy == nil && phaseSwitcher == nil && resurrector != nil: return &struct { *Charger api.Battery @@ -456,7 +456,7 @@ func decorateCustom(base *Charger, chargerEx func(float64) error, identifier fun }, } - case battery != nil && chargerEx == nil && identifier == nil && phaseSwitcher != nil && resurrector != nil: + case battery != nil && chargerEx == nil && identifier == nil && meter == nil && meterEnergy == nil && phaseSwitcher != nil && resurrector != nil: return &struct { *Charger api.Battery @@ -475,7 +475,7 @@ func decorateCustom(base *Charger, chargerEx func(float64) error, identifier fun }, } - case battery != nil && chargerEx != nil && identifier == nil && phaseSwitcher != nil && resurrector != nil: + case battery != nil && chargerEx != nil && identifier == nil && meter == nil && meterEnergy == nil && phaseSwitcher != nil && resurrector != nil: return &struct { *Charger api.Battery @@ -498,7 +498,7 @@ func decorateCustom(base *Charger, chargerEx func(float64) error, identifier fun }, } - case battery != nil && chargerEx == nil && identifier != nil && phaseSwitcher != nil && resurrector != nil: + case battery != nil && chargerEx == nil && identifier != nil && meter == nil && meterEnergy == nil && phaseSwitcher != nil && resurrector != nil: return &struct { *Charger api.Battery @@ -521,7 +521,7 @@ func decorateCustom(base *Charger, chargerEx func(float64) error, identifier fun }, } - case battery != nil && chargerEx != nil && identifier != nil && phaseSwitcher != nil && resurrector != nil: + case battery != nil && chargerEx != nil && identifier != nil && meter == nil && meterEnergy == nil && phaseSwitcher != nil && resurrector != nil: return &struct { *Charger api.Battery @@ -547,6 +547,2150 @@ func decorateCustom(base *Charger, chargerEx func(float64) error, identifier fun resurrector: resurrector, }, } + + case battery == nil && chargerEx == nil && identifier == nil && meter != nil && meterEnergy == nil && phaseSwitcher == nil && resurrector == nil: + return &struct { + *Charger + api.Meter + }{ + Charger: base, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + } + + case battery == nil && chargerEx != nil && identifier == nil && meter != nil && meterEnergy == nil && phaseSwitcher == nil && resurrector == nil: + return &struct { + *Charger + api.ChargerEx + api.Meter + }{ + Charger: base, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + } + + case battery == nil && chargerEx == nil && identifier != nil && meter != nil && meterEnergy == nil && phaseSwitcher == nil && resurrector == nil: + return &struct { + *Charger + api.Identifier + api.Meter + }{ + Charger: base, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + } + + case battery == nil && chargerEx != nil && identifier != nil && meter != nil && meterEnergy == nil && phaseSwitcher == nil && resurrector == nil: + return &struct { + *Charger + api.ChargerEx + api.Identifier + api.Meter + }{ + Charger: base, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + } + + case battery == nil && chargerEx == nil && identifier == nil && meter != nil && meterEnergy == nil && phaseSwitcher != nil && resurrector == nil: + return &struct { + *Charger + api.Meter + api.PhaseSwitcher + }{ + Charger: base, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case battery == nil && chargerEx != nil && identifier == nil && meter != nil && meterEnergy == nil && phaseSwitcher != nil && resurrector == nil: + return &struct { + *Charger + api.ChargerEx + api.Meter + api.PhaseSwitcher + }{ + Charger: base, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case battery == nil && chargerEx == nil && identifier != nil && meter != nil && meterEnergy == nil && phaseSwitcher != nil && resurrector == nil: + return &struct { + *Charger + api.Identifier + api.Meter + api.PhaseSwitcher + }{ + Charger: base, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case battery == nil && chargerEx != nil && identifier != nil && meter != nil && meterEnergy == nil && phaseSwitcher != nil && resurrector == nil: + return &struct { + *Charger + api.ChargerEx + api.Identifier + api.Meter + api.PhaseSwitcher + }{ + Charger: base, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case battery == nil && chargerEx == nil && identifier == nil && meter != nil && meterEnergy == nil && phaseSwitcher == nil && resurrector != nil: + return &struct { + *Charger + api.Meter + api.Resurrector + }{ + Charger: base, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery == nil && chargerEx != nil && identifier == nil && meter != nil && meterEnergy == nil && phaseSwitcher == nil && resurrector != nil: + return &struct { + *Charger + api.ChargerEx + api.Meter + api.Resurrector + }{ + Charger: base, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery == nil && chargerEx == nil && identifier != nil && meter != nil && meterEnergy == nil && phaseSwitcher == nil && resurrector != nil: + return &struct { + *Charger + api.Identifier + api.Meter + api.Resurrector + }{ + Charger: base, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery == nil && chargerEx != nil && identifier != nil && meter != nil && meterEnergy == nil && phaseSwitcher == nil && resurrector != nil: + return &struct { + *Charger + api.ChargerEx + api.Identifier + api.Meter + api.Resurrector + }{ + Charger: base, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery == nil && chargerEx == nil && identifier == nil && meter != nil && meterEnergy == nil && phaseSwitcher != nil && resurrector != nil: + return &struct { + *Charger + api.Meter + api.PhaseSwitcher + api.Resurrector + }{ + Charger: base, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery == nil && chargerEx != nil && identifier == nil && meter != nil && meterEnergy == nil && phaseSwitcher != nil && resurrector != nil: + return &struct { + *Charger + api.ChargerEx + api.Meter + api.PhaseSwitcher + api.Resurrector + }{ + Charger: base, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery == nil && chargerEx == nil && identifier != nil && meter != nil && meterEnergy == nil && phaseSwitcher != nil && resurrector != nil: + return &struct { + *Charger + api.Identifier + api.Meter + api.PhaseSwitcher + api.Resurrector + }{ + Charger: base, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery == nil && chargerEx != nil && identifier != nil && meter != nil && meterEnergy == nil && phaseSwitcher != nil && resurrector != nil: + return &struct { + *Charger + api.ChargerEx + api.Identifier + api.Meter + api.PhaseSwitcher + api.Resurrector + }{ + Charger: base, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery != nil && chargerEx == nil && identifier == nil && meter != nil && meterEnergy == nil && phaseSwitcher == nil && resurrector == nil: + return &struct { + *Charger + api.Battery + api.Meter + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + } + + case battery != nil && chargerEx != nil && identifier == nil && meter != nil && meterEnergy == nil && phaseSwitcher == nil && resurrector == nil: + return &struct { + *Charger + api.Battery + api.ChargerEx + api.Meter + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + } + + case battery != nil && chargerEx == nil && identifier != nil && meter != nil && meterEnergy == nil && phaseSwitcher == nil && resurrector == nil: + return &struct { + *Charger + api.Battery + api.Identifier + api.Meter + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + } + + case battery != nil && chargerEx != nil && identifier != nil && meter != nil && meterEnergy == nil && phaseSwitcher == nil && resurrector == nil: + return &struct { + *Charger + api.Battery + api.ChargerEx + api.Identifier + api.Meter + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + } + + case battery != nil && chargerEx == nil && identifier == nil && meter != nil && meterEnergy == nil && phaseSwitcher != nil && resurrector == nil: + return &struct { + *Charger + api.Battery + api.Meter + api.PhaseSwitcher + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case battery != nil && chargerEx != nil && identifier == nil && meter != nil && meterEnergy == nil && phaseSwitcher != nil && resurrector == nil: + return &struct { + *Charger + api.Battery + api.ChargerEx + api.Meter + api.PhaseSwitcher + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case battery != nil && chargerEx == nil && identifier != nil && meter != nil && meterEnergy == nil && phaseSwitcher != nil && resurrector == nil: + return &struct { + *Charger + api.Battery + api.Identifier + api.Meter + api.PhaseSwitcher + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case battery != nil && chargerEx != nil && identifier != nil && meter != nil && meterEnergy == nil && phaseSwitcher != nil && resurrector == nil: + return &struct { + *Charger + api.Battery + api.ChargerEx + api.Identifier + api.Meter + api.PhaseSwitcher + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case battery != nil && chargerEx == nil && identifier == nil && meter != nil && meterEnergy == nil && phaseSwitcher == nil && resurrector != nil: + return &struct { + *Charger + api.Battery + api.Meter + api.Resurrector + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery != nil && chargerEx != nil && identifier == nil && meter != nil && meterEnergy == nil && phaseSwitcher == nil && resurrector != nil: + return &struct { + *Charger + api.Battery + api.ChargerEx + api.Meter + api.Resurrector + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery != nil && chargerEx == nil && identifier != nil && meter != nil && meterEnergy == nil && phaseSwitcher == nil && resurrector != nil: + return &struct { + *Charger + api.Battery + api.Identifier + api.Meter + api.Resurrector + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery != nil && chargerEx != nil && identifier != nil && meter != nil && meterEnergy == nil && phaseSwitcher == nil && resurrector != nil: + return &struct { + *Charger + api.Battery + api.ChargerEx + api.Identifier + api.Meter + api.Resurrector + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery != nil && chargerEx == nil && identifier == nil && meter != nil && meterEnergy == nil && phaseSwitcher != nil && resurrector != nil: + return &struct { + *Charger + api.Battery + api.Meter + api.PhaseSwitcher + api.Resurrector + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery != nil && chargerEx != nil && identifier == nil && meter != nil && meterEnergy == nil && phaseSwitcher != nil && resurrector != nil: + return &struct { + *Charger + api.Battery + api.ChargerEx + api.Meter + api.PhaseSwitcher + api.Resurrector + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery != nil && chargerEx == nil && identifier != nil && meter != nil && meterEnergy == nil && phaseSwitcher != nil && resurrector != nil: + return &struct { + *Charger + api.Battery + api.Identifier + api.Meter + api.PhaseSwitcher + api.Resurrector + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery != nil && chargerEx != nil && identifier != nil && meter != nil && meterEnergy == nil && phaseSwitcher != nil && resurrector != nil: + return &struct { + *Charger + api.Battery + api.ChargerEx + api.Identifier + api.Meter + api.PhaseSwitcher + api.Resurrector + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery == nil && chargerEx == nil && identifier == nil && meter == nil && meterEnergy != nil && phaseSwitcher == nil && resurrector == nil: + return &struct { + *Charger + api.MeterEnergy + }{ + Charger: base, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + } + + case battery == nil && chargerEx != nil && identifier == nil && meter == nil && meterEnergy != nil && phaseSwitcher == nil && resurrector == nil: + return &struct { + *Charger + api.ChargerEx + api.MeterEnergy + }{ + Charger: base, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + } + + case battery == nil && chargerEx == nil && identifier != nil && meter == nil && meterEnergy != nil && phaseSwitcher == nil && resurrector == nil: + return &struct { + *Charger + api.Identifier + api.MeterEnergy + }{ + Charger: base, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + } + + case battery == nil && chargerEx != nil && identifier != nil && meter == nil && meterEnergy != nil && phaseSwitcher == nil && resurrector == nil: + return &struct { + *Charger + api.ChargerEx + api.Identifier + api.MeterEnergy + }{ + Charger: base, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + } + + case battery == nil && chargerEx == nil && identifier == nil && meter == nil && meterEnergy != nil && phaseSwitcher != nil && resurrector == nil: + return &struct { + *Charger + api.MeterEnergy + api.PhaseSwitcher + }{ + Charger: base, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case battery == nil && chargerEx != nil && identifier == nil && meter == nil && meterEnergy != nil && phaseSwitcher != nil && resurrector == nil: + return &struct { + *Charger + api.ChargerEx + api.MeterEnergy + api.PhaseSwitcher + }{ + Charger: base, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case battery == nil && chargerEx == nil && identifier != nil && meter == nil && meterEnergy != nil && phaseSwitcher != nil && resurrector == nil: + return &struct { + *Charger + api.Identifier + api.MeterEnergy + api.PhaseSwitcher + }{ + Charger: base, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case battery == nil && chargerEx != nil && identifier != nil && meter == nil && meterEnergy != nil && phaseSwitcher != nil && resurrector == nil: + return &struct { + *Charger + api.ChargerEx + api.Identifier + api.MeterEnergy + api.PhaseSwitcher + }{ + Charger: base, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case battery == nil && chargerEx == nil && identifier == nil && meter == nil && meterEnergy != nil && phaseSwitcher == nil && resurrector != nil: + return &struct { + *Charger + api.MeterEnergy + api.Resurrector + }{ + Charger: base, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery == nil && chargerEx != nil && identifier == nil && meter == nil && meterEnergy != nil && phaseSwitcher == nil && resurrector != nil: + return &struct { + *Charger + api.ChargerEx + api.MeterEnergy + api.Resurrector + }{ + Charger: base, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery == nil && chargerEx == nil && identifier != nil && meter == nil && meterEnergy != nil && phaseSwitcher == nil && resurrector != nil: + return &struct { + *Charger + api.Identifier + api.MeterEnergy + api.Resurrector + }{ + Charger: base, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery == nil && chargerEx != nil && identifier != nil && meter == nil && meterEnergy != nil && phaseSwitcher == nil && resurrector != nil: + return &struct { + *Charger + api.ChargerEx + api.Identifier + api.MeterEnergy + api.Resurrector + }{ + Charger: base, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery == nil && chargerEx == nil && identifier == nil && meter == nil && meterEnergy != nil && phaseSwitcher != nil && resurrector != nil: + return &struct { + *Charger + api.MeterEnergy + api.PhaseSwitcher + api.Resurrector + }{ + Charger: base, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery == nil && chargerEx != nil && identifier == nil && meter == nil && meterEnergy != nil && phaseSwitcher != nil && resurrector != nil: + return &struct { + *Charger + api.ChargerEx + api.MeterEnergy + api.PhaseSwitcher + api.Resurrector + }{ + Charger: base, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery == nil && chargerEx == nil && identifier != nil && meter == nil && meterEnergy != nil && phaseSwitcher != nil && resurrector != nil: + return &struct { + *Charger + api.Identifier + api.MeterEnergy + api.PhaseSwitcher + api.Resurrector + }{ + Charger: base, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery == nil && chargerEx != nil && identifier != nil && meter == nil && meterEnergy != nil && phaseSwitcher != nil && resurrector != nil: + return &struct { + *Charger + api.ChargerEx + api.Identifier + api.MeterEnergy + api.PhaseSwitcher + api.Resurrector + }{ + Charger: base, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery != nil && chargerEx == nil && identifier == nil && meter == nil && meterEnergy != nil && phaseSwitcher == nil && resurrector == nil: + return &struct { + *Charger + api.Battery + api.MeterEnergy + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + } + + case battery != nil && chargerEx != nil && identifier == nil && meter == nil && meterEnergy != nil && phaseSwitcher == nil && resurrector == nil: + return &struct { + *Charger + api.Battery + api.ChargerEx + api.MeterEnergy + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + } + + case battery != nil && chargerEx == nil && identifier != nil && meter == nil && meterEnergy != nil && phaseSwitcher == nil && resurrector == nil: + return &struct { + *Charger + api.Battery + api.Identifier + api.MeterEnergy + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + } + + case battery != nil && chargerEx != nil && identifier != nil && meter == nil && meterEnergy != nil && phaseSwitcher == nil && resurrector == nil: + return &struct { + *Charger + api.Battery + api.ChargerEx + api.Identifier + api.MeterEnergy + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + } + + case battery != nil && chargerEx == nil && identifier == nil && meter == nil && meterEnergy != nil && phaseSwitcher != nil && resurrector == nil: + return &struct { + *Charger + api.Battery + api.MeterEnergy + api.PhaseSwitcher + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case battery != nil && chargerEx != nil && identifier == nil && meter == nil && meterEnergy != nil && phaseSwitcher != nil && resurrector == nil: + return &struct { + *Charger + api.Battery + api.ChargerEx + api.MeterEnergy + api.PhaseSwitcher + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case battery != nil && chargerEx == nil && identifier != nil && meter == nil && meterEnergy != nil && phaseSwitcher != nil && resurrector == nil: + return &struct { + *Charger + api.Battery + api.Identifier + api.MeterEnergy + api.PhaseSwitcher + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case battery != nil && chargerEx != nil && identifier != nil && meter == nil && meterEnergy != nil && phaseSwitcher != nil && resurrector == nil: + return &struct { + *Charger + api.Battery + api.ChargerEx + api.Identifier + api.MeterEnergy + api.PhaseSwitcher + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case battery != nil && chargerEx == nil && identifier == nil && meter == nil && meterEnergy != nil && phaseSwitcher == nil && resurrector != nil: + return &struct { + *Charger + api.Battery + api.MeterEnergy + api.Resurrector + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery != nil && chargerEx != nil && identifier == nil && meter == nil && meterEnergy != nil && phaseSwitcher == nil && resurrector != nil: + return &struct { + *Charger + api.Battery + api.ChargerEx + api.MeterEnergy + api.Resurrector + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery != nil && chargerEx == nil && identifier != nil && meter == nil && meterEnergy != nil && phaseSwitcher == nil && resurrector != nil: + return &struct { + *Charger + api.Battery + api.Identifier + api.MeterEnergy + api.Resurrector + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery != nil && chargerEx != nil && identifier != nil && meter == nil && meterEnergy != nil && phaseSwitcher == nil && resurrector != nil: + return &struct { + *Charger + api.Battery + api.ChargerEx + api.Identifier + api.MeterEnergy + api.Resurrector + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery != nil && chargerEx == nil && identifier == nil && meter == nil && meterEnergy != nil && phaseSwitcher != nil && resurrector != nil: + return &struct { + *Charger + api.Battery + api.MeterEnergy + api.PhaseSwitcher + api.Resurrector + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery != nil && chargerEx != nil && identifier == nil && meter == nil && meterEnergy != nil && phaseSwitcher != nil && resurrector != nil: + return &struct { + *Charger + api.Battery + api.ChargerEx + api.MeterEnergy + api.PhaseSwitcher + api.Resurrector + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery != nil && chargerEx == nil && identifier != nil && meter == nil && meterEnergy != nil && phaseSwitcher != nil && resurrector != nil: + return &struct { + *Charger + api.Battery + api.Identifier + api.MeterEnergy + api.PhaseSwitcher + api.Resurrector + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery != nil && chargerEx != nil && identifier != nil && meter == nil && meterEnergy != nil && phaseSwitcher != nil && resurrector != nil: + return &struct { + *Charger + api.Battery + api.ChargerEx + api.Identifier + api.MeterEnergy + api.PhaseSwitcher + api.Resurrector + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery == nil && chargerEx == nil && identifier == nil && meter != nil && meterEnergy != nil && phaseSwitcher == nil && resurrector == nil: + return &struct { + *Charger + api.Meter + api.MeterEnergy + }{ + Charger: base, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + } + + case battery == nil && chargerEx != nil && identifier == nil && meter != nil && meterEnergy != nil && phaseSwitcher == nil && resurrector == nil: + return &struct { + *Charger + api.ChargerEx + api.Meter + api.MeterEnergy + }{ + Charger: base, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + } + + case battery == nil && chargerEx == nil && identifier != nil && meter != nil && meterEnergy != nil && phaseSwitcher == nil && resurrector == nil: + return &struct { + *Charger + api.Identifier + api.Meter + api.MeterEnergy + }{ + Charger: base, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + } + + case battery == nil && chargerEx != nil && identifier != nil && meter != nil && meterEnergy != nil && phaseSwitcher == nil && resurrector == nil: + return &struct { + *Charger + api.ChargerEx + api.Identifier + api.Meter + api.MeterEnergy + }{ + Charger: base, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + } + + case battery == nil && chargerEx == nil && identifier == nil && meter != nil && meterEnergy != nil && phaseSwitcher != nil && resurrector == nil: + return &struct { + *Charger + api.Meter + api.MeterEnergy + api.PhaseSwitcher + }{ + Charger: base, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case battery == nil && chargerEx != nil && identifier == nil && meter != nil && meterEnergy != nil && phaseSwitcher != nil && resurrector == nil: + return &struct { + *Charger + api.ChargerEx + api.Meter + api.MeterEnergy + api.PhaseSwitcher + }{ + Charger: base, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case battery == nil && chargerEx == nil && identifier != nil && meter != nil && meterEnergy != nil && phaseSwitcher != nil && resurrector == nil: + return &struct { + *Charger + api.Identifier + api.Meter + api.MeterEnergy + api.PhaseSwitcher + }{ + Charger: base, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case battery == nil && chargerEx != nil && identifier != nil && meter != nil && meterEnergy != nil && phaseSwitcher != nil && resurrector == nil: + return &struct { + *Charger + api.ChargerEx + api.Identifier + api.Meter + api.MeterEnergy + api.PhaseSwitcher + }{ + Charger: base, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case battery == nil && chargerEx == nil && identifier == nil && meter != nil && meterEnergy != nil && phaseSwitcher == nil && resurrector != nil: + return &struct { + *Charger + api.Meter + api.MeterEnergy + api.Resurrector + }{ + Charger: base, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery == nil && chargerEx != nil && identifier == nil && meter != nil && meterEnergy != nil && phaseSwitcher == nil && resurrector != nil: + return &struct { + *Charger + api.ChargerEx + api.Meter + api.MeterEnergy + api.Resurrector + }{ + Charger: base, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery == nil && chargerEx == nil && identifier != nil && meter != nil && meterEnergy != nil && phaseSwitcher == nil && resurrector != nil: + return &struct { + *Charger + api.Identifier + api.Meter + api.MeterEnergy + api.Resurrector + }{ + Charger: base, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery == nil && chargerEx != nil && identifier != nil && meter != nil && meterEnergy != nil && phaseSwitcher == nil && resurrector != nil: + return &struct { + *Charger + api.ChargerEx + api.Identifier + api.Meter + api.MeterEnergy + api.Resurrector + }{ + Charger: base, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery == nil && chargerEx == nil && identifier == nil && meter != nil && meterEnergy != nil && phaseSwitcher != nil && resurrector != nil: + return &struct { + *Charger + api.Meter + api.MeterEnergy + api.PhaseSwitcher + api.Resurrector + }{ + Charger: base, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery == nil && chargerEx != nil && identifier == nil && meter != nil && meterEnergy != nil && phaseSwitcher != nil && resurrector != nil: + return &struct { + *Charger + api.ChargerEx + api.Meter + api.MeterEnergy + api.PhaseSwitcher + api.Resurrector + }{ + Charger: base, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery == nil && chargerEx == nil && identifier != nil && meter != nil && meterEnergy != nil && phaseSwitcher != nil && resurrector != nil: + return &struct { + *Charger + api.Identifier + api.Meter + api.MeterEnergy + api.PhaseSwitcher + api.Resurrector + }{ + Charger: base, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery == nil && chargerEx != nil && identifier != nil && meter != nil && meterEnergy != nil && phaseSwitcher != nil && resurrector != nil: + return &struct { + *Charger + api.ChargerEx + api.Identifier + api.Meter + api.MeterEnergy + api.PhaseSwitcher + api.Resurrector + }{ + Charger: base, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery != nil && chargerEx == nil && identifier == nil && meter != nil && meterEnergy != nil && phaseSwitcher == nil && resurrector == nil: + return &struct { + *Charger + api.Battery + api.Meter + api.MeterEnergy + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + } + + case battery != nil && chargerEx != nil && identifier == nil && meter != nil && meterEnergy != nil && phaseSwitcher == nil && resurrector == nil: + return &struct { + *Charger + api.Battery + api.ChargerEx + api.Meter + api.MeterEnergy + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + } + + case battery != nil && chargerEx == nil && identifier != nil && meter != nil && meterEnergy != nil && phaseSwitcher == nil && resurrector == nil: + return &struct { + *Charger + api.Battery + api.Identifier + api.Meter + api.MeterEnergy + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + } + + case battery != nil && chargerEx != nil && identifier != nil && meter != nil && meterEnergy != nil && phaseSwitcher == nil && resurrector == nil: + return &struct { + *Charger + api.Battery + api.ChargerEx + api.Identifier + api.Meter + api.MeterEnergy + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + } + + case battery != nil && chargerEx == nil && identifier == nil && meter != nil && meterEnergy != nil && phaseSwitcher != nil && resurrector == nil: + return &struct { + *Charger + api.Battery + api.Meter + api.MeterEnergy + api.PhaseSwitcher + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case battery != nil && chargerEx != nil && identifier == nil && meter != nil && meterEnergy != nil && phaseSwitcher != nil && resurrector == nil: + return &struct { + *Charger + api.Battery + api.ChargerEx + api.Meter + api.MeterEnergy + api.PhaseSwitcher + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case battery != nil && chargerEx == nil && identifier != nil && meter != nil && meterEnergy != nil && phaseSwitcher != nil && resurrector == nil: + return &struct { + *Charger + api.Battery + api.Identifier + api.Meter + api.MeterEnergy + api.PhaseSwitcher + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case battery != nil && chargerEx != nil && identifier != nil && meter != nil && meterEnergy != nil && phaseSwitcher != nil && resurrector == nil: + return &struct { + *Charger + api.Battery + api.ChargerEx + api.Identifier + api.Meter + api.MeterEnergy + api.PhaseSwitcher + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case battery != nil && chargerEx == nil && identifier == nil && meter != nil && meterEnergy != nil && phaseSwitcher == nil && resurrector != nil: + return &struct { + *Charger + api.Battery + api.Meter + api.MeterEnergy + api.Resurrector + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery != nil && chargerEx != nil && identifier == nil && meter != nil && meterEnergy != nil && phaseSwitcher == nil && resurrector != nil: + return &struct { + *Charger + api.Battery + api.ChargerEx + api.Meter + api.MeterEnergy + api.Resurrector + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery != nil && chargerEx == nil && identifier != nil && meter != nil && meterEnergy != nil && phaseSwitcher == nil && resurrector != nil: + return &struct { + *Charger + api.Battery + api.Identifier + api.Meter + api.MeterEnergy + api.Resurrector + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery != nil && chargerEx != nil && identifier != nil && meter != nil && meterEnergy != nil && phaseSwitcher == nil && resurrector != nil: + return &struct { + *Charger + api.Battery + api.ChargerEx + api.Identifier + api.Meter + api.MeterEnergy + api.Resurrector + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery != nil && chargerEx == nil && identifier == nil && meter != nil && meterEnergy != nil && phaseSwitcher != nil && resurrector != nil: + return &struct { + *Charger + api.Battery + api.Meter + api.MeterEnergy + api.PhaseSwitcher + api.Resurrector + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery != nil && chargerEx != nil && identifier == nil && meter != nil && meterEnergy != nil && phaseSwitcher != nil && resurrector != nil: + return &struct { + *Charger + api.Battery + api.ChargerEx + api.Meter + api.MeterEnergy + api.PhaseSwitcher + api.Resurrector + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery != nil && chargerEx == nil && identifier != nil && meter != nil && meterEnergy != nil && phaseSwitcher != nil && resurrector != nil: + return &struct { + *Charger + api.Battery + api.Identifier + api.Meter + api.MeterEnergy + api.PhaseSwitcher + api.Resurrector + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } + + case battery != nil && chargerEx != nil && identifier != nil && meter != nil && meterEnergy != nil && phaseSwitcher != nil && resurrector != nil: + return &struct { + *Charger + api.Battery + api.ChargerEx + api.Identifier + api.Meter + api.MeterEnergy + api.PhaseSwitcher + api.Resurrector + }{ + Charger: base, + Battery: &decorateCustomBatteryImpl{ + battery: battery, + }, + ChargerEx: &decorateCustomChargerExImpl{ + chargerEx: chargerEx, + }, + Identifier: &decorateCustomIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateCustomMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateCustomMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseSwitcher: &decorateCustomPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + Resurrector: &decorateCustomResurrectorImpl{ + resurrector: resurrector, + }, + } } return nil @@ -576,6 +2720,22 @@ func (impl *decorateCustomIdentifierImpl) Identify() (string, error) { return impl.identifier() } +type decorateCustomMeterImpl struct { + meter func() (float64, error) +} + +func (impl *decorateCustomMeterImpl) CurrentPower() (float64, error) { + return impl.meter() +} + +type decorateCustomMeterEnergyImpl struct { + meterEnergy func() (float64, error) +} + +func (impl *decorateCustomMeterEnergyImpl) TotalEnergy() (float64, error) { + return impl.meterEnergy() +} + type decorateCustomPhaseSwitcherImpl struct { phaseSwitcher func(int) error } diff --git a/meter/helper.go b/meter/helper.go new file mode 100644 index 000000000..a7c008126 --- /dev/null +++ b/meter/helper.go @@ -0,0 +1,99 @@ +package meter + +import ( + "errors" + "fmt" + + "github.com/evcc-io/evcc/provider" +) + +// BuildMeasurements returns typical meter measurement getters from config +func BuildMeasurements( + power *provider.Config, + energy *provider.Config, + currents []provider.Config, + voltages []provider.Config, + powers []provider.Config, +) ( + func() (float64, error), + func() (float64, error), + func() (float64, float64, float64, error), + func() (float64, float64, float64, error), + func() (float64, float64, float64, error), + error, +) { + var powerG func() (float64, error) + if power != nil { + var err error + powerG, err = provider.NewFloatGetterFromConfig(*power) + if err != nil { + return nil, nil, nil, nil, nil, fmt.Errorf("power: %w", err) + } + } + + var energyG func() (float64, error) + if energy != nil { + var err error + energyG, err = provider.NewFloatGetterFromConfig(*energy) + if err != nil { + return nil, nil, nil, nil, nil, fmt.Errorf("energy: %w", err) + } + } + + currentsG, err := buildPhaseProviders(currents) + if err != nil { + return nil, nil, nil, nil, nil, fmt.Errorf("currents: %w", err) + } + + voltagesG, err := buildPhaseProviders(voltages) + if err != nil { + return nil, nil, nil, nil, nil, fmt.Errorf("voltages: %w", err) + } + + powersG, err := buildPhaseProviders(powers) + if err != nil { + return nil, nil, nil, nil, nil, fmt.Errorf("powers: %w", err) + } + + return powerG, energyG, currentsG, voltagesG, powersG, nil +} + +// buildPhaseProviders returns phases getter for given config +func buildPhaseProviders(providers []provider.Config) (func() (float64, float64, float64, error), error) { + if len(providers) == 0 { + return nil, nil + } + + if len(providers) != 3 { + return nil, errors.New("need one per phase, total three") + } + + var phases [3]func() (float64, error) + for idx, prov := range providers { + c, err := provider.NewFloatGetterFromConfig(prov) + if err != nil { + return nil, fmt.Errorf("[%d] %w", idx, err) + } + + phases[idx] = c + } + + return collectPhaseProviders(phases), nil +} + +// collectPhaseProviders combines phase getters into combined api function +func collectPhaseProviders(g [3]func() (float64, error)) func() (float64, float64, float64, error) { + return func() (float64, float64, float64, error) { + var res [3]float64 + for idx, currentG := range g { + c, err := currentG() + if err != nil { + return 0, 0, 0, err + } + + res[idx] = c + } + + return res[0], res[1], res[2], nil + } +} diff --git a/meter/mbmd.go b/meter/mbmd.go index fbff86016..551644843 100644 --- a/meter/mbmd.go +++ b/meter/mbmd.go @@ -145,30 +145,27 @@ func NewModbusMbmdFromConfig(other map[string]interface{}) (api.Meter, error) { } func (m *ModbusMbmd) buildPhaseProviders(readings []string) (func() (float64, float64, float64, error), error) { - var res func() (float64, float64, float64, error) - if len(readings) > 0 { - if len(readings) != 3 { - return nil, errors.New("need one per phase, total three") - } - - phases := make([]func() (float64, error), 0, 3) - for idx, reading := range readings { - opCurrent, err := modbus.ParseOperation(m.device, reading) - if err != nil { - return nil, fmt.Errorf("invalid measurement [%d]: %s", idx, reading) - } - - c := func() (float64, error) { - return m.floatGetter(opCurrent) - } - - phases = append(phases, c) - } - - res = collectPhaseProviders(phases) + if len(readings) == 0 { + return nil, nil } - return res, nil + if len(readings) != 3 { + return nil, errors.New("need one per phase, total three") + } + + var phases [3]func() (float64, error) + for idx, reading := range readings { + opCurrent, err := modbus.ParseOperation(m.device, reading) + if err != nil { + return nil, fmt.Errorf("invalid measurement [%d]: %s", idx, reading) + } + + phases[idx] = func() (float64, error) { + return m.floatGetter(opCurrent) + } + } + + return collectPhaseProviders(phases), nil } // floatGetter executes configured modbus read operation and implements func() (float64, error) diff --git a/meter/meter.go b/meter/meter.go index f7893ae86..7ca1d301e 100644 --- a/meter/meter.go +++ b/meter/meter.go @@ -1,7 +1,6 @@ package meter import ( - "errors" "fmt" "github.com/evcc-io/evcc/api" @@ -41,39 +40,12 @@ func NewConfigurableFromConfig(other map[string]interface{}) (api.Meter, error) return nil, err } - power, err := provider.NewFloatGetterFromConfig(cc.Power) + powerG, energyG, currentsG, voltagesG, powersG, err := BuildMeasurements(&cc.Power, cc.Energy, cc.Currents, cc.Voltages, cc.Powers) if err != nil { - return nil, fmt.Errorf("power: %w", err) + return nil, err } - m, _ := NewConfigurable(power) - - // decorate energy - var totalEnergyG func() (float64, error) - if cc.Energy != nil { - totalEnergyG, err = provider.NewFloatGetterFromConfig(*cc.Energy) - if err != nil { - return nil, fmt.Errorf("energy: %w", err) - } - } - - // decorate currents - currentsG, err := buildPhaseProviders(cc.Currents) - if err != nil { - return nil, fmt.Errorf("currents: %w", err) - } - - // decorate voltages - voltagesG, err := buildPhaseProviders(cc.Voltages) - if err != nil { - return nil, fmt.Errorf("voltages: %w", err) - } - - // decorate powers - powersG, err := buildPhaseProviders(cc.Powers) - if err != nil { - return nil, fmt.Errorf("powers: %w", err) - } + m, _ := NewConfigurable(powerG) // decorate soc var socG func() (float64, error) @@ -104,51 +76,11 @@ func NewConfigurableFromConfig(other map[string]interface{}) (api.Meter, error) batModeS = cc.battery.ModeController(modeS) } - res := m.Decorate(totalEnergyG, currentsG, voltagesG, powersG, socG, cc.capacity.Decorator(), batModeS) + res := m.Decorate(energyG, currentsG, voltagesG, powersG, socG, cc.capacity.Decorator(), batModeS) return res, nil } -func buildPhaseProviders(providers []provider.Config) (func() (float64, float64, float64, error), error) { - var res func() (float64, float64, float64, error) - if len(providers) > 0 { - if len(providers) != 3 { - return nil, errors.New("need one per phase, total three") - } - - phases := make([]func() (float64, error), 0, 3) - for idx, prov := range providers { - c, err := provider.NewFloatGetterFromConfig(prov) - if err != nil { - return nil, fmt.Errorf("[%d] %w", idx, err) - } - - phases = append(phases, c) - } - - res = collectPhaseProviders(phases) - } - - return res, nil -} - -// collectPhaseProviders combines phase getters into currents api function -func collectPhaseProviders(g []func() (float64, error)) func() (float64, float64, float64, error) { - return func() (float64, float64, float64, error) { - var res []float64 - for _, currentG := range g { - c, err := currentG() - if err != nil { - return 0, 0, 0, err - } - - res = append(res, c) - } - - return res[0], res[1], res[2], nil - } -} - // NewConfigurable creates a new meter func NewConfigurable(currentPowerG func() (float64, error)) (*Meter, error) { m := &Meter{ diff --git a/meter/openwb.go b/meter/openwb.go index 11242cb2f..6ebb8fa9b 100644 --- a/meter/openwb.go +++ b/meter/openwb.go @@ -64,13 +64,13 @@ func NewOpenWBFromConfig(other map[string]interface{}) (api.Meter, error) { return nil, err } - var curr []func() (float64, error) - for i := 1; i <= 3; i++ { - current, err := to.FloatGetter(mq("%s/evu/%s%d", cc.Topic, openwb.CurrentTopic, i)) + var curr [3]func() (float64, error) + for i := 0; i < 3; i++ { + current, err := to.FloatGetter(mq("%s/evu/%s%d", cc.Topic, openwb.CurrentTopic, i+1)) if err != nil { return nil, err } - curr = append(curr, current) + curr[i] = current } currents = collectPhaseProviders(curr)