{
  "spec_version": 1,
  "slug": "enapter-el21-electrolyser",
  "manufacturer": "Enapter",
  "model": "Electrolyser EL 2.1",
  "category": "Electrolyser",
  "supplier_url": "https://handbook.enapter.com/electrolyser/el21_firmware/1.9.3/modbus_tcp_communication_interface.html",
  "default_configuration": {
    "protocol": "modbus_tcp",
    "port": 502,
    "unit_id": 1,
    "addressing": "zero_based",
    "byte_order": "BigEndian",
    "word_order": "HighFirst"
  },
  "coils": [],
  "discrete_inputs": [],
  "input_registers": [
    {
      "address": 0,
      "count": 2,
      "name": "Device model",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0x454C3231 for the EL 2.1."
    },
    {
      "address": 2,
      "count": 1,
      "name": "Firmware major and minor version",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "e.g. 267 means major 267 // 256 = 1 and minor 267 % 256 = 11, i.e. 1.11."
    },
    {
      "address": 3,
      "count": 1,
      "name": "Firmware patch version",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 4,
      "count": 2,
      "name": "Firmware build number",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 18,
      "count": 1,
      "name": "System state",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = internal error / system not initialised, 1 = system in operation, 2 = error, 3 = fatal error, 4 = system in expert mode."
    },
    {
      "address": 20,
      "count": 2,
      "name": "Live time",
      "data_type": "UInt32",
      "units": "s",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Total time the system has been powered up, not only the time the stack was working."
    },
    {
      "address": 22,
      "count": 2,
      "name": "Uptime",
      "data_type": "UInt32",
      "units": "s",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "How long the system has been running."
    },
    {
      "address": 26,
      "count": 2,
      "name": "Free memory",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Memory that can be used."
    },
    {
      "address": 28,
      "count": 2,
      "name": "Available memory",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Memory that has not been allocated yet."
    },
    {
      "address": 30,
      "count": 2,
      "name": "Free space on flash card",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Space on the flash card that holds the configuration."
    },
    {
      "address": 1000,
      "count": 2,
      "name": "Product code",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Enumeration of the ELE21 product variants (e.g. 0x00 = ELE210535A2AXV01_03)."
    },
    {
      "address": 1002,
      "count": 2,
      "name": "Stack start/stop cycles",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "How many start/stop cycles the stack has run."
    },
    {
      "address": 1004,
      "count": 2,
      "name": "Stack total runtime",
      "data_type": "UInt32",
      "units": "s",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1006,
      "count": 2,
      "name": "Stack total hydrogen production",
      "data_type": "Float32",
      "units": "NL",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1008,
      "count": 2,
      "name": "Hydrogen flow rate",
      "data_type": "Float32",
      "units": "NL/h",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "NaN when the electrolyser is not producing hydrogen."
    },
    {
      "address": 1200,
      "count": 1,
      "name": "Electrolyser state",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = halted, 1 = maintenance mode, 2 = idle, 3 = steady, 4 = stand-by (max pressure), 5 = curve, 6 = blowdown."
    },
    {
      "address": 4000,
      "count": 1,
      "name": "Configuration progress",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "1 = a configuration is in progress."
    },
    {
      "address": 4001,
      "count": 1,
      "name": "Configuration source",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "1 = configuration over Modbus."
    },
    {
      "address": 4002,
      "count": 2,
      "name": "Last configuration result",
      "data_type": "Int32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = OK, 1 = permanent failure, 2 = no entry / interrupted, 5 = I/O data save error, 11 = try again, 13 = access denied (a changed register is read-only), 16 = busy, 22 = invalid data."
    },
    {
      "address": 4004,
      "count": 1,
      "name": "Last configuration wrong holding register",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "First invalid holding register number that prevented a successful configuration commit."
    },
    {
      "address": 4600,
      "count": 1,
      "name": "Heartbeat",
      "data_type": "UInt16",
      "units": "s",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Modbus heartbeat timeout in seconds; 0 = disabled (default)."
    },
    {
      "address": 6000,
      "count": 1,
      "name": "Dryer error flags",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "16-bit bitmask; bit i is the i-th entry of the document's dryer error/warning list (e.g. bit 0 = TT00 invalid, bit 9 = pressure switch PS01 triggered, bit 13 = PT00 invalid)."
    },
    {
      "address": 6001,
      "count": 1,
      "name": "Dryer warning flags",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Same bitmask as register 6000."
    },
    {
      "address": 6002,
      "count": 2,
      "name": "Dryer TT00 temperature",
      "data_type": "Float32",
      "units": "°C",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Heater element temperature, cartridge 0 (first line)."
    },
    {
      "address": 6004,
      "count": 2,
      "name": "Dryer TT01 temperature",
      "data_type": "Float32",
      "units": "°C",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Heater element temperature, cartridge 1 (second line)."
    },
    {
      "address": 6006,
      "count": 2,
      "name": "Dryer TT02 temperature",
      "data_type": "Float32",
      "units": "°C",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Heater element temperature, cartridge 2 (first line)."
    },
    {
      "address": 6008,
      "count": 2,
      "name": "Dryer TT03 temperature",
      "data_type": "Float32",
      "units": "°C",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Heater element temperature, cartridge 3 (second line)."
    },
    {
      "address": 6010,
      "count": 2,
      "name": "Dryer PT00 input pressure",
      "data_type": "Float32",
      "units": "bar",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 6012,
      "count": 2,
      "name": "Dryer PT01 output pressure",
      "data_type": "Float32",
      "units": "bar",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 6104,
      "count": 1,
      "name": "Dryer control network connection status",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "1 = online, 0 = offline."
    },
    {
      "address": 7000,
      "count": 1,
      "name": "High electrolyte level switch LSH102B",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "1 = electrolyte level above the sensor, 0 = below."
    },
    {
      "address": 7001,
      "count": 1,
      "name": "Very high electrolyte level switch LSHH102A",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "1 = electrolyte level above the sensor, 0 = below."
    },
    {
      "address": 7002,
      "count": 1,
      "name": "Low electrolyte level switch LSL102D",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "1 = electrolyte level above the sensor, 0 = below."
    },
    {
      "address": 7003,
      "count": 1,
      "name": "Medium electrolyte level switch LSM102C",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "1 = electrolyte level above the sensor, 0 = below."
    },
    {
      "address": 7004,
      "count": 1,
      "name": "Electrolyte tank high pressure switch PSH102",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "1 = pressure too high, 0 = normal."
    },
    {
      "address": 7005,
      "count": 1,
      "name": "Very high hydrogen pressure switch PSHH101B",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "1 = pressure too high, 0 = normal."
    },
    {
      "address": 7006,
      "count": 1,
      "name": "Downstream high temperature switch TSH106",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "1 = temperature too high, 0 = normal."
    },
    {
      "address": 7007,
      "count": 1,
      "name": "Electronic compartment high temperature switch TSH108",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "1 = temperature too high, 0 = normal."
    },
    {
      "address": 7008,
      "count": 1,
      "name": "Very low electrolyte temperature switch TSLL102B",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "1 = temperature too low, 0 = normal."
    },
    {
      "address": 7009,
      "count": 1,
      "name": "Chassis water presence switch WPS104",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "1 = water present on the input, 0 = no water input."
    },
    {
      "address": 7010,
      "count": 1,
      "name": "Dry contact",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "1 = OK (closed), 0 = not OK (open)."
    },
    {
      "address": 7500,
      "count": 2,
      "name": "Electrolyte cooler fan speed F103A",
      "data_type": "Float32",
      "units": "rpm",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 7502,
      "count": 2,
      "name": "Air circulation fan speed F104B",
      "data_type": "Float32",
      "units": "rpm",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 7504,
      "count": 2,
      "name": "Electronic compartment cooling fan speed F108C",
      "data_type": "Float32",
      "units": "rpm",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 7506,
      "count": 2,
      "name": "Electrolyte flow FM106",
      "data_type": "Float32",
      "units": "L/min",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 7508,
      "count": 2,
      "name": "Stack current HASS",
      "data_type": "Float32",
      "units": "A",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 7510,
      "count": 2,
      "name": "Stack voltage (PSU)",
      "data_type": "Float32",
      "units": "V",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 7512,
      "count": 2,
      "name": "Inner hydrogen pressure PT101A",
      "data_type": "Float32",
      "units": "bar",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 7514,
      "count": 2,
      "name": "Outer hydrogen pressure PT101C",
      "data_type": "Float32",
      "units": "bar",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 7516,
      "count": 2,
      "name": "Water inlet pressure PT105",
      "data_type": "Float32",
      "units": "bar",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 7518,
      "count": 2,
      "name": "Electrolyte temperature TT102A",
      "data_type": "Float32",
      "units": "°C",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 7520,
      "count": 2,
      "name": "Downstream temperature TT106",
      "data_type": "Float32",
      "units": "°C",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 8000,
      "count": 2,
      "name": "Inner hydrogen pressure PT101A, raw sensor value",
      "data_type": "Float32",
      "units": "V",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Raw sensor voltage, not a pressure."
    },
    {
      "address": 8002,
      "count": 2,
      "name": "Outer hydrogen pressure PT101C, raw sensor value",
      "data_type": "Float32",
      "units": "V",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Raw sensor voltage, not a pressure."
    },
    {
      "address": 8004,
      "count": 2,
      "name": "Stack current HASS, raw sensor value",
      "data_type": "Float32",
      "units": "V",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Raw sensor voltage, not a current."
    }
  ],
  "holding_registers": [
    {
      "address": 4,
      "count": 1,
      "name": "Reboot",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Write 1 to reboot the electrolyser."
    },
    {
      "address": 5,
      "count": 1,
      "name": "Locate electrolyser",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "1 = blink all LEDs, 0 = stop blinking."
    },
    {
      "address": 6,
      "count": 1,
      "name": "Maintenance mode (system)",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "1 = enable maintenance mode, 0 = disable."
    },
    {
      "address": 1000,
      "count": 1,
      "name": "Start / stop electrolyser",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Write 1 = start, 0 = stop. Read back: 1 while the stack is producing hydrogen (see input register 1200 for the detailed state), 0 when it is not."
    },
    {
      "address": 1002,
      "count": 2,
      "name": "Production rate setpoint",
      "data_type": "Float32",
      "units": "%",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Current production rate in percent. A system reset restores the default production rate; the value can be changed while the electrolyser produces hydrogen."
    },
    {
      "address": 1010,
      "count": 1,
      "name": "Request blowdown routine",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "1 = request a blowdown; reading it back shows whether a blowdown is requested."
    },
    {
      "address": 1011,
      "count": 1,
      "name": "Force water refilling",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "1 = start forced water refilling."
    },
    {
      "address": 1013,
      "count": 1,
      "name": "Maintenance mode (stack)",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "1 = enable maintenance mode for the stack, 0 = disable. The document lists this second maintenance-mode register alongside register 6."
    },
    {
      "address": 1014,
      "count": 1,
      "name": "Preheat",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "1 = start preheat."
    },
    {
      "address": 4000,
      "count": 1,
      "name": "Configuration begin",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "1 = start a configuration transaction."
    },
    {
      "address": 4001,
      "count": 1,
      "name": "Configuration commit",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "1 = commit the changes, 0 = roll back."
    },
    {
      "address": 4020,
      "count": 2,
      "name": "Ethernet IP address",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "e.g. 0xC0A80201 for 192.168.2.1; 0 = DHCP enabled."
    },
    {
      "address": 4022,
      "count": 2,
      "name": "Ethernet IP netmask",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "e.g. 255.255.255.0."
    },
    {
      "address": 4024,
      "count": 2,
      "name": "Ethernet gateway address",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "e.g. 192.168.2.1."
    },
    {
      "address": 4038,
      "count": 2,
      "name": "Cloud log level",
      "data_type": "Int32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = logging disabled (default), 1 = fatal errors only, 2 = fatal errors and errors, 3 = warnings and above, 4 = the level the document describes as 'everything before and important messages', 5 = all messages except internal debug, 6 = all messages."
    },
    {
      "address": 4042,
      "count": 2,
      "name": "System log level",
      "data_type": "Int32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Same scale as the cloud log level (register 4038)."
    },
    {
      "address": 4044,
      "count": 2,
      "name": "Syslog IP address",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Factory default 255.255.255.255 (broadcast)."
    },
    {
      "address": 4046,
      "count": 1,
      "name": "Syslog port",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Factory default 514."
    },
    {
      "address": 4142,
      "count": 2,
      "name": "Chassis altitude",
      "data_type": "Float32",
      "units": "m",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW"
    },
    {
      "address": 4308,
      "count": 2,
      "name": "Set maximum tank pressure (outlet)",
      "data_type": "Float32",
      "units": "bar",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW"
    },
    {
      "address": 4310,
      "count": 2,
      "name": "Set restart pressure (outlet)",
      "data_type": "Float32",
      "units": "bar",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW"
    },
    {
      "address": 4396,
      "count": 2,
      "name": "Set default production rate",
      "data_type": "Float32",
      "units": "%",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Only writable while the stack is inactive (idle or maintenance mode)."
    },
    {
      "address": 4494,
      "count": 2,
      "name": "Electrolyte cooling type",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = disabled, 1 = air cooled, 2 = liquid cooled."
    },
    {
      "address": 4600,
      "count": 2,
      "name": "Heartbeat Modbus timeout",
      "data_type": "UInt32",
      "units": "s",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 disables the timeout."
    },
    {
      "address": 4602,
      "count": 2,
      "name": "Heartbeat gateway timeout",
      "data_type": "UInt32",
      "units": "s",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 disables the timeout."
    },
    {
      "address": 4604,
      "count": 2,
      "name": "Heartbeat UCM timeout",
      "data_type": "UInt32",
      "units": "s",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 disables the timeout."
    },
    {
      "address": 4900,
      "count": 2,
      "name": "Period for warm-up water level",
      "data_type": "UInt32",
      "units": "ms",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW"
    },
    {
      "address": 4910,
      "count": 2,
      "name": "Minimum stack current for check",
      "data_type": "Float32",
      "units": "A",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW"
    },
    {
      "address": 4912,
      "count": 2,
      "name": "Threshold for stack current check",
      "data_type": "Float32",
      "units": "A",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW"
    },
    {
      "address": 4914,
      "count": 2,
      "name": "Period for stack current check",
      "data_type": "UInt32",
      "units": "ms",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW"
    },
    {
      "address": 6014,
      "count": 2,
      "name": "Dryer PT01 minimum threshold",
      "data_type": "Float32",
      "units": "bar",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Dryer output pressure at which the dryer leaves stand-by."
    },
    {
      "address": 6016,
      "count": 2,
      "name": "Dryer PT01 maximum threshold",
      "data_type": "Float32",
      "units": "bar",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Dryer output pressure at which the dryer moves to stand-by."
    },
    {
      "address": 6018,
      "count": 1,
      "name": "Start / stop dryer",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Write 1 = start, 0 = stop; read until the value is 259, which means the command was handled."
    },
    {
      "address": 6019,
      "count": 1,
      "name": "Stop dryer",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Write 1 = stop; the value 259 means the command was handled."
    },
    {
      "address": 6020,
      "count": 1,
      "name": "Reboot dryer",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "1 = reboot."
    },
    {
      "address": 7005,
      "count": 1,
      "name": "Cooling valve V106",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = close, 1 = open."
    }
  ],
  "combined_registers": [],
  "notes": "Register map of the Enapter Electrolyser EL 2.1 as published for firmware 1.9.3; Enapter versions this document per firmware release, so check the handbook for the firmware the unit runs. The vendor states port 502 and Modbus slave address 1 ('Enapter Electrolyser always addressed as a slave'), and all of its worked examples use unit ID 01. The addresses are the document's own register numbers, which it explicitly defines as protocol addresses: 'Holding register 0 in this document would be referred to as 40001 and would be addressed as register 0000 in the data address field', so they are used unchanged as zero-based wire addresses. Data is big-endian, high word first. Boolean fields are 16-bit registers where 0 is false and any other value is true. Configuration registers are written in a transaction: open with 4000, write the settings, commit with 4001. Left out because the format has no 64-bit or 128-bit type: holding 0 (Unix time, uint64) and 4026 (chassis serial, uint64), input 6 (control board serial, uint128), 14 (chassis serial, uint64), 1010 (stack serial, uint64) and the two Wi-Fi MAC address words at 6100 and 6102; also left out are the warning and error event arrays at input 768 and 832 (32 registers each, whose first register holds the count) and the setting block 4916-4928, whose unit column drifts by one row in the published table (a 'period' printed in bar). Source: Enapter Handbook, 'EL 2.1 FW 1.9.3 Modbus TCP Communication Interface'."
}
