From 966b321219d090f3b0b88fadfebe2a4ad577bd51 Mon Sep 17 00:00:00 2001 From: andig Date: Fri, 9 Jan 2026 09:11:00 +0100 Subject: [PATCH 1/2] MBMD: add missing battery capabilities --- meter/mbmd.go | 25 +- meter/mbmd_decorators.go | 974 ++++++++++++++++----------------------- 2 files changed, 432 insertions(+), 567 deletions(-) diff --git a/meter/mbmd.go b/meter/mbmd.go index e08fd1773..0736db8b6 100644 --- a/meter/mbmd.go +++ b/meter/mbmd.go @@ -26,7 +26,24 @@ func init() { registry.AddCtx("mbmd", NewModbusMbmdFromConfig) } -//go:generate go tool decorate -f decorateModbusMbmd -b api.Meter -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.PhasePowers,Powers,func() (float64, float64, float64, error)" -t "api.Battery,Soc,func() (float64, error)" -t "api.BatteryCapacity,Capacity,func() float64" +//go:generate go tool decorate + +//evcc:function decorateMbmd +//evcc:basetype api.Meter +//evcc:type api.MeterEnergy,TotalEnergy,func() (float64, error) +//evcc:type api.PhaseCurrents,Currents,func() (float64, float64, float64, error) +//evcc:type api.PhaseVoltages,Voltages,func() (float64, float64, float64, error) +//evcc:type api.PhasePowers,Powers,func() (float64, float64, float64, error) +// evcc:type api.MaxACPowerGetter,MaxACPower,func() float64 + +//evcc:function decorateMbmdBattery +//evcc:basetype api.Meter +//evcc:type api.MeterEnergy,TotalEnergy,func() (float64, error) +//evcc:type api.Battery,Soc,func() (float64, error) +//evcc:type api.BatteryCapacity,Capacity,func() float64 +//evcc:type api.BatterySocLimiter,GetSocLimits,func() (float64, float64) +//evcc:type api.BatteryPowerLimiter,GetPowerLimits,func() (float64, float64) +// evcc:type api.BatteryController,SetBatteryMode,func(api.BatteryMode) error // NewModbusMbmdFromConfig creates api.Meter from config func NewModbusMbmdFromConfig(ctx context.Context, other map[string]any) (api.Meter, error) { @@ -135,7 +152,11 @@ func NewModbusMbmdFromConfig(ctx context.Context, other map[string]any) (api.Met soc = g } - return decorateModbusMbmd(m, totalEnergy, currentsG, voltagesG, powersG, soc, cc.batteryCapacity.Decorator()), nil + if soc != nil { + return decorateMbmdBattery(m, totalEnergy, soc, cc.batteryCapacity.Decorator(), cc.batterySocLimits.Decorator(), cc.batteryPowerLimits.Decorator()), nil + } + + return decorateMbmd(m, totalEnergy, currentsG, voltagesG, powersG), nil } // deviceOp checks is RS485 device supports operation diff --git a/meter/mbmd_decorators.go b/meter/mbmd_decorators.go index ad371e936..271d2eb56 100644 --- a/meter/mbmd_decorators.go +++ b/meter/mbmd_decorators.go @@ -6,90 +6,90 @@ import ( "github.com/evcc-io/evcc/api" ) -func decorateModbusMbmd(base api.Meter, meterEnergy func() (float64, error), phaseCurrents func() (float64, float64, float64, error), phaseVoltages func() (float64, float64, float64, error), phasePowers func() (float64, float64, float64, error), battery func() (float64, error), batteryCapacity func() float64) api.Meter { +func decorateMbmd(base api.Meter, meterEnergy func() (float64, error), phaseCurrents func() (float64, float64, float64, error), phaseVoltages func() (float64, float64, float64, error), phasePowers func() (float64, float64, float64, error)) api.Meter { switch { - case battery == nil && meterEnergy == nil && phaseCurrents == nil && phaseVoltages == nil: + case meterEnergy == nil && phaseCurrents == nil && phaseVoltages == nil: return base - case battery == nil && meterEnergy != nil && phaseCurrents == nil && phaseVoltages == nil: + case meterEnergy != nil && phaseCurrents == nil && phaseVoltages == nil: return &struct { api.Meter api.MeterEnergy }{ Meter: base, - MeterEnergy: &decorateModbusMbmdMeterEnergyImpl{ + MeterEnergy: &decorateMbmdMeterEnergyImpl{ meterEnergy: meterEnergy, }, } - case battery == nil && meterEnergy == nil && phaseCurrents != nil && phasePowers == nil && phaseVoltages == nil: + case meterEnergy == nil && phaseCurrents != nil && phasePowers == nil && phaseVoltages == nil: return &struct { api.Meter api.PhaseCurrents }{ Meter: base, - PhaseCurrents: &decorateModbusMbmdPhaseCurrentsImpl{ + PhaseCurrents: &decorateMbmdPhaseCurrentsImpl{ phaseCurrents: phaseCurrents, }, } - case battery == nil && meterEnergy != nil && phaseCurrents != nil && phasePowers == nil && phaseVoltages == nil: + case meterEnergy != nil && phaseCurrents != nil && phasePowers == nil && phaseVoltages == nil: return &struct { api.Meter api.MeterEnergy api.PhaseCurrents }{ Meter: base, - MeterEnergy: &decorateModbusMbmdMeterEnergyImpl{ + MeterEnergy: &decorateMbmdMeterEnergyImpl{ meterEnergy: meterEnergy, }, - PhaseCurrents: &decorateModbusMbmdPhaseCurrentsImpl{ + PhaseCurrents: &decorateMbmdPhaseCurrentsImpl{ phaseCurrents: phaseCurrents, }, } - case battery == nil && meterEnergy == nil && phaseCurrents == nil && phaseVoltages != nil: + case meterEnergy == nil && phaseCurrents == nil && phaseVoltages != nil: return &struct { api.Meter api.PhaseVoltages }{ Meter: base, - PhaseVoltages: &decorateModbusMbmdPhaseVoltagesImpl{ + PhaseVoltages: &decorateMbmdPhaseVoltagesImpl{ phaseVoltages: phaseVoltages, }, } - case battery == nil && meterEnergy != nil && phaseCurrents == nil && phaseVoltages != nil: + case meterEnergy != nil && phaseCurrents == nil && phaseVoltages != nil: return &struct { api.Meter api.MeterEnergy api.PhaseVoltages }{ Meter: base, - MeterEnergy: &decorateModbusMbmdMeterEnergyImpl{ + MeterEnergy: &decorateMbmdMeterEnergyImpl{ meterEnergy: meterEnergy, }, - PhaseVoltages: &decorateModbusMbmdPhaseVoltagesImpl{ + PhaseVoltages: &decorateMbmdPhaseVoltagesImpl{ phaseVoltages: phaseVoltages, }, } - case battery == nil && meterEnergy == nil && phaseCurrents != nil && phasePowers == nil && phaseVoltages != nil: + case meterEnergy == nil && phaseCurrents != nil && phasePowers == nil && phaseVoltages != nil: return &struct { api.Meter api.PhaseCurrents api.PhaseVoltages }{ Meter: base, - PhaseCurrents: &decorateModbusMbmdPhaseCurrentsImpl{ + PhaseCurrents: &decorateMbmdPhaseCurrentsImpl{ phaseCurrents: phaseCurrents, }, - PhaseVoltages: &decorateModbusMbmdPhaseVoltagesImpl{ + PhaseVoltages: &decorateMbmdPhaseVoltagesImpl{ phaseVoltages: phaseVoltages, }, } - case battery == nil && meterEnergy != nil && phaseCurrents != nil && phasePowers == nil && phaseVoltages != nil: + case meterEnergy != nil && phaseCurrents != nil && phasePowers == nil && phaseVoltages != nil: return &struct { api.Meter api.MeterEnergy @@ -97,33 +97,33 @@ func decorateModbusMbmd(base api.Meter, meterEnergy func() (float64, error), pha api.PhaseVoltages }{ Meter: base, - MeterEnergy: &decorateModbusMbmdMeterEnergyImpl{ + MeterEnergy: &decorateMbmdMeterEnergyImpl{ meterEnergy: meterEnergy, }, - PhaseCurrents: &decorateModbusMbmdPhaseCurrentsImpl{ + PhaseCurrents: &decorateMbmdPhaseCurrentsImpl{ phaseCurrents: phaseCurrents, }, - PhaseVoltages: &decorateModbusMbmdPhaseVoltagesImpl{ + PhaseVoltages: &decorateMbmdPhaseVoltagesImpl{ phaseVoltages: phaseVoltages, }, } - case battery == nil && meterEnergy == nil && phaseCurrents != nil && phasePowers != nil && phaseVoltages == nil: + case meterEnergy == nil && phaseCurrents != nil && phasePowers != nil && phaseVoltages == nil: return &struct { api.Meter api.PhaseCurrents api.PhasePowers }{ Meter: base, - PhaseCurrents: &decorateModbusMbmdPhaseCurrentsImpl{ + PhaseCurrents: &decorateMbmdPhaseCurrentsImpl{ phaseCurrents: phaseCurrents, }, - PhasePowers: &decorateModbusMbmdPhasePowersImpl{ + PhasePowers: &decorateMbmdPhasePowersImpl{ phasePowers: phasePowers, }, } - case battery == nil && meterEnergy != nil && phaseCurrents != nil && phasePowers != nil && phaseVoltages == nil: + case meterEnergy != nil && phaseCurrents != nil && phasePowers != nil && phaseVoltages == nil: return &struct { api.Meter api.MeterEnergy @@ -131,18 +131,18 @@ func decorateModbusMbmd(base api.Meter, meterEnergy func() (float64, error), pha api.PhasePowers }{ Meter: base, - MeterEnergy: &decorateModbusMbmdMeterEnergyImpl{ + MeterEnergy: &decorateMbmdMeterEnergyImpl{ meterEnergy: meterEnergy, }, - PhaseCurrents: &decorateModbusMbmdPhaseCurrentsImpl{ + PhaseCurrents: &decorateMbmdPhaseCurrentsImpl{ phaseCurrents: phaseCurrents, }, - PhasePowers: &decorateModbusMbmdPhasePowersImpl{ + PhasePowers: &decorateMbmdPhasePowersImpl{ phasePowers: phasePowers, }, } - case battery == nil && meterEnergy == nil && phaseCurrents != nil && phasePowers != nil && phaseVoltages != nil: + case meterEnergy == nil && phaseCurrents != nil && phasePowers != nil && phaseVoltages != nil: return &struct { api.Meter api.PhaseCurrents @@ -150,18 +150,18 @@ func decorateModbusMbmd(base api.Meter, meterEnergy func() (float64, error), pha api.PhaseVoltages }{ Meter: base, - PhaseCurrents: &decorateModbusMbmdPhaseCurrentsImpl{ + PhaseCurrents: &decorateMbmdPhaseCurrentsImpl{ phaseCurrents: phaseCurrents, }, - PhasePowers: &decorateModbusMbmdPhasePowersImpl{ + PhasePowers: &decorateMbmdPhasePowersImpl{ phasePowers: phasePowers, }, - PhaseVoltages: &decorateModbusMbmdPhaseVoltagesImpl{ + PhaseVoltages: &decorateMbmdPhaseVoltagesImpl{ phaseVoltages: phaseVoltages, }, } - case battery == nil && meterEnergy != nil && phaseCurrents != nil && phasePowers != nil && phaseVoltages != nil: + case meterEnergy != nil && phaseCurrents != nil && phasePowers != nil && phaseVoltages != nil: return &struct { api.Meter api.MeterEnergy @@ -170,520 +170,16 @@ func decorateModbusMbmd(base api.Meter, meterEnergy func() (float64, error), pha api.PhaseVoltages }{ Meter: base, - MeterEnergy: &decorateModbusMbmdMeterEnergyImpl{ + MeterEnergy: &decorateMbmdMeterEnergyImpl{ meterEnergy: meterEnergy, }, - PhaseCurrents: &decorateModbusMbmdPhaseCurrentsImpl{ + PhaseCurrents: &decorateMbmdPhaseCurrentsImpl{ phaseCurrents: phaseCurrents, }, - PhasePowers: &decorateModbusMbmdPhasePowersImpl{ + PhasePowers: &decorateMbmdPhasePowersImpl{ phasePowers: phasePowers, }, - PhaseVoltages: &decorateModbusMbmdPhaseVoltagesImpl{ - phaseVoltages: phaseVoltages, - }, - } - - case battery != nil && batteryCapacity == nil && meterEnergy == nil && phaseCurrents == nil && phaseVoltages == nil: - return &struct { - api.Meter - api.Battery - }{ - Meter: base, - Battery: &decorateModbusMbmdBatteryImpl{ - battery: battery, - }, - } - - case battery != nil && batteryCapacity == nil && meterEnergy != nil && phaseCurrents == nil && phaseVoltages == nil: - return &struct { - api.Meter - api.Battery - api.MeterEnergy - }{ - Meter: base, - Battery: &decorateModbusMbmdBatteryImpl{ - battery: battery, - }, - MeterEnergy: &decorateModbusMbmdMeterEnergyImpl{ - meterEnergy: meterEnergy, - }, - } - - case battery != nil && batteryCapacity == nil && meterEnergy == nil && phaseCurrents != nil && phasePowers == nil && phaseVoltages == nil: - return &struct { - api.Meter - api.Battery - api.PhaseCurrents - }{ - Meter: base, - Battery: &decorateModbusMbmdBatteryImpl{ - battery: battery, - }, - PhaseCurrents: &decorateModbusMbmdPhaseCurrentsImpl{ - phaseCurrents: phaseCurrents, - }, - } - - case battery != nil && batteryCapacity == nil && meterEnergy != nil && phaseCurrents != nil && phasePowers == nil && phaseVoltages == nil: - return &struct { - api.Meter - api.Battery - api.MeterEnergy - api.PhaseCurrents - }{ - Meter: base, - Battery: &decorateModbusMbmdBatteryImpl{ - battery: battery, - }, - MeterEnergy: &decorateModbusMbmdMeterEnergyImpl{ - meterEnergy: meterEnergy, - }, - PhaseCurrents: &decorateModbusMbmdPhaseCurrentsImpl{ - phaseCurrents: phaseCurrents, - }, - } - - case battery != nil && batteryCapacity == nil && meterEnergy == nil && phaseCurrents == nil && phaseVoltages != nil: - return &struct { - api.Meter - api.Battery - api.PhaseVoltages - }{ - Meter: base, - Battery: &decorateModbusMbmdBatteryImpl{ - battery: battery, - }, - PhaseVoltages: &decorateModbusMbmdPhaseVoltagesImpl{ - phaseVoltages: phaseVoltages, - }, - } - - case battery != nil && batteryCapacity == nil && meterEnergy != nil && phaseCurrents == nil && phaseVoltages != nil: - return &struct { - api.Meter - api.Battery - api.MeterEnergy - api.PhaseVoltages - }{ - Meter: base, - Battery: &decorateModbusMbmdBatteryImpl{ - battery: battery, - }, - MeterEnergy: &decorateModbusMbmdMeterEnergyImpl{ - meterEnergy: meterEnergy, - }, - PhaseVoltages: &decorateModbusMbmdPhaseVoltagesImpl{ - phaseVoltages: phaseVoltages, - }, - } - - case battery != nil && batteryCapacity == nil && meterEnergy == nil && phaseCurrents != nil && phasePowers == nil && phaseVoltages != nil: - return &struct { - api.Meter - api.Battery - api.PhaseCurrents - api.PhaseVoltages - }{ - Meter: base, - Battery: &decorateModbusMbmdBatteryImpl{ - battery: battery, - }, - PhaseCurrents: &decorateModbusMbmdPhaseCurrentsImpl{ - phaseCurrents: phaseCurrents, - }, - PhaseVoltages: &decorateModbusMbmdPhaseVoltagesImpl{ - phaseVoltages: phaseVoltages, - }, - } - - case battery != nil && batteryCapacity == nil && meterEnergy != nil && phaseCurrents != nil && phasePowers == nil && phaseVoltages != nil: - return &struct { - api.Meter - api.Battery - api.MeterEnergy - api.PhaseCurrents - api.PhaseVoltages - }{ - Meter: base, - Battery: &decorateModbusMbmdBatteryImpl{ - battery: battery, - }, - MeterEnergy: &decorateModbusMbmdMeterEnergyImpl{ - meterEnergy: meterEnergy, - }, - PhaseCurrents: &decorateModbusMbmdPhaseCurrentsImpl{ - phaseCurrents: phaseCurrents, - }, - PhaseVoltages: &decorateModbusMbmdPhaseVoltagesImpl{ - phaseVoltages: phaseVoltages, - }, - } - - case battery != nil && batteryCapacity == nil && meterEnergy == nil && phaseCurrents != nil && phasePowers != nil && phaseVoltages == nil: - return &struct { - api.Meter - api.Battery - api.PhaseCurrents - api.PhasePowers - }{ - Meter: base, - Battery: &decorateModbusMbmdBatteryImpl{ - battery: battery, - }, - PhaseCurrents: &decorateModbusMbmdPhaseCurrentsImpl{ - phaseCurrents: phaseCurrents, - }, - PhasePowers: &decorateModbusMbmdPhasePowersImpl{ - phasePowers: phasePowers, - }, - } - - case battery != nil && batteryCapacity == nil && meterEnergy != nil && phaseCurrents != nil && phasePowers != nil && phaseVoltages == nil: - return &struct { - api.Meter - api.Battery - api.MeterEnergy - api.PhaseCurrents - api.PhasePowers - }{ - Meter: base, - Battery: &decorateModbusMbmdBatteryImpl{ - battery: battery, - }, - MeterEnergy: &decorateModbusMbmdMeterEnergyImpl{ - meterEnergy: meterEnergy, - }, - PhaseCurrents: &decorateModbusMbmdPhaseCurrentsImpl{ - phaseCurrents: phaseCurrents, - }, - PhasePowers: &decorateModbusMbmdPhasePowersImpl{ - phasePowers: phasePowers, - }, - } - - case battery != nil && batteryCapacity == nil && meterEnergy == nil && phaseCurrents != nil && phasePowers != nil && phaseVoltages != nil: - return &struct { - api.Meter - api.Battery - api.PhaseCurrents - api.PhasePowers - api.PhaseVoltages - }{ - Meter: base, - Battery: &decorateModbusMbmdBatteryImpl{ - battery: battery, - }, - PhaseCurrents: &decorateModbusMbmdPhaseCurrentsImpl{ - phaseCurrents: phaseCurrents, - }, - PhasePowers: &decorateModbusMbmdPhasePowersImpl{ - phasePowers: phasePowers, - }, - PhaseVoltages: &decorateModbusMbmdPhaseVoltagesImpl{ - phaseVoltages: phaseVoltages, - }, - } - - case battery != nil && batteryCapacity == nil && meterEnergy != nil && phaseCurrents != nil && phasePowers != nil && phaseVoltages != nil: - return &struct { - api.Meter - api.Battery - api.MeterEnergy - api.PhaseCurrents - api.PhasePowers - api.PhaseVoltages - }{ - Meter: base, - Battery: &decorateModbusMbmdBatteryImpl{ - battery: battery, - }, - MeterEnergy: &decorateModbusMbmdMeterEnergyImpl{ - meterEnergy: meterEnergy, - }, - PhaseCurrents: &decorateModbusMbmdPhaseCurrentsImpl{ - phaseCurrents: phaseCurrents, - }, - PhasePowers: &decorateModbusMbmdPhasePowersImpl{ - phasePowers: phasePowers, - }, - PhaseVoltages: &decorateModbusMbmdPhaseVoltagesImpl{ - phaseVoltages: phaseVoltages, - }, - } - - case battery != nil && batteryCapacity != nil && meterEnergy == nil && phaseCurrents == nil && phaseVoltages == nil: - return &struct { - api.Meter - api.Battery - api.BatteryCapacity - }{ - Meter: base, - Battery: &decorateModbusMbmdBatteryImpl{ - battery: battery, - }, - BatteryCapacity: &decorateModbusMbmdBatteryCapacityImpl{ - batteryCapacity: batteryCapacity, - }, - } - - case battery != nil && batteryCapacity != nil && meterEnergy != nil && phaseCurrents == nil && phaseVoltages == nil: - return &struct { - api.Meter - api.Battery - api.BatteryCapacity - api.MeterEnergy - }{ - Meter: base, - Battery: &decorateModbusMbmdBatteryImpl{ - battery: battery, - }, - BatteryCapacity: &decorateModbusMbmdBatteryCapacityImpl{ - batteryCapacity: batteryCapacity, - }, - MeterEnergy: &decorateModbusMbmdMeterEnergyImpl{ - meterEnergy: meterEnergy, - }, - } - - case battery != nil && batteryCapacity != nil && meterEnergy == nil && phaseCurrents != nil && phasePowers == nil && phaseVoltages == nil: - return &struct { - api.Meter - api.Battery - api.BatteryCapacity - api.PhaseCurrents - }{ - Meter: base, - Battery: &decorateModbusMbmdBatteryImpl{ - battery: battery, - }, - BatteryCapacity: &decorateModbusMbmdBatteryCapacityImpl{ - batteryCapacity: batteryCapacity, - }, - PhaseCurrents: &decorateModbusMbmdPhaseCurrentsImpl{ - phaseCurrents: phaseCurrents, - }, - } - - case battery != nil && batteryCapacity != nil && meterEnergy != nil && phaseCurrents != nil && phasePowers == nil && phaseVoltages == nil: - return &struct { - api.Meter - api.Battery - api.BatteryCapacity - api.MeterEnergy - api.PhaseCurrents - }{ - Meter: base, - Battery: &decorateModbusMbmdBatteryImpl{ - battery: battery, - }, - BatteryCapacity: &decorateModbusMbmdBatteryCapacityImpl{ - batteryCapacity: batteryCapacity, - }, - MeterEnergy: &decorateModbusMbmdMeterEnergyImpl{ - meterEnergy: meterEnergy, - }, - PhaseCurrents: &decorateModbusMbmdPhaseCurrentsImpl{ - phaseCurrents: phaseCurrents, - }, - } - - case battery != nil && batteryCapacity != nil && meterEnergy == nil && phaseCurrents == nil && phaseVoltages != nil: - return &struct { - api.Meter - api.Battery - api.BatteryCapacity - api.PhaseVoltages - }{ - Meter: base, - Battery: &decorateModbusMbmdBatteryImpl{ - battery: battery, - }, - BatteryCapacity: &decorateModbusMbmdBatteryCapacityImpl{ - batteryCapacity: batteryCapacity, - }, - PhaseVoltages: &decorateModbusMbmdPhaseVoltagesImpl{ - phaseVoltages: phaseVoltages, - }, - } - - case battery != nil && batteryCapacity != nil && meterEnergy != nil && phaseCurrents == nil && phaseVoltages != nil: - return &struct { - api.Meter - api.Battery - api.BatteryCapacity - api.MeterEnergy - api.PhaseVoltages - }{ - Meter: base, - Battery: &decorateModbusMbmdBatteryImpl{ - battery: battery, - }, - BatteryCapacity: &decorateModbusMbmdBatteryCapacityImpl{ - batteryCapacity: batteryCapacity, - }, - MeterEnergy: &decorateModbusMbmdMeterEnergyImpl{ - meterEnergy: meterEnergy, - }, - PhaseVoltages: &decorateModbusMbmdPhaseVoltagesImpl{ - phaseVoltages: phaseVoltages, - }, - } - - case battery != nil && batteryCapacity != nil && meterEnergy == nil && phaseCurrents != nil && phasePowers == nil && phaseVoltages != nil: - return &struct { - api.Meter - api.Battery - api.BatteryCapacity - api.PhaseCurrents - api.PhaseVoltages - }{ - Meter: base, - Battery: &decorateModbusMbmdBatteryImpl{ - battery: battery, - }, - BatteryCapacity: &decorateModbusMbmdBatteryCapacityImpl{ - batteryCapacity: batteryCapacity, - }, - PhaseCurrents: &decorateModbusMbmdPhaseCurrentsImpl{ - phaseCurrents: phaseCurrents, - }, - PhaseVoltages: &decorateModbusMbmdPhaseVoltagesImpl{ - phaseVoltages: phaseVoltages, - }, - } - - case battery != nil && batteryCapacity != nil && meterEnergy != nil && phaseCurrents != nil && phasePowers == nil && phaseVoltages != nil: - return &struct { - api.Meter - api.Battery - api.BatteryCapacity - api.MeterEnergy - api.PhaseCurrents - api.PhaseVoltages - }{ - Meter: base, - Battery: &decorateModbusMbmdBatteryImpl{ - battery: battery, - }, - BatteryCapacity: &decorateModbusMbmdBatteryCapacityImpl{ - batteryCapacity: batteryCapacity, - }, - MeterEnergy: &decorateModbusMbmdMeterEnergyImpl{ - meterEnergy: meterEnergy, - }, - PhaseCurrents: &decorateModbusMbmdPhaseCurrentsImpl{ - phaseCurrents: phaseCurrents, - }, - PhaseVoltages: &decorateModbusMbmdPhaseVoltagesImpl{ - phaseVoltages: phaseVoltages, - }, - } - - case battery != nil && batteryCapacity != nil && meterEnergy == nil && phaseCurrents != nil && phasePowers != nil && phaseVoltages == nil: - return &struct { - api.Meter - api.Battery - api.BatteryCapacity - api.PhaseCurrents - api.PhasePowers - }{ - Meter: base, - Battery: &decorateModbusMbmdBatteryImpl{ - battery: battery, - }, - BatteryCapacity: &decorateModbusMbmdBatteryCapacityImpl{ - batteryCapacity: batteryCapacity, - }, - PhaseCurrents: &decorateModbusMbmdPhaseCurrentsImpl{ - phaseCurrents: phaseCurrents, - }, - PhasePowers: &decorateModbusMbmdPhasePowersImpl{ - phasePowers: phasePowers, - }, - } - - case battery != nil && batteryCapacity != nil && meterEnergy != nil && phaseCurrents != nil && phasePowers != nil && phaseVoltages == nil: - return &struct { - api.Meter - api.Battery - api.BatteryCapacity - api.MeterEnergy - api.PhaseCurrents - api.PhasePowers - }{ - Meter: base, - Battery: &decorateModbusMbmdBatteryImpl{ - battery: battery, - }, - BatteryCapacity: &decorateModbusMbmdBatteryCapacityImpl{ - batteryCapacity: batteryCapacity, - }, - MeterEnergy: &decorateModbusMbmdMeterEnergyImpl{ - meterEnergy: meterEnergy, - }, - PhaseCurrents: &decorateModbusMbmdPhaseCurrentsImpl{ - phaseCurrents: phaseCurrents, - }, - PhasePowers: &decorateModbusMbmdPhasePowersImpl{ - phasePowers: phasePowers, - }, - } - - case battery != nil && batteryCapacity != nil && meterEnergy == nil && phaseCurrents != nil && phasePowers != nil && phaseVoltages != nil: - return &struct { - api.Meter - api.Battery - api.BatteryCapacity - api.PhaseCurrents - api.PhasePowers - api.PhaseVoltages - }{ - Meter: base, - Battery: &decorateModbusMbmdBatteryImpl{ - battery: battery, - }, - BatteryCapacity: &decorateModbusMbmdBatteryCapacityImpl{ - batteryCapacity: batteryCapacity, - }, - PhaseCurrents: &decorateModbusMbmdPhaseCurrentsImpl{ - phaseCurrents: phaseCurrents, - }, - PhasePowers: &decorateModbusMbmdPhasePowersImpl{ - phasePowers: phasePowers, - }, - PhaseVoltages: &decorateModbusMbmdPhaseVoltagesImpl{ - phaseVoltages: phaseVoltages, - }, - } - - case battery != nil && batteryCapacity != nil && meterEnergy != nil && phaseCurrents != nil && phasePowers != nil && phaseVoltages != nil: - return &struct { - api.Meter - api.Battery - api.BatteryCapacity - api.MeterEnergy - api.PhaseCurrents - api.PhasePowers - api.PhaseVoltages - }{ - Meter: base, - Battery: &decorateModbusMbmdBatteryImpl{ - battery: battery, - }, - BatteryCapacity: &decorateModbusMbmdBatteryCapacityImpl{ - batteryCapacity: batteryCapacity, - }, - MeterEnergy: &decorateModbusMbmdMeterEnergyImpl{ - meterEnergy: meterEnergy, - }, - PhaseCurrents: &decorateModbusMbmdPhaseCurrentsImpl{ - phaseCurrents: phaseCurrents, - }, - PhasePowers: &decorateModbusMbmdPhasePowersImpl{ - phasePowers: phasePowers, - }, - PhaseVoltages: &decorateModbusMbmdPhaseVoltagesImpl{ + PhaseVoltages: &decorateMbmdPhaseVoltagesImpl{ phaseVoltages: phaseVoltages, }, } @@ -692,50 +188,398 @@ func decorateModbusMbmd(base api.Meter, meterEnergy func() (float64, error), pha return nil } -type decorateModbusMbmdBatteryImpl struct { - battery func() (float64, error) -} - -func (impl *decorateModbusMbmdBatteryImpl) Soc() (float64, error) { - return impl.battery() -} - -type decorateModbusMbmdBatteryCapacityImpl struct { - batteryCapacity func() float64 -} - -func (impl *decorateModbusMbmdBatteryCapacityImpl) Capacity() float64 { - return impl.batteryCapacity() -} - -type decorateModbusMbmdMeterEnergyImpl struct { +type decorateMbmdMeterEnergyImpl struct { meterEnergy func() (float64, error) } -func (impl *decorateModbusMbmdMeterEnergyImpl) TotalEnergy() (float64, error) { +func (impl *decorateMbmdMeterEnergyImpl) TotalEnergy() (float64, error) { return impl.meterEnergy() } -type decorateModbusMbmdPhaseCurrentsImpl struct { +type decorateMbmdPhaseCurrentsImpl struct { phaseCurrents func() (float64, float64, float64, error) } -func (impl *decorateModbusMbmdPhaseCurrentsImpl) Currents() (float64, float64, float64, error) { +func (impl *decorateMbmdPhaseCurrentsImpl) Currents() (float64, float64, float64, error) { return impl.phaseCurrents() } -type decorateModbusMbmdPhasePowersImpl struct { +type decorateMbmdPhasePowersImpl struct { phasePowers func() (float64, float64, float64, error) } -func (impl *decorateModbusMbmdPhasePowersImpl) Powers() (float64, float64, float64, error) { +func (impl *decorateMbmdPhasePowersImpl) Powers() (float64, float64, float64, error) { return impl.phasePowers() } -type decorateModbusMbmdPhaseVoltagesImpl struct { +type decorateMbmdPhaseVoltagesImpl struct { phaseVoltages func() (float64, float64, float64, error) } -func (impl *decorateModbusMbmdPhaseVoltagesImpl) Voltages() (float64, float64, float64, error) { +func (impl *decorateMbmdPhaseVoltagesImpl) Voltages() (float64, float64, float64, error) { return impl.phaseVoltages() } + +func decorateMbmdBattery(base api.Meter, meterEnergy func() (float64, error), battery func() (float64, error), batteryCapacity func() float64, batterySocLimiter func() (float64, float64), batteryPowerLimiter func() (float64, float64)) api.Meter { + switch { + case battery == nil && meterEnergy == nil: + return base + + case battery == nil && meterEnergy != nil: + return &struct { + api.Meter + api.MeterEnergy + }{ + Meter: base, + MeterEnergy: &decorateMbmdBatteryMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + } + + case battery != nil && batteryCapacity == nil && batteryPowerLimiter == nil && batterySocLimiter == nil && meterEnergy == nil: + return &struct { + api.Meter + api.Battery + }{ + Meter: base, + Battery: &decorateMbmdBatteryBatteryImpl{ + battery: battery, + }, + } + + case battery != nil && batteryCapacity == nil && batteryPowerLimiter == nil && batterySocLimiter == nil && meterEnergy != nil: + return &struct { + api.Meter + api.Battery + api.MeterEnergy + }{ + Meter: base, + Battery: &decorateMbmdBatteryBatteryImpl{ + battery: battery, + }, + MeterEnergy: &decorateMbmdBatteryMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + } + + case battery != nil && batteryCapacity != nil && batteryPowerLimiter == nil && batterySocLimiter == nil && meterEnergy == nil: + return &struct { + api.Meter + api.Battery + api.BatteryCapacity + }{ + Meter: base, + Battery: &decorateMbmdBatteryBatteryImpl{ + battery: battery, + }, + BatteryCapacity: &decorateMbmdBatteryBatteryCapacityImpl{ + batteryCapacity: batteryCapacity, + }, + } + + case battery != nil && batteryCapacity != nil && batteryPowerLimiter == nil && batterySocLimiter == nil && meterEnergy != nil: + return &struct { + api.Meter + api.Battery + api.BatteryCapacity + api.MeterEnergy + }{ + Meter: base, + Battery: &decorateMbmdBatteryBatteryImpl{ + battery: battery, + }, + BatteryCapacity: &decorateMbmdBatteryBatteryCapacityImpl{ + batteryCapacity: batteryCapacity, + }, + MeterEnergy: &decorateMbmdBatteryMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + } + + case battery != nil && batteryCapacity == nil && batteryPowerLimiter == nil && batterySocLimiter != nil && meterEnergy == nil: + return &struct { + api.Meter + api.Battery + api.BatterySocLimiter + }{ + Meter: base, + Battery: &decorateMbmdBatteryBatteryImpl{ + battery: battery, + }, + BatterySocLimiter: &decorateMbmdBatteryBatterySocLimiterImpl{ + batterySocLimiter: batterySocLimiter, + }, + } + + case battery != nil && batteryCapacity == nil && batteryPowerLimiter == nil && batterySocLimiter != nil && meterEnergy != nil: + return &struct { + api.Meter + api.Battery + api.BatterySocLimiter + api.MeterEnergy + }{ + Meter: base, + Battery: &decorateMbmdBatteryBatteryImpl{ + battery: battery, + }, + BatterySocLimiter: &decorateMbmdBatteryBatterySocLimiterImpl{ + batterySocLimiter: batterySocLimiter, + }, + MeterEnergy: &decorateMbmdBatteryMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + } + + case battery != nil && batteryCapacity != nil && batteryPowerLimiter == nil && batterySocLimiter != nil && meterEnergy == nil: + return &struct { + api.Meter + api.Battery + api.BatteryCapacity + api.BatterySocLimiter + }{ + Meter: base, + Battery: &decorateMbmdBatteryBatteryImpl{ + battery: battery, + }, + BatteryCapacity: &decorateMbmdBatteryBatteryCapacityImpl{ + batteryCapacity: batteryCapacity, + }, + BatterySocLimiter: &decorateMbmdBatteryBatterySocLimiterImpl{ + batterySocLimiter: batterySocLimiter, + }, + } + + case battery != nil && batteryCapacity != nil && batteryPowerLimiter == nil && batterySocLimiter != nil && meterEnergy != nil: + return &struct { + api.Meter + api.Battery + api.BatteryCapacity + api.BatterySocLimiter + api.MeterEnergy + }{ + Meter: base, + Battery: &decorateMbmdBatteryBatteryImpl{ + battery: battery, + }, + BatteryCapacity: &decorateMbmdBatteryBatteryCapacityImpl{ + batteryCapacity: batteryCapacity, + }, + BatterySocLimiter: &decorateMbmdBatteryBatterySocLimiterImpl{ + batterySocLimiter: batterySocLimiter, + }, + MeterEnergy: &decorateMbmdBatteryMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + } + + case battery != nil && batteryCapacity == nil && batteryPowerLimiter != nil && batterySocLimiter == nil && meterEnergy == nil: + return &struct { + api.Meter + api.Battery + api.BatteryPowerLimiter + }{ + Meter: base, + Battery: &decorateMbmdBatteryBatteryImpl{ + battery: battery, + }, + BatteryPowerLimiter: &decorateMbmdBatteryBatteryPowerLimiterImpl{ + batteryPowerLimiter: batteryPowerLimiter, + }, + } + + case battery != nil && batteryCapacity == nil && batteryPowerLimiter != nil && batterySocLimiter == nil && meterEnergy != nil: + return &struct { + api.Meter + api.Battery + api.BatteryPowerLimiter + api.MeterEnergy + }{ + Meter: base, + Battery: &decorateMbmdBatteryBatteryImpl{ + battery: battery, + }, + BatteryPowerLimiter: &decorateMbmdBatteryBatteryPowerLimiterImpl{ + batteryPowerLimiter: batteryPowerLimiter, + }, + MeterEnergy: &decorateMbmdBatteryMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + } + + case battery != nil && batteryCapacity != nil && batteryPowerLimiter != nil && batterySocLimiter == nil && meterEnergy == nil: + return &struct { + api.Meter + api.Battery + api.BatteryCapacity + api.BatteryPowerLimiter + }{ + Meter: base, + Battery: &decorateMbmdBatteryBatteryImpl{ + battery: battery, + }, + BatteryCapacity: &decorateMbmdBatteryBatteryCapacityImpl{ + batteryCapacity: batteryCapacity, + }, + BatteryPowerLimiter: &decorateMbmdBatteryBatteryPowerLimiterImpl{ + batteryPowerLimiter: batteryPowerLimiter, + }, + } + + case battery != nil && batteryCapacity != nil && batteryPowerLimiter != nil && batterySocLimiter == nil && meterEnergy != nil: + return &struct { + api.Meter + api.Battery + api.BatteryCapacity + api.BatteryPowerLimiter + api.MeterEnergy + }{ + Meter: base, + Battery: &decorateMbmdBatteryBatteryImpl{ + battery: battery, + }, + BatteryCapacity: &decorateMbmdBatteryBatteryCapacityImpl{ + batteryCapacity: batteryCapacity, + }, + BatteryPowerLimiter: &decorateMbmdBatteryBatteryPowerLimiterImpl{ + batteryPowerLimiter: batteryPowerLimiter, + }, + MeterEnergy: &decorateMbmdBatteryMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + } + + case battery != nil && batteryCapacity == nil && batteryPowerLimiter != nil && batterySocLimiter != nil && meterEnergy == nil: + return &struct { + api.Meter + api.Battery + api.BatteryPowerLimiter + api.BatterySocLimiter + }{ + Meter: base, + Battery: &decorateMbmdBatteryBatteryImpl{ + battery: battery, + }, + BatteryPowerLimiter: &decorateMbmdBatteryBatteryPowerLimiterImpl{ + batteryPowerLimiter: batteryPowerLimiter, + }, + BatterySocLimiter: &decorateMbmdBatteryBatterySocLimiterImpl{ + batterySocLimiter: batterySocLimiter, + }, + } + + case battery != nil && batteryCapacity == nil && batteryPowerLimiter != nil && batterySocLimiter != nil && meterEnergy != nil: + return &struct { + api.Meter + api.Battery + api.BatteryPowerLimiter + api.BatterySocLimiter + api.MeterEnergy + }{ + Meter: base, + Battery: &decorateMbmdBatteryBatteryImpl{ + battery: battery, + }, + BatteryPowerLimiter: &decorateMbmdBatteryBatteryPowerLimiterImpl{ + batteryPowerLimiter: batteryPowerLimiter, + }, + BatterySocLimiter: &decorateMbmdBatteryBatterySocLimiterImpl{ + batterySocLimiter: batterySocLimiter, + }, + MeterEnergy: &decorateMbmdBatteryMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + } + + case battery != nil && batteryCapacity != nil && batteryPowerLimiter != nil && batterySocLimiter != nil && meterEnergy == nil: + return &struct { + api.Meter + api.Battery + api.BatteryCapacity + api.BatteryPowerLimiter + api.BatterySocLimiter + }{ + Meter: base, + Battery: &decorateMbmdBatteryBatteryImpl{ + battery: battery, + }, + BatteryCapacity: &decorateMbmdBatteryBatteryCapacityImpl{ + batteryCapacity: batteryCapacity, + }, + BatteryPowerLimiter: &decorateMbmdBatteryBatteryPowerLimiterImpl{ + batteryPowerLimiter: batteryPowerLimiter, + }, + BatterySocLimiter: &decorateMbmdBatteryBatterySocLimiterImpl{ + batterySocLimiter: batterySocLimiter, + }, + } + + case battery != nil && batteryCapacity != nil && batteryPowerLimiter != nil && batterySocLimiter != nil && meterEnergy != nil: + return &struct { + api.Meter + api.Battery + api.BatteryCapacity + api.BatteryPowerLimiter + api.BatterySocLimiter + api.MeterEnergy + }{ + Meter: base, + Battery: &decorateMbmdBatteryBatteryImpl{ + battery: battery, + }, + BatteryCapacity: &decorateMbmdBatteryBatteryCapacityImpl{ + batteryCapacity: batteryCapacity, + }, + BatteryPowerLimiter: &decorateMbmdBatteryBatteryPowerLimiterImpl{ + batteryPowerLimiter: batteryPowerLimiter, + }, + BatterySocLimiter: &decorateMbmdBatteryBatterySocLimiterImpl{ + batterySocLimiter: batterySocLimiter, + }, + MeterEnergy: &decorateMbmdBatteryMeterEnergyImpl{ + meterEnergy: meterEnergy, + }, + } + } + + return nil +} + +type decorateMbmdBatteryBatteryImpl struct { + battery func() (float64, error) +} + +func (impl *decorateMbmdBatteryBatteryImpl) Soc() (float64, error) { + return impl.battery() +} + +type decorateMbmdBatteryBatteryCapacityImpl struct { + batteryCapacity func() float64 +} + +func (impl *decorateMbmdBatteryBatteryCapacityImpl) Capacity() float64 { + return impl.batteryCapacity() +} + +type decorateMbmdBatteryBatteryPowerLimiterImpl struct { + batteryPowerLimiter func() (float64, float64) +} + +func (impl *decorateMbmdBatteryBatteryPowerLimiterImpl) GetPowerLimits() (float64, float64) { + return impl.batteryPowerLimiter() +} + +type decorateMbmdBatteryBatterySocLimiterImpl struct { + batterySocLimiter func() (float64, float64) +} + +func (impl *decorateMbmdBatteryBatterySocLimiterImpl) GetSocLimits() (float64, float64) { + return impl.batterySocLimiter() +} + +type decorateMbmdBatteryMeterEnergyImpl struct { + meterEnergy func() (float64, error) +} + +func (impl *decorateMbmdBatteryMeterEnergyImpl) TotalEnergy() (float64, error) { + return impl.meterEnergy() +} From 43de24b9e5846ce067cead5dcdad10091d4efb9a Mon Sep 17 00:00:00 2001 From: andig Date: Fri, 9 Jan 2026 09:25:04 +0100 Subject: [PATCH 2/2] wip --- meter/mbmd.go | 60 ++-- meter/mbmd_decorators.go | 585 --------------------------------------- 2 files changed, 21 insertions(+), 624 deletions(-) delete mode 100644 meter/mbmd_decorators.go diff --git a/meter/mbmd.go b/meter/mbmd.go index 0736db8b6..af24df778 100644 --- a/meter/mbmd.go +++ b/meter/mbmd.go @@ -15,38 +15,18 @@ import ( "github.com/volkszaehler/mbmd/meters/rs485" ) -// ModbusMbmd is an api.Meter implementation with configurable getters and setters. -type ModbusMbmd struct { +// Mbmd is an api.Meter implementation with configurable getters and setters. +type Mbmd struct { conn *modbus.Connection device *rs485.RS485 - powerG func() (float64, error) } func init() { - registry.AddCtx("mbmd", NewModbusMbmdFromConfig) + registry.AddCtx("mbmd", NewMbmdFromConfig) } -//go:generate go tool decorate - -//evcc:function decorateMbmd -//evcc:basetype api.Meter -//evcc:type api.MeterEnergy,TotalEnergy,func() (float64, error) -//evcc:type api.PhaseCurrents,Currents,func() (float64, float64, float64, error) -//evcc:type api.PhaseVoltages,Voltages,func() (float64, float64, float64, error) -//evcc:type api.PhasePowers,Powers,func() (float64, float64, float64, error) -// evcc:type api.MaxACPowerGetter,MaxACPower,func() float64 - -//evcc:function decorateMbmdBattery -//evcc:basetype api.Meter -//evcc:type api.MeterEnergy,TotalEnergy,func() (float64, error) -//evcc:type api.Battery,Soc,func() (float64, error) -//evcc:type api.BatteryCapacity,Capacity,func() float64 -//evcc:type api.BatterySocLimiter,GetSocLimits,func() (float64, float64) -//evcc:type api.BatteryPowerLimiter,GetPowerLimits,func() (float64, float64) -// evcc:type api.BatteryController,SetBatteryMode,func(api.BatteryMode) error - -// NewModbusMbmdFromConfig creates api.Meter from config -func NewModbusMbmdFromConfig(ctx context.Context, other map[string]any) (api.Meter, error) { +// NewMbmdFromConfig creates api.Meter from config +func NewMbmdFromConfig(ctx context.Context, other map[string]any) (api.Meter, error) { cc := struct { Model string batteryCapacity `mapstructure:",squash"` @@ -100,14 +80,14 @@ func NewModbusMbmdFromConfig(ctx context.Context, other map[string]any) (api.Met return nil, err } - m := &ModbusMbmd{ + mbmd := &Mbmd{ conn: conn, device: device, } ops := device.Producer().Produce() - m.powerG, err = m.deviceOp(ops, cc.Power) + powerG, err := mbmd.deviceOp(ops, cc.Power) if err != nil { return nil, fmt.Errorf("invalid measurement for power: %s", cc.Power) } @@ -115,7 +95,7 @@ func NewModbusMbmdFromConfig(ctx context.Context, other map[string]any) (api.Met // decorate energy var totalEnergy func() (float64, error) if cc.Energy != "" { - g, err := m.deviceOp(ops, cc.Energy) + g, err := mbmd.deviceOp(ops, cc.Energy) if err != nil { return nil, fmt.Errorf("invalid measurement for energy: %s", cc.Energy) } @@ -124,19 +104,19 @@ func NewModbusMbmdFromConfig(ctx context.Context, other map[string]any) (api.Met } // decorate currents - currentsG, err := m.buildPhaseProviders(ops, cc.Currents) + currentsG, err := mbmd.buildPhaseProviders(ops, cc.Currents) if err != nil { return nil, fmt.Errorf("currents: %w", err) } // decorate voltages - voltagesG, err := m.buildPhaseProviders(ops, cc.Voltages) + voltagesG, err := mbmd.buildPhaseProviders(ops, cc.Voltages) if err != nil { return nil, fmt.Errorf("voltages: %w", err) } // decorate powers - powersG, err := m.buildPhaseProviders(ops, cc.Powers) + powersG, err := mbmd.buildPhaseProviders(ops, cc.Powers) if err != nil { return nil, fmt.Errorf("powers: %w", err) } @@ -144,7 +124,7 @@ func NewModbusMbmdFromConfig(ctx context.Context, other map[string]any) (api.Met // decorate soc var soc func() (float64, error) if cc.Soc != "" { - g, err := m.deviceOp(ops, cc.Soc) + g, err := mbmd.deviceOp(ops, cc.Soc) if err != nil { return nil, fmt.Errorf("invalid measurement for soc: %s", cc.Soc) } @@ -152,15 +132,17 @@ func NewModbusMbmdFromConfig(ctx context.Context, other map[string]any) (api.Met soc = g } + m, _ := NewConfigurable(powerG) + if soc != nil { - return decorateMbmdBattery(m, totalEnergy, soc, cc.batteryCapacity.Decorator(), cc.batterySocLimits.Decorator(), cc.batteryPowerLimits.Decorator()), nil + return m.DecorateBattery(totalEnergy, soc, cc.batteryCapacity.Decorator(), cc.batterySocLimits.Decorator(), cc.batteryPowerLimits.Decorator(), nil), nil } - return decorateMbmd(m, totalEnergy, currentsG, voltagesG, powersG), nil + return m.Decorate(totalEnergy, currentsG, voltagesG, powersG, nil), nil } // deviceOp checks is RS485 device supports operation -func (m *ModbusMbmd) deviceOp(ops []rs485.Operation, name string) (func() (float64, error), error) { +func (m *Mbmd) deviceOp(ops []rs485.Operation, name string) (func() (float64, error), error) { // leading minus sign? name, invert := strings.CutPrefix(name, "-") @@ -192,7 +174,7 @@ func (m *ModbusMbmd) deviceOp(ops []rs485.Operation, name string) (func() (float return nil, fmt.Errorf("unsupported measurement: %s", measurement.String()) } -func (m *ModbusMbmd) buildPhaseProviders(ops []rs485.Operation, readings []string) (func() (float64, float64, float64, error), error) { +func (m *Mbmd) buildPhaseProviders(ops []rs485.Operation, readings []string) (func() (float64, float64, float64, error), error) { if len(readings) == 0 { return nil, nil } @@ -215,6 +197,6 @@ func (m *ModbusMbmd) buildPhaseProviders(ops []rs485.Operation, readings []strin } // CurrentPower implements the api.Meter interface -func (m *ModbusMbmd) CurrentPower() (float64, error) { - return m.powerG() -} +// func (m *Mbmd) CurrentPower() (float64, error) { +// return m.powerG() +// } diff --git a/meter/mbmd_decorators.go b/meter/mbmd_decorators.go deleted file mode 100644 index 271d2eb56..000000000 --- a/meter/mbmd_decorators.go +++ /dev/null @@ -1,585 +0,0 @@ -package meter - -// Code generated by github.com/evcc-io/evcc/cmd/tools/decorate.go. DO NOT EDIT. - -import ( - "github.com/evcc-io/evcc/api" -) - -func decorateMbmd(base api.Meter, meterEnergy func() (float64, error), phaseCurrents func() (float64, float64, float64, error), phaseVoltages func() (float64, float64, float64, error), phasePowers func() (float64, float64, float64, error)) api.Meter { - switch { - case meterEnergy == nil && phaseCurrents == nil && phaseVoltages == nil: - return base - - case meterEnergy != nil && phaseCurrents == nil && phaseVoltages == nil: - return &struct { - api.Meter - api.MeterEnergy - }{ - Meter: base, - MeterEnergy: &decorateMbmdMeterEnergyImpl{ - meterEnergy: meterEnergy, - }, - } - - case meterEnergy == nil && phaseCurrents != nil && phasePowers == nil && phaseVoltages == nil: - return &struct { - api.Meter - api.PhaseCurrents - }{ - Meter: base, - PhaseCurrents: &decorateMbmdPhaseCurrentsImpl{ - phaseCurrents: phaseCurrents, - }, - } - - case meterEnergy != nil && phaseCurrents != nil && phasePowers == nil && phaseVoltages == nil: - return &struct { - api.Meter - api.MeterEnergy - api.PhaseCurrents - }{ - Meter: base, - MeterEnergy: &decorateMbmdMeterEnergyImpl{ - meterEnergy: meterEnergy, - }, - PhaseCurrents: &decorateMbmdPhaseCurrentsImpl{ - phaseCurrents: phaseCurrents, - }, - } - - case meterEnergy == nil && phaseCurrents == nil && phaseVoltages != nil: - return &struct { - api.Meter - api.PhaseVoltages - }{ - Meter: base, - PhaseVoltages: &decorateMbmdPhaseVoltagesImpl{ - phaseVoltages: phaseVoltages, - }, - } - - case meterEnergy != nil && phaseCurrents == nil && phaseVoltages != nil: - return &struct { - api.Meter - api.MeterEnergy - api.PhaseVoltages - }{ - Meter: base, - MeterEnergy: &decorateMbmdMeterEnergyImpl{ - meterEnergy: meterEnergy, - }, - PhaseVoltages: &decorateMbmdPhaseVoltagesImpl{ - phaseVoltages: phaseVoltages, - }, - } - - case meterEnergy == nil && phaseCurrents != nil && phasePowers == nil && phaseVoltages != nil: - return &struct { - api.Meter - api.PhaseCurrents - api.PhaseVoltages - }{ - Meter: base, - PhaseCurrents: &decorateMbmdPhaseCurrentsImpl{ - phaseCurrents: phaseCurrents, - }, - PhaseVoltages: &decorateMbmdPhaseVoltagesImpl{ - phaseVoltages: phaseVoltages, - }, - } - - case meterEnergy != nil && phaseCurrents != nil && phasePowers == nil && phaseVoltages != nil: - return &struct { - api.Meter - api.MeterEnergy - api.PhaseCurrents - api.PhaseVoltages - }{ - Meter: base, - MeterEnergy: &decorateMbmdMeterEnergyImpl{ - meterEnergy: meterEnergy, - }, - PhaseCurrents: &decorateMbmdPhaseCurrentsImpl{ - phaseCurrents: phaseCurrents, - }, - PhaseVoltages: &decorateMbmdPhaseVoltagesImpl{ - phaseVoltages: phaseVoltages, - }, - } - - case meterEnergy == nil && phaseCurrents != nil && phasePowers != nil && phaseVoltages == nil: - return &struct { - api.Meter - api.PhaseCurrents - api.PhasePowers - }{ - Meter: base, - PhaseCurrents: &decorateMbmdPhaseCurrentsImpl{ - phaseCurrents: phaseCurrents, - }, - PhasePowers: &decorateMbmdPhasePowersImpl{ - phasePowers: phasePowers, - }, - } - - case meterEnergy != nil && phaseCurrents != nil && phasePowers != nil && phaseVoltages == nil: - return &struct { - api.Meter - api.MeterEnergy - api.PhaseCurrents - api.PhasePowers - }{ - Meter: base, - MeterEnergy: &decorateMbmdMeterEnergyImpl{ - meterEnergy: meterEnergy, - }, - PhaseCurrents: &decorateMbmdPhaseCurrentsImpl{ - phaseCurrents: phaseCurrents, - }, - PhasePowers: &decorateMbmdPhasePowersImpl{ - phasePowers: phasePowers, - }, - } - - case meterEnergy == nil && phaseCurrents != nil && phasePowers != nil && phaseVoltages != nil: - return &struct { - api.Meter - api.PhaseCurrents - api.PhasePowers - api.PhaseVoltages - }{ - Meter: base, - PhaseCurrents: &decorateMbmdPhaseCurrentsImpl{ - phaseCurrents: phaseCurrents, - }, - PhasePowers: &decorateMbmdPhasePowersImpl{ - phasePowers: phasePowers, - }, - PhaseVoltages: &decorateMbmdPhaseVoltagesImpl{ - phaseVoltages: phaseVoltages, - }, - } - - case meterEnergy != nil && phaseCurrents != nil && phasePowers != nil && phaseVoltages != nil: - return &struct { - api.Meter - api.MeterEnergy - api.PhaseCurrents - api.PhasePowers - api.PhaseVoltages - }{ - Meter: base, - MeterEnergy: &decorateMbmdMeterEnergyImpl{ - meterEnergy: meterEnergy, - }, - PhaseCurrents: &decorateMbmdPhaseCurrentsImpl{ - phaseCurrents: phaseCurrents, - }, - PhasePowers: &decorateMbmdPhasePowersImpl{ - phasePowers: phasePowers, - }, - PhaseVoltages: &decorateMbmdPhaseVoltagesImpl{ - phaseVoltages: phaseVoltages, - }, - } - } - - return nil -} - -type decorateMbmdMeterEnergyImpl struct { - meterEnergy func() (float64, error) -} - -func (impl *decorateMbmdMeterEnergyImpl) TotalEnergy() (float64, error) { - return impl.meterEnergy() -} - -type decorateMbmdPhaseCurrentsImpl struct { - phaseCurrents func() (float64, float64, float64, error) -} - -func (impl *decorateMbmdPhaseCurrentsImpl) Currents() (float64, float64, float64, error) { - return impl.phaseCurrents() -} - -type decorateMbmdPhasePowersImpl struct { - phasePowers func() (float64, float64, float64, error) -} - -func (impl *decorateMbmdPhasePowersImpl) Powers() (float64, float64, float64, error) { - return impl.phasePowers() -} - -type decorateMbmdPhaseVoltagesImpl struct { - phaseVoltages func() (float64, float64, float64, error) -} - -func (impl *decorateMbmdPhaseVoltagesImpl) Voltages() (float64, float64, float64, error) { - return impl.phaseVoltages() -} - -func decorateMbmdBattery(base api.Meter, meterEnergy func() (float64, error), battery func() (float64, error), batteryCapacity func() float64, batterySocLimiter func() (float64, float64), batteryPowerLimiter func() (float64, float64)) api.Meter { - switch { - case battery == nil && meterEnergy == nil: - return base - - case battery == nil && meterEnergy != nil: - return &struct { - api.Meter - api.MeterEnergy - }{ - Meter: base, - MeterEnergy: &decorateMbmdBatteryMeterEnergyImpl{ - meterEnergy: meterEnergy, - }, - } - - case battery != nil && batteryCapacity == nil && batteryPowerLimiter == nil && batterySocLimiter == nil && meterEnergy == nil: - return &struct { - api.Meter - api.Battery - }{ - Meter: base, - Battery: &decorateMbmdBatteryBatteryImpl{ - battery: battery, - }, - } - - case battery != nil && batteryCapacity == nil && batteryPowerLimiter == nil && batterySocLimiter == nil && meterEnergy != nil: - return &struct { - api.Meter - api.Battery - api.MeterEnergy - }{ - Meter: base, - Battery: &decorateMbmdBatteryBatteryImpl{ - battery: battery, - }, - MeterEnergy: &decorateMbmdBatteryMeterEnergyImpl{ - meterEnergy: meterEnergy, - }, - } - - case battery != nil && batteryCapacity != nil && batteryPowerLimiter == nil && batterySocLimiter == nil && meterEnergy == nil: - return &struct { - api.Meter - api.Battery - api.BatteryCapacity - }{ - Meter: base, - Battery: &decorateMbmdBatteryBatteryImpl{ - battery: battery, - }, - BatteryCapacity: &decorateMbmdBatteryBatteryCapacityImpl{ - batteryCapacity: batteryCapacity, - }, - } - - case battery != nil && batteryCapacity != nil && batteryPowerLimiter == nil && batterySocLimiter == nil && meterEnergy != nil: - return &struct { - api.Meter - api.Battery - api.BatteryCapacity - api.MeterEnergy - }{ - Meter: base, - Battery: &decorateMbmdBatteryBatteryImpl{ - battery: battery, - }, - BatteryCapacity: &decorateMbmdBatteryBatteryCapacityImpl{ - batteryCapacity: batteryCapacity, - }, - MeterEnergy: &decorateMbmdBatteryMeterEnergyImpl{ - meterEnergy: meterEnergy, - }, - } - - case battery != nil && batteryCapacity == nil && batteryPowerLimiter == nil && batterySocLimiter != nil && meterEnergy == nil: - return &struct { - api.Meter - api.Battery - api.BatterySocLimiter - }{ - Meter: base, - Battery: &decorateMbmdBatteryBatteryImpl{ - battery: battery, - }, - BatterySocLimiter: &decorateMbmdBatteryBatterySocLimiterImpl{ - batterySocLimiter: batterySocLimiter, - }, - } - - case battery != nil && batteryCapacity == nil && batteryPowerLimiter == nil && batterySocLimiter != nil && meterEnergy != nil: - return &struct { - api.Meter - api.Battery - api.BatterySocLimiter - api.MeterEnergy - }{ - Meter: base, - Battery: &decorateMbmdBatteryBatteryImpl{ - battery: battery, - }, - BatterySocLimiter: &decorateMbmdBatteryBatterySocLimiterImpl{ - batterySocLimiter: batterySocLimiter, - }, - MeterEnergy: &decorateMbmdBatteryMeterEnergyImpl{ - meterEnergy: meterEnergy, - }, - } - - case battery != nil && batteryCapacity != nil && batteryPowerLimiter == nil && batterySocLimiter != nil && meterEnergy == nil: - return &struct { - api.Meter - api.Battery - api.BatteryCapacity - api.BatterySocLimiter - }{ - Meter: base, - Battery: &decorateMbmdBatteryBatteryImpl{ - battery: battery, - }, - BatteryCapacity: &decorateMbmdBatteryBatteryCapacityImpl{ - batteryCapacity: batteryCapacity, - }, - BatterySocLimiter: &decorateMbmdBatteryBatterySocLimiterImpl{ - batterySocLimiter: batterySocLimiter, - }, - } - - case battery != nil && batteryCapacity != nil && batteryPowerLimiter == nil && batterySocLimiter != nil && meterEnergy != nil: - return &struct { - api.Meter - api.Battery - api.BatteryCapacity - api.BatterySocLimiter - api.MeterEnergy - }{ - Meter: base, - Battery: &decorateMbmdBatteryBatteryImpl{ - battery: battery, - }, - BatteryCapacity: &decorateMbmdBatteryBatteryCapacityImpl{ - batteryCapacity: batteryCapacity, - }, - BatterySocLimiter: &decorateMbmdBatteryBatterySocLimiterImpl{ - batterySocLimiter: batterySocLimiter, - }, - MeterEnergy: &decorateMbmdBatteryMeterEnergyImpl{ - meterEnergy: meterEnergy, - }, - } - - case battery != nil && batteryCapacity == nil && batteryPowerLimiter != nil && batterySocLimiter == nil && meterEnergy == nil: - return &struct { - api.Meter - api.Battery - api.BatteryPowerLimiter - }{ - Meter: base, - Battery: &decorateMbmdBatteryBatteryImpl{ - battery: battery, - }, - BatteryPowerLimiter: &decorateMbmdBatteryBatteryPowerLimiterImpl{ - batteryPowerLimiter: batteryPowerLimiter, - }, - } - - case battery != nil && batteryCapacity == nil && batteryPowerLimiter != nil && batterySocLimiter == nil && meterEnergy != nil: - return &struct { - api.Meter - api.Battery - api.BatteryPowerLimiter - api.MeterEnergy - }{ - Meter: base, - Battery: &decorateMbmdBatteryBatteryImpl{ - battery: battery, - }, - BatteryPowerLimiter: &decorateMbmdBatteryBatteryPowerLimiterImpl{ - batteryPowerLimiter: batteryPowerLimiter, - }, - MeterEnergy: &decorateMbmdBatteryMeterEnergyImpl{ - meterEnergy: meterEnergy, - }, - } - - case battery != nil && batteryCapacity != nil && batteryPowerLimiter != nil && batterySocLimiter == nil && meterEnergy == nil: - return &struct { - api.Meter - api.Battery - api.BatteryCapacity - api.BatteryPowerLimiter - }{ - Meter: base, - Battery: &decorateMbmdBatteryBatteryImpl{ - battery: battery, - }, - BatteryCapacity: &decorateMbmdBatteryBatteryCapacityImpl{ - batteryCapacity: batteryCapacity, - }, - BatteryPowerLimiter: &decorateMbmdBatteryBatteryPowerLimiterImpl{ - batteryPowerLimiter: batteryPowerLimiter, - }, - } - - case battery != nil && batteryCapacity != nil && batteryPowerLimiter != nil && batterySocLimiter == nil && meterEnergy != nil: - return &struct { - api.Meter - api.Battery - api.BatteryCapacity - api.BatteryPowerLimiter - api.MeterEnergy - }{ - Meter: base, - Battery: &decorateMbmdBatteryBatteryImpl{ - battery: battery, - }, - BatteryCapacity: &decorateMbmdBatteryBatteryCapacityImpl{ - batteryCapacity: batteryCapacity, - }, - BatteryPowerLimiter: &decorateMbmdBatteryBatteryPowerLimiterImpl{ - batteryPowerLimiter: batteryPowerLimiter, - }, - MeterEnergy: &decorateMbmdBatteryMeterEnergyImpl{ - meterEnergy: meterEnergy, - }, - } - - case battery != nil && batteryCapacity == nil && batteryPowerLimiter != nil && batterySocLimiter != nil && meterEnergy == nil: - return &struct { - api.Meter - api.Battery - api.BatteryPowerLimiter - api.BatterySocLimiter - }{ - Meter: base, - Battery: &decorateMbmdBatteryBatteryImpl{ - battery: battery, - }, - BatteryPowerLimiter: &decorateMbmdBatteryBatteryPowerLimiterImpl{ - batteryPowerLimiter: batteryPowerLimiter, - }, - BatterySocLimiter: &decorateMbmdBatteryBatterySocLimiterImpl{ - batterySocLimiter: batterySocLimiter, - }, - } - - case battery != nil && batteryCapacity == nil && batteryPowerLimiter != nil && batterySocLimiter != nil && meterEnergy != nil: - return &struct { - api.Meter - api.Battery - api.BatteryPowerLimiter - api.BatterySocLimiter - api.MeterEnergy - }{ - Meter: base, - Battery: &decorateMbmdBatteryBatteryImpl{ - battery: battery, - }, - BatteryPowerLimiter: &decorateMbmdBatteryBatteryPowerLimiterImpl{ - batteryPowerLimiter: batteryPowerLimiter, - }, - BatterySocLimiter: &decorateMbmdBatteryBatterySocLimiterImpl{ - batterySocLimiter: batterySocLimiter, - }, - MeterEnergy: &decorateMbmdBatteryMeterEnergyImpl{ - meterEnergy: meterEnergy, - }, - } - - case battery != nil && batteryCapacity != nil && batteryPowerLimiter != nil && batterySocLimiter != nil && meterEnergy == nil: - return &struct { - api.Meter - api.Battery - api.BatteryCapacity - api.BatteryPowerLimiter - api.BatterySocLimiter - }{ - Meter: base, - Battery: &decorateMbmdBatteryBatteryImpl{ - battery: battery, - }, - BatteryCapacity: &decorateMbmdBatteryBatteryCapacityImpl{ - batteryCapacity: batteryCapacity, - }, - BatteryPowerLimiter: &decorateMbmdBatteryBatteryPowerLimiterImpl{ - batteryPowerLimiter: batteryPowerLimiter, - }, - BatterySocLimiter: &decorateMbmdBatteryBatterySocLimiterImpl{ - batterySocLimiter: batterySocLimiter, - }, - } - - case battery != nil && batteryCapacity != nil && batteryPowerLimiter != nil && batterySocLimiter != nil && meterEnergy != nil: - return &struct { - api.Meter - api.Battery - api.BatteryCapacity - api.BatteryPowerLimiter - api.BatterySocLimiter - api.MeterEnergy - }{ - Meter: base, - Battery: &decorateMbmdBatteryBatteryImpl{ - battery: battery, - }, - BatteryCapacity: &decorateMbmdBatteryBatteryCapacityImpl{ - batteryCapacity: batteryCapacity, - }, - BatteryPowerLimiter: &decorateMbmdBatteryBatteryPowerLimiterImpl{ - batteryPowerLimiter: batteryPowerLimiter, - }, - BatterySocLimiter: &decorateMbmdBatteryBatterySocLimiterImpl{ - batterySocLimiter: batterySocLimiter, - }, - MeterEnergy: &decorateMbmdBatteryMeterEnergyImpl{ - meterEnergy: meterEnergy, - }, - } - } - - return nil -} - -type decorateMbmdBatteryBatteryImpl struct { - battery func() (float64, error) -} - -func (impl *decorateMbmdBatteryBatteryImpl) Soc() (float64, error) { - return impl.battery() -} - -type decorateMbmdBatteryBatteryCapacityImpl struct { - batteryCapacity func() float64 -} - -func (impl *decorateMbmdBatteryBatteryCapacityImpl) Capacity() float64 { - return impl.batteryCapacity() -} - -type decorateMbmdBatteryBatteryPowerLimiterImpl struct { - batteryPowerLimiter func() (float64, float64) -} - -func (impl *decorateMbmdBatteryBatteryPowerLimiterImpl) GetPowerLimits() (float64, float64) { - return impl.batteryPowerLimiter() -} - -type decorateMbmdBatteryBatterySocLimiterImpl struct { - batterySocLimiter func() (float64, float64) -} - -func (impl *decorateMbmdBatteryBatterySocLimiterImpl) GetSocLimits() (float64, float64) { - return impl.batterySocLimiter() -} - -type decorateMbmdBatteryMeterEnergyImpl struct { - meterEnergy func() (float64, error) -} - -func (impl *decorateMbmdBatteryMeterEnergyImpl) TotalEnergy() (float64, error) { - return impl.meterEnergy() -}