{ "$schema": "https://raw.githubusercontent.com/nobrega8/mbmap-library/main/schema/mbmap-2.schema.json", "mbmap": 2, "vendor": "Eastron", "model": "SDM120-M", "models": ["SDM120-M"], "vendor_website": "eastroneurope.com", "description": "Single-phase multifunction DIN rail energy meter, 45 A direct connection, bidirectional", "revision": 3, "revised": "2026-11-10", "source": "Zhejiang Eastron Electronic, \"Eastron SDM120-M User Manual V1.0\", Modbus register map; https://www.eastrongroup.com/eastrongroup/2025/03/22/eastronsdm120-musermanualv1.0.pdf", "sources": [ {"title": "Eastron SDM120-M User Manual", "version": "V1.0", "note": "Modbus register map", "url": "https://www.eastrongroup.com/eastrongroup/2025/03/22/eastronsdm120-musermanualv1.0.pdf"} ], "notes": [ "Eastron SDM120-M single-phase energy meter (RS485).", "Measurements are float32 input registers (FC04); the integer copies at 2710h-2849h carry the same values." ], "protocol": "rtu", "unit_id": 1, "baudrate": 9600, "parity": "N", "databits": 8, "stopbits": 1, "byte_order": "big", "word_order": "big", "address_base": 0, "x_status": "official", "registers": [ {"name": "Voltage", "group": "Measurements", "area": "input", "address": 0, "type": "float32", "unit": "V", "access": "R"}, {"name": "Current", "group": "Measurements", "area": "input", "address": 6, "type": "float32", "unit": "A", "access": "R"}, {"name": "Active power", "group": "Measurements", "area": "input", "address": 12, "type": "float32", "unit": "W", "access": "R"}, {"name": "Apparent power", "group": "Measurements", "area": "input", "address": 18, "type": "float32", "unit": "VA", "access": "R"}, {"name": "Reactive power", "group": "Measurements", "area": "input", "address": 24, "type": "float32", "unit": "var", "access": "R"}, {"name": "Power factor", "group": "Measurements", "area": "input", "address": 30, "type": "float32", "access": "R"}, {"name": "Frequency", "group": "Measurements", "area": "input", "address": 70, "type": "float32", "unit": "Hz", "access": "R"}, {"name": "Import active energy", "group": "Energy", "area": "input", "address": 72, "type": "float32", "unit": "kWh", "access": "R"}, {"name": "Export active energy", "group": "Energy", "area": "input", "address": 74, "type": "float32", "unit": "kWh", "access": "R"}, {"name": "Import reactive energy", "group": "Energy", "area": "input", "address": 76, "type": "float32", "unit": "kvarh", "access": "R"}, {"name": "Export reactive energy", "group": "Energy", "area": "input", "address": 78, "type": "float32", "unit": "kvarh", "access": "R"}, {"name": "VAh", "group": "Energy", "area": "input", "address": 80, "type": "float32", "unit": "kVAh", "access": "R"}, {"name": "Ah", "group": "Energy", "area": "input", "address": 82, "type": "float32", "unit": "Ah", "access": "R"}, {"name": "Total system power demand", "group": "Demand", "area": "input", "address": 84, "type": "float32", "unit": "W", "access": "R"}, {"name": "Maximum total system power demand", "group": "Demand", "area": "input", "address": 86, "type": "float32", "unit": "W", "access": "R"}, {"name": "Import system power demand", "group": "Demand", "area": "input", "address": 88, "type": "float32", "unit": "W", "access": "R"}, {"name": "Maximum import system power demand", "group": "Demand", "area": "input", "address": 90, "type": "float32", "unit": "W", "access": "R"}, {"name": "Export system power demand", "group": "Demand", "area": "input", "address": 92, "type": "float32", "unit": "W", "access": "R"}, {"name": "Maximum export system power demand", "group": "Demand", "area": "input", "address": 94, "type": "float32", "unit": "W", "access": "R"}, {"name": "Current demand", "group": "Demand", "area": "input", "address": 258, "type": "float32", "unit": "A", "access": "R"}, {"name": "Maximum current demand", "group": "Demand", "area": "input", "address": 264, "type": "float32", "unit": "A", "access": "R"}, {"name": "Total active energy", "group": "Energy", "area": "input", "address": 342, "type": "float32", "unit": "kWh", "access": "R"}, {"name": "Total reactive energy", "group": "Energy", "area": "input", "address": 344, "type": "float32", "unit": "kvarh", "access": "R"}, {"name": "CO2", "group": "Energy", "area": "input", "address": 20130, "type": "float32", "unit": "kg", "access": "R"}, {"name": "Total import active energy (int64)", "group": "Energy (integer)", "area": "input", "address": 10000, "type": "int64", "scale": 0.001, "unit": "kWh", "access": "R", "description": "Raw value in Wh, varh or VAh"}, {"name": "Total export active energy (int64)", "group": "Energy (integer)", "area": "input", "address": 10004, "type": "int64", "scale": 0.001, "unit": "kWh", "access": "R", "description": "Raw value in Wh, varh or VAh"}, {"name": "Total import reactive energy (int64)", "group": "Energy (integer)", "area": "input", "address": 10008, "type": "int64", "scale": 0.001, "unit": "kvarh", "access": "R", "description": "Raw value in Wh, varh or VAh"}, {"name": "Total export reactive energy (int64)", "group": "Energy (integer)", "area": "input", "address": 10012, "type": "int64", "scale": 0.001, "unit": "kvarh", "access": "R", "description": "Raw value in Wh, varh or VAh"}, {"name": "Total apparent energy (int64)", "group": "Energy (integer)", "area": "input", "address": 10016, "type": "int64", "scale": 0.001, "unit": "kVAh", "access": "R", "description": "Raw value in Wh, varh or VAh"}, {"name": "Total active energy (int64)", "group": "Energy (integer)", "area": "input", "address": 10020, "type": "int64", "scale": 0.001, "unit": "kWh", "access": "R", "description": "Raw value in Wh, varh or VAh"}, {"name": "Total reactive energy (int64)", "group": "Energy (integer)", "area": "input", "address": 10024, "type": "int64", "scale": 0.001, "unit": "kvarh", "access": "R", "description": "Raw value in Wh, varh or VAh"}, {"name": "Voltage (int32)", "group": "Measurements (integer)", "area": "input", "address": 10250, "type": "int32", "scale": 0.1, "unit": "V", "access": "R"}, {"name": "Current (int32)", "group": "Measurements (integer)", "area": "input", "address": 10256, "type": "int32", "scale": 0.001, "unit": "A", "access": "R"}, {"name": "Active power (int32)", "group": "Measurements (integer)", "area": "input", "address": 10262, "type": "int32", "scale": 0.1, "unit": "W", "access": "R"}, {"name": "Apparent power (int32)", "group": "Measurements (integer)", "area": "input", "address": 10268, "type": "int32", "scale": 0.1, "unit": "VA", "access": "R"}, {"name": "Reactive power (int32)", "group": "Measurements (integer)", "area": "input", "address": 10274, "type": "int32", "scale": 0.1, "unit": "var", "access": "R"}, {"name": "Power factor (int32)", "group": "Measurements (integer)", "area": "input", "address": 10280, "type": "int32", "scale": 0.01, "access": "R"}, {"name": "Frequency (int32)", "group": "Measurements (integer)", "area": "input", "address": 10308, "type": "int32", "scale": 0.01, "unit": "Hz", "access": "R"}, {"name": "CO2 (int64)", "group": "Energy (integer)", "area": "input", "address": 10310, "type": "int64", "scale": 0.001, "unit": "kg", "access": "R"}, {"name": "Demand period", "group": "Setup", "area": "holding", "address": 2, "type": "float32", "unit": "min", "access": "RW", "description": "0 to 60 minutes, default 60. 0 makes demand show the present value and max demand the maximum since the last reset"}, {"name": "Pulse 1 width", "group": "Setup", "area": "holding", "address": 12, "type": "float32", "unit": "ms", "access": "RW", "description": "60, 100 or 200 ms, default 60"}, {"name": "Network parity and stop bits", "group": "Setup", "area": "holding", "address": 18, "type": "float32", "access": "RW", "description": "0 = no parity, 1 stop bit; 1 = even, 1 stop (the register table calls this the default; the specification says parity none); 2 = odd, 1 stop; 3 = no parity, 2 stop. Takes effect after a restart"}, {"name": "Meter ID", "group": "Setup", "area": "holding", "address": 20, "type": "float32", "access": "RW", "description": "Modbus address 1 to 247, default 1"}, {"name": "Pulse 1 rate", "group": "Setup", "area": "holding", "address": 22, "type": "float32", "access": "RW", "description": "0 = 0.001, 1 = 0.01, 2 = 0.1, 3 = 1 kWh per pulse"}, {"name": "Baud rate", "group": "Setup", "area": "holding", "address": 28, "type": "float32", "access": "RW", "description": "0 = 2400, 1 = 4800, 2 = 9600 (default), 3 = 19200, 4 = 38400"}, {"name": "Scroll display time", "group": "Setup", "area": "holding", "address": 58, "type": "float32", "unit": "s", "access": "RW", "description": "0 to 255 s; 0 (default) = no automatic scrolling"}, {"name": "CO2 rate", "group": "Setup", "area": "holding", "address": 70, "type": "uint32", "scale": 0.0001, "unit": "kg/kWh", "access": "RW", "description": "0 to 60 kg per kWh, default 0.5703"}, {"name": "Pulse 1 output mode", "group": "Setup", "area": "holding", "address": 86, "type": "float32", "access": "RW", "description": "1 = import active, 2 = total active (import + export), 4 = export active (default), 5 = import reactive, 6 = total reactive, 8 = export reactive"}, {"name": "Reset historical data", "group": "Commands", "area": "holding", "address": 61456, "type": "uint16", "access": "W", "enum": {"0": "Reset demand"}, "description": "The manual documents writes with FC16; Modbench writes a single register with FC06, which the meter may reject"}, {"name": "Scroll display time (BCD)", "group": "Setup", "area": "holding", "address": 63744, "type": "uint16", "access": "RW", "description": "BCD, 0 to 30 s (0x0030 = 30 s); 0 = no automatic scrolling. The manual documents writes with FC16; Modbench writes a single register with FC06, which the meter may reject"}, {"name": "Pulse 1 output", "group": "Setup", "area": "holding", "address": 63760, "type": "uint16", "access": "RW", "enum": {"0": "0.001 kWh/imp", "1": "0.01 kWh/imp", "2": "0.1 kWh/imp", "3": "1 kWh/imp"}, "description": "The manual documents writes with FC16; Modbench writes a single register with FC06, which the meter may reject"}, {"name": "Measurement mode", "group": "Setup", "area": "holding", "address": 63776, "type": "uint16", "access": "RW", "enum": {"1": "Total = import", "2": "Total = import + export", "3": "Total = import - export"}, "description": "Default 2. The manual documents writes with FC16; Modbench writes a single register with FC06, which the meter may reject"}, {"name": "Serial number", "group": "Device", "area": "holding", "address": 64512, "type": "uint32", "access": "R", "role": "serial"}, {"name": "Meter code", "group": "Device", "area": "holding", "address": 64514, "type": "uint16", "access": "R", "description": "0020h"}, {"name": "Software version major", "group": "Device", "area": "holding", "address": 64644, "type": "uint16", "bit": 8, "bits": 8, "access": "R", "role": "firmware"}, {"name": "Software version minor", "group": "Device", "area": "holding", "address": 64644, "type": "uint16", "bit": 0, "bits": 8, "access": "R", "role": "firmware"} ] }