{
 "manufacturer": "Belimo",
 "manufacturer_slug": "belimo",
 "model": "2-way EPIV DN 15-50 (Version 4.2) Modbus RTU",
 "model_slug": "epiv-2-way-v4",
 "short_model": "Belimo 2-way EPIV",
 "aliases": [
  "EP..R2+BAC",
  "EP..R2+KBAC",
  "Electronic pressure-independent valve"
 ],
 "equipment_type": "Actuator / valve (pressure-independent characterised control valve)",
 "applies_to": "Belimo 2-way EPIV DN 15-50 Version 4 (EP..R2+(K)BAC) on Modbus RTU, per interface description edition 2025-09 / V4.2.",
 "summary": "Belimo's electronic pressure-independent valve measures flow with its own sensor and controls either position or flow. On Modbus RTU it takes a relative setpoint and override, and reports position, flow in l/s, gpm and a selectable unit, medium temperature, glycol and accumulated volume, plus fault flags and the min/max flow limits. 32-bit values are low word first.",
 "transport": [
  "RTU"
 ],
 "defaults": {
  "unit_id": 1,
  "baud": 38400,
  "parity": "None",
  "data_bits": 8,
  "stop_bits": 2,
  "tcp_port": null
 },
 "addressing": {
  "convention": "1-based",
  "note": "Belimo prints each register twice: 'No.' counts from 1 and 'Address' from 0, and the documented value here is the No. column. Register No. 1 (setpoint) is wire address 0. Every value sits in one flat table, so holding-register reads (FC 3) and writes (FC 6/16) reach everything; FC 4 input-register reads of the same addresses also work."
 },
 "default_word_order": "CDAB",
 "firmware": "Version 4 devices (example in the document: 400 = 4.00)",
 "source": {
  "title": "Modbus interface description - 2-way EPIV, DN 15...50 (Version 4.2)",
  "doc_number": "Edition 2025-09 / V4.2",
  "revision_date": "2025-09",
  "url": "https://www.belimo.com/mam/general-documents/system_integration/Modbus/belimo_Modbus-Register_2way-EPIV_V4_2_en-gb.pdf",
  "pages": "General notes pp. 4-5; register overview pp. 6-7; register description pp. 8-14"
 },
 "notes": [
  "32-bit values occupy two registers with the low word first (Belimo's worked example: No. 10 = 14551, No. 11 = 19 gives 19 x 65536 + 14551 = 1,259,735), so they are UINT32 with CDAB word order. Write a 32-bit pair with one FC 16 request covering only those two registers.",
  "Values are unsigned unless Belimo marks them signed (**): the flow-body temperatures (No. 22/23) are signed two's complement and typed INT16.",
  "The flow-meter serial-number pairs (No. 201/202, 203/204) are marked LowWord/HighWord in the register overview, so they are typed UINT32 low word first.",
  "Unsupported registers read 65535. Writable registers from No. 101 up are persistent; don't write them cyclically.",
  "Belimo notes that the HVAC application may clamp values inside the listed ranges depending on the valve size (see the product datasheet).",
  "Unlike the air/water actuators, Setpoint source (No. 119) defaults to Analog on this valve: write 1 before bus setpoints take effect."
 ],
 "registers": [
  {
   "table": "holding_register",
   "address": 0,
   "documented": "1",
   "name": "Setpoint relative",
   "description": "Position or flow setpoint 0-100 %, scaled between the Min and Max limits.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.01,
   "units": "%",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 1,
   "documented": "2",
   "name": "Override control",
   "description": "Forces a fixed valve state; min/max follow Control mode.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "None",
    "1": "Open valve",
    "2": "Close valve",
    "3": "Minimum flow",
    "5": "Maximum flow",
    "6": "Nominal flow",
    "10": "Motor stop"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 2,
   "documented": "3",
   "name": "Command",
   "description": "Service command; returns to 0 after it is sent.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "None",
    "2": "Sync"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 3,
   "documented": "4",
   "name": "Device type",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": {
    "0": "Device not connected",
    "1": "Air / water",
    "2": "VAV / EPIV / flow sensor",
    "3": "Fire",
    "4": "Energy valve / energy meter",
    "5": "6-way EPIV"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 4,
   "documented": "5",
   "name": "Relative position",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.01,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 5,
   "documented": "6",
   "name": "Absolute position",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.01,
   "units": "°",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 6,
   "documented": "7",
   "name": "Relative volumetric flow",
   "description": "Flow as % of Vmax (No. 107).",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.01,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 7,
   "documented": "8",
   "name": "Absolute volumetric flow (l/s)",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.01,
   "units": "l/s",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 8,
   "documented": "9",
   "name": "Absolute volumetric flow (gpm)",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "gpm",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 9,
   "documented": "10",
   "name": "Absolute volumetric flow (selected unit)",
   "description": "Unit set by No. 148.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.001,
   "units": "see No. 148",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 11,
   "documented": "12",
   "name": "Setpoint analog",
   "description": "Setpoint seen on the analog input when Setpoint source = Analog.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.01,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 12,
   "documented": "13",
   "name": "Sensor 1 value",
   "description": "Extra sensor input on Y3; mV for Active, 0/1 for Switch (No. 121).",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 15,
   "documented": "16",
   "name": "Flow setpoint (l/s)",
   "description": "Active absolute flow setpoint.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.01,
   "units": "l/s",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 16,
   "documented": "17",
   "name": "Flow setpoint (gpm)",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "gpm",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 17,
   "documented": "18",
   "name": "Flow setpoint (selected unit)",
   "description": "Unit set by No. 148.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.001,
   "units": "see No. 148",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 21,
   "documented": "22",
   "name": "Temperature flow body (°C)",
   "description": "Medium temperature at the flow sensor.",
   "data_type": "INT16",
   "length": 1,
   "word_order": null,
   "scale": 0.01,
   "units": "°C",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 22,
   "documented": "23",
   "name": "Temperature flow body (°F)",
   "description": "",
   "data_type": "INT16",
   "length": 1,
   "word_order": null,
   "scale": 0.01,
   "units": "°F",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 25,
   "documented": "26",
   "name": "Glycol concentration",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.01,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 59,
   "documented": "60",
   "name": "Accumulated volume (m3)",
   "description": "Not resettable.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.01,
   "units": "m3",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 61,
   "documented": "62",
   "name": "Accumulated volume (gal)",
   "description": "Not resettable.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "gal",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 63,
   "documented": "64",
   "name": "Accumulated volume (selected unit)",
   "description": "Unit set by No. 150; not resettable.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "see No. 150",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 99,
   "documented": "100",
   "name": "Bus termination",
   "description": "Shows whether the 120 ohm terminator is enabled (set with Belimo Assistant 2).",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": {
    "0": "Disabled",
    "1": "Enabled"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 100,
   "documented": "101",
   "name": "Series number 1st part",
   "description": "First block of the serial number on the housing label.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 101,
   "documented": "102",
   "name": "Series number 2nd part",
   "description": "Second block of the serial number.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 102,
   "documented": "103",
   "name": "Series number 4th part",
   "description": "Fourth block of the serial number (the third is not exposed).",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 103,
   "documented": "104",
   "name": "Firmware version",
   "description": "Communication module firmware; 400 means version 4.00.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 104,
   "documented": "105",
   "name": "Malfunction and service information",
   "description": "Bit-coded fault flags; several can be set at once.",
   "data_type": "BITMAP16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": {
    "0": "No communication to actuator",
    "1": "Gear train disengaged",
    "2": "Actuator cannot move",
    "3": "Reverse flow",
    "4": "Flow setpoint not reached (15 min)",
    "5": "Flow with closed valve",
    "6": "Actual flow exceeds nominal flow",
    "7": "Flow measurement error",
    "9": "Flow body temperature error",
    "10": "Communication to flow sensor interrupted",
    "11": "Freeze warning",
    "12": "Glycol detected",
    "15": "Bus watchdog triggered"
   },
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 105,
   "documented": "106",
   "name": "Minimum volumetric flow",
   "description": "Min flow limit as %; 0 disables it.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.01,
   "units": "%",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 106,
   "documented": "107",
   "name": "Maximum volumetric flow",
   "description": "Max flow limit, 25-100 % of Vnom; default 100 %.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.01,
   "units": "%",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 108,
   "documented": "109",
   "name": "Bus fail action",
   "description": "Action when the bus watchdog expires.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "None",
    "1": "Open",
    "2": "Close",
    "3": "Max",
    "4": "Min",
    "6": "Stop"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 109,
   "documented": "110",
   "name": "Timeout for communication watchdog",
   "description": "5-3600 s, default 120 s; any missed setpoint/override write triggers No. 109.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "s",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 110,
   "documented": "111",
   "name": "Nominal volumetric flow (l/s)",
   "description": "Vnom of the valve.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.01,
   "units": "l/s",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 111,
   "documented": "112",
   "name": "Nominal volumetric flow (gpm)",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "gpm",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 112,
   "documented": "113",
   "name": "Nominal volumetric flow (selected unit)",
   "description": "Unit set by No. 148.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.001,
   "units": "see No. 148",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 116,
   "documented": "117",
   "name": "Control mode",
   "description": "Position or flow control; changing it resets the device. Default flow.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "Position control",
    "1": "Flow control"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 118,
   "documented": "119",
   "name": "Setpoint source",
   "description": "Analog = 0.5-10 V on wire 3; Bus = No. 1. Default Analog.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "Analog",
    "1": "Bus"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 120,
   "documented": "121",
   "name": "Sensor 1 type",
   "description": "Extra sensor input; selectable only when Setpoint source = Bus.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "None",
    "1": "Active",
    "4": "Switch"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 129,
   "documented": "130",
   "name": "Minimum flow limit (l/s)",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.01,
   "units": "l/s",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 130,
   "documented": "131",
   "name": "Minimum flow limit (gpm)",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "gpm",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 131,
   "documented": "132",
   "name": "Minimum flow limit (selected unit)",
   "description": "Unit set by No. 148.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.001,
   "units": "see No. 148",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 133,
   "documented": "134",
   "name": "Maximum flow limit (l/s)",
   "description": "Values below 25 % of Vnom are raised to 25 %.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.01,
   "units": "l/s",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 134,
   "documented": "135",
   "name": "Maximum flow limit (gpm)",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "gpm",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 135,
   "documented": "136",
   "name": "Maximum flow limit (selected unit)",
   "description": "Unit set by No. 148.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.001,
   "units": "see No. 148",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 147,
   "documented": "148",
   "name": "Unit selection flow",
   "description": "Unit for No. 10, 18, 113, 132 and 136. Default l/h.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "m3/s",
    "1": "m3/h",
    "2": "l/s",
    "3": "l/min",
    "4": "l/h",
    "5": "gpm",
    "6": "cfm"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 149,
   "documented": "150",
   "name": "Unit selection volume",
   "description": "Unit for No. 64. Default m3.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "m3",
    "1": "Litre",
    "2": "Gallon",
    "3": "cf"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 200,
   "documented": "201",
   "name": "Flow meter serial number, first digits",
   "description": "Production order number.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 202,
   "documented": "203",
   "name": "Flow meter serial number, last digits",
   "description": "Production sequence number.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  }
 ],
 "integration": {
  "summary": "Set address and frame with Belimo Assistant 2, write Setpoint source No. 119 = 1 (Bus), choose Control mode No. 117, then write the setpoint to No. 1 (address 0) and poll flow (No. 8 or 10), position (No. 5) and faults (No. 105).",
  "minimum_registers": [
   {
    "table": "holding_register",
    "address": 118,
    "why": "Setpoint source = Bus (default is Analog)"
   },
   {
    "table": "holding_register",
    "address": 116,
    "why": "Position or flow control"
   },
   {
    "table": "holding_register",
    "address": 0,
    "why": "Setpoint, 0.01 %"
   },
   {
    "table": "holding_register",
    "address": 7,
    "why": "Flow l/s"
   },
   {
    "table": "holding_register",
    "address": 4,
    "why": "Relative position"
   },
   {
    "table": "holding_register",
    "address": 21,
    "why": "Medium temperature °C"
   },
   {
    "table": "holding_register",
    "address": 104,
    "why": "Fault flags"
   },
   {
    "table": "holding_register",
    "address": 109,
    "why": "Watchdog timeout"
   }
  ],
  "enable": "Configure Modbus address (1-247), baud and frame with Belimo Assistant 2, then write No. 119 = 1 so the valve follows the bus setpoint.",
  "watchdog": "No. 110 sets the timeout (5-3600 s, default 120 s). If neither No. 1 nor No. 2 is written in that time, the valve performs the Bus fail action in No. 109 (default None) and bit 15 of No. 105 is set.",
  "quirks": [
   "Register No. is 1-based; subtract 1 for the wire address.",
   "Changing Control mode (No. 117) resets the device.",
   "32-bit pairs are low word first and must be written with one FC 16 covering only that pair."
  ],
  "setup": [
   "Default frame 1-8-N-2 at 38400 baud, address 1.",
   "Up to 32 nodes per segment without a repeater; terminate with 120 ohm."
  ],
  "gotchas": [
   "Out of the box the valve listens to the analog input, not the bus.",
   "65535 means 'not available'."
  ]
 },
 "page": "https://easymodbus.com/modbus-register-maps/belimo/epiv-2-way-v4",
 "address_note": "address = 0-based Modbus wire (PDU) address; documented = as printed in the source.",
 "note": "Re-typed from the manufacturer's public documentation (see source) and verified against it. Registers vary by firmware and options; verify against the live device before writing."
}
