{
  "$schema": "https://raw.githubusercontent.com/nobrega8/mbmap-library/main/schema/mbmap-2.schema.json",
  "mbmap": 2,
  "vendor": "Alfen",
  "model": "Eve (NG9xx)",
  "models": ["Eve Single", "Eve Double"],
  "vendor_website": "alfen.com",
  "description": "EV charging station on the NG9xx platform, Modbus TCP",
  "revision": 2,
  "revised": "2026-11-10",
  "source": "Alfen ICU B.V., Modbus for ACE, Configuration Guide, version 1.0, 05/2025",
  "sources": [{"title": "Modbus for ACE, Configuration Guide", "version": "1.0", "date": "2025-05", "url": "https://alfen.com/media/1047/download", "note": "Appendices A to F"}],
  "notes": [
    "Every register is a holding register (function 3 to read, 6 and 16 to write). The manual numbers them from 1 and says to subtract 1 for the address on the wire, so the numbers here are 1-based (address_base 1).",
    "Which device answers depends on the Modbus server address: 200 for the station registers (1100 to 1105) and the smart charging network registers (1400 to 1431); 1 for the single socket, or the left socket of a dual socket station; 2 for the right socket. The socket registers (300 to 425 and 1200 to 1215) are read from server address 1 or 2. The manual does not say which address reaches the product identification and date registers (100 to 178). The default unit_id here is 1 (a socket).",
    "32-bit values are mixed-endian: bytes inside a 16-bit word are big-endian and the low word comes first (word_order little). The manual says this only for 32-bit values; the 64-bit values (energy, uptime, meter timestamp) are given the same word order here, which the manual does not state.",
    "A 32-bit value must be read or written in one request, not as two requests. A write to a multi-register value that does not cover all its registers is refused.",
    "A reserved or unavailable register is returned as NaN (0xFFFF for a 16-bit register). Chargers with a Reallin meter made after 2021 return NaN for the sum registers of current, apparent power, reactive power and real energy consumed; older chargers with an ABB meter return numbers.",
    "Strings hold two ASCII characters per register and end with a zero.",
    "Modbus TCP is off by default. It needs the Active Load Balancing licence, and the settings Allow reading, Allow writing maximum currents, Enable sockets and Enable Smart Charging Network must be set in the ACE Service Installer (version 4.0 or later). Up to two clients can connect at the same time. UDP is not supported.",
    "The maximum current registers (1210 and 1417 to 1422) are not kept across a reboot. After the valid time (60 s by default) without a new write the charger falls back to its safe current, so poll more often than the valid time. The safe current must be set before a maximum current can be written.",
    "At most 125 registers can be read in one request.",
    "Register 1104 (OCPP state) is listed as 1104..1105 in the manual, which overlaps 1105 (number of sockets); it is one register here. The meter state bit field (register 300) and meter type (305) values are as listed in the manual. No registers have the firmware, model or serial role because the manual does not say which server address answers the identification registers.",
    "Written from the manufacturer's document; not tested on a device."
  ],
  "protocol": "tcp",
  "unit_id": 1,
  "port": 502,
  "address_base": 1,
  "max_read_registers": 125,
  "byte_order": "big",
  "word_order": "little",
  "x_status": "official",
  "enums": {
    "enabled": {"0": "Disabled", "1": "Enabled"},
    "availability": {"0": "Inoperative", "1": "Operative"},
    "yes_no": {"0": "No", "1": "Yes"},
    "phases": {"1": "1 phase", "3": "3 phases"},
    "meter_type": {"0": "RTU", "1": "TCP/IP", "2": "UDP", "3": "P1", "4": "Other"}
  },
  "registers": [
    {"name": "Name", "group": "Product identification", "area": "holding", "address": 100, "type": "string", "length": 17, "access": "R", "description": "Station name"},
    {"name": "Manufacturer", "group": "Product identification", "area": "holding", "address": 117, "type": "string", "length": 5, "access": "R"},
    {"name": "Modbus table version", "group": "Product identification", "area": "holding", "address": 122, "type": "int16", "access": "R"},
    {"name": "Firmware version", "group": "Product identification", "area": "holding", "address": 123, "type": "string", "length": 17, "access": "R", "role": "firmware"},
    {"name": "Platform type", "group": "Product identification", "area": "holding", "address": 140, "type": "string", "length": 17, "access": "R", "description": "Platform, for example NG910"},
    {"name": "Station serial number", "group": "Product identification", "area": "holding", "address": 157, "type": "string", "length": 11, "access": "R", "role": "serial"},
    {"name": "Date year", "group": "Date and time", "area": "holding", "address": 168, "type": "int16", "access": "R", "unit": "yr"},
    {"name": "Date month", "group": "Date and time", "area": "holding", "address": 169, "type": "int16", "access": "R", "unit": "month"},
    {"name": "Date day", "group": "Date and time", "area": "holding", "address": 170, "type": "int16", "access": "R", "unit": "day"},
    {"name": "Time hour", "group": "Date and time", "area": "holding", "address": 171, "type": "int16", "access": "R", "unit": "h"},
    {"name": "Time minute", "group": "Date and time", "area": "holding", "address": 172, "type": "int16", "access": "R", "unit": "min"},
    {"name": "Time second", "group": "Date and time", "area": "holding", "address": 173, "type": "int16", "access": "R", "unit": "s"},
    {"name": "Uptime", "group": "Date and time", "area": "holding", "address": 174, "type": "uint64", "access": "R", "scale": 0.001, "unit": "s"},
    {"name": "Time zone", "group": "Date and time", "area": "holding", "address": 178, "type": "int16", "access": "R", "unit": "min", "description": "Offset from UTC in minutes"},
    {"name": "Station active max current", "group": "Station status (server address 200)", "area": "holding", "address": 1100, "type": "float32", "access": "R", "unit": "A", "description": "The actual maximum current"},
    {"name": "Temperature", "group": "Station status (server address 200)", "area": "holding", "address": 1102, "type": "float32", "access": "R", "unit": "°C", "description": "Board temperature, not the ambient temperature"},
    {"name": "OCPP state", "group": "Station status (server address 200)", "area": "holding", "address": 1104, "type": "uint16", "access": "R", "description": "Tells whether the back office is connected"},
    {"name": "Number of sockets", "group": "Station status (server address 200)", "area": "holding", "address": 1105, "type": "uint16", "access": "R"},
    {"name": "SCN name", "group": "Smart charging network (server address 200)", "area": "holding", "address": 1400, "type": "string", "length": 4, "access": "R"},
    {"name": "SCN sockets", "group": "Smart charging network (server address 200)", "area": "holding", "address": 1404, "type": "uint16", "access": "R", "description": "Number of connected sockets"},
    {"name": "SCN total consumption phase L1", "group": "Smart charging network (server address 200)", "area": "holding", "address": 1405, "type": "float32", "access": "R", "unit": "A"},
    {"name": "SCN total consumption phase L2", "group": "Smart charging network (server address 200)", "area": "holding", "address": 1407, "type": "float32", "access": "R", "unit": "A"},
    {"name": "SCN total consumption phase L3", "group": "Smart charging network (server address 200)", "area": "holding", "address": 1409, "type": "float32", "access": "R", "unit": "A"},
    {"name": "SCN actual max current phase L1", "group": "Smart charging network (server address 200)", "area": "holding", "address": 1411, "type": "float32", "access": "R", "unit": "A"},
    {"name": "SCN actual max current phase L2", "group": "Smart charging network (server address 200)", "area": "holding", "address": 1413, "type": "float32", "access": "R", "unit": "A"},
    {"name": "SCN actual max current phase L3", "group": "Smart charging network (server address 200)", "area": "holding", "address": 1415, "type": "float32", "access": "R", "unit": "A"},
    {"name": "SCN max current phase L1", "group": "Smart charging network (server address 200)", "area": "holding", "address": 1417, "type": "float32", "access": "RW", "unit": "A", "description": "Maximum current for each phase, written by the energy management system"},
    {"name": "SCN max current phase L2", "group": "Smart charging network (server address 200)", "area": "holding", "address": 1419, "type": "float32", "access": "RW", "unit": "A", "description": "Maximum current for each phase, written by the energy management system"},
    {"name": "SCN max current phase L3", "group": "Smart charging network (server address 200)", "area": "holding", "address": 1421, "type": "float32", "access": "RW", "unit": "A", "description": "Maximum current for each phase, written by the energy management system"},
    {"name": "SCN remaining valid time max current phase L1", "group": "Smart charging network (server address 200)", "area": "holding", "address": 1423, "type": "uint32", "access": "R", "unit": "s"},
    {"name": "SCN remaining valid time max current phase L2", "group": "Smart charging network (server address 200)", "area": "holding", "address": 1425, "type": "uint32", "access": "R", "unit": "s"},
    {"name": "SCN remaining valid time max current phase L3", "group": "Smart charging network (server address 200)", "area": "holding", "address": 1427, "type": "uint32", "access": "R", "unit": "s"},
    {"name": "SCN safe current", "group": "Smart charging network (server address 200)", "area": "holding", "address": 1429, "type": "float32", "access": "R", "unit": "A", "description": "Configured SCN safe current"},
    {"name": "SCN Modbus server max current enable", "group": "Smart charging network (server address 200)", "area": "holding", "address": 1431, "type": "uint16", "access": "R", "enum": "enabled"},
    {"name": "Availability", "group": "Socket status (server address 1 or 2)", "area": "holding", "address": 1200, "type": "uint16", "access": "R", "enum": "availability"},
    {"name": "Mode 3 state", "group": "Socket status (server address 1 or 2)", "area": "holding", "address": 1201, "type": "string", "length": 5, "access": "R", "description": "IEC 61851 state, see the manual's Mode 3 state listing"},
    {"name": "Actual applied max current", "group": "Socket status (server address 1 or 2)", "area": "holding", "address": 1206, "type": "float32", "access": "R", "unit": "A", "description": "Overall maximum current in use for the socket"},
    {"name": "Modbus server max current valid time", "group": "Socket status (server address 1 or 2)", "area": "holding", "address": 1208, "type": "uint32", "access": "R", "unit": "s", "description": "Remaining time before the socket falls back to the safe current"},
    {"name": "Modbus server max current", "group": "Socket status (server address 1 or 2)", "area": "holding", "address": 1210, "type": "float32", "access": "RW", "unit": "A", "description": "Setpoint written by the energy management system"},
    {"name": "Active load balancing safe current", "group": "Socket status (server address 1 or 2)", "area": "holding", "address": 1212, "type": "float32", "access": "R", "unit": "A"},
    {"name": "Modbus server setpoint accounted for", "group": "Socket status (server address 1 or 2)", "area": "holding", "address": 1214, "type": "uint16", "access": "R", "enum": "yes_no", "description": "Whether the written setpoint is used to work out the actual applied max current"},
    {"name": "Charge using 1 or 3 phases", "group": "Socket status (server address 1 or 2)", "area": "holding", "address": 1215, "type": "uint16", "access": "RW", "enum": "phases"},
    {"name": "Meter initialised", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 300, "type": "bool", "bit": 0, "access": "R", "description": "Initialised"},
    {"name": "Meter updated", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 300, "type": "bool", "bit": 1, "access": "R"},
    {"name": "Meter warning", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 300, "type": "bool", "bit": 2, "access": "R"},
    {"name": "Meter error", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 300, "type": "bool", "bit": 3, "access": "R"},
    {"name": "Meter last value timestamp", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 301, "type": "uint64", "access": "R", "scale": 0.001, "unit": "s", "description": "Time since the last measurements were received"},
    {"name": "Meter type", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 305, "type": "uint16", "access": "R", "enum": "meter_type"},
    {"name": "Voltage L1-N", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 306, "type": "float32", "access": "R", "unit": "V"},
    {"name": "Voltage L2-N", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 308, "type": "float32", "access": "R", "unit": "V"},
    {"name": "Voltage L3-N", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 310, "type": "float32", "access": "R", "unit": "V"},
    {"name": "Voltage L1-L2", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 312, "type": "float32", "access": "R", "unit": "V"},
    {"name": "Voltage L2-L3", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 314, "type": "float32", "access": "R", "unit": "V"},
    {"name": "Voltage L3-L1", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 316, "type": "float32", "access": "R", "unit": "V"},
    {"name": "Current N", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 318, "type": "float32", "access": "R", "unit": "A"},
    {"name": "Current L1", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 320, "type": "float32", "access": "R", "unit": "A"},
    {"name": "Current L2", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 322, "type": "float32", "access": "R", "unit": "A"},
    {"name": "Current L3", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 324, "type": "float32", "access": "R", "unit": "A"},
    {"name": "Current sum", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 326, "type": "float32", "access": "R", "unit": "A", "description": "Returns NaN on chargers with a Reallin meter made after 2021"},
    {"name": "Power factor L1", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 328, "type": "float32", "access": "R"},
    {"name": "Power factor L2", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 330, "type": "float32", "access": "R"},
    {"name": "Power factor L3", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 332, "type": "float32", "access": "R"},
    {"name": "Power factor sum", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 334, "type": "float32", "access": "R"},
    {"name": "Frequency", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 336, "type": "float32", "access": "R", "unit": "Hz"},
    {"name": "Real power L1", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 338, "type": "float32", "access": "R", "unit": "W"},
    {"name": "Real power L2", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 340, "type": "float32", "access": "R", "unit": "W"},
    {"name": "Real power L3", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 342, "type": "float32", "access": "R", "unit": "W"},
    {"name": "Real power sum", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 344, "type": "float32", "access": "R", "unit": "W"},
    {"name": "Apparent power L1", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 346, "type": "float32", "access": "R", "unit": "VA"},
    {"name": "Apparent power L2", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 348, "type": "float32", "access": "R", "unit": "VA"},
    {"name": "Apparent power L3", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 350, "type": "float32", "access": "R", "unit": "VA"},
    {"name": "Apparent power sum", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 352, "type": "float32", "access": "R", "unit": "VA", "description": "Returns NaN on chargers with a Reallin meter made after 2021"},
    {"name": "Reactive power L1", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 354, "type": "float32", "access": "R", "unit": "VAr"},
    {"name": "Reactive power L2", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 356, "type": "float32", "access": "R", "unit": "VAr"},
    {"name": "Reactive power L3", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 358, "type": "float32", "access": "R", "unit": "VAr"},
    {"name": "Reactive power sum", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 360, "type": "float32", "access": "R", "unit": "VAr", "description": "Returns NaN on chargers with a Reallin meter made after 2021"},
    {"name": "Real energy delivered L1", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 362, "type": "float64", "access": "R", "unit": "Wh"},
    {"name": "Real energy delivered L2", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 366, "type": "float64", "access": "R", "unit": "Wh"},
    {"name": "Real energy delivered L3", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 370, "type": "float64", "access": "R", "unit": "Wh"},
    {"name": "Real energy delivered sum", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 374, "type": "float64", "access": "R", "unit": "Wh"},
    {"name": "Real energy consumed L1", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 378, "type": "float64", "access": "R", "unit": "Wh"},
    {"name": "Real energy consumed L2", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 382, "type": "float64", "access": "R", "unit": "Wh"},
    {"name": "Real energy consumed L3", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 386, "type": "float64", "access": "R", "unit": "Wh"},
    {"name": "Real energy consumed sum", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 390, "type": "float64", "access": "R", "unit": "Wh", "description": "Returns NaN on chargers with a Reallin meter made after 2021"},
    {"name": "Apparent energy L1", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 394, "type": "float64", "access": "R", "unit": "VAh"},
    {"name": "Apparent energy L2", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 398, "type": "float64", "access": "R", "unit": "VAh"},
    {"name": "Apparent energy L3", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 402, "type": "float64", "access": "R", "unit": "VAh"},
    {"name": "Apparent energy sum", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 406, "type": "float64", "access": "R", "unit": "VAh"},
    {"name": "Reactive energy L1", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 410, "type": "float64", "access": "R", "unit": "VArh"},
    {"name": "Reactive energy L2", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 414, "type": "float64", "access": "R", "unit": "VArh"},
    {"name": "Reactive energy L3", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 418, "type": "float64", "access": "R", "unit": "VArh"},
    {"name": "Reactive energy sum", "group": "Socket energy meter (server address 1 or 2)", "area": "holding", "address": 422, "type": "float64", "access": "R", "unit": "VArh"}
  ]
}
