{ "$schema": "https://raw.githubusercontent.com/nobrega8/mbmap-library/main/schema/mbmap-2.schema.json", "mbmap": 2, "vendor": "REDZ", "model": "LKM111 / LKM114", "models": ["LKM111", "LKM114"], "vendor_website": "redz-sc.com", "description": "IEC 62056-21 meter to Modbus RTU gateway with RS232 on the meter side; LKM111 has RS232 and LKM114 RS485 on the Modbus side. Reads one meter", "revision": 2, "source": "REDZ, \"LKM Series Electricity Meter Protocol to Modbus Protocol Gateways User Manual\", sections 6.1, 6.5-6.10 and 8 (standard 24-register firmware)", "notes": [ "REDZ LKM111 / LKM114.", "Standard firmware with the OBIS_EURO list (24 values per meter). Other firmware (OBIS_EURO_1..14, TRF, 64-register versions) keeps the same addresses but maps different OBIS codes, so the names below would be wrong for it.", "Data addresses: the manual's table lists them as 1, 3, 5... (1-based), while its Modbus Poll and ZTerminal examples read", "Time at wire address 0 and 1.8.0 at 4. This map follows the examples. The settings (128-133) and monitoring (160-189)", "addresses are wire addresses, as the FC06/FC16 examples show.", "Values are the read-out digits without the decimal point, so no scale or unit is given: they depend on the meter.", "Mode switch 1 (OFF-OFF): 19200 8N1 on the Modbus side, 300 baud auto-switching on the meter side.", "Tested on an LKM111 / LKM114 with one meter, November 2026. All 36 registers of the map were read without errors in 3 requests. Checked: the 32-bit word order (big), the meter values (time, date, energies, maximum demand), the settings, and the monitoring registers (IEC read counter, uptime, both firmware words). Instantaneous values (current, voltage, power factor, frequency) read 0 on the meter in use, so their scaling was not checked." ], "protocol": "rtu", "unit_id": 1, "baudrate": 19200, "parity": "N", "databits": 8, "stopbits": 1, "byte_order": "big", "word_order": "big", "address_base": 0, "enums": { "reading_method": {"0": "Method 1: full table + BCC (obsolete)", "1": "Method 2: line by line"} }, "x_status": "verified", "registers": [ {"name": "Time (0.9.1)", "group": "Meter 1", "area": "holding", "address": 0, "type": "uint32", "access": "R", "description": "OBIS 0.9.1. hhmmss as digits (10:25:07 reads 102507). 0 if not in the read-out"}, {"name": "Date (0.9.2)", "group": "Meter 1", "area": "holding", "address": 2, "type": "uint32", "access": "R", "description": "OBIS 0.9.2. yymmdd as digits (22-09-14 reads 220914). 0 if not in the read-out"}, {"name": "Active energy import A+ (1.8.0)", "group": "Meter 1", "area": "holding", "address": 4, "type": "uint32", "access": "R", "description": "OBIS 1.8.0. Digits of the read-out value without the decimal point (e.g. 6895.2317 reads 68952317): apply the meter's decimals. 0 if not in the read-out"}, {"name": "Active energy export A- (2.8.0)", "group": "Meter 1", "area": "holding", "address": 6, "type": "uint32", "access": "R", "description": "OBIS 2.8.0. Digits of the read-out value without the decimal point (e.g. 6895.2317 reads 68952317): apply the meter's decimals. 0 if not in the read-out"}, {"name": "Reactive energy R+ (3.8.0)", "group": "Meter 1", "area": "holding", "address": 8, "type": "uint32", "access": "R", "description": "OBIS 3.8.0. Digits of the read-out value without the decimal point (e.g. 6895.2317 reads 68952317): apply the meter's decimals. 0 if not in the read-out"}, {"name": "Reactive energy R- (4.8.0)", "group": "Meter 1", "area": "holding", "address": 10, "type": "uint32", "access": "R", "description": "OBIS 4.8.0. Digits of the read-out value without the decimal point (e.g. 6895.2317 reads 68952317): apply the meter's decimals. 0 if not in the read-out"}, {"name": "Reactive inductive energy import Q1 (5.8.0)", "group": "Meter 1", "area": "holding", "address": 12, "type": "uint32", "access": "R", "description": "OBIS 5.8.0. Digits of the read-out value without the decimal point (e.g. 6895.2317 reads 68952317): apply the meter's decimals. 0 if not in the read-out"}, {"name": "Reactive capacitive energy import Q2 (6.8.0)", "group": "Meter 1", "area": "holding", "address": 14, "type": "uint32", "access": "R", "description": "OBIS 6.8.0. Digits of the read-out value without the decimal point (e.g. 6895.2317 reads 68952317): apply the meter's decimals. 0 if not in the read-out"}, {"name": "Reactive inductive energy export Q3 (7.8.0)", "group": "Meter 1", "area": "holding", "address": 16, "type": "uint32", "access": "R", "description": "OBIS 7.8.0. Digits of the read-out value without the decimal point (e.g. 6895.2317 reads 68952317): apply the meter's decimals. 0 if not in the read-out"}, {"name": "Reactive capacitive energy export Q4 (8.8.0)", "group": "Meter 1", "area": "holding", "address": 18, "type": "uint32", "access": "R", "description": "OBIS 8.8.0. Digits of the read-out value without the decimal point (e.g. 6895.2317 reads 68952317): apply the meter's decimals. 0 if not in the read-out"}, {"name": "Maximum demand import P+max (1.6.0)", "group": "Meter 1", "area": "holding", "address": 20, "type": "uint32", "access": "R", "description": "OBIS 1.6.0. Digits of the read-out value without the decimal point (e.g. 6895.2317 reads 68952317): apply the meter's decimals. 0 if not in the read-out"}, {"name": "Maximum demand export P-max (2.6.0)", "group": "Meter 1", "area": "holding", "address": 22, "type": "uint32", "access": "R", "description": "OBIS 2.6.0. Digits of the read-out value without the decimal point (e.g. 6895.2317 reads 68952317): apply the meter's decimals. 0 if not in the read-out"}, {"name": "Average import power last period (1.5.0)", "group": "Meter 1", "area": "holding", "address": 24, "type": "uint32", "access": "R", "description": "OBIS 1.5.0. Digits of the read-out value without the decimal point (e.g. 6895.2317 reads 68952317): apply the meter's decimals. 0 if not in the read-out"}, {"name": "Active power import P+ (1.7.0)", "group": "Meter 1", "area": "holding", "address": 26, "type": "uint32", "access": "R", "description": "OBIS 1.7.0. Digits of the read-out value without the decimal point (e.g. 6895.2317 reads 68952317): apply the meter's decimals. 0 if not in the read-out"}, {"name": "Current L1 (31.7.0)", "group": "Meter 1", "area": "holding", "address": 28, "type": "uint32", "access": "R", "description": "OBIS 31.7.0. Digits of the read-out value without the decimal point (e.g. 6895.2317 reads 68952317): apply the meter's decimals. 0 if not in the read-out"}, {"name": "Current L2 (51.7.0)", "group": "Meter 1", "area": "holding", "address": 30, "type": "uint32", "access": "R", "description": "OBIS 51.7.0. Digits of the read-out value without the decimal point (e.g. 6895.2317 reads 68952317): apply the meter's decimals. 0 if not in the read-out"}, {"name": "Current L3 (71.7.0)", "group": "Meter 1", "area": "holding", "address": 32, "type": "uint32", "access": "R", "description": "OBIS 71.7.0. Digits of the read-out value without the decimal point (e.g. 6895.2317 reads 68952317): apply the meter's decimals. 0 if not in the read-out"}, {"name": "Voltage L1 (32.7.0)", "group": "Meter 1", "area": "holding", "address": 34, "type": "uint32", "access": "R", "description": "OBIS 32.7.0. Digits of the read-out value without the decimal point (e.g. 6895.2317 reads 68952317): apply the meter's decimals. 0 if not in the read-out"}, {"name": "Voltage L2 (52.7.0)", "group": "Meter 1", "area": "holding", "address": 36, "type": "uint32", "access": "R", "description": "OBIS 52.7.0. Digits of the read-out value without the decimal point (e.g. 6895.2317 reads 68952317): apply the meter's decimals. 0 if not in the read-out"}, {"name": "Voltage L3 (72.7.0)", "group": "Meter 1", "area": "holding", "address": 38, "type": "uint32", "access": "R", "description": "OBIS 72.7.0. Digits of the read-out value without the decimal point (e.g. 6895.2317 reads 68952317): apply the meter's decimals. 0 if not in the read-out"}, {"name": "Power factor (13.7.0)", "group": "Meter 1", "area": "holding", "address": 40, "type": "int32", "access": "R", "description": "OBIS 13.7.0. Can be negative; the manual lists UInt32. 0 if not in the read-out"}, {"name": "Frequency (14.7.0)", "group": "Meter 1", "area": "holding", "address": 42, "type": "uint32", "access": "R", "description": "OBIS 14.7.0. Digits of the read-out value without the decimal point (e.g. 6895.2317 reads 68952317): apply the meter's decimals. 0 if not in the read-out"}, {"name": "Meter number (C.1.0)", "group": "Meter 1", "area": "holding", "address": 44, "type": "uint32", "access": "R", "description": "OBIS C.1.0. Meter ID / serial number. 0 if not in the read-out"}, {"name": "Active power sum A+ - A- (16.7.0)", "group": "Meter 1", "area": "holding", "address": 46, "type": "int32", "access": "R", "description": "OBIS 16.7.0. Can be negative; the manual lists UInt32. 0 if not in the read-out"}, {"name": "Modbus address", "group": "Settings", "area": "holding", "address": 128, "type": "uint16", "access": "RW", "write_min": 1, "write_max": 247, "description": "Gateway slave id; answers the write with the old id"}, {"name": "Reading period", "group": "Settings", "area": "holding", "address": 129, "type": "uint16", "unit": "s", "access": "RW", "write_min": 1, "write_max": 255, "description": "Wait after each read attempt (default 10)"}, {"name": "Table code", "group": "Settings", "area": "holding", "address": 130, "type": "uint16", "access": "RW", "write_min": 0, "write_max": 255, "description": "ASCII code sent in the IEC 62056-21 option select message (0x30 = '0' default; 0x37 = '7')"}, {"name": "Reading method", "group": "Settings", "area": "holding", "address": 131, "type": "uint16", "access": "RW", "write_min": 0, "write_max": 1, "enum": "reading_method", "description": "Default 1"}, {"name": "Init string repeat count", "group": "Settings", "area": "holding", "address": 132, "type": "uint16", "access": "RW", "write_min": 0, "write_max": 4, "description": "Times the init string is sent before the request; 0 = off"}, {"name": "Meter count", "group": "Settings", "area": "holding", "address": 133, "type": "uint16", "access": "RW", "write_min": 1, "write_max": 1, "description": "Meters read on the bus (this model reads one meter)"}, {"name": "IEC address meter 1", "group": "Monitoring", "area": "holding", "address": 160, "type": "uint32", "access": "RW", "write_min": 0, "write_max": 4294967295, "description": "IEC 62056-21 device address (usually the serial number); 0 = not used. Write with FC16"}, {"name": "IEC read counter", "group": "Monitoring", "area": "holding", "address": 162, "type": "uint32", "access": "R", "description": "Successful meter reads"}, {"name": "Uptime", "group": "Monitoring", "area": "holding", "address": 164, "type": "uint32", "unit": "s", "access": "R", "description": "Seconds since power-up; the gateway restarts every 24 h"}, {"name": "Firmware original", "group": "Monitoring", "area": "holding", "address": 166, "type": "uint32", "access": "R", "description": "0xDDMYYYVV: day byte; month nibble; year 12 bits; version byte"}, {"name": "Firmware upgraded", "group": "Monitoring", "area": "holding", "address": 168, "type": "uint32", "access": "R", "description": "Same layout as Firmware original; differs after a field upgrade"}, {"name": "Init string", "group": "Monitoring", "area": "holding", "address": 170, "type": "uint32", "access": "RW", "write_min": 0, "write_max": 4294967295, "description": "4 wake-up bytes sent before the read-out (needs Init string repeat count >= 1). Write with FC16"} ] }