{
  "spec_version": 1,
  "slug": "enapter-el41-electrolyser",
  "manufacturer": "Enapter",
  "model": "Electrolyser 4.1 (EL 4.1)",
  "category": "Electrolyser",
  "supplier_url": "https://handbook.enapter.com/electrolyser/el41/el41_firmware/3.5.0/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": "0x45533431 for the EL 4.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. 769 means major 769 // 256 = 3 and minor 769 % 256 = 1, i.e. 3.1."
    },
    {
      "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": 1000,
      "count": 2,
      "name": "Product code",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Enumeration of the ELE41 product variants (e.g. 0x44 = ELE410535A2ASV01)."
    },
    {
      "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": 1014,
      "count": 1,
      "name": "Cooling type",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "1 = air cooling, 2 = liquid cooling."
    },
    {
      "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."
    },
    {
      "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 0-3 = TT00-TT03 invalid, bit 4-7 = TT00-TT03 value growth not enough, bit 8 = pressure switch PS00 triggered, bit 9 = pressure switch PS01 triggered, bit 10-12 = F100-F102 invalid RPM, bit 13 = PT00 invalid, bit 14 = PT01 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": 6021,
      "count": 1,
      "name": "Dryer state",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Dryer logic state."
    },
    {
      "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": 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": 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": 7526,
      "count": 2,
      "name": "Board power 24 V",
      "data_type": "Float32",
      "units": "V",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 7532,
      "count": 2,
      "name": "Board temperature",
      "data_type": "Float32",
      "units": "°C",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 7538,
      "count": 2,
      "name": "Gas presence HT104",
      "data_type": "Float32",
      "units": "ppm",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 7540,
      "count": 2,
      "name": "Safety board temperature TE108",
      "data_type": "Float32",
      "units": "°C",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "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": "1 = reboot."
    },
    {
      "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": "System maintenance mode",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Legacy support: the document says new integrations must use register 1013. 1 = enable, 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",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "1 = enable maintenance mode, 0 = disable."
    },
    {
      "address": 1014,
      "count": 1,
      "name": "Preheat",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "1 = start preheat, 0 = stop preheat."
    },
    {
      "address": 1015,
      "count": 1,
      "name": "Flushing",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "1 = skip flushing, 0 = flushing."
    },
    {
      "address": 1016,
      "count": 1,
      "name": "Start SIF proof tests",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = no test, 1-6 = number of the proof test to run."
    },
    {
      "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": 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": 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 it leaves stand-by. The new value is saved only after writing 1 to register 6022."
    },
    {
      "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 it moves to stand-by. The new value is saved only after writing 1 to register 6022."
    },
    {
      "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 register 6021 for the dryer logic state. The document warns that frequent writes damage the dryer's flash."
    },
    {
      "address": 6019,
      "count": 1,
      "name": "Stop dryer",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "The document marks this register DEPRECATED; use 6018."
    },
    {
      "address": 6020,
      "count": 1,
      "name": "Reboot dryer",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Write 1 = reboot the dryer; reading it returns how many times the dryer has been rebooted. The document warns that frequent writes damage the dryer's flash."
    },
    {
      "address": 6022,
      "count": 1,
      "name": "Save updated dryer configuration",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Write 1 to save the updated dryer configuration to flash. The document warns that frequent writes damage the dryer's flash."
    },
    {
      "address": 6023,
      "count": 1,
      "name": "Locate dryer in DCN/IDCN",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = disable, 1 = enable."
    },
    {
      "address": 6024,
      "count": 1,
      "name": "Reboot UCM",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "1 = reboot the UCM."
    },
    {
      "address": 6025,
      "count": 1,
      "name": "Plugin ID",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Plugin id the value written to 6026 is saved under; 1 = auto control plugin."
    },
    {
      "address": 6026,
      "count": 1,
      "name": "Plugin argument",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = disable plugin, 1 = enable plugin."
    },
    {
      "address": 6200,
      "count": 2,
      "name": "Water tank status",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Bitmask: bit 1 = stop, bit 2 = maintenance, bit 4 = manual mode, bit 5 = bad quality water input, bit 6 = waiting for water, bit 7 = high water inlet temperature, bit 8 = low water inlet temperature, bit 9 = very low water level, bit 10 = low water level, bit 11 = very high water level (warning), bit 13 = low water tank temperature, bit 15 = very high water level (fatal error)."
    },
    {
      "address": 6202,
      "count": 2,
      "name": "Water tank water level",
      "data_type": "Float32",
      "units": "L",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW"
    },
    {
      "address": 6204,
      "count": 2,
      "name": "Water tank inlet temperature",
      "data_type": "Float32",
      "units": "°C",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW"
    },
    {
      "address": 6206,
      "count": 2,
      "name": "Water tank tank temperature",
      "data_type": "Float32",
      "units": "°C",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW"
    },
    {
      "address": 6208,
      "count": 2,
      "name": "Water tank conductivity",
      "data_type": "Float32",
      "units": "µS/cm",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW"
    },
    {
      "address": 6210,
      "count": 2,
      "name": "Water tank pump current",
      "data_type": "Float32",
      "units": "A",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW"
    },
    {
      "address": 6220,
      "count": 2,
      "name": "Water tank UCM uptime",
      "data_type": "UInt32",
      "units": "s",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW"
    },
    {
      "address": 6222,
      "count": 1,
      "name": "Command to water tank",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "1 = start, 2 = stop, 3 = reboot WT control board, 4 = reboot WT UCM board, 5 = locate off, 6 = locate on, 7 = maintenance off, 8 = maintenance on."
    },
    {
      "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 4.1 as published for firmware 3.5.0; Enapter versions this document per firmware release (the handbook also holds 3.4.0, 3.4.1 and 3.4.2 for this model) and the register set does differ between the EL 4.1 and the older EL 2.1, which has its own seed. The vendor states port 502 and Modbus slave address 1 ('Enapter Electrolyser always addressed as a slave'). Addresses are the document's own register numbers, which it defines as protocol addresses (holding register 0 is 40001, addressed as 0000 in the PDU), 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 as a transaction: open with 4000, write, commit with 4001. This firmware also exposes the Water Tank 4.1 block (6200-6223) through the electrolyser. Left out because the format has no 64-bit or 128-bit type: holding 0 (Unix time), input 6 (control board serial, uint128), 14 (chassis serial) and 1010 (stack serial); also left out are the warning and error code arrays at input 768 and 832 (whose first register holds the count) and the reserved water-tank rows 6212-6218 and 6223. Source: Enapter Handbook, 'EL 4.1 FW 3.5.0 Modbus TCP Communication Interface'."
}
