{
  "spec_version": 1,
  "slug": "belimo-vav-compact",
  "manufacturer": "Belimo",
  "model": "VAV-Compact volumetric flow controller (..MV-D3-MOD, ..HV24A-MOD)",
  "category": "HVAC controller",
  "supplier_url": "https://www.belimo.com/mam/general-documents/system_integration/Modbus/belimo_Modbus-Register_VAV_V3_8_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 related to the position or to the volumetric flow, scaled between Vmin (register 105) and Vmax (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, 4 = mid, 5 = max, 6 = fast open, 7 = fast close. Fast open / fast close cycles increase mechanical load."
    },
    {
      "address": 2,
      "count": 1,
      "name": "Command",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = none (default), 1 = adaption, 2 = test, 3 = sync, 4 = reset. After the command is sent the register returns to none; reset clears the malfunction and service information in register 104."
    },
    {
      "address": 3,
      "count": 1,
      "name": "Actuator type",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = actuator not connected, 1 = air / water, 2 = VAV / EPIV, 3 = fire, 4 = energy valve, 5 = 6-way EPIV."
    },
    {
      "address": 4,
      "count": 1,
      "name": "Relative position",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "Range 0...10000."
    },
    {
      "address": 5,
      "count": 1,
      "name": "Absolute position",
      "data_type": "UInt16",
      "units": "°",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Degrees for actuators with rotary movement, millimetres for actuators with linear movement (the unit depends on the device)."
    },
    {
      "address": 6,
      "count": 1,
      "name": "Relative volumetric flow",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "Relative volumetric flow of Vnom. Range 0...10000."
    },
    {
      "address": 7,
      "count": 1,
      "name": "Absolute volumetric flow",
      "data_type": "UInt16",
      "units": "m3/h",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Range 0...Vnom."
    },
    {
      "address": 8,
      "count": 1,
      "name": "Sensor 1 value",
      "data_type": "UInt16",
      "units": "mV",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Millivolts if sensor type 1 (register 107) is active, 0 / 1 if sensor type 1 is a switch. Range 0...65535."
    },
    {
      "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 own example: address x = low word, x+1 = high word, value = high * 65536 + low)."
    },
    {
      "address": 12,
      "count": 1,
      "name": "Analog setpoint",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "Setpoint in percent when the actuator is controlled by the analog signal."
    },
    {
      "address": 99,
      "count": 1,
      "name": "Bus termination",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = inactive (default), 1 = active: the 120 ohm bus termination is enabled."
    },
    {
      "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",
      "description": "Communication module firmware, e.g. 302 for version 3.02."
    },
    {
      "address": 104,
      "count": 1,
      "name": "Malfunction and service information",
      "data_type": "Binary",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Bit-coded. Bit 1 mechanical travel increased, bit 2 actuator cannot move, bit 8 internal activity, bit 9 gear train disengaged (manual override pressed), bit 10 bus watchdog triggered."
    },
    {
      "address": 105,
      "count": 1,
      "name": "Vmin",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "RW",
      "description": "Lower flow limit, range 0...Vmax. Default 0."
    },
    {
      "address": 106,
      "count": 1,
      "name": "Vmax",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "RW",
      "description": "Upper flow limit, range Vmin...10000 and greater than 20 percent. Default 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 / hybrid, 4 = switch. Restart the actuator after a change for correct sensor values."
    },
    {
      "address": 108,
      "count": 1,
      "name": "Bus fail position",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = none / last setpoint (default), 1 = fast close, 2 = fast open, 3 = mid position. Becomes active when the bus watchdog (register 109) expires."
    },
    {
      "address": 109,
      "count": 1,
      "name": "Timeout for bus watchdog",
      "data_type": "UInt16",
      "units": "s",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = deactivated (default), range 0...3600 s. When a bus fail position is configured the document states a default of 120 s."
    },
    {
      "address": 110,
      "count": 1,
      "name": "Nominal volumetric flow",
      "data_type": "UInt16",
      "units": "m3/h",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "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": "Vnom in the unit chosen by register 117, low word first."
    },
    {
      "address": 116,
      "count": 1,
      "name": "Control mode",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = position control, 1 = flow control."
    },
    {
      "address": 117,
      "count": 1,
      "name": "Unit selection flow",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = m3/s, 1 = m3/h (default), 2 = l/s, 3 = l/min, 4 = l/h, 5 = gpm, 6 = cfm."
    },
    {
      "address": 118,
      "count": 1,
      "name": "Setpoint source",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = analog signal on wire 3, 1 = bus (default, setpoint from register 0)."
    }
  ],
  "combined_registers": [],
  "notes": "Source: Belimo 'Modbus Interface Description - VAV-Compact, Volumetric flow compact control device', edition 2026-01 / V3.08, manufacturer date 01.12.2023 (belimo_Modbus-Register_VAV_V3_8_en-gb.pdf), read from Belimo's own regional mirror https://www.belimo.ro/mam/general-documents/system_integration/Modbus/belimo_Modbus-Register_VAV_V3_8_en-gb.pdf because www.belimo.com answers automated requests with HTTP 403; same MAM document and edition, the URL above is the canonical location. Applicable actuator types: ..MV-D3-MOD and ..HV24A-MOD. Factory Modbus settings from the document's 'Modbus RTU' block: 38400 Bd, transmission format 1-8-N-2 (8 data bits, no parity, 2 stop bits), address 1; 9600/19200/76800/115200 Bd and 1-8-N-1 / 1-8-E-1 / 1-8-O-1 are selectable, as are addresses 1...247. Addressing: the document prints both numberings - 'All data is arranged in a table and addressed by 1..n (Register No.) or 0..n-1 (Address)' - and every row carries both columns; the values stored here are the Address column (Register No. minus 1), hence zero_based. Word order: 32-bit values are 'little endian byte swap / LSW (Least Significant Word) first', so the low word sits at the lower Register No. and the two 32-bit rows (10 and 112) are read LowFirst; the document's worked example gives high word 19 at Register No. x+1 and low word 14551 at x, value = 19 * 65536 + 14551. Every value is an unsigned 16-bit integer and the document makes no distinction between data types, so all rows live in holding registers and FC 3/6/16 reach everything (FC 2/4 are alternatives). Left out: registers 9, 11, 111, 114 and 115, printed as '–' (reserved or the second half of a 32-bit pair); register 12 is entered read-only because its description table says R while the overview column shows 'R / W'. Scales are the document's plain multipliers (0.01 percent, 0.001 for the unit-selected 32-bit flows)."
}
