diff --git a/charger/keba-modbus.go b/charger/keba-modbus.go index cdb5a715c6..4aef317455 100644 --- a/charger/keba-modbus.go +++ b/charger/keba-modbus.go @@ -64,7 +64,7 @@ func init() { registry.Add("keba-modbus", NewKebaFromConfig) } -//go:generate go run ../cmd/tools/decorate.go -f decorateKeba -b *Keba -r api.Charger -t "api.Meter,CurrentPower,func() (float64, error)" -t "api.MeterEnergy,TotalEnergy,func() (float64, error)" -t "api.PhaseCurrents,Currents,func() (float64, float64, float64, error)" -t "api.Identifier,Identify,func() (string, error)" -t "api.PhaseSwitcher,Phases1p3p,func(int) error" +//go:generate go run ../cmd/tools/decorate.go -f decorateKeba -b *Keba -r api.Charger -t "api.Meter,CurrentPower,func() (float64, error)" -t "api.MeterEnergy,TotalEnergy,func() (float64, error)" -t "api.PhaseCurrents,Currents,func() (float64, float64, float64, error)" -t "api.Identifier,Identify,func() (string, error)" -t "api.PhaseSwitcher,Phases1p3p,func(int) error" -t "api.PhaseGetter,GetPhases,func() (int, error)" // NewKebaFromConfig creates a new Keba ModbusTCP charger func NewKebaFromConfig(other map[string]interface{}) (api.Charger, error) { @@ -104,10 +104,14 @@ func NewKebaFromConfig(other map[string]interface{}) (api.Charger, error) { } // phases - var phases func(int) error + var ( + phasesS func(int) error + phasesG func() (int, error) + ) if b, err := wb.conn.ReadHoldingRegisters(kebaRegPhaseSource, 2); err == nil { if source := binary.BigEndian.Uint32(b); source == 3 { - phases = wb.phases1p3p + phasesS = wb.phases1p3p + phasesG = wb.getPhases } } @@ -121,7 +125,7 @@ func NewKebaFromConfig(other map[string]interface{}) (api.Charger, error) { go wb.heartbeat(time.Duration(u) * time.Second / 2) } - return decorateKeba(wb, currentPower, totalEnergy, currents, identify, phases), nil + return decorateKeba(wb, currentPower, totalEnergy, currents, identify, phasesS, phasesG), nil } // NewKeba creates a new charger @@ -138,9 +142,6 @@ func NewKeba(uri string, slaveID uint8) (*Keba, error) { log := util.NewLogger("keba") conn.Logger(log.TRACE) - // per Keba docs - // conn.Delay(500 * time.Millisecond) - wb := &Keba{ log: log, conn: conn, @@ -284,6 +285,16 @@ func (wb *Keba) phases1p3p(phases int) error { return err } +// getPhases implements the api.PhaseGetter interface +func (wb *Keba) getPhases() (int, error) { + b, err := wb.conn.ReadHoldingRegisters(kebaRegPhaseState, 1) + if err != nil { + return 0, err + } + + return int(binary.BigEndian.Uint16(b)), nil +} + var _ api.Diagnosis = (*Keba)(nil) // Diagnose implements the api.Diagnosis interface diff --git a/charger/keba-modbus_decorators.go b/charger/keba-modbus_decorators.go index fe332850d7..4fd330a8bb 100644 --- a/charger/keba-modbus_decorators.go +++ b/charger/keba-modbus_decorators.go @@ -6,12 +6,12 @@ import ( "github.com/evcc-io/evcc/api" ) -func decorateKeba(base *Keba, meter func() (float64, error), meterEnergy func() (float64, error), phaseCurrents func() (float64, float64, float64, error), identifier func() (string, error), phaseSwitcher func(int) error) api.Charger { +func decorateKeba(base *Keba, meter func() (float64, error), meterEnergy func() (float64, error), phaseCurrents func() (float64, float64, float64, error), identifier func() (string, error), phaseSwitcher func(int) error, phaseGetter func() (int, error)) api.Charger { switch { - case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseSwitcher == nil: + case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher == nil: return base - case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseSwitcher == nil: + case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher == nil: return &struct { *Keba api.Meter @@ -22,7 +22,7 @@ func decorateKeba(base *Keba, meter func() (float64, error), meterEnergy func() }, } - case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseSwitcher == nil: + case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher == nil: return &struct { *Keba api.MeterEnergy @@ -33,7 +33,7 @@ func decorateKeba(base *Keba, meter func() (float64, error), meterEnergy func() }, } - case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseSwitcher == nil: + case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher == nil: return &struct { *Keba api.Meter @@ -48,7 +48,7 @@ func decorateKeba(base *Keba, meter func() (float64, error), meterEnergy func() }, } - case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseSwitcher == nil: + case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher == nil: return &struct { *Keba api.PhaseCurrents @@ -59,7 +59,7 @@ func decorateKeba(base *Keba, meter func() (float64, error), meterEnergy func() }, } - case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseSwitcher == nil: + case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher == nil: return &struct { *Keba api.Meter @@ -74,7 +74,7 @@ func decorateKeba(base *Keba, meter func() (float64, error), meterEnergy func() }, } - case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseSwitcher == nil: + case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher == nil: return &struct { *Keba api.MeterEnergy @@ -89,7 +89,7 @@ func decorateKeba(base *Keba, meter func() (float64, error), meterEnergy func() }, } - case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseSwitcher == nil: + case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher == nil: return &struct { *Keba api.Meter @@ -108,7 +108,7 @@ func decorateKeba(base *Keba, meter func() (float64, error), meterEnergy func() }, } - case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseSwitcher == nil: + case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher == nil: return &struct { *Keba api.Identifier @@ -119,7 +119,7 @@ func decorateKeba(base *Keba, meter func() (float64, error), meterEnergy func() }, } - case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseSwitcher == nil: + case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher == nil: return &struct { *Keba api.Identifier @@ -134,7 +134,7 @@ func decorateKeba(base *Keba, meter func() (float64, error), meterEnergy func() }, } - case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseSwitcher == nil: + case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher == nil: return &struct { *Keba api.Identifier @@ -149,7 +149,7 @@ func decorateKeba(base *Keba, meter func() (float64, error), meterEnergy func() }, } - case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseSwitcher == nil: + case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher == nil: return &struct { *Keba api.Identifier @@ -168,7 +168,7 @@ func decorateKeba(base *Keba, meter func() (float64, error), meterEnergy func() }, } - case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseSwitcher == nil: + case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher == nil: return &struct { *Keba api.Identifier @@ -183,7 +183,7 @@ func decorateKeba(base *Keba, meter func() (float64, error), meterEnergy func() }, } - case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseSwitcher == nil: + case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher == nil: return &struct { *Keba api.Identifier @@ -202,7 +202,7 @@ func decorateKeba(base *Keba, meter func() (float64, error), meterEnergy func() }, } - case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseSwitcher == nil: + case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher == nil: return &struct { *Keba api.Identifier @@ -221,7 +221,7 @@ func decorateKeba(base *Keba, meter func() (float64, error), meterEnergy func() }, } - case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseSwitcher == nil: + case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher == nil: return &struct { *Keba api.Identifier @@ -244,7 +244,7 @@ func decorateKeba(base *Keba, meter func() (float64, error), meterEnergy func() }, } - case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseSwitcher != nil: + case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher != nil: return &struct { *Keba api.PhaseSwitcher @@ -255,7 +255,7 @@ func decorateKeba(base *Keba, meter func() (float64, error), meterEnergy func() }, } - case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseSwitcher != nil: + case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher != nil: return &struct { *Keba api.Meter @@ -270,7 +270,7 @@ func decorateKeba(base *Keba, meter func() (float64, error), meterEnergy func() }, } - case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseSwitcher != nil: + case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher != nil: return &struct { *Keba api.MeterEnergy @@ -285,7 +285,7 @@ func decorateKeba(base *Keba, meter func() (float64, error), meterEnergy func() }, } - case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseSwitcher != nil: + case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher != nil: return &struct { *Keba api.Meter @@ -304,7 +304,7 @@ func decorateKeba(base *Keba, meter func() (float64, error), meterEnergy func() }, } - case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseSwitcher != nil: + case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher != nil: return &struct { *Keba api.PhaseCurrents @@ -319,7 +319,7 @@ func decorateKeba(base *Keba, meter func() (float64, error), meterEnergy func() }, } - case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseSwitcher != nil: + case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher != nil: return &struct { *Keba api.Meter @@ -338,7 +338,7 @@ func decorateKeba(base *Keba, meter func() (float64, error), meterEnergy func() }, } - case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseSwitcher != nil: + case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher != nil: return &struct { *Keba api.MeterEnergy @@ -357,7 +357,7 @@ func decorateKeba(base *Keba, meter func() (float64, error), meterEnergy func() }, } - case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseSwitcher != nil: + case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher != nil: return &struct { *Keba api.Meter @@ -380,7 +380,7 @@ func decorateKeba(base *Keba, meter func() (float64, error), meterEnergy func() }, } - case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseSwitcher != nil: + case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher != nil: return &struct { *Keba api.Identifier @@ -395,7 +395,7 @@ func decorateKeba(base *Keba, meter func() (float64, error), meterEnergy func() }, } - case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseSwitcher != nil: + case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher != nil: return &struct { *Keba api.Identifier @@ -414,7 +414,7 @@ func decorateKeba(base *Keba, meter func() (float64, error), meterEnergy func() }, } - case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseSwitcher != nil: + case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher != nil: return &struct { *Keba api.Identifier @@ -433,7 +433,7 @@ func decorateKeba(base *Keba, meter func() (float64, error), meterEnergy func() }, } - case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseSwitcher != nil: + case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher != nil: return &struct { *Keba api.Identifier @@ -456,7 +456,7 @@ func decorateKeba(base *Keba, meter func() (float64, error), meterEnergy func() }, } - case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseSwitcher != nil: + case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher != nil: return &struct { *Keba api.Identifier @@ -475,7 +475,7 @@ func decorateKeba(base *Keba, meter func() (float64, error), meterEnergy func() }, } - case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseSwitcher != nil: + case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher != nil: return &struct { *Keba api.Identifier @@ -498,7 +498,7 @@ func decorateKeba(base *Keba, meter func() (float64, error), meterEnergy func() }, } - case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseSwitcher != nil: + case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher != nil: return &struct { *Keba api.Identifier @@ -521,7 +521,7 @@ func decorateKeba(base *Keba, meter func() (float64, error), meterEnergy func() }, } - case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseSwitcher != nil: + case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher != nil: return &struct { *Keba api.Identifier @@ -547,6 +547,678 @@ func decorateKeba(base *Keba, meter func() (float64, error), meterEnergy func() phaseSwitcher: phaseSwitcher, }, } + + case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher == nil: + return &struct { + *Keba + api.PhaseGetter + }{ + Keba: base, + PhaseGetter: &decorateKebaPhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + } + + case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher == nil: + return &struct { + *Keba + api.Meter + api.PhaseGetter + }{ + Keba: base, + Meter: &decorateKebaMeterImpl{ + meter: meter, + }, + PhaseGetter: &decorateKebaPhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + } + + case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher == nil: + return &struct { + *Keba + api.MeterEnergy + api.PhaseGetter + }{ + Keba: base, + MeterEnergy: &decorateKebaMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseGetter: &decorateKebaPhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + } + + case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher == nil: + return &struct { + *Keba + api.Meter + api.MeterEnergy + api.PhaseGetter + }{ + Keba: base, + Meter: &decorateKebaMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateKebaMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseGetter: &decorateKebaPhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + } + + case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher == nil: + return &struct { + *Keba + api.PhaseCurrents + api.PhaseGetter + }{ + Keba: base, + PhaseCurrents: &decorateKebaPhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateKebaPhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + } + + case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher == nil: + return &struct { + *Keba + api.Meter + api.PhaseCurrents + api.PhaseGetter + }{ + Keba: base, + Meter: &decorateKebaMeterImpl{ + meter: meter, + }, + PhaseCurrents: &decorateKebaPhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateKebaPhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + } + + case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher == nil: + return &struct { + *Keba + api.MeterEnergy + api.PhaseCurrents + api.PhaseGetter + }{ + Keba: base, + MeterEnergy: &decorateKebaMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseCurrents: &decorateKebaPhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateKebaPhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + } + + case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher == nil: + return &struct { + *Keba + api.Meter + api.MeterEnergy + api.PhaseCurrents + api.PhaseGetter + }{ + Keba: base, + Meter: &decorateKebaMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateKebaMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseCurrents: &decorateKebaPhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateKebaPhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + } + + case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher == nil: + return &struct { + *Keba + api.Identifier + api.PhaseGetter + }{ + Keba: base, + Identifier: &decorateKebaIdentifierImpl{ + identifier: identifier, + }, + PhaseGetter: &decorateKebaPhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + } + + case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher == nil: + return &struct { + *Keba + api.Identifier + api.Meter + api.PhaseGetter + }{ + Keba: base, + Identifier: &decorateKebaIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateKebaMeterImpl{ + meter: meter, + }, + PhaseGetter: &decorateKebaPhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + } + + case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher == nil: + return &struct { + *Keba + api.Identifier + api.MeterEnergy + api.PhaseGetter + }{ + Keba: base, + Identifier: &decorateKebaIdentifierImpl{ + identifier: identifier, + }, + MeterEnergy: &decorateKebaMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseGetter: &decorateKebaPhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + } + + case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher == nil: + return &struct { + *Keba + api.Identifier + api.Meter + api.MeterEnergy + api.PhaseGetter + }{ + Keba: base, + Identifier: &decorateKebaIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateKebaMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateKebaMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseGetter: &decorateKebaPhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + } + + case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher == nil: + return &struct { + *Keba + api.Identifier + api.PhaseCurrents + api.PhaseGetter + }{ + Keba: base, + Identifier: &decorateKebaIdentifierImpl{ + identifier: identifier, + }, + PhaseCurrents: &decorateKebaPhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateKebaPhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + } + + case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher == nil: + return &struct { + *Keba + api.Identifier + api.Meter + api.PhaseCurrents + api.PhaseGetter + }{ + Keba: base, + Identifier: &decorateKebaIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateKebaMeterImpl{ + meter: meter, + }, + PhaseCurrents: &decorateKebaPhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateKebaPhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + } + + case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher == nil: + return &struct { + *Keba + api.Identifier + api.MeterEnergy + api.PhaseCurrents + api.PhaseGetter + }{ + Keba: base, + Identifier: &decorateKebaIdentifierImpl{ + identifier: identifier, + }, + MeterEnergy: &decorateKebaMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseCurrents: &decorateKebaPhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateKebaPhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + } + + case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher == nil: + return &struct { + *Keba + api.Identifier + api.Meter + api.MeterEnergy + api.PhaseCurrents + api.PhaseGetter + }{ + Keba: base, + Identifier: &decorateKebaIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateKebaMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateKebaMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseCurrents: &decorateKebaPhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateKebaPhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + } + + case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher != nil: + return &struct { + *Keba + api.PhaseGetter + api.PhaseSwitcher + }{ + Keba: base, + PhaseGetter: &decorateKebaPhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateKebaPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher != nil: + return &struct { + *Keba + api.Meter + api.PhaseGetter + api.PhaseSwitcher + }{ + Keba: base, + Meter: &decorateKebaMeterImpl{ + meter: meter, + }, + PhaseGetter: &decorateKebaPhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateKebaPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher != nil: + return &struct { + *Keba + api.MeterEnergy + api.PhaseGetter + api.PhaseSwitcher + }{ + Keba: base, + MeterEnergy: &decorateKebaMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseGetter: &decorateKebaPhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateKebaPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher != nil: + return &struct { + *Keba + api.Meter + api.MeterEnergy + api.PhaseGetter + api.PhaseSwitcher + }{ + Keba: base, + Meter: &decorateKebaMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateKebaMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseGetter: &decorateKebaPhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateKebaPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher != nil: + return &struct { + *Keba + api.PhaseCurrents + api.PhaseGetter + api.PhaseSwitcher + }{ + Keba: base, + PhaseCurrents: &decorateKebaPhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateKebaPhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateKebaPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher != nil: + return &struct { + *Keba + api.Meter + api.PhaseCurrents + api.PhaseGetter + api.PhaseSwitcher + }{ + Keba: base, + Meter: &decorateKebaMeterImpl{ + meter: meter, + }, + PhaseCurrents: &decorateKebaPhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateKebaPhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateKebaPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher != nil: + return &struct { + *Keba + api.MeterEnergy + api.PhaseCurrents + api.PhaseGetter + api.PhaseSwitcher + }{ + Keba: base, + MeterEnergy: &decorateKebaMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseCurrents: &decorateKebaPhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateKebaPhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateKebaPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher != nil: + return &struct { + *Keba + api.Meter + api.MeterEnergy + api.PhaseCurrents + api.PhaseGetter + api.PhaseSwitcher + }{ + Keba: base, + Meter: &decorateKebaMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateKebaMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseCurrents: &decorateKebaPhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateKebaPhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateKebaPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher != nil: + return &struct { + *Keba + api.Identifier + api.PhaseGetter + api.PhaseSwitcher + }{ + Keba: base, + Identifier: &decorateKebaIdentifierImpl{ + identifier: identifier, + }, + PhaseGetter: &decorateKebaPhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateKebaPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher != nil: + return &struct { + *Keba + api.Identifier + api.Meter + api.PhaseGetter + api.PhaseSwitcher + }{ + Keba: base, + Identifier: &decorateKebaIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateKebaMeterImpl{ + meter: meter, + }, + PhaseGetter: &decorateKebaPhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateKebaPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher != nil: + return &struct { + *Keba + api.Identifier + api.MeterEnergy + api.PhaseGetter + api.PhaseSwitcher + }{ + Keba: base, + Identifier: &decorateKebaIdentifierImpl{ + identifier: identifier, + }, + MeterEnergy: &decorateKebaMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseGetter: &decorateKebaPhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateKebaPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher != nil: + return &struct { + *Keba + api.Identifier + api.Meter + api.MeterEnergy + api.PhaseGetter + api.PhaseSwitcher + }{ + Keba: base, + Identifier: &decorateKebaIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateKebaMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateKebaMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseGetter: &decorateKebaPhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateKebaPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher != nil: + return &struct { + *Keba + api.Identifier + api.PhaseCurrents + api.PhaseGetter + api.PhaseSwitcher + }{ + Keba: base, + Identifier: &decorateKebaIdentifierImpl{ + identifier: identifier, + }, + PhaseCurrents: &decorateKebaPhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateKebaPhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateKebaPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher != nil: + return &struct { + *Keba + api.Identifier + api.Meter + api.PhaseCurrents + api.PhaseGetter + api.PhaseSwitcher + }{ + Keba: base, + Identifier: &decorateKebaIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateKebaMeterImpl{ + meter: meter, + }, + PhaseCurrents: &decorateKebaPhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateKebaPhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateKebaPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher != nil: + return &struct { + *Keba + api.Identifier + api.MeterEnergy + api.PhaseCurrents + api.PhaseGetter + api.PhaseSwitcher + }{ + Keba: base, + Identifier: &decorateKebaIdentifierImpl{ + identifier: identifier, + }, + MeterEnergy: &decorateKebaMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseCurrents: &decorateKebaPhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateKebaPhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateKebaPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher != nil: + return &struct { + *Keba + api.Identifier + api.Meter + api.MeterEnergy + api.PhaseCurrents + api.PhaseGetter + api.PhaseSwitcher + }{ + Keba: base, + Identifier: &decorateKebaIdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateKebaMeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateKebaMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseCurrents: &decorateKebaPhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateKebaPhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateKebaPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } } return nil @@ -584,6 +1256,14 @@ func (impl *decorateKebaPhaseCurrentsImpl) Currents() (float64, float64, float64 return impl.phaseCurrents() } +type decorateKebaPhaseGetterImpl struct { + phaseGetter func() (int, error) +} + +func (impl *decorateKebaPhaseGetterImpl) GetPhases() (int, error) { + return impl.phaseGetter() +} + type decorateKebaPhaseSwitcherImpl struct { phaseSwitcher func(int) error }