{ "$schema": "https://raw.githubusercontent.com/nobrega8/mbmap-library/main/schema/mbmap-2.schema.json", "mbmap": 2, "vendor": "Eastron", "model": "SDM120CT", "models": ["SDM120CT", "SDM120CTM", "SDM120CT-M"], "vendor_website": "eastroneurope.com", "description": "Single-phase DIN rail energy meter for an external current transformer (1 A or 5 A secondary)", "revision": 2, "revised": "2026-10-17", "source": "Eastron, \"Eastron SDM120CTM Smart Meter Modbus Protocol Implementation\", V1.3", "sources": [{"title": "Eastron SDM120CTM Smart Meter Modbus Protocol Implementation", "version": "V1.3", "url": "https://www.eastroneurope.com/images/uploads/products/protocol/SDM120CT_Modbus_protocol.pdf"}], "notes": [ "Measurements are float32 input registers (FC04); settings are float32 holding registers (FC03 read, FC10 write). The meter also answers FC08.", "Requests must start at an even address and cover an even number of registers, so a single float32 is read or written as two registers. Only one float can be written per request.", "The settings at F900h-F920h are 16-bit values in the protocol; read them together with the next register if the meter rejects a one-register read." ], "protocol": "rtu", "unit_id": 1, "baudrate": 2400, "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": "0x0000", "type": "float32", "unit": "V", "access": "R"}, {"name": "Current", "group": "Measurements", "area": "input", "address": "0x0006", "type": "float32", "unit": "A", "access": "R"}, {"name": "Active power", "group": "Measurements", "area": "input", "address": "0x000C", "type": "float32", "unit": "W", "access": "R"}, {"name": "Apparent power", "group": "Measurements", "area": "input", "address": "0x0012", "type": "float32", "unit": "VA", "access": "R"}, {"name": "Reactive power", "group": "Measurements", "area": "input", "address": "0x0018", "type": "float32", "unit": "var", "access": "R"}, {"name": "Power factor", "group": "Measurements", "area": "input", "address": "0x001E", "type": "float32", "access": "R"}, {"name": "Frequency", "group": "Measurements", "area": "input", "address": "0x0046", "type": "float32", "unit": "Hz", "access": "R"}, {"name": "Import active energy", "group": "Energy", "area": "input", "address": "0x0048", "type": "float32", "unit": "kWh", "access": "R"}, {"name": "Export active energy", "group": "Energy", "area": "input", "address": "0x004A", "type": "float32", "unit": "kWh", "access": "R"}, {"name": "Import reactive energy", "group": "Energy", "area": "input", "address": "0x004C", "type": "float32", "unit": "kvarh", "access": "R"}, {"name": "Export reactive energy", "group": "Energy", "area": "input", "address": "0x004E", "type": "float32", "unit": "kvarh", "access": "R"}, {"name": "Total system power demand", "group": "Demand", "area": "input", "address": "0x0054", "type": "float32", "unit": "W", "access": "R"}, {"name": "Maximum total system power demand", "group": "Demand", "area": "input", "address": "0x0056", "type": "float32", "unit": "W", "access": "R"}, {"name": "Import system power demand", "group": "Demand", "area": "input", "address": "0x0058", "type": "float32", "unit": "W", "access": "R"}, {"name": "Maximum import system power demand", "group": "Demand", "area": "input", "address": "0x005A", "type": "float32", "unit": "W", "access": "R"}, {"name": "Export system power demand", "group": "Demand", "area": "input", "address": "0x005C", "type": "float32", "unit": "W", "access": "R"}, {"name": "Maximum export system power demand", "group": "Demand", "area": "input", "address": "0x005E", "type": "float32", "unit": "W", "access": "R"}, {"name": "Current demand", "group": "Demand", "area": "input", "address": "0x0102", "type": "float32", "unit": "A", "access": "R"}, {"name": "Maximum current demand", "group": "Demand", "area": "input", "address": "0x0108", "type": "float32", "unit": "A", "access": "R"}, {"name": "Total active energy", "group": "Energy", "area": "input", "address": "0x0156", "type": "float32", "unit": "kWh", "access": "R"}, {"name": "Total reactive energy", "group": "Energy", "area": "input", "address": "0x0158", "type": "float32", "unit": "kvarh", "access": "R"}, {"name": "Demand time", "group": "Setup", "area": "holding", "address": "0x0000", "type": "float32", "unit": "min", "access": "R", "description": "Minutes into the first demand calculation; demand values are valid once it reaches the demand period"}, {"name": "Demand period", "group": "Setup", "area": "holding", "address": "0x0002", "type": "float32", "unit": "min", "access": "RW", "write_min": 0, "write_max": 60, "description": "Default 60; 0 turns demand off"}, {"name": "Relay pulse width", "group": "Setup", "area": "holding", "address": "0x000C", "type": "float32", "unit": "ms", "access": "RW", "description": "60, 100 or 200 ms, default 100"}, {"name": "Network parity and stop bits", "group": "Setup", "area": "holding", "address": "0x0012", "type": "float32", "access": "RW", "enum": {"0": "No parity, 1 stop bit", "1": "Even parity, 1 stop bit", "2": "Odd parity, 1 stop bit", "3": "No parity, 2 stop bits"}, "description": "Default 0. Takes effect after a restart"}, {"name": "Meter ID", "group": "Setup", "area": "holding", "address": "0x0014", "type": "float32", "access": "RW", "write_min": 1, "write_max": 247, "description": "Modbus address, default 1"}, {"name": "Baud rate", "group": "Setup", "area": "holding", "address": "0x001C", "type": "float32", "access": "RW", "enum": {"0": "2400", "1": "4800", "2": "9600", "5": "1200"}, "description": "Default 0 (2400)"}, {"name": "CT primary current", "group": "Setup", "area": "holding", "address": "0x0032", "type": "float32", "unit": "A", "access": "RW", "write_min": 5, "write_max": 9999, "description": "Default 5"}, {"name": "CT secondary current", "group": "Setup", "area": "holding", "address": "0x0034", "type": "float32", "unit": "A", "access": "RW", "description": "1 or 5, default 5"}, {"name": "Pulse 1 output mode", "group": "Setup", "area": "holding", "address": "0x0056", "type": "float32", "access": "RW", "enum": {"1": "Import active energy", "2": "Import + export active energy", "4": "Export active energy", "5": "Import reactive energy", "6": "Import + export reactive energy", "8": "Export reactive energy"}, "description": "Default 4"}, {"name": "Reset demand", "group": "Commands", "area": "holding", "address": "0xF010", "type": "uint32", "access": "W", "enum": {"0": "Reset demand"}, "description": "The protocol writes 00 00 here; requests must cover an even number of registers, so this sends two zero registers with FC10"}, {"name": "Scroll display time", "group": "Setup", "area": "holding", "address": "0xF900", "type": "uint16", "unit": "s", "access": "RW", "description": "BCD, 0 to 30 s; 0 (default) = no automatic scrolling"}, {"name": "Pulse 1 constant", "group": "Setup", "area": "holding", "address": "0xF910", "type": "uint16", "access": "RW", "enum": {"0": "0.001 kWh/imp", "1": "0.01 kWh/imp", "2": "0.1 kWh/imp", "3": "1 kWh/imp", "4": "10 kWh/imp", "5": "100 kWh/imp", "6": "1000 kWh/imp"}, "description": "Default 1"}, {"name": "Measurement mode", "group": "Setup", "area": "holding", "address": "0xF920", "type": "uint16", "access": "RW", "enum": {"1": "Total = import", "2": "Total = import + export", "3": "Total = import - export"}, "description": "Default 2"}, {"name": "Serial number", "group": "Device", "area": "holding", "address": "0xFC00", "type": "uint32", "access": "R", "role": "serial"} ] }