{
  "spec_version": 1,
  "slug": "grundfos-hydro-mpc",
  "manufacturer": "Grundfos",
  "model": "Hydro MPC / Control MPC booster system with GENIECON controller (CIM 200 Modbus RTU)",
  "category": "Pump controller",
  "supplier_url": "https://api.grundfos.com/literature/Grundfosliterature-6012934.pdf",
  "default_configuration": {
    "protocol": "modbus_tcp",
    "port": 502,
    "unit_id": 1,
    "addressing": "one_based",
    "byte_order": "BigEndian",
    "word_order": "HighFirst",
    "native_interface": "rs485",
    "serial": {
      "parity": "Even",
      "baud_rate": 19200,
      "data_bits": 8,
      "stop_bits": 1
    }
  },
  "coils": [],
  "discrete_inputs": [],
  "input_registers": [
    {
      "address": 301,
      "count": 1,
      "name": "Head",
      "data_type": "UInt16",
      "units": "bar",
      "scale_factor": 0.001,
      "offset": 0,
      "access": "R",
      "description": "Actual system head/pressure, 0.001 bar."
    },
    {
      "address": 302,
      "count": 1,
      "name": "Volume flow",
      "data_type": "UInt16",
      "units": "m3/h",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Actual system flow, 0.1 m3/h."
    },
    {
      "address": 303,
      "count": 1,
      "name": "Relative performance",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "Relative performance of the booster system, 0.01 %."
    },
    {
      "address": 306,
      "count": 1,
      "name": "Digital input",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Logical value of the external digital input signals, one bit per input."
    },
    {
      "address": 307,
      "count": 1,
      "name": "Digital output",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Logical value of the external digital output signals, one bit per output."
    },
    {
      "address": 308,
      "count": 1,
      "name": "Actual set-point",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "Actual set-point, 0.01 % of the set-point range."
    },
    {
      "address": 309,
      "count": 1,
      "name": "Motor current",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Actual motor current, 0.1 A."
    },
    {
      "address": 315,
      "count": 1,
      "name": "Inlet pressure",
      "data_type": "UInt16",
      "units": "bar",
      "scale_factor": 0.001,
      "offset": 0,
      "access": "R",
      "description": "Inlet pressure, 0.001 bar (sensor required)."
    },
    {
      "address": 317,
      "count": 1,
      "name": "Storage tank level",
      "data_type": "UInt16",
      "units": "m",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "Storage-tank level, 0.01 m (sensor required)."
    },
    {
      "address": 341,
      "count": 1,
      "name": "Outlet pressure",
      "data_type": "UInt16",
      "units": "bar",
      "scale_factor": 0.001,
      "offset": 0,
      "access": "R",
      "description": "System outlet pressure, 0.001 bar (sensor required)."
    },
    {
      "address": 343,
      "count": 1,
      "name": "User set-point",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "Set-point entered by the user, 0.01 % of the set-point range; same scaling as control register 104."
    },
    {
      "address": 344,
      "count": 1,
      "name": "Analogue influence",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "Set-point attenuator, 0.01 %."
    },
    {
      "address": 346,
      "count": 1,
      "name": "Specific energy",
      "data_type": "UInt16",
      "units": "Wh/m3",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Specific energy of the booster system, raw value in 0.1 Wh/m3 (document scale \"0.1 Wh/m3\")."
    },
    {
      "address": 347,
      "count": 1,
      "name": "Average specific energy",
      "data_type": "UInt16",
      "units": "Wh/m3",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Average specific energy, 0.1 Wh/m3."
    },
    {
      "address": 401,
      "count": 1,
      "name": "Pump 1 status",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Bit0 AccessMode (0 = local control by pump buttons, 1 = remote control by the booster system), bit1 OnOff (0 = off, 1 = on), bit2 Alarm (0 = no alarm, 1 = alarm). Not available on Hydro Multi-E model G."
    },
    {
      "address": 402,
      "count": 1,
      "name": "Pump 1 alarm code",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Grundfos-specific alarm code, see the alarm and warning code table."
    },
    {
      "address": 403,
      "count": 2,
      "name": "Pump 1 operating time",
      "data_type": "UInt32",
      "units": "h",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Operating time of the pump, 32-bit value (high word 403, low word 404), 1 hour."
    },
    {
      "address": 405,
      "count": 1,
      "name": "Pump 1 speed",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "Speed of the pump motor, 0.01 %. Not available on Hydro Multi-E model G."
    },
    {
      "address": 406,
      "count": 1,
      "name": "Pump 1 line current",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Average value of the line currents on the pump, 0.1 A. Not available on Hydro Multi-E model G."
    },
    {
      "address": 407,
      "count": 1,
      "name": "Pump 1 power",
      "data_type": "UInt16",
      "units": "W",
      "scale_factor": 10,
      "offset": 0,
      "access": "R",
      "description": "Power consumption of the pump, 10 W. Not available on Hydro Multi-E model G."
    },
    {
      "address": 408,
      "count": 1,
      "name": "Pump 1 motor temperature",
      "data_type": "UInt16",
      "units": "K",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "Motor temperature of the pump, 0.01 K. Not available on Hydro Multi-E model G."
    },
    {
      "address": 409,
      "count": 1,
      "name": "Pump 1 control source",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = unknown, 1 = buttons on the pump, 2 = GENIbus (booster controller), 3 = GENIlink/GENIair (handheld controller), 4 = external control. Not available on Hydro Multi-E model G."
    }
  ],
  "holding_registers": [
    {
      "address": 101,
      "count": 1,
      "name": "Control",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Bit0 RemoteAccessReq (1 = Modbus master controls the booster), bit1 OnOffReq (0 = stop, 1 = start), bit2 ResetAlarm (1 = reset, rising edge), bit4 CopyToLocal (copy control mode/operation mode/setpoint to local settings when switching from remote to local), bit5 ResetAccCounters. Bit3 and bits 6-15 are reserved."
    },
    {
      "address": 102,
      "count": 1,
      "name": "Control mode",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 constant speed, 1 constant frequency, 3 constant head, 4 constant pressure, 5 constant differential pressure, 6 proportional pressure, 7 constant flow, 8 constant temperature, 9 constant temperature difference, 10 constant level, 128 AutoAdapt, 129 FlowAdapt, 130 closed-loop sensor (availability depends on the booster model)."
    },
    {
      "address": 103,
      "count": 1,
      "name": "Operation mode",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Operating-mode enumeration: 0 auto-control, 4 OpenLoopMin, 6 OpenLoopMax. OnOffReq has higher priority than OperationMode."
    },
    {
      "address": 104,
      "count": 1,
      "name": "Set-point",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "RW",
      "description": "Set-point, 0.01 % of the set-point range in open-loop control; closed-loop control uses the unit of the controlled variable (see the set-point scaling table in section 11.3 of the document)."
    }
  ],
  "combined_registers": [],
  "notes": "Source: Grundfos \"Modbus for Grundfos boosters - SoftCIM Modbus RTU, SoftCIM Modbus TCP, CIM/CIU 200 Modbus RTU, CIM/CIU 500 Ethernet for Modbus TCP\", functional profile and user manual, document Grundfosliterature-6012934 (https://api.grundfos.com/literature/Grundfosliterature-6012934.pdf), applies to GENIECON MPC, Hydro MPC, CU 352 and Control MPC. This seed models the CIM 200 Modbus RTU path: section 4.2/5.1/5.2 document the default frame 19200 bps, even parity, 8 data bits, 1 stop bit (the CIM 200 default is even parity with 1 stop bit; 19200 is the default transmission speed). The slave address is set with the hexadecimal rotary switches SW6/SW7 (1-247) and the document states no factory value, so unit ID 1 is a placeholder. Section 10.1 states that registers numbered X are addressed in telegrams as X-1 (register 00104 setpoint is addressed as 00103), hence one-based. 32-bit values combine high word at the lower address (HI × 65536 + LO). Omitted on purpose: the CIM configuration and status blocks (00001-00021), the status register block (00201-00209), the remaining pump blocks (pump 2-6 start at 00411/00421/00431/00441/00451 with the same layout), the DDD remote sensors, alarm simulation and user registers, the 32-bit counters (operating time 1 hour, powered time 1 hour, energy 1 kWh, pumped volume 0.1 m3) and the remaining sensor rows, as a scope choice, and the model-dependent set-point tables for DDD sensors. Registers 00401-00409 are the pump 1 block."
}
