{
 "manufacturer": "Belimo",
 "manufacturer_slug": "belimo",
 "model": "Energy Valve DN 15-50 (Version 4) Modbus RTU / TCP",
 "model_slug": "energy-valve-v4",
 "short_model": "Belimo Energy Valve V4",
 "aliases": [
  "EV..R2+BAC",
  "EV..R2+KBAC",
  "EV..R2+MID",
  "EV..R3+BAC",
  "Energy Valve 4"
 ],
 "equipment_type": "Actuator / valve (pressure-independent control valve with energy metering)",
 "applies_to": "Belimo Energy Valve Version 4, DN 15-50 (EV..R2+(K)BAC, EV..R2+MID, EV..R3+BAC), per Energy Valve Modbus interface description en-gb 2023-08.",
 "summary": "Belimo's Energy Valve combines a pressure-independent control valve, a flow sensor and two temperature sensors, so it reports flow, delta T, heating/cooling power and energy totals. Version 4 offers Modbus RTU on RS-485 and Modbus TCP on its Ethernet port. Most values are given three times - in SI, imperial and a user-selected unit - and large values use two registers, low word first.",
 "transport": [
  "RTU",
  "TCP"
 ],
 "defaults": {
  "unit_id": 1,
  "baud": 38400,
  "parity": "None",
  "data_bits": 8,
  "stop_bits": 2,
  "tcp_port": 502
 },
 "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 (firmware example in the document: 400 = 4.00)",
 "source": {
  "title": "Energy Valve Modbus Interface Description - Energy Valve DN 15...50 (Version 4)",
  "doc_number": "en-gb 2023-08 (general notes dated 15.01.2022)",
  "revision_date": "2023-08",
  "url": "https://www.belimo.com/mam/general-documents/system_integration/Modbus/belimo_Modbus-Register_Energy-Valve_V4_1_en-gb.pdf",
  "pages": "General notes p. 2; register overview pp. 3-5; register descriptions pp. 6-10"
 },
 "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 sensor-1 and Temperature 1/2 registers (No. 14, 15, 20-23) are signed two's complement and typed INT16 here.",
  "Unsupported registers read 65535. Writable registers from No. 101 up are persistent; don't write them cyclically.",
  "The description table prints Sensor 1 °C/°F (No. 123/124) with addresses 124/125, which does not match the No.-minus-1 rule used everywhere else, so those two are left out. No. 13 (raw sensor value, scale depends on sensor type) is also left out.",
  "No. 136/137 (Vmax in selected unit) is left out: its scaling is printed as '0.001-' and is unclear. No. 201-204 (sensor serial number / production order and sequence numbers) are left out because the document does not say whether each pair is one 32-bit value.",
  "No. 9 (flow gpm) has no access letter in the description table; it is read-only like its neighbours. No. 151 has no access letter either and is listed as read-only to be safe, although the other unit selections are R/W.",
  "Belimo lists Communication watchdog (No. 110) as 'not functional, reserved for future' in this edition, so don't rely on it."
 ],
 "registers": [
  {
   "table": "holding_register",
   "address": 0,
   "documented": "1",
   "name": "Setpoint",
   "description": "Relative setpoint 0-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": 1,
   "documented": "2",
   "name": "Override control",
   "description": "Forces a fixed valve state instead of the setpoint.",
   "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 (Sync).",
   "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": "Actuator 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",
    "3": "Fire",
    "4": "Energy Valve / flow 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 a percentage of Vnom.",
   "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": 13,
   "documented": "14",
   "name": "Sensor 1 temperature (°C)",
   "description": "Sensor 1 input as temperature (passive sensor types).",
   "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": 14,
   "documented": "15",
   "name": "Sensor 1 temperature (°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": 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": 19,
   "documented": "20",
   "name": "Temperature 1 external (°C)",
   "description": "Remote (external) temperature 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": 20,
   "documented": "21",
   "name": "Temperature 1 external (°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": 21,
   "documented": "22",
   "name": "Temperature 2 integrated (°C)",
   "description": "Integrated temperature 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 2 integrated (°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": 23,
   "documented": "24",
   "name": "Delta T (K)",
   "description": "Temperature difference between the two sensors.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.01,
   "units": "K",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 24,
   "documented": "25",
   "name": "Delta T (°F)",
   "description": "",
   "data_type": "UINT16",
   "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": 26,
   "documented": "27",
   "name": "Relative power",
   "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": 27,
   "documented": "28",
   "name": "Cooling power (kW)",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.001,
   "units": "kW",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 29,
   "documented": "30",
   "name": "Cooling power (kBTU/h)",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.001,
   "units": "kBTU/h",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 31,
   "documented": "32",
   "name": "Cooling power (selected unit)",
   "description": "Unit set by No. 149.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.1,
   "units": "see No. 149",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 33,
   "documented": "34",
   "name": "Heating power (kW)",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.001,
   "units": "kW",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 35,
   "documented": "36",
   "name": "Heating power (kBTU/h)",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.001,
   "units": "kBTU/h",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 37,
   "documented": "38",
   "name": "Heating power (selected unit)",
   "description": "Unit set by No. 149.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.1,
   "units": "see No. 149",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 39,
   "documented": "40",
   "name": "Delta T setpoint (K)",
   "description": "Delta T setpoint, 1.00-55.00 K.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.01,
   "units": "K",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 40,
   "documented": "41",
   "name": "Delta T setpoint (°F)",
   "description": "Same setpoint in °F, 1.80-99.00.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.01,
   "units": "°F",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 41,
   "documented": "42",
   "name": "Flow limit for Delta T (l/s)",
   "description": "Absolute flow setpoint used by the Delta T function.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.001,
   "units": "l/s",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 43,
   "documented": "44",
   "name": "Flow limit for Delta T (gpm)",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.01,
   "units": "gpm",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 45,
   "documented": "46",
   "name": "Flow limit for Delta T (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": 59,
   "documented": "60",
   "name": "Total volume (m3)",
   "description": "",
   "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": "Total volume (gal)",
   "description": "",
   "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": "Total volume (selected unit)",
   "description": "Unit set by No. 150.",
   "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": 65,
   "documented": "66",
   "name": "Cooling energy (kWh)",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "kWh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 67,
   "documented": "68",
   "name": "Cooling energy (kBTU)",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "kBTU",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 69,
   "documented": "70",
   "name": "Cooling energy (selected unit)",
   "description": "Unit set by No. 151.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "see No. 151",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 71,
   "documented": "72",
   "name": "Heating energy (kWh)",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "kWh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 73,
   "documented": "74",
   "name": "Heating energy (kBTU)",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "kBTU",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 75,
   "documented": "76",
   "name": "Heating energy (selected unit)",
   "description": "Unit set by No. 151.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "see No. 151",
   "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 the tools).",
   "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 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 (air in system)",
    "8": "External temperature sensor error",
    "9": "Integrated temperature sensor error",
    "10": "Communication to flow sensor interrupted",
    "11": "Freeze warning",
    "12": "Glycol detected",
    "13": "Power setpoint not reached (15 min)"
   },
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 105,
   "documented": "106",
   "name": "Vmin",
   "description": "Minimum flow limit in %, 0 up to Vmax; default 0.",
   "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": "Vmax",
   "description": "Maximum flow limit, 25-100 %; cannot go below Vmin. 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 setpoint",
   "description": "Setpoint used when the bus watchdog expires.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.01,
   "units": "%",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 109,
   "documented": "110",
   "name": "Communication watchdog",
   "description": "Bus timeout; Belimo marks it not functional / reserved in this edition.",
   "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": "How the setpoint is interpreted. Default flow control.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "Position control",
    "1": "Flow control",
    "2": "Power control"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 118,
   "documented": "119",
   "name": "Setpoint source",
   "description": "Bus = No. 1; Analog = 0.5-10 V on wire 3. Default Bus.",
   "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",
    "3": "Passive",
    "4": "Switch"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 121,
   "documented": "122",
   "name": "Sensor 1 passive sensor type",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "Resistance measurement",
    "1": "PT1000",
    "2": "Ni1000",
    "7": "NTC10k2",
    "8": "NTC10k3"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 129,
   "documented": "130",
   "name": "Vmin (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": "Vmin (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": "Vmin (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": "Vmax (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": 134,
   "documented": "135",
   "name": "Vmax (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": 147,
   "documented": "148",
   "name": "Unit selection flow",
   "description": "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": 148,
   "documented": "149",
   "name": "Unit selection power",
   "description": "Default kW.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "W",
    "1": "kW",
    "2": "MW",
    "3": "BTU/h",
    "4": "kBTU/h",
    "5": "ton"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 149,
   "documented": "150",
   "name": "Unit selection volume",
   "description": "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": 150,
   "documented": "151",
   "name": "Unit selection energy",
   "description": "Default kWh.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": {
    "0": "J",
    "1": "kJ",
    "2": "MJ",
    "3": "GJ",
    "4": "Wh",
    "5": "kWh",
    "6": "MWh",
    "7": "BTU",
    "8": "kBTU",
    "9": "ton"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 159,
   "documented": "160",
   "name": "Nominal power (kW)",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.001,
   "units": "kW",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 161,
   "documented": "162",
   "name": "Nominal power (kBTU/h)",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.001,
   "units": "kBTU/h",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 163,
   "documented": "164",
   "name": "Nominal power (selected unit)",
   "description": "Unit set by No. 149.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.1,
   "units": "see No. 149",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 165,
   "documented": "166",
   "name": "Max power",
   "description": "Power limit as % of nominal power, 0.5-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": 166,
   "documented": "167",
   "name": "Absolute Pmax (kW)",
   "description": "Power limit, 0.5 % of Pnom up to Pnom.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.001,
   "units": "kW",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 168,
   "documented": "169",
   "name": "Absolute Pmax (kBTU/h)",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.001,
   "units": "kBTU/h",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 170,
   "documented": "171",
   "name": "Absolute Pmax (selected unit)",
   "description": "Unit set by No. 149.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.1,
   "units": "see No. 149",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 179,
   "documented": "180",
   "name": "Delta T limitation",
   "description": "Turns the Delta T Manager on. Default disabled.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "Disabled",
    "1": "dT-Manager",
    "2": "dT-Manager scaling"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 180,
   "documented": "181",
   "name": "Delta T Manager status",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": {
    "0": "Not selected",
    "1": "Standby",
    "2": "Active",
    "3": "Scaling standby",
    "4": "Scaling active"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 204,
   "documented": "205",
   "name": "Select meter register",
   "description": "Certified (MID models only) or lifetime totals for No. 60-77; avoid toggling.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "Certified meter register",
    "1": "Lifetime meter register"
   },
   "bits": null,
   "offset": 0
  }
 ],
 "integration": {
  "summary": "Pick RTU (RS-485, 38400 8N2, address 1) or TCP (port 502), keep Setpoint source = Bus, choose Control mode (No. 117), then write the setpoint to No. 1 (address 0) and poll flow, temperatures, power and energy. Read each 32-bit value as a two-register pair, low word first.",
  "minimum_registers": [
   {
    "table": "holding_register",
    "address": 0,
    "why": "Setpoint, 0.01 %"
   },
   {
    "table": "holding_register",
    "address": 116,
    "why": "Control mode: position / flow / power"
   },
   {
    "table": "holding_register",
    "address": 7,
    "why": "Flow l/s"
   },
   {
    "table": "holding_register",
    "address": 19,
    "why": "Temperature 1 (external) °C"
   },
   {
    "table": "holding_register",
    "address": 21,
    "why": "Temperature 2 (integrated) °C"
   },
   {
    "table": "holding_register",
    "address": 27,
    "why": "Cooling power kW"
   },
   {
    "table": "holding_register",
    "address": 33,
    "why": "Heating power kW"
   },
   {
    "table": "holding_register",
    "address": 65,
    "why": "Cooling energy kWh"
   },
   {
    "table": "holding_register",
    "address": 71,
    "why": "Heating energy kWh"
   },
   {
    "table": "holding_register",
    "address": 104,
    "why": "Fault flags"
   }
  ],
  "enable": "Modbus RTU and TCP are configured with the Belimo Assistant app or the valve's built-in web server (address, baud, frame, IP). Setpoint source (No. 119) defaults to Bus.",
  "watchdog": "Bus fail setpoint is No. 109 and the timeout No. 110 (0-3600 s, 0 = off, default 120 s once a fail setpoint is set): if neither No. 1 nor No. 2 is renewed in time the valve goes to the fail setpoint. Belimo marks No. 110 as not functional in this edition, so test it before relying on it.",
  "quirks": [
   "Register No. is 1-based; subtract 1 for the wire address.",
   "32-bit pairs are low word first (CDAB) and must be written with a single FC 16 to just those two registers.",
   "Each quantity appears in SI, imperial and 'selected unit' registers; the selected-unit registers follow No. 148-151."
  ],
  "setup": [
   "RTU default frame 1-8-N-2 at 38400 baud, address 1; 9600-115200 baud supported.",
   "TCP default port 502 over the Ethernet socket.",
   "Max. 32 RTU nodes per segment without a repeater; terminate with 120 ohm."
  ],
  "gotchas": [
   "Unsupported values read 65535 - treat it as 'not available', not as a real reading.",
   "Temperatures are signed; read them as INT16."
  ]
 },
 "page": "https://easymodbus.com/modbus-register-maps/belimo/energy-valve-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."
}
