diff --git a/charger/warp/types.go b/charger/warp/types.go index 6589d74b1..31ae1b493 100644 --- a/charger/warp/types.go +++ b/charger/warp/types.go @@ -1,9 +1,10 @@ package warp const ( - FeatureMeter = "meter" - FeatureMeterPhases = "meter_phases" - FeatureNfc = "nfc" + FeatureMeter = "meter" + FeatureMeterAllValues = "meter_all_values" + FeatureMeterPhases = "meter_phases" + FeatureNfc = "nfc" ) // https://www.warp-charger.com/api.html#evse_state diff --git a/charger/warp2.go b/charger/warp2.go index fd46709c0..d2e2ba033 100644 --- a/charger/warp2.go +++ b/charger/warp2.go @@ -37,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.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" // NewWarpFromConfig creates a new configurable charger func NewWarp2FromConfig(other map[string]interface{}) (api.Charger, error) { @@ -66,9 +66,10 @@ func NewWarp2FromConfig(other map[string]interface{}) (api.Charger, error) { totalEnergy = wb.totalEnergy } - var currents func() (float64, float64, float64, error) + var currents, voltages func() (float64, float64, float64, error) if wb.hasFeature(cc.Topic, warp.FeatureMeterPhases) { currents = wb.currents + voltages = wb.voltages } var identity func() (string, error) @@ -83,7 +84,7 @@ func NewWarp2FromConfig(other map[string]interface{}) (api.Charger, error) { } } - return decorateWarp2(wb, currentPower, totalEnergy, currents, identity, phases), err + return decorateWarp2(wb, currentPower, totalEnergy, currents, voltages, identity, phases), err } // NewWarp2 creates a new configurable charger @@ -239,24 +240,42 @@ func (wb *Warp2) totalEnergy() (float64, error) { return res.EnergyAbs, err } +func (wb *Warp2) meterValues() ([]float64, error) { + s, err := wb.meterDetailsG() + if err != nil { + return nil, err + } + + var res []float64 + if err := json.Unmarshal([]byte(s), &res); err != nil { + return nil, err + } + + if len(res) <= 5 { + return nil, errors.New("invalid length") + } + + return res, nil +} + // currents implements the api.MeterCurrrents interface func (wb *Warp2) currents() (float64, float64, float64, error) { - var res []float64 - - s, err := wb.meterDetailsG() + res, err := wb.meterValues() if err != nil { return 0, 0, 0, err } - if err := json.Unmarshal([]byte(s), &res); err != nil { + return res[3], res[4], res[5], nil +} + +// voltages implements the api.MeterVoltages interface +func (wb *Warp2) voltages() (float64, float64, float64, error) { + res, err := wb.meterValues() + if err != nil { return 0, 0, 0, err } - if len(res) <= 5 { - return 0, 0, 0, errors.New("invalid length") - } - - return res[3], res[4], res[5], nil + return res[0], res[1], res[2], nil } func (wb *Warp2) identify() (string, error) { diff --git a/charger/warp2_decorators.go b/charger/warp2_decorators.go index 14feea9bb..980015f67 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), 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) api.Charger { switch { - case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseSwitcher == nil: + case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseSwitcher == nil && phaseVoltages == nil: return base - case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseSwitcher == nil: + case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents == 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: + case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents == 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: + case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents == 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: + case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents != 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: + case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents != 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: + case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents != 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: + case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseSwitcher == nil && phaseVoltages == nil: return &struct { *Warp2 api.Meter @@ -108,7 +108,143 @@ func decorateWarp2(base *Warp2, 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 && phaseSwitcher == nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.PhaseVoltages + }{ + Warp2: base, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseSwitcher == nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Meter + api.PhaseVoltages + }{ + Warp2: base, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseSwitcher == nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.MeterEnergy + api.PhaseVoltages + }{ + Warp2: base, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseSwitcher == nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Meter + api.MeterEnergy + api.PhaseVoltages + }{ + Warp2: base, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseSwitcher == nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.PhaseCurrents + api.PhaseVoltages + }{ + Warp2: base, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseSwitcher == nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Meter + api.PhaseCurrents + api.PhaseVoltages + }{ + Warp2: base, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseSwitcher == nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.MeterEnergy + api.PhaseCurrents + api.PhaseVoltages + }{ + Warp2: base, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseSwitcher == nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Meter + api.MeterEnergy + api.PhaseCurrents + api.PhaseVoltages + }{ + Warp2: base, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseSwitcher == nil && phaseVoltages == nil: return &struct { *Warp2 api.Identifier @@ -119,7 +255,7 @@ func decorateWarp2(base *Warp2, 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 && phaseSwitcher == nil && phaseVoltages == nil: return &struct { *Warp2 api.Identifier @@ -134,7 +270,7 @@ func decorateWarp2(base *Warp2, 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 && phaseSwitcher == nil && phaseVoltages == nil: return &struct { *Warp2 api.Identifier @@ -149,7 +285,7 @@ func decorateWarp2(base *Warp2, 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 && phaseSwitcher == nil && phaseVoltages == nil: return &struct { *Warp2 api.Identifier @@ -168,7 +304,7 @@ func decorateWarp2(base *Warp2, 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 && phaseSwitcher == nil && phaseVoltages == nil: return &struct { *Warp2 api.Identifier @@ -183,7 +319,7 @@ func decorateWarp2(base *Warp2, 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 && phaseSwitcher == nil && phaseVoltages == nil: return &struct { *Warp2 api.Identifier @@ -202,7 +338,7 @@ func decorateWarp2(base *Warp2, 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 && phaseSwitcher == nil && phaseVoltages == nil: return &struct { *Warp2 api.Identifier @@ -221,7 +357,7 @@ func decorateWarp2(base *Warp2, 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 && phaseSwitcher == nil && phaseVoltages == nil: return &struct { *Warp2 api.Identifier @@ -244,7 +380,175 @@ func decorateWarp2(base *Warp2, 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 && phaseSwitcher == nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Identifier + api.PhaseVoltages + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseSwitcher == nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Identifier + api.Meter + api.PhaseVoltages + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseSwitcher == nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Identifier + api.MeterEnergy + api.PhaseVoltages + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseSwitcher == nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Identifier + api.Meter + api.MeterEnergy + api.PhaseVoltages + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseSwitcher == nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Identifier + api.PhaseCurrents + api.PhaseVoltages + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseSwitcher == nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Identifier + api.Meter + api.PhaseCurrents + api.PhaseVoltages + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseSwitcher == nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Identifier + api.MeterEnergy + api.PhaseCurrents + api.PhaseVoltages + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseSwitcher == nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Identifier + api.Meter + api.MeterEnergy + api.PhaseCurrents + api.PhaseVoltages + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseSwitcher != nil && phaseVoltages == nil: return &struct { *Warp2 api.PhaseSwitcher @@ -255,7 +559,7 @@ func decorateWarp2(base *Warp2, 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 && phaseSwitcher != nil && phaseVoltages == nil: return &struct { *Warp2 api.Meter @@ -270,7 +574,7 @@ func decorateWarp2(base *Warp2, 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 && phaseSwitcher != nil && phaseVoltages == nil: return &struct { *Warp2 api.MeterEnergy @@ -285,7 +589,7 @@ func decorateWarp2(base *Warp2, 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 && phaseSwitcher != nil && phaseVoltages == nil: return &struct { *Warp2 api.Meter @@ -304,7 +608,7 @@ func decorateWarp2(base *Warp2, 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 && phaseSwitcher != nil && phaseVoltages == nil: return &struct { *Warp2 api.PhaseCurrents @@ -319,7 +623,7 @@ func decorateWarp2(base *Warp2, 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 && phaseSwitcher != nil && phaseVoltages == nil: return &struct { *Warp2 api.Meter @@ -338,7 +642,7 @@ func decorateWarp2(base *Warp2, 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 && phaseSwitcher != nil && phaseVoltages == nil: return &struct { *Warp2 api.MeterEnergy @@ -357,7 +661,7 @@ func decorateWarp2(base *Warp2, 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 && phaseSwitcher != nil && phaseVoltages == nil: return &struct { *Warp2 api.Meter @@ -380,7 +684,175 @@ func decorateWarp2(base *Warp2, 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 && phaseSwitcher != nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.PhaseSwitcher + api.PhaseVoltages + }{ + Warp2: base, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseSwitcher != nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Meter + api.PhaseSwitcher + api.PhaseVoltages + }{ + Warp2: base, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseSwitcher != nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.MeterEnergy + api.PhaseSwitcher + api.PhaseVoltages + }{ + Warp2: base, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseSwitcher != nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Meter + api.MeterEnergy + api.PhaseSwitcher + api.PhaseVoltages + }{ + Warp2: base, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier == nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseSwitcher != nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.PhaseCurrents + api.PhaseSwitcher + api.PhaseVoltages + }{ + Warp2: base, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier == nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseSwitcher != nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Meter + api.PhaseCurrents + api.PhaseSwitcher + api.PhaseVoltages + }{ + Warp2: base, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier == nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseSwitcher != nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.MeterEnergy + api.PhaseCurrents + api.PhaseSwitcher + api.PhaseVoltages + }{ + Warp2: base, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier == nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseSwitcher != nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Meter + api.MeterEnergy + api.PhaseCurrents + api.PhaseSwitcher + api.PhaseVoltages + }{ + Warp2: base, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseSwitcher != nil && phaseVoltages == nil: return &struct { *Warp2 api.Identifier @@ -395,7 +867,7 @@ func decorateWarp2(base *Warp2, 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 && phaseSwitcher != nil && phaseVoltages == nil: return &struct { *Warp2 api.Identifier @@ -414,7 +886,7 @@ func decorateWarp2(base *Warp2, 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 && phaseSwitcher != nil && phaseVoltages == nil: return &struct { *Warp2 api.Identifier @@ -433,7 +905,7 @@ func decorateWarp2(base *Warp2, 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 && phaseSwitcher != nil && phaseVoltages == nil: return &struct { *Warp2 api.Identifier @@ -456,7 +928,7 @@ func decorateWarp2(base *Warp2, 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 && phaseSwitcher != nil && phaseVoltages == nil: return &struct { *Warp2 api.Identifier @@ -475,7 +947,7 @@ func decorateWarp2(base *Warp2, 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 && phaseSwitcher != nil && phaseVoltages == nil: return &struct { *Warp2 api.Identifier @@ -498,7 +970,7 @@ func decorateWarp2(base *Warp2, 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 && phaseSwitcher != nil && phaseVoltages == nil: return &struct { *Warp2 api.Identifier @@ -521,7 +993,7 @@ func decorateWarp2(base *Warp2, 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 && phaseSwitcher != nil && phaseVoltages == nil: return &struct { *Warp2 api.Identifier @@ -547,6 +1019,206 @@ func decorateWarp2(base *Warp2, meter func() (float64, error), meterEnergy func( phaseSwitcher: phaseSwitcher, }, } + + case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents == nil && phaseSwitcher != nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Identifier + api.PhaseSwitcher + api.PhaseVoltages + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents == nil && phaseSwitcher != nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Identifier + api.Meter + api.PhaseSwitcher + api.PhaseVoltages + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents == nil && phaseSwitcher != nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Identifier + api.MeterEnergy + api.PhaseSwitcher + api.PhaseVoltages + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents == nil && phaseSwitcher != nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Identifier + api.Meter + api.MeterEnergy + api.PhaseSwitcher + api.PhaseVoltages + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier != nil && meter == nil && meterEnergy == nil && phaseCurrents != nil && phaseSwitcher != nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Identifier + api.PhaseCurrents + api.PhaseSwitcher + api.PhaseVoltages + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier != nil && meter != nil && meterEnergy == nil && phaseCurrents != nil && phaseSwitcher != nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Identifier + api.Meter + api.PhaseCurrents + api.PhaseSwitcher + api.PhaseVoltages + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier != nil && meter == nil && meterEnergy != nil && phaseCurrents != nil && phaseSwitcher != nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Identifier + api.MeterEnergy + api.PhaseCurrents + api.PhaseSwitcher + api.PhaseVoltages + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } + + case identifier != nil && meter != nil && meterEnergy != nil && phaseCurrents != nil && phaseSwitcher != nil && phaseVoltages != nil: + return &struct { + *Warp2 + api.Identifier + api.Meter + api.MeterEnergy + api.PhaseCurrents + api.PhaseSwitcher + api.PhaseVoltages + }{ + Warp2: base, + Identifier: &decorateWarp2IdentifierImpl{ + identifier: identifier, + }, + Meter: &decorateWarp2MeterImpl{ + meter: meter, + }, + MeterEnergy: &decorateWarp2MeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + PhaseCurrents: &decorateWarp2PhaseCurrentsImpl{ + phaseCurrents: phaseCurrents, + }, + PhaseSwitcher: &decorateWarp2PhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + PhaseVoltages: &decorateWarp2PhaseVoltagesImpl{ + phaseVoltages: phaseVoltages, + }, + } } return nil @@ -591,3 +1263,11 @@ type decorateWarp2PhaseSwitcherImpl struct { func (impl *decorateWarp2PhaseSwitcherImpl) Phases1p3p(phases int) error { return impl.phaseSwitcher(phases) } + +type decorateWarp2PhaseVoltagesImpl struct { + phaseVoltages func() (float64, float64, float64, error) +} + +func (impl *decorateWarp2PhaseVoltagesImpl) Voltages() (float64, float64, float64, error) { + return impl.phaseVoltages() +}