{
 "manufacturer": "ABB",
 "manufacturer_slug": "abb",
 "model": "EQ meter B21 (Modbus RTU)",
 "model_slug": "b21",
 "short_model": "B21",
 "aliases": [
  "B21",
  "EQ B21"
 ],
 "equipment_type": "Energy meter",
 "applies_to": "ABB EQ B21 single-phase 65 A DIN meter with the RS485 interface set to Modbus.",
 "summary": "The B21 is ABB's single-phase EQ DIN-rail kWh meter. Versions with the RS485 port talk Modbus RTU using the same hex-addressed holding-register map as the rest of the EQ family. This map keeps the values that make sense on a single-phase meter: total, tariff, L1 and resettable energy, L1 voltage, current, power, angles and power factor, identification, clock status, conversion factors and resets.",
 "transport": [
  "RTU"
 ],
 "defaults": {
  "unit_id": null,
  "baud": null,
  "parity": null,
  "data_bits": null,
  "stop_bits": null,
  "tcp_port": null
 },
 "addressing": {
  "convention": "hex 0-based",
  "note": "Start registers are printed in hex exactly as sent on the bus (5000 = 0x5000); the manual says not to subtract 40000 or 1. Function 3 reads, 6/16 write."
 },
 "default_word_order": "ABCD",
 "firmware": null,
 "source": {
  "title": "B21 User Manual",
  "doc_number": "2CMC485004M0201 Revision D",
  "revision_date": "2025-11-07",
  "url": "https://search.abb.com/library/Download.aspx?DocumentID=2CMC485004M0201&LanguageCode=en&DocumentPartId=&Action=Launch",
  "pages": "Chapter 9 'Communication with Modbus', mapping tables PDF pp. 65-74"
 },
 "notes": [
  "Addresses are printed in hexadecimal exactly as sent on the bus (the manual says not to subtract 40000 or 1). All data is in holding registers, read with function 3 and written with function 6 or 16.",
  "Multi-register values are big-endian: the most significant byte is the high byte of the lowest register, so 32-bit and 64-bit values are ABCD (high word first).",
  "Unsupported quantities still answer, but with an 'invalid' marker: FFFF in every register for unsigned values, and the largest positive value (7FFF, 7FFFFFFF ...) for signed values.",
  "Instantaneous power registers are signed 32-bit with 2 decimals, which caps them near +/-21 MW; for larger systems the manual points to the DMTME-compatible block, which reports whole watts.",
  "Built from the current manual revision. The 2013 Revision A also listed input states/counters, error/warning/alarm flag words, load-profile and log resets; the current revision no longer lists them, so they are left out.",
  "Left out: the DMTME-block energy registers (103E, 1040) whose unit is printed as 'Wh*100' / 'VArh*100', which does not make the scaling direction unambiguous.",
  "Left out: event-log, alarm-configuration, pulse-output and tariff-configuration register groups, which work through selector/header registers or OBIS-coded multi-register fields rather than simple point reads.",
  "The B21 manual reprints the full EQ mapping, including L2/L3, line-to-line and 3-phase quantities; those are left out here because a single-phase meter returns the 'invalid' marker for them.",
  "Outputs 1 and 2 (6300, 6301) are the only Modbus I/O registers listed. The reset table still lists input counter / stored-state resets for inputs 1-4 (8F0B-8F16), but no input registers are mapped, so those resets are left out.",
  "Left out: date/time (8A00) and power outage time (8A39), which pack bytes across three registers rather than a standard data type.",
  "Resettable reactive energy import/export (5534, 5538): the manual's Unit column prints 'kWh' for these two rows, while the quantity name is reactive energy. Size (4 registers), resolution (0,01) and data type (Unsigned) are printed unambiguously and match the other reactive registers, so they are kept and listed as kvarh; the unit is the only misprint."
 ],
 "integration": {
  "summary": "Switch the RS485 port to Modbus in the meter menu, then poll holding registers with function 3 at their hex addresses. Energy is 64-bit (4 registers) with 0.01 resolution, high word first.",
  "minimum_registers": [
   {
    "table": "holding_register",
    "address": 20480,
    "why": "Total active import energy"
   },
   {
    "table": "holding_register",
    "address": 20484,
    "why": "Total active export energy"
   },
   {
    "table": "holding_register",
    "address": 23296,
    "why": "Voltage L1-N"
   },
   {
    "table": "holding_register",
    "address": 23308,
    "why": "Current L1"
   },
   {
    "table": "holding_register",
    "address": 23316,
    "why": "Total active power"
   },
   {
    "table": "holding_register",
    "address": 23340,
    "why": "Frequency"
   },
   {
    "table": "holding_register",
    "address": 35072,
    "why": "Serial number"
   }
  ],
  "enable": "In the meter menu, open the RS485 communication settings and set the protocol to Modbus (not EQ-Bus), then set baud rate, address and parity.",
  "watchdog": null,
  "quirks": [
   "Hex wire addresses, no 40001 offset.",
   "Readable range 0x1000-0x8EFF, up to 125 registers per request.",
   "Missing quantities return FFFF / 7FFF... rather than an exception."
  ],
  "setup": [
   "Address range 1-247.",
   "Modbus baud rates: 1200 to 115200; parity None, Odd or Even."
  ],
  "gotchas": [
   "Modbus is carried on the RS485 port; M-Bus variants use M-Bus instead.",
   "Writes to unsupported registers are not rejected; read back to confirm."
  ]
 },
 "registers": [
  {
   "table": "holding_register",
   "address": 4098,
   "documented": "1002",
   "name": "DMTME phase voltage L1-N",
   "description": "DMTME-compatible block, whole units.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 1,
   "units": "V",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 4112,
   "documented": "1010",
   "name": "DMTME line current L1",
   "description": "DMTME-compatible block.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 1,
   "units": "mA",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 4120,
   "documented": "1018",
   "name": "DMTME power factor L1",
   "description": "DMTME-compatible block; published as PF x 1000.",
   "data_type": "INT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.001,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 4136,
   "documented": "1028",
   "name": "DMTME apparent power L1",
   "description": "DMTME-compatible block, whole units.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 1,
   "units": "VA",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 4144,
   "documented": "1030",
   "name": "DMTME active power L1",
   "description": "DMTME-compatible block, whole units.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 1,
   "units": "W",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 4152,
   "documented": "1038",
   "name": "DMTME reactive power L1",
   "description": "DMTME-compatible block, whole units.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 1,
   "units": "var",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 4166,
   "documented": "1046",
   "name": "DMTME frequency",
   "description": "DMTME-compatible block.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 1,
   "units": "mHz",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 4512,
   "documented": "11A0",
   "name": "DMTME current transformer ratio",
   "description": "DMTME-compatible block.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 4514,
   "documented": "11A2",
   "name": "DMTME voltage transformer ratio",
   "description": "DMTME-compatible block.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20480,
   "documented": "5000",
   "name": "Active import energy",
   "description": "Total accumulator, 2 decimals.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "kWh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20484,
   "documented": "5004",
   "name": "Active export energy",
   "description": "Total accumulator, 2 decimals.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "kWh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20488,
   "documented": "5008",
   "name": "Active net energy",
   "description": "Import minus export, signed.",
   "data_type": "INT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "kWh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20492,
   "documented": "500C",
   "name": "Reactive import energy",
   "description": "Total accumulator, 2 decimals.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "kvarh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20496,
   "documented": "5010",
   "name": "Reactive export energy",
   "description": "Total accumulator, 2 decimals.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "kvarh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20500,
   "documented": "5014",
   "name": "Reactive net energy",
   "description": "Import minus export, signed.",
   "data_type": "INT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "kvarh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20504,
   "documented": "5018",
   "name": "Apparent import energy",
   "description": "Total accumulator, 2 decimals.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "kVAh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20508,
   "documented": "501C",
   "name": "Apparent export energy",
   "description": "Total accumulator, 2 decimals.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "kVAh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20512,
   "documented": "5020",
   "name": "Apparent net energy",
   "description": "Import minus export, signed.",
   "data_type": "INT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "kVAh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20516,
   "documented": "5024",
   "name": "Active import CO2",
   "description": "CO2 equivalent of imported active energy.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 0.001,
   "units": "kg",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20532,
   "documented": "5034",
   "name": "Active import currency",
   "description": "Cost equivalent of imported active energy.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 0.001,
   "units": "currency",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20848,
   "documented": "5170",
   "name": "Active import tariff 1",
   "description": "",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "kWh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20852,
   "documented": "5174",
   "name": "Active import tariff 2",
   "description": "",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "kWh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20856,
   "documented": "5178",
   "name": "Active import tariff 3",
   "description": "",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "kWh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20860,
   "documented": "517C",
   "name": "Active import tariff 4",
   "description": "",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "kWh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20880,
   "documented": "5190",
   "name": "Active export tariff 1",
   "description": "",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "kWh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20884,
   "documented": "5194",
   "name": "Active export tariff 2",
   "description": "",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "kWh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20888,
   "documented": "5198",
   "name": "Active export tariff 3",
   "description": "",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "kWh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20892,
   "documented": "519C",
   "name": "Active export tariff 4",
   "description": "",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "kWh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20912,
   "documented": "51B0",
   "name": "Reactive import tariff 1",
   "description": "",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "kvarh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20916,
   "documented": "51B4",
   "name": "Reactive import tariff 2",
   "description": "",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "kvarh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20920,
   "documented": "51B8",
   "name": "Reactive import tariff 3",
   "description": "",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "kvarh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20924,
   "documented": "51BC",
   "name": "Reactive import tariff 4",
   "description": "",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "kvarh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20944,
   "documented": "51D0",
   "name": "Reactive export tariff 1",
   "description": "",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "kvarh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20948,
   "documented": "51D4",
   "name": "Reactive export tariff 2",
   "description": "",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "kvarh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20952,
   "documented": "51D8",
   "name": "Reactive export tariff 3",
   "description": "",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "kvarh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20956,
   "documented": "51DC",
   "name": "Reactive export tariff 4",
   "description": "",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "kvarh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 21600,
   "documented": "5460",
   "name": "Active import energy L1",
   "description": "",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "kWh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 21612,
   "documented": "546C",
   "name": "Active export energy L1",
   "description": "",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "kWh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 21624,
   "documented": "5478",
   "name": "Active net energy L1",
   "description": "",
   "data_type": "INT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "kWh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 21636,
   "documented": "5484",
   "name": "Reactive import energy L1",
   "description": "",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "kvarh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 21648,
   "documented": "5490",
   "name": "Reactive export energy L1",
   "description": "",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "kvarh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 21660,
   "documented": "549C",
   "name": "Reactive net energy L1",
   "description": "",
   "data_type": "INT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "kvarh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 21804,
   "documented": "552C",
   "name": "Resettable active import",
   "description": "",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "kWh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 21808,
   "documented": "5530",
   "name": "Resettable active export",
   "description": "",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "kWh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 21812,
   "documented": "5534",
   "name": "Resettable reactive import",
   "description": "Manual's Unit column prints 'kWh' (res. 0,01, 4 regs, Unsigned); listed as kvarh.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "kvarh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 21816,
   "documented": "5538",
   "name": "Resettable reactive export",
   "description": "Manual's Unit column prints 'kWh' (res. 0,01, 4 regs, Unsigned); listed as kvarh.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "kvarh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 23296,
   "documented": "5B00",
   "name": "Voltage L1-N",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.1,
   "units": "V",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 23308,
   "documented": "5B0C",
   "name": "Current L1",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "A",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 23316,
   "documented": "5B14",
   "name": "Active power Total",
   "description": "Signed; see note on the ~21 MW range limit.",
   "data_type": "INT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "W",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 23318,
   "documented": "5B16",
   "name": "Active power L1",
   "description": "",
   "data_type": "INT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "W",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 23324,
   "documented": "5B1C",
   "name": "Reactive power Total",
   "description": "Signed; see note on the ~21 MW range limit.",
   "data_type": "INT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "var",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 23326,
   "documented": "5B1E",
   "name": "Reactive power L1",
   "description": "",
   "data_type": "INT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "var",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 23332,
   "documented": "5B24",
   "name": "Apparent power Total",
   "description": "Signed; see note on the ~21 MW range limit.",
   "data_type": "INT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "VA",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 23334,
   "documented": "5B26",
   "name": "Apparent power L1",
   "description": "",
   "data_type": "INT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "VA",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 23340,
   "documented": "5B2C",
   "name": "Frequency",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.01,
   "units": "Hz",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 23341,
   "documented": "5B2D",
   "name": "Phase angle power Total",
   "description": "Range -180 to +180.",
   "data_type": "INT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "°",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 23342,
   "documented": "5B2E",
   "name": "Phase angle power L1",
   "description": "Range -180 to +180.",
   "data_type": "INT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "°",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 23345,
   "documented": "5B31",
   "name": "Phase angle voltage L1",
   "description": "",
   "data_type": "INT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "°",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 23351,
   "documented": "5B37",
   "name": "Phase angle current L1",
   "description": "",
   "data_type": "INT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "°",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 23354,
   "documented": "5B3A",
   "name": "Power factor Total",
   "description": "Range -1.000 to +1.000.",
   "data_type": "INT16",
   "length": 1,
   "word_order": null,
   "scale": 0.001,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 23355,
   "documented": "5B3B",
   "name": "Power factor L1",
   "description": "Range -1.000 to +1.000.",
   "data_type": "INT16",
   "length": 1,
   "word_order": null,
   "scale": 0.001,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 23358,
   "documented": "5B3E",
   "name": "Current quadrant Total",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": {
    "1": "Quadrant 1",
    "2": "Quadrant 2",
    "3": "Quadrant 3",
    "4": "Quadrant 4"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 23359,
   "documented": "5B3F",
   "name": "Current quadrant L1",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": {
    "1": "Quadrant 1",
    "2": "Quadrant 2",
    "3": "Quadrant 3",
    "4": "Quadrant 4"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 25344,
   "documented": "6300",
   "name": "Output 1",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "OFF",
    "1": "ON"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 25345,
   "documented": "6301",
   "name": "Output 2",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "OFF",
    "1": "ON"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 35072,
   "documented": "8900",
   "name": "Serial number",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 35080,
   "documented": "8908",
   "name": "Meter firmware version",
   "description": "ASCII, e.g. 1.0.0; unused bytes are 0.",
   "data_type": "STRING",
   "length": 8,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 35088,
   "documented": "8910",
   "name": "Modbus mapping version",
   "description": "High byte = major, low byte = minor version.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 35168,
   "documented": "8960",
   "name": "Type designation",
   "description": "ASCII, 12 characters including null terminator.",
   "data_type": "STRING",
   "length": 6,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 35331,
   "documented": "8A03",
   "name": "Day of week",
   "description": "1-7, Monday = 1.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 35332,
   "documented": "8A04",
   "name": "DST active",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": {
    "0": "DST inactive",
    "1": "DST active"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 35333,
   "documented": "8A05",
   "name": "Day type",
   "description": "0-3 means day type 1-4.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 35334,
   "documented": "8A06",
   "name": "Season",
   "description": "0-3 means season 1-4.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 35335,
   "documented": "8A07",
   "name": "Current tariff",
   "description": "Active tariff, 1 to 4.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 35375,
   "documented": "8A2F",
   "name": "Power fail counter",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 35400,
   "documented": "8A48",
   "name": "Reset counter active energy import",
   "description": "Times the resettable register was cleared.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 35404,
   "documented": "8A4C",
   "name": "Reset counter active energy export",
   "description": "",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 35408,
   "documented": "8A50",
   "name": "Reset counter reactive energy import",
   "description": "",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 35412,
   "documented": "8A54",
   "name": "Reset counter reactive energy export",
   "description": "",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "ABCD",
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 35844,
   "documented": "8C04",
   "name": "CT ratio numerator",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 35846,
   "documented": "8C06",
   "name": "VT ratio numerator",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 35848,
   "documented": "8C08",
   "name": "CT ratio denominator",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 35850,
   "documented": "8C0A",
   "name": "VT ratio denominator",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 36064,
   "documented": "8CE0",
   "name": "CO2 conversion factor",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.001,
   "units": "kg/kWh",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 36066,
   "documented": "8CE2",
   "name": "Currency conversion factor",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "Currency/kWh",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 36068,
   "documented": "8CE4",
   "name": "LED source",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "Active energy",
    "1": "Reactive energy"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 36069,
   "documented": "8CE5",
   "name": "Number of elements",
   "description": "Measuring elements, 1 to 3.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 36608,
   "documented": "8F00",
   "name": "Reset power fail counter",
   "description": "Write 1 to reset.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "W",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 36613,
   "documented": "8F05",
   "name": "Reset power outage time",
   "description": "Write 1 to reset.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "W",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 36635,
   "documented": "8F1B",
   "name": "Reset resettable active energy import",
   "description": "Write 1 to reset.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "W",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 36636,
   "documented": "8F1C",
   "name": "Reset resettable active energy export",
   "description": "Write 1 to reset.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "W",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 36637,
   "documented": "8F1D",
   "name": "Reset resettable reactive energy import",
   "description": "Write 1 to reset.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "W",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 36638,
   "documented": "8F1E",
   "name": "Reset resettable reactive energy export",
   "description": "Write 1 to reset.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "W",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 36639,
   "documented": "8F1F",
   "name": "Reset previous values",
   "description": "Write 1 to reset.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "W",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 36640,
   "documented": "8F20",
   "name": "Reset demand",
   "description": "Write 1 to reset.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "W",
   "values": null,
   "bits": null,
   "offset": 0
  }
 ],
 "page": "https://easymodbus.com/modbus-register-maps/abb/b21",
 "address_note": "address = 0-based Modbus wire (PDU) address; documented = as printed in the source.",
 "note": "Re-typed from the manufacturer's public documentation (see source) and verified against it. Registers vary by firmware and options; verify against the live device before writing."
}
