{
  "$schema": "https://raw.githubusercontent.com/nobrega8/mbmap-library/main/schema/mbmap-2.schema.json",
  "mbmap": 2,
  "vendor": "Shelly",
  "model": "Pro 3EM",
  "models": ["Pro 3EM"],
  "vendor_website": "shelly.com",
  "description": "Three-phase energy meter with Modbus TCP",
  "revision": 2,
  "revised": "2026-10-18",
  "source": "Shelly Gen2 API documentation: Modbus, EM and EMData components",
  "sources": [
    {
      "title": "Shelly Gen2 API: Modbus",
      "url": "https://shelly-api-docs.shelly.cloud/gen2/ComponentsAndServices/Modbus"
    },
    {
      "title": "Shelly Gen2 API: EM",
      "url": "https://shelly-api-docs.shelly.cloud/gen2/ComponentsAndServices/EM",
      "note": "Modbus registers table"
    },
    {
      "title": "Shelly Gen2 API: EMData",
      "url": "https://shelly-api-docs.shelly.cloud/gen2/ComponentsAndServices/EMData",
      "note": "Modbus registers table"
    }
  ],
  "notes": [
    "Modbus TCP must be enabled first (Modbus.SetConfig enable=true, or in the web interface).",
    "The documentation lists input registers in 3xxxx notation: 31000 is input register 1000.",
    "32-bit values are sent low word first, as in the documentation's modbus_cli examples (-B mixed).",
    "A second EM or EMData component, when present, has its registers at +80 (EM) and +70 (EMData)."
  ],
  "protocol": "tcp",
  "port": 502,
  "byte_order": "big",
  "word_order": "little",
  "address_base": 0,
  "x_status": "official",
  "registers": [
    {"name": "MAC address", "group": "Device", "area": "input", "address": 0, "type": "string", "length": 6},
    {"name": "Model", "group": "Device", "area": "input", "address": 6, "type": "string", "length": 10, "role": "model"},
    {"name": "Device name", "group": "Device", "area": "input", "address": 16, "type": "string", "length": 32},
    {"name": "EM last update", "group": "Status", "area": "input", "address": 1000, "type": "uint32", "unit": "s", "description": "Unix timestamp"},
    {"name": "Phase A meter error", "group": "Status", "area": "input", "address": 1002, "type": "bool", "bit": 0},
    {"name": "Phase B meter error", "group": "Status", "area": "input", "address": 1003, "type": "bool", "bit": 0},
    {"name": "Phase C meter error", "group": "Status", "area": "input", "address": 1004, "type": "bool", "bit": 0},
    {"name": "Neutral meter error", "group": "Status", "area": "input", "address": 1005, "type": "bool", "bit": 0},
    {"name": "Phase sequence error", "group": "Status", "area": "input", "address": 1006, "type": "bool", "bit": 0},
    {"name": "Neutral current", "group": "Totals", "area": "input", "address": 1007, "type": "float32", "unit": "A"},
    {"name": "Neutral current mismatch", "group": "Status", "area": "input", "address": 1009, "type": "bool", "bit": 0},
    {"name": "Neutral overcurrent", "group": "Status", "area": "input", "address": 1010, "type": "bool", "bit": 0},
    {"name": "Total current", "group": "Totals", "area": "input", "address": 1011, "type": "float32", "unit": "A", "description": "Sum of the phases"},
    {"name": "Total active power", "group": "Totals", "area": "input", "address": 1013, "type": "float32", "unit": "W", "description": "Sum of the phases"},
    {"name": "Total apparent power", "group": "Totals", "area": "input", "address": 1015, "type": "float32", "unit": "VA", "description": "Sum of the phases"},
    {"name": "Voltage A", "group": "Phase A", "area": "input", "address": 1020, "type": "float32", "unit": "V"},
    {"name": "Current A", "group": "Phase A", "area": "input", "address": 1022, "type": "float32", "unit": "A"},
    {"name": "Active power A", "group": "Phase A", "area": "input", "address": 1024, "type": "float32", "unit": "W"},
    {"name": "Apparent power A", "group": "Phase A", "area": "input", "address": 1026, "type": "float32", "unit": "VA"},
    {"name": "Power factor A", "group": "Phase A", "area": "input", "address": 1028, "type": "float32"},
    {"name": "Overpower A", "group": "Status", "area": "input", "address": 1030, "type": "bool", "bit": 0},
    {"name": "Overvoltage A", "group": "Status", "area": "input", "address": 1031, "type": "bool", "bit": 0},
    {"name": "Overcurrent A", "group": "Status", "area": "input", "address": 1032, "type": "bool", "bit": 0},
    {"name": "Frequency A", "group": "Phase A", "area": "input", "address": 1033, "type": "float32", "unit": "Hz"},
    {"name": "Voltage B", "group": "Phase B", "area": "input", "address": 1040, "type": "float32", "unit": "V"},
    {"name": "Current B", "group": "Phase B", "area": "input", "address": 1042, "type": "float32", "unit": "A"},
    {"name": "Active power B", "group": "Phase B", "area": "input", "address": 1044, "type": "float32", "unit": "W"},
    {"name": "Apparent power B", "group": "Phase B", "area": "input", "address": 1046, "type": "float32", "unit": "VA"},
    {"name": "Power factor B", "group": "Phase B", "area": "input", "address": 1048, "type": "float32"},
    {"name": "Overpower B", "group": "Status", "area": "input", "address": 1050, "type": "bool", "bit": 0},
    {"name": "Overvoltage B", "group": "Status", "area": "input", "address": 1051, "type": "bool", "bit": 0},
    {"name": "Overcurrent B", "group": "Status", "area": "input", "address": 1052, "type": "bool", "bit": 0},
    {"name": "Frequency B", "group": "Phase B", "area": "input", "address": 1053, "type": "float32", "unit": "Hz"},
    {"name": "Voltage C", "group": "Phase C", "area": "input", "address": 1060, "type": "float32", "unit": "V"},
    {"name": "Current C", "group": "Phase C", "area": "input", "address": 1062, "type": "float32", "unit": "A"},
    {"name": "Active power C", "group": "Phase C", "area": "input", "address": 1064, "type": "float32", "unit": "W"},
    {"name": "Apparent power C", "group": "Phase C", "area": "input", "address": 1066, "type": "float32", "unit": "VA"},
    {"name": "Power factor C", "group": "Phase C", "area": "input", "address": 1068, "type": "float32"},
    {"name": "Overpower C", "group": "Status", "area": "input", "address": 1070, "type": "bool", "bit": 0},
    {"name": "Overvoltage C", "group": "Status", "area": "input", "address": 1071, "type": "bool", "bit": 0},
    {"name": "Overcurrent C", "group": "Status", "area": "input", "address": 1072, "type": "bool", "bit": 0},
    {"name": "Frequency C", "group": "Phase C", "area": "input", "address": 1073, "type": "float32", "unit": "Hz"},
    {"name": "Energy last update", "group": "Energy", "area": "input", "address": 1160, "type": "uint32", "unit": "s", "description": "Unix timestamp"},
    {"name": "Total active energy", "group": "Energy", "area": "input", "address": 1162, "type": "float32", "unit": "Wh", "description": "All phases, never reset"},
    {"name": "Total returned active energy", "group": "Energy", "area": "input", "address": 1164, "type": "float32", "unit": "Wh", "description": "All phases, never reset"},
    {"name": "Active energy A", "group": "Energy", "area": "input", "address": 1170, "type": "float32", "unit": "Wh"},
    {"name": "Fundamental active energy A", "group": "Energy", "area": "input", "address": 1172, "type": "float32", "unit": "Wh"},
    {"name": "Returned active energy A", "group": "Energy", "area": "input", "address": 1174, "type": "float32", "unit": "Wh"},
    {"name": "Fundamental returned active energy A", "group": "Energy", "area": "input", "address": 1176, "type": "float32", "unit": "Wh"},
    {"name": "Lagging reactive energy A", "group": "Energy", "area": "input", "address": 1178, "type": "float32", "unit": "varh"},
    {"name": "Leading reactive energy A", "group": "Energy", "area": "input", "address": 1180, "type": "float32", "unit": "varh"},
    {"name": "Active energy A (perpetual)", "group": "Energy", "area": "input", "address": 1182, "type": "float32", "unit": "Wh", "description": "Never reset"},
    {"name": "Returned active energy A (perpetual)", "group": "Energy", "area": "input", "address": 1184, "type": "float32", "unit": "Wh", "description": "Never reset"},
    {"name": "Active energy B", "group": "Energy", "area": "input", "address": 1190, "type": "float32", "unit": "Wh"},
    {"name": "Fundamental active energy B", "group": "Energy", "area": "input", "address": 1192, "type": "float32", "unit": "Wh"},
    {"name": "Returned active energy B", "group": "Energy", "area": "input", "address": 1194, "type": "float32", "unit": "Wh"},
    {"name": "Fundamental returned active energy B", "group": "Energy", "area": "input", "address": 1196, "type": "float32", "unit": "Wh"},
    {"name": "Lagging reactive energy B", "group": "Energy", "area": "input", "address": 1198, "type": "float32", "unit": "varh"},
    {"name": "Leading reactive energy B", "group": "Energy", "area": "input", "address": 1200, "type": "float32", "unit": "varh"},
    {"name": "Active energy B (perpetual)", "group": "Energy", "area": "input", "address": 1202, "type": "float32", "unit": "Wh", "description": "Never reset"},
    {"name": "Returned active energy B (perpetual)", "group": "Energy", "area": "input", "address": 1204, "type": "float32", "unit": "Wh", "description": "Never reset"},
    {"name": "Active energy C", "group": "Energy", "area": "input", "address": 1210, "type": "float32", "unit": "Wh"},
    {"name": "Fundamental active energy C", "group": "Energy", "area": "input", "address": 1212, "type": "float32", "unit": "Wh"},
    {"name": "Returned active energy C", "group": "Energy", "area": "input", "address": 1214, "type": "float32", "unit": "Wh"},
    {"name": "Fundamental returned active energy C", "group": "Energy", "area": "input", "address": 1216, "type": "float32", "unit": "Wh"},
    {"name": "Lagging reactive energy C", "group": "Energy", "area": "input", "address": 1218, "type": "float32", "unit": "varh"},
    {"name": "Leading reactive energy C", "group": "Energy", "area": "input", "address": 1220, "type": "float32", "unit": "varh"},
    {"name": "Active energy C (perpetual)", "group": "Energy", "area": "input", "address": 1222, "type": "float32", "unit": "Wh", "description": "Never reset"},
    {"name": "Returned active energy C (perpetual)", "group": "Energy", "area": "input", "address": 1224, "type": "float32", "unit": "Wh", "description": "Never reset"}
  ]
}
