package rs485 import . "github.com/volkszaehler/mbmd/meters" func init() { Register("INEPRO", NewIneproProducer) } type IneproProducer struct { Opcodes } func NewIneproProducer() Producer { /*** * https://vallin.lv/wp-content/uploads/2017/10/PRO380-user-manual-V1-03.pdf */ ops := Opcodes{ VoltageL1: 0x2008, VoltageL2: 0x200C, VoltageL3: 0x2010, Frequency: 0x2020, CurrentL1: 0x2068, CurrentL2: 0x206C, CurrentL3: 0x2070, Power: 0x2080, PowerL1: 0x2088, PowerL2: 0x208C, PowerL3: 0x2090, ReactivePower: 0x20A0, ReactivePowerL1: 0x20A8, ReactivePowerL2: 0x20AC, ReactivePowerL3: 0x20B0, ApparentPower: 0x20C0, ApparentPowerL1: 0x20C8, ApparentPowerL2: 0x20CC, ApparentPowerL3: 0x20D0, Cosphi: 0x20E0, CosphiL1: 0x20E8, CosphiL2: 0x20EC, CosphiL3: 0x20F0, Sum: 0x3000, SumT1: 0x3100, SumT2: 0x3200, SumL1: 0x3008, SumL2: 0x300C, SumL3: 0x3010, Import: 0x3020, ImportT1: 0x3120, ImportT2: 0x3220, ImportL1: 0x3028, ImportL2: 0x302C, ImportL3: 0x3030, Export: 0x3040, ExportT1: 0x3140, ExportT2: 0x3240, ExportL1: 0x3048, ExportL2: 0x304C, ExportL3: 0x3050, ReactiveSum: 0x3060, ReactiveSumT1: 0x3160, ReactiveSumT2: 0x3260, ReactiveSumL1: 0x3068, ReactiveSumL2: 0x306C, ReactiveSumL3: 0x3070, ReactiveImport: 0x3080, ReactiveImportT1: 0x3180, ReactiveImportT2: 0x3280, ReactiveImportL1: 0x3088, ReactiveImportL2: 0x308C, ReactiveImportL3: 0x3090, ReactiveExport: 0x30A0, ReactiveExportT1: 0x31A0, ReactiveExportT2: 0x32A0, ReactiveExportL1: 0x30A8, ReactiveExportL2: 0x30AC, ReactiveExportL3: 0x30B0, } return &IneproProducer{Opcodes: ops} } // Description implements Producer interface func (p *IneproProducer) Description() string { return "Inepro Metering Pro 380" } func (p *IneproProducer) snip(iec Measurement, scaler ...float64) Operation { snip := Operation{ FuncCode: ReadHoldingReg, OpCode: p.Opcodes[iec], ReadLen: 2, IEC61850: iec, Transform: RTUIeee754ToFloat64, } if len(scaler) > 0 { snip.Transform = MakeScaledTransform(snip.Transform, scaler[0]) } return snip } // Probe implements Producer interface func (p *IneproProducer) Probe() Operation { return p.snip(VoltageL1) } // Produce implements Producer interface func (p *IneproProducer) Produce() (res []Operation) { for op := range p.Opcodes { switch op { case Power, PowerL1, PowerL2, PowerL3, ReactivePower, ReactivePowerL1, ReactivePowerL2, ReactivePowerL3, ApparentPower, ApparentPowerL1, ApparentPowerL2, ApparentPowerL3: res = append(res, p.snip(op, 0.001)) default: res = append(res, p.snip(op)) } } return res }