From 217a6ddd3f742c228277cd62560f9ca532cd3bab Mon Sep 17 00:00:00 2001 From: andig Date: Sun, 13 Jul 2025 16:35:56 +0200 Subject: [PATCH] chore: speedup mbmd setup --- meter/mbmd.go | 18 ++++++++++-------- meter/mbmd_operation.go | 4 +--- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/meter/mbmd.go b/meter/mbmd.go index 7d43587ce..848b27549 100644 --- a/meter/mbmd.go +++ b/meter/mbmd.go @@ -88,7 +88,9 @@ func NewModbusMbmdFromConfig(ctx context.Context, other map[string]interface{}) device: device, } - m.opPower, err = rs485FindDeviceOp(device, cc.Power) + ops := device.Producer().Produce() + + m.opPower, err = rs485FindDeviceOp(ops, cc.Power) if err != nil { return nil, fmt.Errorf("invalid measurement for power: %s", cc.Power) } @@ -96,7 +98,7 @@ func NewModbusMbmdFromConfig(ctx context.Context, other map[string]interface{}) // decorate energy var totalEnergy func() (float64, error) if cc.Energy != "" { - m.opEnergy, err = rs485FindDeviceOp(device, cc.Energy) + m.opEnergy, err = rs485FindDeviceOp(ops, cc.Energy) if err != nil { return nil, fmt.Errorf("invalid measurement for energy: %s", cc.Energy) } @@ -105,19 +107,19 @@ func NewModbusMbmdFromConfig(ctx context.Context, other map[string]interface{}) } // decorate currents - currentsG, err := m.buildPhaseProviders(cc.Currents) + currentsG, err := m.buildPhaseProviders(ops, cc.Currents) if err != nil { return nil, fmt.Errorf("currents: %w", err) } // decorate voltages - voltagesG, err := m.buildPhaseProviders(cc.Voltages) + voltagesG, err := m.buildPhaseProviders(ops, cc.Voltages) if err != nil { return nil, fmt.Errorf("voltages: %w", err) } // decorate powers - powersG, err := m.buildPhaseProviders(cc.Powers) + powersG, err := m.buildPhaseProviders(ops, cc.Powers) if err != nil { return nil, fmt.Errorf("powers: %w", err) } @@ -125,7 +127,7 @@ func NewModbusMbmdFromConfig(ctx context.Context, other map[string]interface{}) // decorate soc var soc func() (float64, error) if cc.Soc != "" { - m.opSoc, err = rs485FindDeviceOp(device, cc.Soc) + m.opSoc, err = rs485FindDeviceOp(ops, cc.Soc) if err != nil { return nil, fmt.Errorf("invalid measurement for soc: %s", cc.Soc) } @@ -136,7 +138,7 @@ func NewModbusMbmdFromConfig(ctx context.Context, other map[string]interface{}) return decorateModbusMbmd(m, totalEnergy, currentsG, voltagesG, powersG, soc, cc.batteryCapacity.Decorator()), nil } -func (m *ModbusMbmd) buildPhaseProviders(readings []string) (func() (float64, float64, float64, error), error) { +func (m *ModbusMbmd) buildPhaseProviders(ops []rs485.Operation, readings []string) (func() (float64, float64, float64, error), error) { if len(readings) == 0 { return nil, nil } @@ -147,7 +149,7 @@ func (m *ModbusMbmd) buildPhaseProviders(readings []string) (func() (float64, fl var phases [3]func() (float64, error) for idx, reading := range readings { - opCurrent, err := rs485FindDeviceOp(m.device, reading) + opCurrent, err := rs485FindDeviceOp(ops, reading) if err != nil { return nil, fmt.Errorf("invalid measurement [%d]: %s", idx, reading) } diff --git a/meter/mbmd_operation.go b/meter/mbmd_operation.go index b0099e5b2..b06f525f0 100644 --- a/meter/mbmd_operation.go +++ b/meter/mbmd_operation.go @@ -19,14 +19,12 @@ func isRS485(model string) bool { } // rs485FindDeviceOp checks is RS485 device supports operation -func rs485FindDeviceOp(device *rs485.RS485, name string) (op rs485.Operation, err error) { +func rs485FindDeviceOp(ops []rs485.Operation, name string) (op rs485.Operation, err error) { measurement, err := meters.MeasurementString(name) if err != nil { return rs485.Operation{}, fmt.Errorf("invalid measurement: %s", name) } - ops := device.Producer().Produce() - for _, op := range ops { if op.IEC61850 == measurement { return op, nil