{ "$schema": "https://raw.githubusercontent.com/nobrega8/mbmap-library/main/schema/mbmap-2.schema.json", "mbmap": 2, "vendor": "ABB", "model": "B21", "models": ["B21"], "vendor_website": "abb.com", "description": "Single-phase DIN rail energy meter of the EQ B-series (direct connected, 65 A), Modbus RTU over RS485", "revision": 3, "revised": "2026-10-18", "source": "ABB, \"B21 User Manual\", 2CMC485004M0201 revision D (2025-11-07); https://library.abb.com/d/2CMC485004M0201", "sources": [{"title": "B21 User Manual", "version": "2CMC485004M0201 revision D", "date": "2025-11-07", "url": "https://library.abb.com/d/2CMC485004M0201"}], "notes": [ "ABB EQ meter B21 (single phase, direct connected, 65 A) with RS485, protocol set to Modbus.", "Addresses are exactly as sent on the bus. Readable range is 0x1000-0x8EFF; any block of 1-125 registers works.", "The manual lists the common EQ mapping; only the single-phase quantities are in this map. The others read as \"invalid\".", "Quantities a model does not have read as \"invalid\": all FFFF for unsigned, the largest positive value for signed.", "Outputs, tariffs, resettable registers, CO2 and currency depend on the variant (Steel, Bronze, Silver). Steel meters (B21 1xx-xxx) only have import registers.", "The manual does not state the factory RS485 settings; check them on the meter display." ], "protocol": "rtu", "unit_id": 1, "byte_order": "big", "word_order": "big", "address_base": 0, "max_read_registers": 125, "enums": { "off_on": {"0": "Off", "1": "On"} }, "sentinels": { "uint16": {"0xFFFF": "Invalid"}, "int16": {"0x7FFF": "Invalid"}, "uint32": {"0xFFFFFFFF": "Invalid"}, "int32": {"0x7FFFFFFF": "Invalid"}, "uint64": {"0xFFFFFFFFFFFFFFFF": "Invalid"}, "int64": {"0x7FFFFFFFFFFFFFFF": "Invalid"} }, "x_status": "official", "registers": [ {"name": "Active energy import", "group": "Energy", "area": "holding", "address": "0x5000", "type": "uint64", "scale": 0.01, "unit": "kWh", "access": "R"}, {"name": "Active energy export", "group": "Energy", "area": "holding", "address": "0x5004", "type": "uint64", "scale": 0.01, "unit": "kWh", "access": "R"}, {"name": "Active energy net", "group": "Energy", "area": "holding", "address": "0x5008", "type": "int64", "scale": 0.01, "unit": "kWh", "access": "R", "description": "Import minus export"}, {"name": "Reactive energy import", "group": "Energy", "area": "holding", "address": "0x500C", "type": "uint64", "scale": 0.01, "unit": "kvarh", "access": "R"}, {"name": "Reactive energy export", "group": "Energy", "area": "holding", "address": "0x5010", "type": "uint64", "scale": 0.01, "unit": "kvarh", "access": "R"}, {"name": "Reactive energy net", "group": "Energy", "area": "holding", "address": "0x5014", "type": "int64", "scale": 0.01, "unit": "kvarh", "access": "R"}, {"name": "Apparent energy import", "group": "Energy", "area": "holding", "address": "0x5018", "type": "uint64", "scale": 0.01, "unit": "kVAh", "access": "R"}, {"name": "Apparent energy export", "group": "Energy", "area": "holding", "address": "0x501C", "type": "uint64", "scale": 0.01, "unit": "kVAh", "access": "R"}, {"name": "Apparent energy net", "group": "Energy", "area": "holding", "address": "0x5020", "type": "int64", "scale": 0.01, "unit": "kVAh", "access": "R"}, {"name": "CO2 for active import", "group": "Energy", "area": "holding", "address": "0x5024", "type": "uint64", "scale": 0.001, "unit": "kg", "access": "R", "description": "Uses the CO2 conversion factor at 0x8CE0"}, {"name": "Currency for active import", "group": "Energy", "area": "holding", "address": "0x5034", "type": "uint64", "scale": 0.001, "access": "R", "description": "Uses the currency conversion factor at 0x8CE2"}, {"name": "Active energy import tariff 1", "group": "Tariffs", "area": "holding", "address": "0x5170", "type": "uint64", "scale": 0.01, "unit": "kWh", "access": "R"}, {"name": "Active energy import tariff 2", "group": "Tariffs", "area": "holding", "address": "0x5174", "type": "uint64", "scale": 0.01, "unit": "kWh", "access": "R"}, {"name": "Active energy import tariff 3", "group": "Tariffs", "area": "holding", "address": "0x5178", "type": "uint64", "scale": 0.01, "unit": "kWh", "access": "R"}, {"name": "Active energy import tariff 4", "group": "Tariffs", "area": "holding", "address": "0x517C", "type": "uint64", "scale": 0.01, "unit": "kWh", "access": "R"}, {"name": "Active energy export tariff 1", "group": "Tariffs", "area": "holding", "address": "0x5190", "type": "uint64", "scale": 0.01, "unit": "kWh", "access": "R"}, {"name": "Active energy export tariff 2", "group": "Tariffs", "area": "holding", "address": "0x5194", "type": "uint64", "scale": 0.01, "unit": "kWh", "access": "R"}, {"name": "Active energy export tariff 3", "group": "Tariffs", "area": "holding", "address": "0x5198", "type": "uint64", "scale": 0.01, "unit": "kWh", "access": "R"}, {"name": "Active energy export tariff 4", "group": "Tariffs", "area": "holding", "address": "0x519C", "type": "uint64", "scale": 0.01, "unit": "kWh", "access": "R"}, {"name": "Reactive energy import tariff 1", "group": "Tariffs", "area": "holding", "address": "0x51B0", "type": "uint64", "scale": 0.01, "unit": "kvarh", "access": "R"}, {"name": "Reactive energy import tariff 2", "group": "Tariffs", "area": "holding", "address": "0x51B4", "type": "uint64", "scale": 0.01, "unit": "kvarh", "access": "R"}, {"name": "Reactive energy import tariff 3", "group": "Tariffs", "area": "holding", "address": "0x51B8", "type": "uint64", "scale": 0.01, "unit": "kvarh", "access": "R"}, {"name": "Reactive energy import tariff 4", "group": "Tariffs", "area": "holding", "address": "0x51BC", "type": "uint64", "scale": 0.01, "unit": "kvarh", "access": "R"}, {"name": "Reactive energy export tariff 1", "group": "Tariffs", "area": "holding", "address": "0x51D0", "type": "uint64", "scale": 0.01, "unit": "kvarh", "access": "R"}, {"name": "Reactive energy export tariff 2", "group": "Tariffs", "area": "holding", "address": "0x51D4", "type": "uint64", "scale": 0.01, "unit": "kvarh", "access": "R"}, {"name": "Reactive energy export tariff 3", "group": "Tariffs", "area": "holding", "address": "0x51D8", "type": "uint64", "scale": 0.01, "unit": "kvarh", "access": "R"}, {"name": "Reactive energy export tariff 4", "group": "Tariffs", "area": "holding", "address": "0x51DC", "type": "uint64", "scale": 0.01, "unit": "kvarh", "access": "R"}, {"name": "Resettable active energy import", "group": "Resettable energy", "area": "holding", "address": "0x552C", "type": "uint64", "scale": 0.01, "unit": "kWh", "access": "R"}, {"name": "Resettable active energy export", "group": "Resettable energy", "area": "holding", "address": "0x5530", "type": "uint64", "scale": 0.01, "unit": "kWh", "access": "R"}, {"name": "Resettable reactive energy import", "group": "Resettable energy", "area": "holding", "address": "0x5534", "type": "uint64", "scale": 0.01, "unit": "kvarh", "access": "R", "description": "The manual's table gives kWh; kvarh assumed"}, {"name": "Resettable reactive energy export", "group": "Resettable energy", "area": "holding", "address": "0x5538", "type": "uint64", "scale": 0.01, "unit": "kvarh", "access": "R", "description": "The manual's table gives kWh; kvarh assumed"}, {"name": "Voltage L1-N", "group": "Voltage", "area": "holding", "address": "0x5B00", "type": "uint32", "scale": 0.1, "unit": "V", "access": "R"}, {"name": "Current L1", "group": "Current", "area": "holding", "address": "0x5B0C", "type": "uint32", "scale": 0.01, "unit": "A", "access": "R"}, {"name": "Total active power", "group": "Power", "area": "holding", "address": "0x5B14", "type": "int32", "scale": 0.01, "unit": "W", "access": "R", "description": "Limited to about ±21 MW; use the DMTME block above that"}, {"name": "Active power L1", "group": "Power", "area": "holding", "address": "0x5B16", "type": "int32", "scale": 0.01, "unit": "W", "access": "R"}, {"name": "Total reactive power", "group": "Power", "area": "holding", "address": "0x5B1C", "type": "int32", "scale": 0.01, "unit": "var", "access": "R"}, {"name": "Reactive power L1", "group": "Power", "area": "holding", "address": "0x5B1E", "type": "int32", "scale": 0.01, "unit": "var", "access": "R"}, {"name": "Total apparent power", "group": "Power", "area": "holding", "address": "0x5B24", "type": "int32", "scale": 0.01, "unit": "VA", "access": "R"}, {"name": "Apparent power L1", "group": "Power", "area": "holding", "address": "0x5B26", "type": "int32", "scale": 0.01, "unit": "VA", "access": "R"}, {"name": "Frequency", "group": "Power", "area": "holding", "address": "0x5B2C", "type": "uint16", "scale": 0.01, "unit": "Hz", "access": "R"}, {"name": "Power angle total", "group": "Angles", "area": "holding", "address": "0x5B2D", "type": "int16", "scale": 0.1, "unit": "°", "access": "R", "description": "-180 to +180"}, {"name": "Power angle L1", "group": "Angles", "area": "holding", "address": "0x5B2E", "type": "int16", "scale": 0.1, "unit": "°", "access": "R"}, {"name": "Voltage angle L1", "group": "Angles", "area": "holding", "address": "0x5B31", "type": "int16", "scale": 0.1, "unit": "°", "access": "R"}, {"name": "Current angle L1", "group": "Angles", "area": "holding", "address": "0x5B37", "type": "int16", "scale": 0.1, "unit": "°", "access": "R"}, {"name": "Total power factor", "group": "Power factor", "area": "holding", "address": "0x5B3A", "type": "int16", "scale": 0.001, "access": "R"}, {"name": "Power factor L1", "group": "Power factor", "area": "holding", "address": "0x5B3B", "type": "int16", "scale": 0.001, "access": "R"}, {"name": "Quadrant total", "group": "Power factor", "area": "holding", "address": "0x5B3E", "type": "uint16", "access": "R", "description": "1-4"}, {"name": "Quadrant L1", "group": "Power factor", "area": "holding", "address": "0x5B3F", "type": "uint16", "access": "R", "description": "1-4"}, {"name": "DMTME total active power", "group": "DMTME compatible", "area": "holding", "address": "0x102E", "type": "uint32", "unit": "W", "access": "R", "description": "No decimals; for powers above ±21 MW"}, {"name": "DMTME total reactive power", "group": "DMTME compatible", "area": "holding", "address": "0x1036", "type": "uint32", "unit": "var", "access": "R", "description": "No decimals"}, {"name": "DMTME total apparent power", "group": "DMTME compatible", "area": "holding", "address": "0x1026", "type": "uint32", "unit": "VA", "access": "R", "description": "No decimals"}, {"name": "Output 1", "group": "I/O", "area": "holding", "address": "0x6300", "type": "uint16", "access": "RW", "enum": "off_on"}, {"name": "Output 2", "group": "I/O", "area": "holding", "address": "0x6301", "type": "uint16", "access": "RW", "enum": "off_on"}, {"name": "Serial number", "group": "Info", "area": "holding", "address": "0x8900", "type": "uint32", "access": "R", "role": "serial"}, {"name": "Firmware version", "group": "Info", "area": "holding", "address": "0x8908", "type": "string", "length": 8, "access": "R", "role": "firmware", "description": "Digits separated by periods, e.g. 1.0.0"}, {"name": "Modbus mapping major version", "group": "Info", "area": "holding", "address": "0x8910", "type": "uint16", "bit": 8, "bits": 8, "access": "R"}, {"name": "Modbus mapping minor version", "group": "Info", "area": "holding", "address": "0x8910", "type": "uint16", "bit": 0, "bits": 8, "access": "R"}, {"name": "Type designation", "group": "Info", "area": "holding", "address": "0x8960", "type": "string", "length": 6, "access": "R", "description": "e.g. B21 312-100"}, {"name": "Clock year", "group": "Clock", "area": "holding", "address": "0x8A00", "type": "uint16", "bit": 8, "bits": 8, "access": "R", "description": "Year byte of the date/time; the date/time is written as one 3-register value, not field by field"}, {"name": "Clock month", "group": "Clock", "area": "holding", "address": "0x8A00", "type": "uint16", "bit": 0, "bits": 8, "access": "R"}, {"name": "Clock day", "group": "Clock", "area": "holding", "address": "0x8A01", "type": "uint16", "bit": 8, "bits": 8, "access": "R"}, {"name": "Clock hour", "group": "Clock", "area": "holding", "address": "0x8A01", "type": "uint16", "bit": 0, "bits": 8, "access": "R"}, {"name": "Clock minute", "group": "Clock", "area": "holding", "address": "0x8A02", "type": "uint16", "bit": 8, "bits": 8, "access": "R"}, {"name": "Clock second", "group": "Clock", "area": "holding", "address": "0x8A02", "type": "uint16", "bit": 0, "bits": 8, "access": "R"}, {"name": "Day of week", "group": "Clock", "area": "holding", "address": "0x8A03", "type": "uint16", "access": "R", "enum": {"1": "Monday", "2": "Tuesday", "3": "Wednesday", "4": "Thursday", "5": "Friday", "6": "Saturday", "7": "Sunday"}}, {"name": "DST active", "group": "Clock", "area": "holding", "address": "0x8A04", "type": "uint16", "access": "R", "enum": "off_on"}, {"name": "Day type", "group": "Clock", "area": "holding", "address": "0x8A05", "type": "uint16", "access": "R", "description": "0-3 = day type 1-4"}, {"name": "Season", "group": "Clock", "area": "holding", "address": "0x8A06", "type": "uint16", "access": "R", "description": "0-3 = season 1-4"}, {"name": "Current tariff", "group": "Status", "area": "holding", "address": "0x8A07", "type": "uint16", "access": "RW", "write_min": 1, "write_max": 4, "enum": {"1": "Tariff 1", "2": "Tariff 2", "3": "Tariff 3", "4": "Tariff 4"}}, {"name": "Power fail counter", "group": "Status", "area": "holding", "address": "0x8A2F", "type": "uint16", "access": "R"}, {"name": "Last power outage hours", "group": "Status", "area": "holding", "address": "0x8A3A", "type": "uint16", "bit": 0, "bits": 8, "unit": "h", "access": "R", "description": "Duration of the last outage; its days (3 bytes from 0x8A39) are not in this map", "comment": "Bytes 0-2 days, 3 hours, 4 minutes, 5 seconds"}, {"name": "Last power outage minutes", "group": "Status", "area": "holding", "address": "0x8A3B", "type": "uint16", "bit": 8, "bits": 8, "unit": "min", "access": "R"}, {"name": "Last power outage seconds", "group": "Status", "area": "holding", "address": "0x8A3B", "type": "uint16", "bit": 0, "bits": 8, "unit": "s", "access": "R"}, {"name": "Reset count active energy import", "group": "Status", "area": "holding", "address": "0x8A48", "type": "uint64", "access": "R", "description": "Times the resettable register was reset"}, {"name": "Reset count active energy export", "group": "Status", "area": "holding", "address": "0x8A4C", "type": "uint64", "access": "R"}, {"name": "Reset count reactive energy import", "group": "Status", "area": "holding", "address": "0x8A50", "type": "uint64", "access": "R"}, {"name": "Reset count reactive energy export", "group": "Status", "area": "holding", "address": "0x8A54", "type": "uint64", "access": "R"}, {"name": "CO2 conversion factor", "group": "Settings", "area": "holding", "address": "0x8CE0", "type": "uint32", "scale": 0.001, "unit": "kg/kWh", "access": "RW"}, {"name": "Currency conversion factor", "group": "Settings", "area": "holding", "address": "0x8CE2", "type": "uint32", "scale": 0.01, "access": "RW", "description": "Currency per kWh"}, {"name": "LED source", "group": "Settings", "area": "holding", "address": "0x8CE4", "type": "uint16", "access": "RW", "enum": {"0": "Active energy", "1": "Reactive energy"}}, {"name": "Number of elements", "group": "Settings", "area": "holding", "address": "0x8CE5", "type": "uint16", "access": "R", "description": "1-3"}, {"name": "Reset power fail counter", "group": "Commands", "area": "holding", "address": "0x8F00", "type": "uint16", "access": "W", "enum": {"1": "Reset"}}, {"name": "Reset power outage time", "group": "Commands", "area": "holding", "address": "0x8F05", "type": "uint16", "access": "W", "enum": {"1": "Reset"}}, {"name": "Reset resettable active energy import", "group": "Commands", "area": "holding", "address": "0x8F1B", "type": "uint16", "access": "W", "enum": {"1": "Reset"}}, {"name": "Reset resettable active energy export", "group": "Commands", "area": "holding", "address": "0x8F1C", "type": "uint16", "access": "W", "enum": {"1": "Reset"}}, {"name": "Reset resettable reactive energy import", "group": "Commands", "area": "holding", "address": "0x8F1D", "type": "uint16", "access": "W", "enum": {"1": "Reset"}}, {"name": "Reset resettable reactive energy export", "group": "Commands", "area": "holding", "address": "0x8F1E", "type": "uint16", "access": "W", "enum": {"1": "Reset"}}, {"name": "Reset previous values", "group": "Commands", "area": "holding", "address": "0x8F1F", "type": "uint16", "access": "W", "enum": {"1": "Reset"}}, {"name": "Reset demand", "group": "Commands", "area": "holding", "address": "0x8F20", "type": "uint16", "access": "W", "enum": {"1": "Reset"}} ] }