Skip to content

Commit 6cbf428

Browse files
authored
Eastron: enhance, unify and fix (#377)
1 parent 64e0266 commit 6cbf428

File tree

10 files changed

+312
-145
lines changed

10 files changed

+312
-145
lines changed

docs/mbmd_inspect.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,12 @@ mbmd inspect [flags]
3939
PAC2200 Siemens PAC2200
4040
SBC Saia Burgess Controls ALE3 meters
4141
SDM Eastron SDM630
42+
SDM120 Eastron SDM120
4243
SDM220 Eastron SDM220
4344
SDM230 Eastron SDM230
4445
SDM54 Eastron SDM54
4546
SDM72 Eastron SDM72
47+
SDM72V2 Eastron SDM72 v2
4648
SEMTR SolarEdge SE-MTR-3Y
4749
WAGO87930 Wago 879-30XX
4850
WS100 B+G e-tech WS100

docs/mbmd_run.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,12 @@ mbmd run [flags]
3434
PAC2200 Siemens PAC2200
3535
SBC Saia Burgess Controls ALE3 meters
3636
SDM Eastron SDM630
37+
SDM120 Eastron SDM120
3738
SDM220 Eastron SDM220
3839
SDM230 Eastron SDM230
3940
SDM54 Eastron SDM54
4041
SDM72 Eastron SDM72
42+
SDM72V2 Eastron SDM72 v2
4143
SEMTR SolarEdge SE-MTR-3Y
4244
WAGO87930 Wago 879-30XX
4345
WS100 B+G e-tech WS100

meters/rs485/sdm.go

Lines changed: 52 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -18,45 +18,58 @@ func NewSDMProducer() Producer {
1818
* subtle differences (see 220, 230). Some opcodes might not work on some devices.
1919
*/
2020
ops := Opcodes{
21-
VoltageL1: 0x0000, // 220, 230
22-
VoltageL2: 0x0002,
23-
VoltageL3: 0x0004,
24-
CurrentL1: 0x0006, // 220, 230
25-
CurrentL2: 0x0008,
26-
CurrentL3: 0x000A,
27-
PowerL1: 0x000C, // 230
28-
PowerL2: 0x000E,
29-
PowerL3: 0x0010,
30-
Power: 0x0034,
31-
ApparentPower: 0x0038,
32-
ReactivePower: 0x003C,
33-
ImportPower: 0x0054,
34-
ImportL1: 0x015a,
35-
ImportL2: 0x015c,
36-
ImportL3: 0x015e,
37-
Import: 0x0048, // 220, 230
38-
ExportL1: 0x0160,
39-
ExportL2: 0x0162,
40-
ExportL3: 0x0164,
41-
Export: 0x004a, // 220, 230
42-
SumL1: 0x0166,
43-
SumL2: 0x0168,
44-
SumL3: 0x016a,
45-
Sum: 0x0156, // 220
46-
CosphiL1: 0x001e, // 230
47-
CosphiL2: 0x0020,
48-
CosphiL3: 0x0022,
49-
Cosphi: 0x003e,
50-
THDL1: 0x00ea, // voltage
51-
THDL2: 0x00ec, // voltage
52-
THDL3: 0x00ee, // voltage
53-
THD: 0x00F8, // voltage
54-
Frequency: 0x0046, // 230
55-
//L1THDCurrent: 0x00F0, // current
56-
//L2THDCurrent: 0x00F2, // current
57-
//L3THDCurrent: 0x00F4, // current
58-
//AvgTHDCurrent: 0x00Fa, // current
59-
//ApparentImportPower: 0x0064,
21+
VoltageL1: 0x0000, // Phase 1 line to neutral volts
22+
VoltageL2: 0x0002, // Phase 2 line to neutral volts
23+
VoltageL3: 0x0004, // Phase 3 line to neutral volts
24+
CurrentL1: 0x0006, // Phase 1 current
25+
CurrentL2: 0x0008, // Phase 2 current
26+
CurrentL3: 0x000A, // Phase 3 current
27+
PowerL1: 0x000C, // Phase 1 active power
28+
PowerL2: 0x000E, // Phase 2 active power
29+
PowerL3: 0x0010, // Phase 3 active power
30+
ApparentPowerL1: 0x0012, // Phase 1 apparent power
31+
ApparentPowerL2: 0x0014, // Phase 2 apparent power
32+
ApparentPowerL3: 0x0016, // Phase 3 apparent power
33+
ReactivePowerL1: 0x0018, // Phase 1 reactive power
34+
ReactivePowerL2: 0x001A, // Phase 2 reactive power
35+
ReactivePowerL3: 0x001C, // Phase 3 reactive power
36+
CosphiL1: 0x001E, // Phase 1 power factor
37+
CosphiL2: 0x0020, // Phase 2 power factor
38+
CosphiL3: 0x0022, // Phase 3 power factor
39+
Power: 0x0034, // Total system power
40+
ApparentPower: 0x0038, // Total system volt amps.
41+
ReactivePower: 0x003C, // Total system VAr
42+
Cosphi: 0x003E, // Total system power factor
43+
PhaseAngle: 0x0042, // Total system phase angle
44+
Frequency: 0x0046, // Frequency of supply voltages
45+
Import: 0x0048, // Total Import kWh
46+
Export: 0x004A, // Total Export kWh
47+
ReactiveImport: 0x004C, // Total Import kVArh
48+
ReactiveExport: 0x004E, // Total Export kVArh
49+
THDL1: 0x00EA, // Phase 1 L/N volts THD
50+
THDL2: 0x00EC, // Phase 2 L/N volts THD
51+
THDL3: 0x00EE, // Phase 3 L/N volts THD
52+
THD: 0x00F8, // Average line to neutral volts THD
53+
Sum: 0x0156, // Total kWh
54+
ReactiveSum: 0x0158, // Total kVArh
55+
ImportL1: 0x015A, // L1 import kWh
56+
ImportL2: 0x015C, // L2 import kWh
57+
ImportL3: 0x015E, // L3 import kWh
58+
ExportL1: 0x0160, // L1 export kWh
59+
ExportL2: 0x0162, // L2 export kWh
60+
ExportL3: 0x0164, // L3 export kWh
61+
SumL1: 0x0166, // L1 total kWh
62+
SumL2: 0x0168, // L2 total kWh
63+
SumL3: 0x016A, // L3 total kWh
64+
ReactiveImportL1: 0x016C, // L1 import kVArh
65+
ReactiveImportL2: 0x016E, // L2 import kVArh
66+
ReactiveImportL3: 0x0170, // L3 import kVArh
67+
ReactiveExportL1: 0x0172, // L1 export kVArh
68+
ReactiveExportL2: 0x0174, // L2 export kVArh
69+
ReactiveExportL3: 0x0176, // L3 export kVArh
70+
ReactiveSumL1: 0x0178, // L1 total kVArh
71+
ReactiveSumL2: 0x017A, // L2 total kVArh
72+
ReactiveSumL3: 0x017C, // L3 total kVArh
6073
}
6174
return &SDMProducer{Opcodes: ops}
6275
}

meters/rs485/sdm120.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package rs485
2+
3+
import . "github.com/volkszaehler/mbmd/meters"
4+
5+
func init() {
6+
Register("SDM120", NewSDM120Producer)
7+
}
8+
9+
type SDM120Producer struct {
10+
Opcodes
11+
}
12+
13+
func NewSDM120Producer() Producer {
14+
/**
15+
* Opcodes as defined by Eastron SDM120.
16+
* See https://stromzähler.eu/media/7e/64/b6/1696582669/sdm120modbus_manual.pdf
17+
*/
18+
ops := Opcodes{
19+
Voltage: 0x0000, // Line to neutral volts
20+
Current: 0x0006, // Current
21+
Power: 0x000C, // Active power
22+
ApparentPower: 0x0012, // Apparent power
23+
ReactivePower: 0x0018, // Reactive power
24+
Cosphi: 0x001E, // Power factor
25+
Frequency: 0x0046, // Frequency of supply voltage
26+
Import: 0x0048, // Total Import kWh
27+
Export: 0x004A, // Total Export kWh
28+
ReactiveImport: 0x004C, // Total Import kVArh
29+
ReactiveExport: 0x004E, // Total Export kVArh
30+
Sum: 0x0156, // Total kWh
31+
ReactiveSum: 0x0158, // Total kVArh
32+
}
33+
return &SDM120Producer{Opcodes: ops}
34+
}
35+
36+
func (p *SDM120Producer) Description() string {
37+
return "Eastron SDM120"
38+
}
39+
40+
func (p *SDM120Producer) snip(iec Measurement) Operation {
41+
operation := Operation{
42+
FuncCode: ReadInputReg,
43+
OpCode: p.Opcode(iec),
44+
ReadLen: 2,
45+
IEC61850: iec,
46+
Transform: RTUIeee754ToFloat64,
47+
}
48+
return operation
49+
}
50+
51+
func (p *SDM120Producer) Probe() Operation {
52+
return p.snip(Voltage)
53+
}
54+
55+
func (p *SDM120Producer) Produce() (res []Operation) {
56+
for op := range p.Opcodes {
57+
res = append(res, p.snip(op))
58+
}
59+
60+
return res
61+
}

meters/rs485/sdm220.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,22 @@ func NewSDM220Producer() Producer {
1414
/**
1515
* Opcodes as defined by Eastron SDM220.
1616
* See https://bg-etech.de/download/manual/SDM220StandardDE.pdf
17-
* See extra codes at: https://www.aggsoft.com/serial-data-logger/tutorials/modbus-data-logging/eastron-sdm220.htm
1817
*/
1918
ops := Opcodes{
20-
Voltage: 0x0000, // 220, 230
21-
Current: 0x0006, // 220, 230
22-
Power: 0x000c, // 220
23-
ApparentPower: 0x0012, // 220
24-
ReactivePower: 0x0018, // 220
25-
Cosphi: 0x0024, // 220
26-
Frequency: 0x0046, // 220
27-
Import: 0x0048, // 220, 230
28-
Export: 0x004a, // 220, 230
29-
Sum: 0x0156, // 220, 230
30-
ReactiveSum: 0x0158, // 220
31-
ReactiveImport: 0x4C, // 220, 230
32-
ReactiveExport: 0x4E, // 220, 230
19+
Voltage: 0x0000, // Line to neutral volts
20+
Current: 0x0006, // Current
21+
Power: 0x000C, // Active power
22+
ApparentPower: 0x0012, // Apparent power
23+
ReactivePower: 0x0018, // Reactive power
24+
Cosphi: 0x001E, // Power factor
25+
PhaseAngle: 0x0024, // Phase angle
26+
Frequency: 0x0046, // Frequency of supply voltage
27+
Import: 0x0048, // Total Import kWh
28+
Export: 0x004A, // Total Export kWh
29+
ReactiveImport: 0x004C, // Total Import kVArh
30+
ReactiveExport: 0x004E, // Total Export kVArh
31+
Sum: 0x0156, // Total kWh
32+
ReactiveSum: 0x0158, // Total kVArh
3333
}
3434
return &SDM220Producer{Opcodes: ops}
3535
}

meters/rs485/sdm230.go

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,20 @@ func NewSDM230Producer() Producer {
1616
* See https://bg-etech.de/download/manual/SDM230-register.pdf
1717
*/
1818
ops := Opcodes{
19-
Voltage: 0x0000, // 220, 230
20-
Current: 0x0006, // 220, 230
21-
Power: 0x000C, // 230
22-
Import: 0x0048, // 220, 230
23-
Export: 0x004a, // 220, 230
24-
Cosphi: 0x001e, // 230
25-
Frequency: 0x0046, // 230
26-
ReactiveImport: 0x4C, // 220, 230
27-
ReactiveExport: 0x4E, // 220, 230
28-
ApparentPower: 0x0012, // 230
29-
ReactivePower: 0x0018, // 230
30-
Sum: 0x0156, // 230
31-
PhaseAngle: 0x0024, // 230
19+
Voltage: 0x0000, // Line to neutral volts
20+
Current: 0x0006, // Current
21+
Power: 0x000C, // Active power
22+
ApparentPower: 0x0012, // Apparent power
23+
ReactivePower: 0x0018, // Reactive power
24+
Cosphi: 0x001E, // Power factor
25+
PhaseAngle: 0x0024, // Phase angle
26+
Frequency: 0x0046, // Frequency of supply voltage
27+
Import: 0x0048, // Total Import kWh
28+
Export: 0x004A, // Total Export kWh
29+
ReactiveImport: 0x004C, // Total Import kVArh
30+
ReactiveExport: 0x004E, // Total Export kVArh
31+
Sum: 0x0156, // Total kWh
32+
ReactiveSum: 0x0158, // Total kVArh
3233
}
3334
return &SDM230Producer{Opcodes: ops}
3435
}

meters/rs485/sdm54.go

Lines changed: 53 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -14,50 +14,61 @@ func NewSDM54Producer() Producer {
1414
/**
1515
* Opcodes as defined by Eastron SDM54.
1616
* See https://www.eastrongroup.com/eastrongroup/2024/08/21/eastronsdm54seriesusermanualv1.2.pdf
17-
* This is to a large extent a superset of all SDM devices, however there are
18-
* subtle differences (see 220, 230). Some opcodes might not work on some devices.
1917
*/
2018
ops := Opcodes{
21-
VoltageL1: 0x0000, // 220, 230
22-
VoltageL2: 0x0002,
23-
VoltageL3: 0x0004,
24-
CurrentL1: 0x0006, // 220, 230
25-
CurrentL2: 0x0008,
26-
CurrentL3: 0x000A,
27-
PowerL1: 0x000C, // 230
28-
PowerL2: 0x000E,
29-
PowerL3: 0x0010,
30-
ApparentPowerL1: 0x0012,
31-
ApparentPowerL2: 0x0014,
32-
ApparentPowerL3: 0x0016,
33-
ReactivePowerL1: 0x0018,
34-
ReactivePowerL2: 0x001A,
35-
ReactivePowerL3: 0x001C,
36-
CosphiL1: 0x001e, // 230
37-
CosphiL2: 0x0020,
38-
CosphiL3: 0x0022,
39-
Power: 0x0034,
40-
ApparentPower: 0x0038,
41-
ReactivePower: 0x003C,
42-
ImportPower: 0x0054,
43-
ImportL1: 0x015a,
44-
ImportL2: 0x015c,
45-
ImportL3: 0x015e,
46-
Import: 0x0048, // 220, 230
47-
ExportL1: 0x0160,
48-
ExportL2: 0x0162,
49-
ExportL3: 0x0164,
50-
Export: 0x004a, // 220, 230
51-
SumL1: 0x0166,
52-
SumL2: 0x0168,
53-
SumL3: 0x016a,
54-
Sum: 0x0156, // 220
55-
Cosphi: 0x003e,
56-
THDL1: 0x00ea, // voltage
57-
THDL2: 0x00ec, // voltage
58-
THDL3: 0x00ee, // voltage
59-
THD: 0x00F8, // voltage
60-
Frequency: 0x0046, // 230
19+
VoltageL1: 0x0000, // Phase 1 line to neutral volts
20+
VoltageL2: 0x0002, // Phase 2 line to neutral volts
21+
VoltageL3: 0x0004, // Phase 3 line to neutral volts
22+
CurrentL1: 0x0006, // Phase 1 current
23+
CurrentL2: 0x0008, // Phase 2 current
24+
CurrentL3: 0x000A, // Phase 3 current
25+
PowerL1: 0x000C, // Phase 1 active power
26+
PowerL2: 0x000E, // Phase 2 active power
27+
PowerL3: 0x0010, // Phase 3 active power
28+
ApparentPowerL1: 0x0012, // Phase 1 apparent power
29+
ApparentPowerL2: 0x0014, // Phase 2 apparent power
30+
ApparentPowerL3: 0x0016, // Phase 3 apparent power
31+
ReactivePowerL1: 0x0018, // Phase 1 reactive power
32+
ReactivePowerL2: 0x001A, // Phase 2 reactive power
33+
ReactivePowerL3: 0x001C, // Phase 3 reactive power
34+
CosphiL1: 0x001E, // Phase 1 power factor
35+
CosphiL2: 0x0020, // Phase 2 power factor
36+
CosphiL3: 0x0022, // Phase 3 power factor
37+
Power: 0x0034, // Total system power
38+
ApparentPower: 0x0038, // Total system volt amps.
39+
ReactivePower: 0x003C, // Total system VAr
40+
Cosphi: 0x003E, // Total system power factor
41+
PhaseAngle: 0x0042, // Total system phase angle
42+
Frequency: 0x0046, // Frequency of supply voltages
43+
Import: 0x0048, // Total Import kWh
44+
Export: 0x004A, // Total Export kWh
45+
THDL1: 0x00EA, // Phase 1 L/N volts THD
46+
THDL2: 0x00EC, // Phase 2 L/N volts THD
47+
THDL3: 0x00EE, // Phase 3 L/N volts THD
48+
THD: 0x00F8, // Average line to neutral volts THD
49+
Sum: 0x0156, // Total kWh
50+
ReactiveSum: 0x0158, // Total kVArh
51+
ImportL1: 0x015A, // L1 import kWh
52+
ImportL2: 0x015C, // L2 import kWh
53+
ImportL3: 0x015E, // L3 import kWh
54+
ExportL1: 0x0160, // L1 export kWh
55+
ExportL2: 0x0162, // L2 export kWh
56+
ExportL3: 0x0164, // L3 export kWh
57+
SumL1: 0x0166, // L1 total kWh
58+
SumL2: 0x0168, // L2 total kWh
59+
SumL3: 0x016A, // L3 total kWh
60+
SumT1: 0x130C, // Tariff 1 total kWh
61+
SumT2: 0x130E, // Tariff 2 total kWh
62+
ImportT1: 0x1314, // Tariff 1 import kWh
63+
ImportT2: 0x1316, // Tariff 2 import kWh
64+
ExportT1: 0x131C, // Tariff 1 export kWh
65+
ExportT2: 0x131E, // Tariff 2 export kWh
66+
ReactiveSumT1: 0x1324, // Tariff 1 total kVArh
67+
ReactiveSumT2: 0x1326, // Tariff 2 total kVArh
68+
ReactiveImportT1: 0x132C, // Tariff 1 import kVArh
69+
ReactiveImportT2: 0x132E, // Tariff 2 import kVArh
70+
ReactiveExportT1: 0x1334, // Tariff 1 export kVArh
71+
ReactiveExportT2: 0x1336, // Tariff 2 export kVArh
6172
}
6273
return &SDM54Producer{Opcodes: ops}
6374
}

meters/rs485/sdm72.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ func NewSDM72Producer() Producer {
1616
* See https://data.stromzähler.eu/eastron/SDM72DM-manual.pdf
1717
*/
1818
ops := Opcodes{
19-
Power: 0x0034,
20-
Import: 0x0048,
21-
Export: 0x004a,
22-
Sum: 0x0156,
19+
Power: 0x0034, // Total system power
20+
Import: 0x0048, // Total Import kWh
21+
Export: 0x004A, // Total Export kWh
22+
Sum: 0x0156, // Total kWh
2323
}
2424
return &SDM72Producer{Opcodes: ops}
2525
}

0 commit comments

Comments
 (0)