From 412ec23a77bbadde9f6c20b4536ef2dfd45b849b Mon Sep 17 00:00:00 2001 From: poohnet Date: Sun, 31 Mar 2024 20:39:21 +0200 Subject: [PATCH] Warp: validate charger phases (#13230) --- api/api.go | 4 + charger/warp/types.go | 4 + charger/warp2.go | 39 +- charger/warp2_decorators.go | 1610 +++++++++++++++++++++++++++++++++-- core/loadpoint.go | 13 + 5 files changed, 1603 insertions(+), 67 deletions(-) diff --git a/api/api.go b/api/api.go index e313594a9..6dab022f5 100644 --- a/api/api.go +++ b/api/api.go @@ -82,6 +82,10 @@ type PhaseSwitcher interface { Phases1p3p(phases int) error } +type PhaseGetter interface { + GetPhases() (int, error) +} + // Diagnosis is a helper interface that allows to dump diagnostic data to console type Diagnosis interface { Diagnose() diff --git a/charger/warp/types.go b/charger/warp/types.go index 31ae1b493..a428a21cf 100644 --- a/charger/warp/types.go +++ b/charger/warp/types.go @@ -105,3 +105,7 @@ type EmState struct { RelayState bool `json:"relay_state"` ErrorFlags int `json:"error_flags"` } + +type EmLowLevelState struct { + Is3phase bool `json:"is_3phase"` +} diff --git a/charger/warp2.go b/charger/warp2.go index ed3615144..aeb2f7786 100644 --- a/charger/warp2.go +++ b/charger/warp2.go @@ -26,6 +26,7 @@ type Warp2 struct { chargeG func() (string, error) userconfigG func() (string, error) emStateG func() (string, error) + emLowLevelG func() (string, error) maxcurrentS func(int64) error phasesS func(int64) error current int64 @@ -36,7 +37,7 @@ func init() { registry.Add("warp-fw2", NewWarp2FromConfig) // deprecated } -//go:generate go run ../cmd/tools/decorate.go -f decorateWarp2 -b *Warp2 -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.PhaseVoltages,Voltages,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 decorateWarp2 -b *Warp2 -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.PhaseVoltages,Voltages,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)" // NewWarpFromConfig creates a new configurable charger func NewWarp2FromConfig(other map[string]interface{}) (api.Charger, error) { @@ -77,13 +78,15 @@ func NewWarp2FromConfig(other map[string]interface{}) (api.Charger, error) { } var phases func(int) error + var getPhases func() (int, error) if cc.EnergyManager != "" { if res, err := wb.emState(); err == nil && res.ExternalControl != 1 { phases = wb.phases1p3p + getPhases = wb.getPhases } } - return decorateWarp2(wb, currentPower, totalEnergy, currents, voltages, identity, phases), err + return decorateWarp2(wb, currentPower, totalEnergy, currents, voltages, identity, phases, getPhases), err } // NewWarp2 creates a new configurable charger @@ -149,6 +152,7 @@ func NewWarp2(mqttconf mqtt.Config, topic, emTopic string, timeout time.Duration if err != nil { return nil, err } + wb.phasesS, err = provider.NewMqtt(log, client, fmt.Sprintf("%s/power_manager/external_control_update", emTopic), 0). WithPayload(`{ "phases_wanted": ${phases} }`). @@ -157,6 +161,11 @@ func NewWarp2(mqttconf mqtt.Config, topic, emTopic string, timeout time.Duration return nil, err } + wb.emLowLevelG, err = to.StringGetter(mq("%s/power_manager/low_level_state", emTopic)) + if err != nil { + return nil, err + } + return wb, nil } @@ -328,6 +337,18 @@ func (wb *Warp2) emState() (warp.EmState, error) { return res, err } +func (wb *Warp2) emLowLevelState() (warp.EmLowLevelState, error) { + var res warp.EmLowLevelState + + s, err := wb.emLowLevelG() + if err == nil { + err = json.Unmarshal([]byte(s), &res) + } + + return res, err +} + +// phases1p3p implements the api.PhaseSwitcher interface func (wb *Warp2) phases1p3p(phases int) error { res, err := wb.emState() if err != nil { @@ -340,3 +361,17 @@ func (wb *Warp2) phases1p3p(phases int) error { return wb.phasesS(int64(phases)) } + +// getPhases implements the api.PhaseGetter interface +func (wb *Warp2) getPhases() (int, error) { + res, err := wb.emLowLevelState() + if err != nil { + return 0, err + } + + if res.Is3phase { + return 3, nil + } + + return 1, nil +} diff --git a/charger/warp2_decorators.go b/charger/warp2_decorators.go index c2451ccb4..eb80a3b50 100644 --- a/charger/warp2_decorators.go +++ b/charger/warp2_decorators.go @@ -6,12 +6,12 @@ import ( "github.com/evcc-io/evcc/api" ) -func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func() (float64, error), phaseCurrents func() (float64, float64, float64, error), phaseVoltages func() (float64, float64, float64, error), identifier func() (string, error), phaseSwitcher func(int) error) api.Charger { +func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func() (float64, error), phaseCurrents func() (float64, float64, float64, error), phaseVoltages 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 && phaseVoltages == nil: + case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher == nil && phaseVoltages == nil: return base - case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseSwitcher == nil && phaseVoltages == nil: + case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher == nil && phaseVoltages == nil: return &struct { *Warp2 api.Meter @@ -22,7 +22,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseSwitcher == nil && phaseVoltages == nil: + case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher == nil && phaseVoltages == nil: return &struct { *Warp2 api.MeterEnergy @@ -33,7 +33,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseSwitcher == nil && phaseVoltages == nil: + case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher == nil && phaseVoltages == nil: return &struct { *Warp2 api.Meter @@ -48,7 +48,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseSwitcher == nil && phaseVoltages == nil: + case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher == nil && phaseVoltages == nil: return &struct { *Warp2 api.PhaseCurrents @@ -59,7 +59,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseSwitcher == nil && phaseVoltages == nil: + case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher == nil && phaseVoltages == nil: return &struct { *Warp2 api.Meter @@ -74,7 +74,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseSwitcher == nil && phaseVoltages == nil: + case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher == nil && phaseVoltages == nil: return &struct { *Warp2 api.MeterEnergy @@ -89,7 +89,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseSwitcher == nil && phaseVoltages == nil: + case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher == nil && phaseVoltages == nil: return &struct { *Warp2 api.Meter @@ -108,7 +108,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseSwitcher == nil && phaseVoltages != nil: + case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher == nil && phaseVoltages != nil: return &struct { *Warp2 api.PhaseVoltages @@ -119,7 +119,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseSwitcher == nil && phaseVoltages != nil: + case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher == nil && phaseVoltages != nil: return &struct { *Warp2 api.Meter @@ -134,7 +134,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseSwitcher == nil && phaseVoltages != nil: + case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher == nil && phaseVoltages != nil: return &struct { *Warp2 api.MeterEnergy @@ -149,7 +149,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseSwitcher == nil && phaseVoltages != nil: + case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher == nil && phaseVoltages != nil: return &struct { *Warp2 api.Meter @@ -168,7 +168,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseSwitcher == nil && phaseVoltages != nil: + case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher == nil && phaseVoltages != nil: return &struct { *Warp2 api.PhaseCurrents @@ -183,7 +183,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseSwitcher == nil && phaseVoltages != nil: + case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher == nil && phaseVoltages != nil: return &struct { *Warp2 api.Meter @@ -202,7 +202,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseSwitcher == nil && phaseVoltages != nil: + case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher == nil && phaseVoltages != nil: return &struct { *Warp2 api.MeterEnergy @@ -221,7 +221,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseSwitcher == nil && phaseVoltages != nil: + case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher == nil && phaseVoltages != nil: return &struct { *Warp2 api.Meter @@ -244,7 +244,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseSwitcher == nil && phaseVoltages == nil: + case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher == nil && phaseVoltages == nil: return &struct { *Warp2 api.Identifier @@ -255,7 +255,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseSwitcher == nil && phaseVoltages == nil: + case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher == nil && phaseVoltages == nil: return &struct { *Warp2 api.Identifier @@ -270,7 +270,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseSwitcher == nil && phaseVoltages == nil: + case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher == nil && phaseVoltages == nil: return &struct { *Warp2 api.Identifier @@ -285,7 +285,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseSwitcher == nil && phaseVoltages == nil: + case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher == nil && phaseVoltages == nil: return &struct { *Warp2 api.Identifier @@ -304,7 +304,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseSwitcher == nil && phaseVoltages == nil: + case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher == nil && phaseVoltages == nil: return &struct { *Warp2 api.Identifier @@ -319,7 +319,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseSwitcher == nil && phaseVoltages == nil: + case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher == nil && phaseVoltages == nil: return &struct { *Warp2 api.Identifier @@ -338,7 +338,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseSwitcher == nil && phaseVoltages == nil: + case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher == nil && phaseVoltages == nil: return &struct { *Warp2 api.Identifier @@ -357,7 +357,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseSwitcher == nil && phaseVoltages == nil: + case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher == nil && phaseVoltages == nil: return &struct { *Warp2 api.Identifier @@ -380,7 +380,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseSwitcher == nil && phaseVoltages != nil: + case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher == nil && phaseVoltages != nil: return &struct { *Warp2 api.Identifier @@ -395,7 +395,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseSwitcher == nil && phaseVoltages != nil: + case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher == nil && phaseVoltages != nil: return &struct { *Warp2 api.Identifier @@ -414,7 +414,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseSwitcher == nil && phaseVoltages != nil: + case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher == nil && phaseVoltages != nil: return &struct { *Warp2 api.Identifier @@ -433,7 +433,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseSwitcher == nil && phaseVoltages != nil: + case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher == nil && phaseVoltages != nil: return &struct { *Warp2 api.Identifier @@ -456,7 +456,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseSwitcher == nil && phaseVoltages != nil: + case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher == nil && phaseVoltages != nil: return &struct { *Warp2 api.Identifier @@ -475,7 +475,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseSwitcher == nil && phaseVoltages != nil: + case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher == nil && phaseVoltages != nil: return &struct { *Warp2 api.Identifier @@ -498,7 +498,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseSwitcher == nil && phaseVoltages != nil: + case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher == nil && phaseVoltages != nil: return &struct { *Warp2 api.Identifier @@ -521,7 +521,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseSwitcher == nil && phaseVoltages != nil: + case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher == nil && phaseVoltages != nil: return &struct { *Warp2 api.Identifier @@ -548,7 +548,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseSwitcher != nil && phaseVoltages == nil: + case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher != nil && phaseVoltages == nil: return &struct { *Warp2 api.PhaseSwitcher @@ -559,7 +559,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseSwitcher != nil && phaseVoltages == nil: + case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher != nil && phaseVoltages == nil: return &struct { *Warp2 api.Meter @@ -574,7 +574,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseSwitcher != nil && phaseVoltages == nil: + case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher != nil && phaseVoltages == nil: return &struct { *Warp2 api.MeterEnergy @@ -589,7 +589,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseSwitcher != nil && phaseVoltages == nil: + case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher != nil && phaseVoltages == nil: return &struct { *Warp2 api.Meter @@ -608,7 +608,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseSwitcher != nil && phaseVoltages == nil: + case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher != nil && phaseVoltages == nil: return &struct { *Warp2 api.PhaseCurrents @@ -623,7 +623,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseSwitcher != nil && phaseVoltages == nil: + case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher != nil && phaseVoltages == nil: return &struct { *Warp2 api.Meter @@ -642,7 +642,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseSwitcher != nil && phaseVoltages == nil: + case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher != nil && phaseVoltages == nil: return &struct { *Warp2 api.MeterEnergy @@ -661,7 +661,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseSwitcher != nil && phaseVoltages == nil: + case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher != nil && phaseVoltages == nil: return &struct { *Warp2 api.Meter @@ -684,7 +684,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseSwitcher != nil && phaseVoltages != nil: + case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher != nil && phaseVoltages != nil: return &struct { *Warp2 api.PhaseSwitcher @@ -699,7 +699,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseSwitcher != nil && phaseVoltages != nil: + case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher != nil && phaseVoltages != nil: return &struct { *Warp2 api.Meter @@ -718,7 +718,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseSwitcher != nil && phaseVoltages != nil: + case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher != nil && phaseVoltages != nil: return &struct { *Warp2 api.MeterEnergy @@ -737,7 +737,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseSwitcher != nil && phaseVoltages != nil: + case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher != nil && phaseVoltages != nil: return &struct { *Warp2 api.Meter @@ -760,7 +760,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseSwitcher != nil && phaseVoltages != nil: + case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher != nil && phaseVoltages != nil: return &struct { *Warp2 api.PhaseCurrents @@ -779,7 +779,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseSwitcher != nil && phaseVoltages != nil: + case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher != nil && phaseVoltages != nil: return &struct { *Warp2 api.Meter @@ -802,7 +802,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseSwitcher != nil && phaseVoltages != nil: + case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher != nil && phaseVoltages != nil: return &struct { *Warp2 api.MeterEnergy @@ -825,7 +825,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseSwitcher != nil && phaseVoltages != nil: + case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher != nil && phaseVoltages != nil: return &struct { *Warp2 api.Meter @@ -852,7 +852,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseSwitcher != nil && phaseVoltages == nil: + case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher != nil && phaseVoltages == nil: return &struct { *Warp2 api.Identifier @@ -867,7 +867,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseSwitcher != nil && phaseVoltages == nil: + case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher != nil && phaseVoltages == nil: return &struct { *Warp2 api.Identifier @@ -886,7 +886,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseSwitcher != nil && phaseVoltages == nil: + case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher != nil && phaseVoltages == nil: return &struct { *Warp2 api.Identifier @@ -905,7 +905,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseSwitcher != nil && phaseVoltages == nil: + case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher != nil && phaseVoltages == nil: return &struct { *Warp2 api.Identifier @@ -928,7 +928,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseSwitcher != nil && phaseVoltages == nil: + case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher != nil && phaseVoltages == nil: return &struct { *Warp2 api.Identifier @@ -947,7 +947,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseSwitcher != nil && phaseVoltages == nil: + case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher != nil && phaseVoltages == nil: return &struct { *Warp2 api.Identifier @@ -970,7 +970,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseSwitcher != nil && phaseVoltages == nil: + case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher != nil && phaseVoltages == nil: return &struct { *Warp2 api.Identifier @@ -993,7 +993,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseSwitcher != nil && phaseVoltages == nil: + case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher != nil && phaseVoltages == nil: return &struct { *Warp2 api.Identifier @@ -1020,7 +1020,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseSwitcher != nil && phaseVoltages != nil: + case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher != nil && phaseVoltages != nil: return &struct { *Warp2 api.Identifier @@ -1039,7 +1039,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseSwitcher != nil && phaseVoltages != nil: + case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher != nil && phaseVoltages != nil: return &struct { *Warp2 api.Identifier @@ -1062,7 +1062,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseSwitcher != nil && phaseVoltages != nil: + case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher != nil && phaseVoltages != nil: return &struct { *Warp2 api.Identifier @@ -1085,7 +1085,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseSwitcher != nil && phaseVoltages != nil: + case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter == nil && phaseSwitcher != nil && phaseVoltages != nil: return &struct { *Warp2 api.Identifier @@ -1112,7 +1112,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseSwitcher != nil && phaseVoltages != nil: + case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher != nil && phaseVoltages != nil: return &struct { *Warp2 api.Identifier @@ -1135,7 +1135,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseSwitcher != nil && phaseVoltages != nil: + case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher != nil && phaseVoltages != nil: return &struct { *Warp2 api.Identifier @@ -1162,7 +1162,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseSwitcher != nil && phaseVoltages != nil: + case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher != nil && phaseVoltages != nil: return &struct { *Warp2 api.Identifier @@ -1189,7 +1189,7 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( }, } - case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseSwitcher != nil && phaseVoltages != nil: + case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter == nil && phaseSwitcher != nil && phaseVoltages != nil: return &struct { *Warp2 api.Identifier @@ -1219,6 +1219,1478 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( phaseVoltages: phaseVoltages, }, } + + case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher == nil && phaseVoltages == nil: + return &struct { + *Warp2 + api.PhaseGetter + }{ + Warp2: base, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + } + + case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher == nil && phaseVoltages == nil: + return &struct { + *Warp2 + api.Meter + api.PhaseGetter + }{ + Warp2: base, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + } + + case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher == nil && phaseVoltages == nil: + return &struct { + *Warp2 + api.MeterEnergy + api.PhaseGetter + }{ + Warp2: base, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + } + + case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher == nil && phaseVoltages == nil: + return &struct { + *Warp2 + api.Meter + api.MeterEnergy + api.PhaseGetter + }{ + Warp2: base, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + } + + case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher == nil && phaseVoltages == nil: + return &struct { + *Warp2 + api.PhaseCurrents + api.PhaseGetter + }{ + Warp2: base, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + } + + case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher == nil && phaseVoltages == nil: + return &struct { + *Warp2 + api.Meter + api.PhaseCurrents + api.PhaseGetter + }{ + Warp2: base, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + } + + case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher == nil && phaseVoltages == nil: + return &struct { + *Warp2 + api.MeterEnergy + api.PhaseCurrents + api.PhaseGetter + }{ + Warp2: base, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + } + + case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher == nil && phaseVoltages == nil: + return &struct { + *Warp2 + api.Meter + api.MeterEnergy + api.PhaseCurrents + api.PhaseGetter + }{ + Warp2: base, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + } + + case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher == nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.PhaseGetter + api.PhaseVoltages + }{ + Warp2: base, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher == nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Meter + api.PhaseGetter + api.PhaseVoltages + }{ + Warp2: base, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher == nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.MeterEnergy + api.PhaseGetter + api.PhaseVoltages + }{ + Warp2: base, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher == nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Meter + api.MeterEnergy + api.PhaseGetter + api.PhaseVoltages + }{ + Warp2: base, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher == nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.PhaseCurrents + api.PhaseGetter + api.PhaseVoltages + }{ + Warp2: base, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher == nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Meter + api.PhaseCurrents + api.PhaseGetter + api.PhaseVoltages + }{ + Warp2: base, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher == nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.MeterEnergy + api.PhaseCurrents + api.PhaseGetter + api.PhaseVoltages + }{ + Warp2: base, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher == nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Meter + api.MeterEnergy + api.PhaseCurrents + api.PhaseGetter + api.PhaseVoltages + }{ + Warp2: base, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher == nil && phaseVoltages == nil: + return &struct { + *Warp2 + api.Identifier + api.PhaseGetter + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + } + + case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher == nil && phaseVoltages == nil: + return &struct { + *Warp2 + api.Identifier + api.Meter + api.PhaseGetter + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + } + + case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher == nil && phaseVoltages == nil: + return &struct { + *Warp2 + api.Identifier + api.MeterEnergy + api.PhaseGetter + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + } + + case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher == nil && phaseVoltages == nil: + return &struct { + *Warp2 + api.Identifier + api.Meter + api.MeterEnergy + api.PhaseGetter + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + } + + case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher == nil && phaseVoltages == nil: + return &struct { + *Warp2 + api.Identifier + api.PhaseCurrents + api.PhaseGetter + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + } + + case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher == nil && phaseVoltages == nil: + return &struct { + *Warp2 + api.Identifier + api.Meter + api.PhaseCurrents + api.PhaseGetter + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + } + + case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher == nil && phaseVoltages == nil: + return &struct { + *Warp2 + api.Identifier + api.MeterEnergy + api.PhaseCurrents + api.PhaseGetter + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + } + + case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher == nil && phaseVoltages == nil: + return &struct { + *Warp2 + api.Identifier + api.Meter + api.MeterEnergy + api.PhaseCurrents + api.PhaseGetter + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + } + + case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher == nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Identifier + api.PhaseGetter + api.PhaseVoltages + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher == nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Identifier + api.Meter + api.PhaseGetter + api.PhaseVoltages + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher == nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Identifier + api.MeterEnergy + api.PhaseGetter + api.PhaseVoltages + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher == nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Identifier + api.Meter + api.MeterEnergy + api.PhaseGetter + api.PhaseVoltages + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher == nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Identifier + api.PhaseCurrents + api.PhaseGetter + api.PhaseVoltages + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher == nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Identifier + api.Meter + api.PhaseCurrents + api.PhaseGetter + api.PhaseVoltages + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher == nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Identifier + api.MeterEnergy + api.PhaseCurrents + api.PhaseGetter + api.PhaseVoltages + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher == nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Identifier + api.Meter + api.MeterEnergy + api.PhaseCurrents + api.PhaseGetter + api.PhaseVoltages + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher != nil && phaseVoltages == nil: + return &struct { + *Warp2 + api.PhaseGetter + api.PhaseSwitcher + }{ + Warp2: base, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher != nil && phaseVoltages == nil: + return &struct { + *Warp2 + api.Meter + api.PhaseGetter + api.PhaseSwitcher + }{ + Warp2: base, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher != nil && phaseVoltages == nil: + return &struct { + *Warp2 + api.MeterEnergy + api.PhaseGetter + api.PhaseSwitcher + }{ + Warp2: base, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher != nil && phaseVoltages == nil: + return &struct { + *Warp2 + api.Meter + api.MeterEnergy + api.PhaseGetter + api.PhaseSwitcher + }{ + Warp2: base, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher != nil && phaseVoltages == nil: + return &struct { + *Warp2 + api.PhaseCurrents + api.PhaseGetter + api.PhaseSwitcher + }{ + Warp2: base, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher != nil && phaseVoltages == nil: + return &struct { + *Warp2 + api.Meter + api.PhaseCurrents + api.PhaseGetter + api.PhaseSwitcher + }{ + Warp2: base, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher != nil && phaseVoltages == nil: + return &struct { + *Warp2 + api.MeterEnergy + api.PhaseCurrents + api.PhaseGetter + api.PhaseSwitcher + }{ + Warp2: base, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher != nil && phaseVoltages == nil: + return &struct { + *Warp2 + api.Meter + api.MeterEnergy + api.PhaseCurrents + api.PhaseGetter + api.PhaseSwitcher + }{ + Warp2: base, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher != nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.PhaseGetter + api.PhaseSwitcher + api.PhaseVoltages + }{ + Warp2: base, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher != nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Meter + api.PhaseGetter + api.PhaseSwitcher + api.PhaseVoltages + }{ + Warp2: base, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher != nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.MeterEnergy + api.PhaseGetter + api.PhaseSwitcher + api.PhaseVoltages + }{ + Warp2: base, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher != nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Meter + api.MeterEnergy + api.PhaseGetter + api.PhaseSwitcher + api.PhaseVoltages + }{ + Warp2: base, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher != nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.PhaseCurrents + api.PhaseGetter + api.PhaseSwitcher + api.PhaseVoltages + }{ + Warp2: base, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher != nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Meter + api.PhaseCurrents + api.PhaseGetter + api.PhaseSwitcher + api.PhaseVoltages + }{ + Warp2: base, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher != nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.MeterEnergy + api.PhaseCurrents + api.PhaseGetter + api.PhaseSwitcher + api.PhaseVoltages + }{ + Warp2: base, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher != nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Meter + api.MeterEnergy + api.PhaseCurrents + api.PhaseGetter + api.PhaseSwitcher + api.PhaseVoltages + }{ + Warp2: base, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher != nil && phaseVoltages == nil: + return &struct { + *Warp2 + api.Identifier + api.PhaseGetter + api.PhaseSwitcher + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher != nil && phaseVoltages == nil: + return &struct { + *Warp2 + api.Identifier + api.Meter + api.PhaseGetter + api.PhaseSwitcher + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher != nil && phaseVoltages == nil: + return &struct { + *Warp2 + api.Identifier + api.MeterEnergy + api.PhaseGetter + api.PhaseSwitcher + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher != nil && phaseVoltages == nil: + return &struct { + *Warp2 + api.Identifier + api.Meter + api.MeterEnergy + api.PhaseGetter + api.PhaseSwitcher + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher != nil && phaseVoltages == nil: + return &struct { + *Warp2 + api.Identifier + api.PhaseCurrents + api.PhaseGetter + api.PhaseSwitcher + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher != nil && phaseVoltages == nil: + return &struct { + *Warp2 + api.Identifier + api.Meter + api.PhaseCurrents + api.PhaseGetter + api.PhaseSwitcher + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher != nil && phaseVoltages == nil: + return &struct { + *Warp2 + api.Identifier + api.MeterEnergy + api.PhaseCurrents + api.PhaseGetter + api.PhaseSwitcher + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher != nil && phaseVoltages == nil: + return &struct { + *Warp2 + api.Identifier + api.Meter + api.MeterEnergy + api.PhaseCurrents + api.PhaseGetter + api.PhaseSwitcher + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } + + case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher != nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Identifier + api.PhaseGetter + api.PhaseSwitcher + api.PhaseVoltages + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher != nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Identifier + api.Meter + api.PhaseGetter + api.PhaseSwitcher + api.PhaseVoltages + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher != nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Identifier + api.MeterEnergy + api.PhaseGetter + api.PhaseSwitcher + api.PhaseVoltages + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseGetter != nil && phaseSwitcher != nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Identifier + api.Meter + api.MeterEnergy + api.PhaseGetter + api.PhaseSwitcher + api.PhaseVoltages + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher != nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Identifier + api.PhaseCurrents + api.PhaseGetter + api.PhaseSwitcher + api.PhaseVoltages + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher != nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Identifier + api.Meter + api.PhaseCurrents + api.PhaseGetter + api.PhaseSwitcher + api.PhaseVoltages + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher != nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Identifier + api.MeterEnergy + api.PhaseCurrents + api.PhaseGetter + api.PhaseSwitcher + api.PhaseVoltages + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseGetter != nil && phaseSwitcher != nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Identifier + api.Meter + api.MeterEnergy + api.PhaseCurrents + api.PhaseGetter + api.PhaseSwitcher + api.PhaseVoltages + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseGetter: &decorateWarp2PhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } } return nil @@ -1256,6 +2728,14 @@ func (impl *decorateWarp2PhaseCurrentsImpl) Currents() (float64, float64, float6 return impl.phaseCurrents() } +type decorateWarp2PhaseGetterImpl struct { + phaseGetter func() (int, error) +} + +func (impl *decorateWarp2PhaseGetterImpl) GetPhases() (int, error) { + return impl.phaseGetter() +} + type decorateWarp2PhaseSwitcherImpl struct { phaseSwitcher func(int) error } diff --git a/core/loadpoint.go b/core/loadpoint.go index eb8c92554..01731f5e8 100644 --- a/core/loadpoint.go +++ b/core/loadpoint.go @@ -710,6 +710,19 @@ func (lp *Loadpoint) syncCharger() error { } } + // sync phases + phases := lp.GetPhases() + if ps, ok := lp.charger.(api.PhaseGetter); ok && enabled && shouldBeConsistent && phases > 0 { + if chargerPhases, err := ps.GetPhases(); err == nil { + if chargerPhases != phases { + lp.log.WARN.Printf("charger logic error: phases mismatch (got %d, expected %d)", chargerPhases, phases) + lp.setPhases(chargerPhases) + } + } else if !errors.Is(err, api.ErrNotAvailable) { + return fmt.Errorf("charger get phases: %w", err) + } + } + case !enabled && !lp.phaseSwitchCompleted(): // some chargers (i.E. Easee in some configurations) disable themselves to be able to switch phases // -> enable charger