{
  "spec_version": 1,
  "slug": "belimo-vav-universal",
  "manufacturer": "Belimo",
  "model": "VAV-Universal VRU-D3-BAC / VRU-M1-BAC / VRU-M1R-BAC",
  "category": "HVAC controller",
  "supplier_url": "https://www.belimo.com/mam/general-documents/system_integration/Modbus/belimo_Modbus-Register_VRU_V1_4_en-gb.pdf",
  "default_configuration": {
    "protocol": "modbus_tcp",
    "port": 502,
    "unit_id": 1,
    "addressing": "zero_based",
    "byte_order": "BigEndian",
    "word_order": "LowFirst",
    "native_interface": "rs485",
    "serial": {
      "parity": "None",
      "baud_rate": 38400,
      "data_bits": 8,
      "stop_bits": 2
    }
  },
  "coils": [],
  "discrete_inputs": [],
  "input_registers": [],
  "holding_registers": [
    {
      "address": 0,
      "count": 1,
      "name": "Setpoint",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "RW",
      "description": "Setpoint for the demanded flow, pressure or damper position according to the selected application and control mode; active when setpoint source (register 118) is bus. Scaled between Min (register 105) and Max (register 106). Range 0...10000. Default 0."
    },
    {
      "address": 1,
      "count": 1,
      "name": "Override control",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = none (default), 1 = open, 2 = close, 3 = min, 5 = max, 8 = motor stop. Acts on the active setpoint source."
    },
    {
      "address": 2,
      "count": 1,
      "name": "Command",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = none (default), 1 = adaptation, 2 = test run, 3 = synchronization. The register returns to 0 after the command has been executed."
    },
    {
      "address": 3,
      "count": 1,
      "name": "Actuator type",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "1 = air / water, 2 = VAV / EPIV, 3 = fire, 4 = energy valve, 5 = 6-way EPIV. Reads 65535 when the selected application has no local actuator."
    },
    {
      "address": 4,
      "count": 1,
      "name": "Relative position",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "Related to the adapted mechanical range. Range 0...10000; 65535 when the application has no local actuator."
    },
    {
      "address": 5,
      "count": 1,
      "name": "Absolute position",
      "data_type": "UInt16",
      "units": "°",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "Angular position over the entire range of rotation, range 0...9600 (0.01 degrees), i.e. 0...96 degrees. 65535 when the application has no local actuator."
    },
    {
      "address": 6,
      "count": 1,
      "name": "Relative volumetric flow",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "Relative to the nominal volumetric flow in register 110. Range 0...15000. 65535 when the application does not measure flow."
    },
    {
      "address": 7,
      "count": 1,
      "name": "Absolute volumetric flow",
      "data_type": "UInt16",
      "units": "m3/h",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Range 0...65535; 65535 when the application does not measure flow."
    },
    {
      "address": 8,
      "count": 1,
      "name": "Sensor 1 value",
      "data_type": "UInt16",
      "units": "mV",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Depends on sensor type 1 (register 107): voltage 0...65535 mV, resistance 0...65535 ohm, 0/1 for a switch."
    },
    {
      "address": 10,
      "count": 2,
      "name": "Absolute volumetric flow in the selected unit",
      "data_type": "UInt32",
      "units": "UnitSel",
      "scale_factor": 0.001,
      "offset": 0,
      "access": "R",
      "description": "32-bit value in the unit chosen by register 117, low word first (the document's worked example: high word at Register No. x+1, low word at x). 65535 in both words when the application does not measure flow."
    },
    {
      "address": 12,
      "count": 1,
      "name": "Analog setpoint",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "Setpoint in percent when setpoint source (register 118) is analog."
    },
    {
      "address": 50,
      "count": 1,
      "name": "Relative differential pressure",
      "data_type": "Int16",
      "units": "%",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "Relative to the nominal differential pressure in register 128. Range -15000...15000."
    },
    {
      "address": 51,
      "count": 1,
      "name": "Absolute differential pressure",
      "data_type": "Int16",
      "units": "Pa",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Signed integer, range -1000...10000 (x0.1 Pa)."
    },
    {
      "address": 53,
      "count": 2,
      "name": "Absolute differential pressure in the selected unit",
      "data_type": "Int32",
      "units": "UnitSel",
      "scale_factor": 0.001,
      "offset": 0,
      "access": "R",
      "description": "Signed 32-bit value in the unit chosen by register 145, low word first."
    },
    {
      "address": 99,
      "count": 1,
      "name": "Bus termination",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = disabled (default), 1 = enabled: the 120 ohm bus termination is active. Set with the service tools."
    },
    {
      "address": 100,
      "count": 1,
      "name": "Series number, 1st part",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Parts 1, 2 and 4 of the four-part series number are readable; the example 00839-31324-064-008 is read as 00839 / 31324 / 008."
    },
    {
      "address": 101,
      "count": 1,
      "name": "Series number, 2nd part",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 102,
      "count": 1,
      "name": "Series number, 4th part",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 103,
      "count": 1,
      "name": "Firmware version",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 104,
      "count": 1,
      "name": "Malfunction and service information",
      "data_type": "Binary",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Bit 4 error in the dP sensor, bit 6 airflow not reached, bit 8 internal activity, bit 9 gear train disengaged (manual override pressed), bit 10 bus watchdog triggered, bit 11 actuator type does not fit the selected application."
    },
    {
      "address": 105,
      "count": 1,
      "name": "Min",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "RW",
      "description": "Lower limit, range 0...Max."
    },
    {
      "address": 106,
      "count": 1,
      "name": "Max",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "RW",
      "description": "Upper limit, range 2000...10000."
    },
    {
      "address": 107,
      "count": 1,
      "name": "Sensor 1 type",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = none (default), 1 = active (shows the analog setpoint in mV in hybrid mode), 2 = passive, 4 = switch."
    },
    {
      "address": 108,
      "count": 1,
      "name": "Bus fail position",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "RW",
      "description": "Position taken when the communication watchdog (register 109) expires. Range 0...10000."
    },
    {
      "address": 109,
      "count": 1,
      "name": "Communication watchdog",
      "data_type": "UInt16",
      "units": "s",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Timeout in seconds, range 0...3600."
    },
    {
      "address": 110,
      "count": 1,
      "name": "Nominal volumetric flow",
      "data_type": "UInt16",
      "units": "m3/h",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Range 0...60000."
    },
    {
      "address": 112,
      "count": 2,
      "name": "Nominal volumetric flow in the selected unit",
      "data_type": "UInt32",
      "units": "UnitSel",
      "scale_factor": 0.001,
      "offset": 0,
      "access": "R",
      "description": "Low word at register 112, high word at 113; range up to 60000000."
    },
    {
      "address": 116,
      "count": 1,
      "name": "Control mode",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Visualisation of the control mode selected by the damper manufacturer: 0 = position control (Min/Max refer to the adapted mechanical range), 1 = flow control (Min/Max refer to the nominal volumetric flow). Default 1."
    },
    {
      "address": 117,
      "count": 1,
      "name": "Unit selection flow",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Unit for the 32-bit flow registers: 0 = (not used), 1 = m3/h (default), 2 = l/s, 6 = cfm."
    },
    {
      "address": 118,
      "count": 1,
      "name": "Setpoint source",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = analog input on wire 3 (register 12 active), 1 = bus (default, register 0 active)."
    },
    {
      "address": 119,
      "count": 1,
      "name": "Operation mode",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = negative pressure, 1 = positive pressure (default). Only selectable on the VRU-M1R-BAC."
    },
    {
      "address": 123,
      "count": 1,
      "name": "Room pressure cascade",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = disabled (default), 1 = enabled, 2 = enabled fast. Only available when register 124 is flow control or room pressure control; the fast variant only on the VRU-M1R-BAC."
    },
    {
      "address": 124,
      "count": 1,
      "name": "Application selection",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Selected by the damper manufacturer: 0 = flow control (default), 1 = pressure control, 2 = room pressure control, 3 = flow measurement."
    },
    {
      "address": 125,
      "count": 1,
      "name": "System altitude",
      "data_type": "UInt16",
      "units": "m",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Altitude above sea level, range 0...3000 m. Default 0."
    },
    {
      "address": 126,
      "count": 1,
      "name": "Nominal differential pressure in the selected unit",
      "data_type": "UInt16",
      "units": "UnitSel",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Unit chosen by register 145."
    },
    {
      "address": 128,
      "count": 1,
      "name": "Nominal differential pressure",
      "data_type": "UInt16",
      "units": "Pa",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Range depends on the actuator: VRU-D3-BAC 0...5000, VRU-M1-BAC 0...6000, VRU-M1R-BAC 0...750 Pa. Used as dp@Vnom in flow control and as the measurement limit in pressure control."
    },
    {
      "address": 145,
      "count": 1,
      "name": "Unit selection differential pressure",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = pascal (default), 2 = inches of water. Applies to register 126."
    }
  ],
  "combined_registers": [],
  "notes": "Source: Belimo 'Modbus Interface Description - VAV-Universal VRU-D3-BAC / VRU-M1-BAC / VRU-M1R-BAC, Controller for VAV/CAV and pressure applications', edition 2026-01 / V1.04 (belimo_Modbus-Register_VRU_V1_4_en-gb.pdf). www.belimo.com refuses automated downloads (HTTP 403), so the document was read from Belimo's own regional mirror https://www.belimo.ro/mam/general-documents/system_integration/Modbus/belimo_Modbus-Register_VRU_V1_4_en-gb.pdf (same MAM document and edition); the URL above is the canonical vendor location. This is not the VAV-Compact map: the VAV-Universal adds the differential-pressure block (registers 50-53 and 126-145), the application/operation-mode registers (119, 123, 124) and system altitude (125), and it scales the absolute position at 0.01 degrees instead of 1 degree. Factory Modbus settings: 38400 Bd, 1-8-N-2 (8 data bits, no parity, 2 stop bits), address 1; the same four transmission formats and 9600/19200/76800/115200 Bd are selectable, addresses 1...247. Addressing comes from the document's twin columns - 'addressed by 1..n (Register No.) or 0..n-1 (Address)' - so the values here are the Address column, i.e. zero_based. Word order: 32-bit values are 'little endian byte swap / LSW first' (low word at the lower Register No.), hence LowFirst for registers 10, 53 and 112; the signed rows (50, 51, 53) are entered as Int16/Int32 because the document marks them '**) signed integer'. The document prints register 113's address column as '12', a typo for 112: the neighbouring rows and the text ('The register shows the LowWord' / 'HighWord') make 112/113 the pair, and that is what is stored. Deliberately left out: registers 9, 11, 52, 111, 113-115, 120-122, 127 and the '..' gap 129-144, all printed as '–'. The flow and pressure readings are inactive (65535) unless the configured application supports them, which the row descriptions say."
}
