diff --git a/meters/rs485/orno1p504.go b/meters/rs485/orno1p504.go index 57ed105f..b1ccd83d 100644 --- a/meters/rs485/orno1p504.go +++ b/meters/rs485/orno1p504.go @@ -6,26 +6,25 @@ func init() { Register("ORNO1P504", NewORNO1P504Producer) } -var ops1p504 Opcodes = Opcodes{ - - Frequency: 0x02, // 16 bit, Hz - Voltage: 0x00, // 16 bit, V - Current: 0x01, // 16 bit, A - Power: 0x03, // 16 bit, W - ReactivePower: 0x04, // 16 bit, var - ApparentPower: 0x05, // 16 bit, va - Cosphi: 0x06, // 16 bit, - - Sum: 0x07, //32 Bit, wh - ReactiveSum: 0x09, //32 Bit, varh -} - type ORNO1P504Producer struct { Opcodes } func NewORNO1P504Producer() Producer { - return &ORNO1P504Producer{Opcodes: ops1p504} + ops := Opcodes{ + Frequency: 0x02, // 16 bit, Hz + Voltage: 0x00, // 16 bit, V + Current: 0x01, // 16 bit, A + Power: 0x03, // 16 bit, W + ReactivePower: 0x04, // 16 bit, var + ApparentPower: 0x05, // 16 bit, va + Cosphi: 0x06, // 16 bit, + + Sum: 0x07, // 32 Bit, wh + ReactiveSum: 0x09, // 32 Bit, varh + } + + return &ORNO1P504Producer{Opcodes: ops} } // Description implements Producer interface diff --git a/meters/rs485/producer.go b/meters/rs485/producer.go index 1539ea2c..6c3845d9 100644 --- a/meters/rs485/producer.go +++ b/meters/rs485/producer.go @@ -2,6 +2,8 @@ package rs485 import ( "fmt" + "maps" + "slices" "github.com/volkszaehler/mbmd/meters" ) @@ -21,6 +23,9 @@ type Producer interface { // Type returns device description, typically static Description() string + // Measurements returns the defined device readings + Measurements() []meters.Measurement + // Produce creates a slice of possible device operations Produce() []Operation @@ -33,10 +38,14 @@ type Producer interface { type Opcodes map[meters.Measurement]uint16 // Opcode returns physical register for measurement type -func (o *Opcodes) Opcode(iec meters.Measurement) uint16 { - if opcode, ok := (*o)[iec]; ok { +func (o Opcodes) Opcode(iec meters.Measurement) uint16 { + if opcode, ok := (o)[iec]; ok { return opcode } panic(fmt.Sprintf("Undefined opcode for measurement %s", iec.String())) } + +func (o Opcodes) Measurements() []meters.Measurement { + return slices.Collect(maps.Keys(o)) +} diff --git a/meters/rs485/producer_test.go b/meters/rs485/producer_test.go new file mode 100644 index 00000000..aff3a678 --- /dev/null +++ b/meters/rs485/producer_test.go @@ -0,0 +1,14 @@ +package rs485 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestProducers(t *testing.T) { + for name, fun := range Producers { + p := fun() + assert.Equal(t, len(p.Measurements()), len(p.Produce()), name) + } +}