{ "$schema": "https://raw.githubusercontent.com/nobrega8/mbmap-library/main/schema/mbmap-2.schema.json", "mbmap": 2, "vendor": "Contrel", "model": "EMC series", "models": ["EMC series", "EMM-µD3h-485"], "vendor_website": "contrel.it", "description": "Multifunction electrical meter", "revision": 3, "revised": "2026-11-10", "source": "Contrel EMC series communication protocol, instruction manual IM154-U v0.94", "sources": [ {"title": "EMC series electrical multifunction meter communication protocol", "version": "IM154-U v0.94", "note": "register tables, pages 8-11"} ], "notes": [ "Every value is a 32-bit integer in two registers, high word first.", "A value the meter cannot measure reads 0.", "The meter answers at most 32 registers (16 values) per read; a read must not split a value.", "Energy T1 is the total or time band 1 counter and T2 the partial or time band 2 counter, depending on the energy mode. Meters without these functions only have T1.", "The model and firmware are reported by Report Slave ID (FC17), not by a register: slave ID 0x50, firmware in data bytes 19-20, options in bytes 17-18.", "The manual does not give the scale of the power factor and cos phi registers. On a device they read as thousandths (574 = 0.574, equal to active / apparent power), so the map scales them by 0.001.", "Tested on an EMM-µD3h-485 (EMM-µD3), read over a Modbus TCP gateway, November 2026: all 80 registers read without errors. Checked: voltages, currents, power, energy (T1, T2 empty), frequency, status, settings and the 32-bit word order (big). The Max voltage L1-L3 registers (0x1072-0x1076) read 105145, 1009514 and 675279 with 226 V on the line, so they do not fit any scale and were not verified. Temperature, hour counter and neutral current read 0 on this meter." ], "protocol": "rtu", "byte_order": "big", "word_order": "big", "address_base": 0, "max_read_registers": 32, "enums": { "do_mode_1": {"1": "Active energy pulses", "2": "Three-phase alarm", "3": "Max/min L1-L2-L3 alarm", "4": "Remote control"}, "do_mode_2": {"1": "Reactive energy pulses", "2": "Three-phase alarm", "3": "Max/min L1-L2-L3 alarm", "4": "Remote control"}, "do_control": {"0x000055AA": "Off", "0x010055AA": "On"} }, "x_status": "verified", "registers": [ {"name": "System voltage", "group": "Measurements", "area": "holding", "address": "0x1000", "type": "uint32", "unit": "V", "description": "Three-phase system voltage"}, {"name": "Voltage L1-N", "group": "Measurements", "area": "holding", "address": "0x1002", "type": "uint32", "unit": "V"}, {"name": "Voltage L2-N", "group": "Measurements", "area": "holding", "address": "0x1004", "type": "uint32", "unit": "V"}, {"name": "Voltage L3-N", "group": "Measurements", "area": "holding", "address": "0x1006", "type": "uint32", "unit": "V"}, {"name": "Voltage L1-L2", "group": "Measurements", "area": "holding", "address": "0x1008", "type": "uint32", "unit": "V"}, {"name": "Voltage L2-L3", "group": "Measurements", "area": "holding", "address": "0x100A", "type": "uint32", "unit": "V"}, {"name": "Voltage L3-L1", "group": "Measurements", "area": "holding", "address": "0x100C", "type": "uint32", "unit": "V"}, {"name": "System current", "group": "Measurements", "area": "holding", "address": "0x100E", "type": "uint32", "scale": 0.001, "unit": "A", "description": "Three-phase system current (sent in mA)"}, {"name": "Current L1", "group": "Measurements", "area": "holding", "address": "0x1010", "type": "uint32", "scale": 0.001, "unit": "A", "description": "Sent in mA"}, {"name": "Current L2", "group": "Measurements", "area": "holding", "address": "0x1012", "type": "uint32", "scale": 0.001, "unit": "A", "description": "Sent in mA"}, {"name": "Current L3", "group": "Measurements", "area": "holding", "address": "0x1014", "type": "uint32", "scale": 0.001, "unit": "A", "description": "Sent in mA"}, {"name": "System power factor", "group": "Measurements", "area": "holding", "address": "0x1016", "type": "int32", "scale": 0.001, "description": "Raw value divided by 1000 (574 = 0.574); the manual does not give the scale, checked against active / apparent power on a device"}, {"name": "Power factor L1", "group": "Measurements", "area": "holding", "address": "0x1018", "type": "int32", "scale": 0.001, "description": "Raw value divided by 1000 (574 = 0.574); the manual does not give the scale, checked against active / apparent power on a device"}, {"name": "Power factor L2", "group": "Measurements", "area": "holding", "address": "0x101A", "type": "int32", "scale": 0.001, "description": "Raw value divided by 1000 (574 = 0.574); the manual does not give the scale, checked against active / apparent power on a device"}, {"name": "Power factor L3", "group": "Measurements", "area": "holding", "address": "0x101C", "type": "int32", "scale": 0.001, "description": "Raw value divided by 1000 (574 = 0.574); the manual does not give the scale, checked against active / apparent power on a device"}, {"name": "System cos phi", "group": "Measurements", "area": "holding", "address": "0x101E", "type": "int32", "scale": 0.001, "description": "Raw value divided by 1000 (574 = 0.574); the manual does not give the scale, checked against active / apparent power on a device"}, {"name": "Cos phi L1", "group": "Measurements", "area": "holding", "address": "0x1020", "type": "int32", "scale": 0.001, "description": "Raw value divided by 1000 (574 = 0.574); the manual does not give the scale, checked against active / apparent power on a device"}, {"name": "Cos phi L2", "group": "Measurements", "area": "holding", "address": "0x1022", "type": "int32", "scale": 0.001, "description": "Raw value divided by 1000 (574 = 0.574); the manual does not give the scale, checked against active / apparent power on a device"}, {"name": "Cos phi L3", "group": "Measurements", "area": "holding", "address": "0x1024", "type": "int32", "scale": 0.001, "description": "Raw value divided by 1000 (574 = 0.574); the manual does not give the scale, checked against active / apparent power on a device"}, {"name": "System apparent power", "group": "Measurements", "area": "holding", "address": "0x1026", "type": "uint32", "unit": "VA"}, {"name": "Apparent power L1", "group": "Measurements", "area": "holding", "address": "0x1028", "type": "uint32", "unit": "VA"}, {"name": "Apparent power L2", "group": "Measurements", "area": "holding", "address": "0x102A", "type": "uint32", "unit": "VA"}, {"name": "Apparent power L3", "group": "Measurements", "area": "holding", "address": "0x102C", "type": "uint32", "unit": "VA"}, {"name": "System active power", "group": "Measurements", "area": "holding", "address": "0x102E", "type": "uint32", "unit": "W"}, {"name": "Active power L1", "group": "Measurements", "area": "holding", "address": "0x1030", "type": "uint32", "unit": "W"}, {"name": "Active power L2", "group": "Measurements", "area": "holding", "address": "0x1032", "type": "uint32", "unit": "W"}, {"name": "Active power L3", "group": "Measurements", "area": "holding", "address": "0x1034", "type": "uint32", "unit": "W"}, {"name": "System reactive power", "group": "Measurements", "area": "holding", "address": "0x1036", "type": "uint32", "unit": "var"}, {"name": "Reactive power L1", "group": "Measurements", "area": "holding", "address": "0x1038", "type": "uint32", "unit": "var"}, {"name": "Reactive power L2", "group": "Measurements", "area": "holding", "address": "0x103A", "type": "uint32", "unit": "var"}, {"name": "Reactive power L3", "group": "Measurements", "area": "holding", "address": "0x103C", "type": "uint32", "unit": "var"}, {"name": "Active energy T1", "group": "Energy", "area": "holding", "address": "0x103E", "type": "uint32", "scale": 0.1, "unit": "kWh", "description": "Three-phase, in units of 100 Wh"}, {"name": "Reactive energy T1", "group": "Energy", "area": "holding", "address": "0x1040", "type": "uint32", "scale": 0.1, "unit": "kvarh", "description": "Three-phase, in units of 100 varh"}, {"name": "Active energy T2", "group": "Energy", "area": "holding", "address": "0x1042", "type": "uint32", "scale": 0.1, "unit": "kWh", "description": "Three-phase, in units of 100 Wh"}, {"name": "Reactive energy T2", "group": "Energy", "area": "holding", "address": "0x1044", "type": "uint32", "scale": 0.1, "unit": "kvarh", "description": "Three-phase, in units of 100 varh"}, {"name": "Frequency", "group": "Measurements", "area": "holding", "address": "0x1046", "type": "uint32", "scale": 0.001, "unit": "Hz", "description": "Sent in mHz"}, {"name": "Neutral current", "group": "Measurements", "area": "holding", "address": "0x1048", "type": "uint32", "scale": 0.001, "unit": "A", "description": "Sent in mA"}, {"name": "Apparent energy T1", "group": "Energy", "area": "holding", "address": "0x104A", "type": "uint32", "scale": 0.1, "unit": "kVAh", "description": "Three-phase, in units of 100 VAh"}, {"name": "Apparent energy T2", "group": "Energy", "area": "holding", "address": "0x104C", "type": "uint32", "scale": 0.1, "unit": "kVAh", "description": "Three-phase, in units of 100 VAh"}, {"name": "Max current L1", "group": "Max and average values", "area": "holding", "address": "0x1060", "type": "uint32", "scale": 0.001, "unit": "A", "description": "Maximum instantaneous value"}, {"name": "Max current L2", "group": "Max and average values", "area": "holding", "address": "0x1062", "type": "uint32", "scale": 0.001, "unit": "A", "description": "Maximum instantaneous value"}, {"name": "Max current L3", "group": "Max and average values", "area": "holding", "address": "0x1064", "type": "uint32", "scale": 0.001, "unit": "A", "description": "Maximum instantaneous value"}, {"name": "Max system active power", "group": "Max and average values", "area": "holding", "address": "0x1066", "type": "uint32", "unit": "W", "description": "Maximum instantaneous value"}, {"name": "Max system apparent power", "group": "Max and average values", "area": "holding", "address": "0x1068", "type": "uint32", "unit": "VA", "description": "Maximum instantaneous value"}, {"name": "Max demand current L1", "group": "Max and average values", "area": "holding", "address": "0x106A", "type": "uint32", "scale": 0.001, "unit": "A", "description": "Highest average value"}, {"name": "Max demand current L2", "group": "Max and average values", "area": "holding", "address": "0x106C", "type": "uint32", "scale": 0.001, "unit": "A", "description": "Highest average value"}, {"name": "Max demand current L3", "group": "Max and average values", "area": "holding", "address": "0x106E", "type": "uint32", "scale": 0.001, "unit": "A", "description": "Highest average value"}, {"name": "Max demand system active power", "group": "Max and average values", "area": "holding", "address": "0x1070", "type": "uint32", "unit": "W", "description": "Highest average value"}, {"name": "Max voltage L1", "group": "Max and average values", "area": "holding", "address": "0x1072", "type": "uint32", "unit": "V", "description": "Maximum instantaneous value"}, {"name": "Max voltage L2", "group": "Max and average values", "area": "holding", "address": "0x1074", "type": "uint32", "unit": "V", "description": "Maximum instantaneous value"}, {"name": "Max voltage L3", "group": "Max and average values", "area": "holding", "address": "0x1076", "type": "uint32", "unit": "V", "description": "Maximum instantaneous value"}, {"name": "Max system reactive power", "group": "Max and average values", "area": "holding", "address": "0x1078", "type": "uint32", "unit": "var", "description": "Maximum instantaneous value"}, {"name": "Max demand system reactive power", "group": "Max and average values", "area": "holding", "address": "0x107A", "type": "uint32", "unit": "var", "description": "Highest average value"}, {"name": "Max demand system apparent power", "group": "Max and average values", "area": "holding", "address": "0x107C", "type": "uint32", "unit": "VA", "description": "Highest average value"}, {"name": "Last average system active power", "group": "Max and average values", "area": "holding", "address": "0x107E", "type": "uint32", "unit": "W"}, {"name": "Last average system reactive power", "group": "Max and average values", "area": "holding", "address": "0x1080", "type": "uint32", "unit": "var"}, {"name": "Last average system apparent power", "group": "Max and average values", "area": "holding", "address": "0x1082", "type": "uint32", "unit": "VA"}, {"name": "Max neutral current", "group": "Max and average values", "area": "holding", "address": "0x1084", "type": "uint32", "scale": 0.001, "unit": "A", "description": "Maximum instantaneous value"}, {"name": "Max demand neutral current", "group": "Max and average values", "area": "holding", "address": "0x1086", "type": "uint32", "scale": 0.001, "unit": "A", "description": "Highest average value"}, {"name": "Last average neutral current", "group": "Max and average values", "area": "holding", "address": "0x1088", "type": "uint32", "scale": 0.001, "unit": "A"}, {"name": "Last average current L1", "group": "Max and average values", "area": "holding", "address": "0x108A", "type": "uint32", "scale": 0.001, "unit": "A"}, {"name": "Last average current L2", "group": "Max and average values", "area": "holding", "address": "0x108C", "type": "uint32", "scale": 0.001, "unit": "A"}, {"name": "Last average current L3", "group": "Max and average values", "area": "holding", "address": "0x108E", "type": "uint32", "scale": 0.001, "unit": "A"}, {"name": "Temperature", "group": "Measurements", "area": "holding", "address": "0x1096", "type": "uint32", "unit": "°C"}, {"name": "Hour counter", "group": "Measurements", "area": "holding", "address": "0x1098", "type": "uint32", "scale": 0.1, "unit": "h", "description": "Sent in tenths of an hour"}, {"name": "DO1 mode", "group": "Status", "area": "holding", "address": "0x109A", "type": "uint16", "bit": 8, "bits": 8, "enum": "do_mode_1", "description": "High byte of the DO1 settings"}, {"name": "DO1 alarm parameter", "group": "Status", "area": "holding", "address": "0x109A", "type": "uint16", "bit": 0, "bits": 8, "description": "Low byte of the DO1 settings: index of the measure in table A (three-phase alarm) or table B (max/min alarm) of the manual"}, {"name": "DO2 mode", "group": "Status", "area": "holding", "address": "0x109B", "type": "uint16", "bit": 8, "bits": 8, "enum": "do_mode_2", "description": "High byte of the DO2 settings"}, {"name": "DO2 alarm parameter", "group": "Status", "area": "holding", "address": "0x109B", "type": "uint16", "bit": 0, "bits": 8, "description": "Low byte of the DO2 settings: index of the measure in table A (three-phase alarm) or table B (max/min alarm) of the manual"}, {"name": "DO1 status", "group": "Status", "area": "holding", "address": "0x109C", "type": "uint16", "bit": 8, "bits": 8}, {"name": "DO2 status", "group": "Status", "area": "holding", "address": "0x109C", "type": "uint16", "bit": 0, "bits": 8}, {"name": "DI status", "group": "Status", "area": "holding", "address": "0x109D", "type": "uint16", "bit": 0, "bits": 8, "enum": {"0": "Powered", "1": "Not powered"}}, {"name": "Sync mode", "group": "Status", "area": "holding", "address": "0x109E", "type": "uint16", "bit": 8, "bits": 8, "enum": {"1": "External sync", "2": "Internal sync 50 Hz", "3": "Internal sync 60 Hz"}}, {"name": "Energy mode", "group": "Status", "area": "holding", "address": "0x109E", "type": "uint16", "bit": 0, "bits": 8, "enum": {"1": "Time bands", "2": "Total / partial", "3": "Single counter"}}, {"name": "Neutral line mode", "group": "Status", "area": "holding", "address": "0x109F", "type": "uint16", "bit": 8, "bits": 8, "enum": {"1": "4-wire (with neutral)", "2": "3-wire"}}, {"name": "Phase mode", "group": "Status", "area": "holding", "address": "0x109F", "type": "uint16", "bit": 0, "bits": 8, "enum": {"1": "Three-phase unbalanced", "2": "Three-phase balanced", "3": "Single phase"}}, {"name": "CT ratio", "group": "Settings", "area": "holding", "address": "0x11A0", "type": "uint32", "access": "RW", "write_min": 1, "write_max": 2000, "description": "Current transformer ratio for L1-L2-L3"}, {"name": "VT ratio", "group": "Settings", "area": "holding", "address": "0x11A2", "type": "uint32", "scale": 0.1, "access": "RW", "write_min": 0.1, "write_max": 400, "description": "Voltage transformer ratio"}, {"name": "Pulse weight", "group": "Settings", "area": "holding", "address": "0x11A4", "type": "uint32", "access": "RW", "write_min": 1, "write_max": 4, "enum": {"1": "0.01 kWh-kvarh/pulse", "2": "0.1 kWh-kvarh/pulse", "3": "1 kWh-kvarh/pulse", "4": "10 kWh-kvarh/pulse"}}, {"name": "Neutral CT ratio", "group": "Settings", "area": "holding", "address": "0x11A6", "type": "uint32", "access": "RW", "write_min": 1, "write_max": 2000, "description": "Current transformer ratio for the neutral"}, {"name": "DO1 control", "group": "Commands", "area": "holding", "address": "0x11A8", "type": "uint32", "access": "W", "enum": "do_control", "description": "Output state in the high word, enable code 0x55AA in the low word. Only when DO1 is set to remote control"}, {"name": "DO2 control", "group": "Commands", "area": "holding", "address": "0x11AA", "type": "uint32", "access": "W", "enum": "do_control", "description": "Output state in the high word, enable code 0x55AA in the low word. Only when DO2 is set to remote control"}, {"name": "Reset energy counters", "group": "Commands", "area": "holding", "address": "0x11B0", "type": "uint32", "access": "W", "write_min": 296768938, "write_max": 296768938, "description": "Write 0x11B055AA"}, {"name": "Reset max instantaneous values", "group": "Commands", "area": "holding", "address": "0x11B2", "type": "uint32", "access": "W", "write_min": 296900010, "write_max": 296900010, "description": "Write 0x11B255AA"}, {"name": "Reset max demand values", "group": "Commands", "area": "holding", "address": "0x11B4", "type": "uint32", "access": "W", "write_min": 297031082, "write_max": 297031082, "description": "Write 0x11B455AA"}, {"name": "Reset all values", "group": "Commands", "area": "holding", "address": "0x11B6", "type": "uint32", "access": "W", "write_min": 297162154, "write_max": 297162154, "description": "Write 0x11B655AA: max values and counters"} ] }