{
  "$schema": "https://raw.githubusercontent.com/nobrega8/mbmap-library/main/schema/mbmap-2.schema.json",
  "mbmap": 2,
  "vendor": "REDZ",
  "model": "LKM124 / LKM614",
  "models": [
    "LKM124",
    "LKM614"
  ],
  "vendor_website": "redz-sc.com",
  "description": "P1 Companion Standard meter to Modbus RTU gateway, 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)",
  "sources": [
    {
      "title": "LKM Series Electricity Meter Protocol to Modbus Protocol Gateways User Manual",
      "note": "sections 6.1, 6.5-6.10 and 8 (standard 24-register firmware)"
    }
  ],
  "notes": [
    "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): 9600 8N1; modes 2-4 are 19200, 57600 and 115200 8N1 on both sides.",
    "Table code, reading method and init string are IEC 62056-21 settings; the manual does not say whether the P1 firmware uses them.",
    "Mode switch 1 (OFF-OFF): 19200 8N1 on the Modbus side, 300 baud auto-switching on the meter side."
  ],
  "protocol": "rtu",
  "unit_id": 1,
  "baudrate": 9600,
  "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": "official",
  "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"
    }
  ]
}