{
  "spec_version": 1,
  "slug": "belimo-thermal-energy-meter",
  "manufacturer": "Belimo",
  "model": "Thermal Energy Meter TEM DN 15...50 (version 4, 22PE..-1U.. / 22PF-..)",
  "category": "Energy meter",
  "supplier_url": "https://www.belimo.com/mam/general-documents/system_integration/Modbus/belimo_Modbus-Register_TEM_V4_2_en-gb.pdf",
  "default_configuration": {
    "protocol": "modbus_tcp",
    "port": 502,
    "unit_id": 1,
    "addressing": "zero_based",
    "byte_order": "BigEndian",
    "word_order": "LowFirst"
  },
  "coils": [],
  "discrete_inputs": [],
  "input_registers": [],
  "holding_registers": [
    {
      "address": 3,
      "count": 1,
      "name": "Device type",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = device not connected, 1 = air / water, 2 = VAV / EPIV, 3 = fire, 4 = energy valve / energy meter, 5 = 6-way EPIV."
    },
    {
      "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 qp in register 110/111/112. Range 0...15000."
    },
    {
      "address": 7,
      "count": 1,
      "name": "Absolute volumetric flow",
      "data_type": "UInt16",
      "units": "l/s",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "Range 0...1576; the sensor reads up to 2.5 x qp."
    },
    {
      "address": 8,
      "count": 1,
      "name": "Absolute volumetric flow",
      "data_type": "UInt16",
      "units": "gpm",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Range 0...2498; the sensor reads up to 2.5 x qp."
    },
    {
      "address": 9,
      "count": 2,
      "name": "Absolute volumetric flow in the selected unit",
      "data_type": "UInt32",
      "units": "UnitSel",
      "scale_factor": 0.001,
      "offset": 0,
      "access": "R",
      "description": "Unit chosen by register 147, low word first."
    },
    {
      "address": 12,
      "count": 1,
      "name": "Sensor 1 value",
      "data_type": "UInt16",
      "units": "mV",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Additional sensor input; millivolts, a resistance or a 0/1 state depending on sensor type 1 (register 120)."
    },
    {
      "address": 13,
      "count": 1,
      "name": "Sensor 1 temperature",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "Range -2000...15000 counts (x0.01 degrees)."
    },
    {
      "address": 14,
      "count": 1,
      "name": "Sensor 1 temperature",
      "data_type": "Int16",
      "units": "°F",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "Range -400...30200 counts (x0.01 degrees)."
    },
    {
      "address": 19,
      "count": 1,
      "name": "Temperature 1 (remote)",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "Range -2000...15000 counts (x0.01 degrees)."
    },
    {
      "address": 20,
      "count": 1,
      "name": "Temperature 1 (remote)",
      "data_type": "Int16",
      "units": "°F",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "Range -400...30200 counts (x0.01 degrees)."
    },
    {
      "address": 21,
      "count": 1,
      "name": "Temperature 2 (flow body)",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "Range -2000...15000 counts (x0.01 degrees)."
    },
    {
      "address": 22,
      "count": 1,
      "name": "Temperature 2 (flow body)",
      "data_type": "Int16",
      "units": "°F",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "Range -400...30200 counts (x0.01 degrees)."
    },
    {
      "address": 23,
      "count": 1,
      "name": "Delta temperature",
      "data_type": "Int16",
      "units": "K",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 24,
      "count": 1,
      "name": "Delta temperature",
      "data_type": "Int16",
      "units": "°F",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 25,
      "count": 1,
      "name": "Glycol concentration",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "Range 0...6000 (x0.01 percent); the effective range depends on the device type."
    },
    {
      "address": 27,
      "count": 2,
      "name": "Absolute power cooling",
      "data_type": "UInt32",
      "units": "kW",
      "scale_factor": 0.001,
      "offset": 0,
      "access": "R",
      "description": "Low word first. Range 0...3990000 (x0.001 kW)."
    },
    {
      "address": 29,
      "count": 2,
      "name": "Absolute power cooling",
      "data_type": "UInt32",
      "units": "kBTU/h",
      "scale_factor": 0.001,
      "offset": 0,
      "access": "R",
      "description": "Low word first. Range 0...136140 (x0.001 kBTU/h)."
    },
    {
      "address": 31,
      "count": 2,
      "name": "Absolute power cooling in the selected unit",
      "data_type": "UInt32",
      "units": "UnitSel",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Unit chosen by register 148, low word first."
    },
    {
      "address": 33,
      "count": 2,
      "name": "Absolute power heating",
      "data_type": "UInt32",
      "units": "kW",
      "scale_factor": 0.001,
      "offset": 0,
      "access": "R",
      "description": "Low word first. Range 0...3990000 (x0.001 kW)."
    },
    {
      "address": 35,
      "count": 2,
      "name": "Absolute power heating",
      "data_type": "UInt32",
      "units": "kBTU/h",
      "scale_factor": 0.001,
      "offset": 0,
      "access": "R",
      "description": "Low word first. Range 0...13614000 (x0.001 kBTU/h)."
    },
    {
      "address": 37,
      "count": 2,
      "name": "Absolute power heating in the selected unit",
      "data_type": "UInt32",
      "units": "UnitSel",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Unit chosen by register 148, low word first."
    },
    {
      "address": 59,
      "count": 2,
      "name": "Accumulated volume",
      "data_type": "UInt32",
      "units": "m3",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "Cannot be reset. Low word first. Range 0...2147483600 (x0.01 m3)."
    },
    {
      "address": 61,
      "count": 2,
      "name": "Accumulated volume",
      "data_type": "UInt32",
      "units": "gal",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Cannot be reset. Low word first. Range 0...2147483647 gal."
    },
    {
      "address": 63,
      "count": 2,
      "name": "Accumulated volume in the selected unit",
      "data_type": "UInt32",
      "units": "UnitSel",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Unit chosen by register 149, low word first."
    },
    {
      "address": 65,
      "count": 2,
      "name": "Absolute energy cooling",
      "data_type": "UInt32",
      "units": "kWh",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Low word first. Range 0...2147483647 kWh."
    },
    {
      "address": 67,
      "count": 2,
      "name": "Absolute energy cooling",
      "data_type": "UInt32",
      "units": "kBTU",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Low word first."
    },
    {
      "address": 69,
      "count": 2,
      "name": "Absolute energy cooling in the selected unit",
      "data_type": "UInt32",
      "units": "UnitSel",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Unit chosen by register 150, low word first."
    },
    {
      "address": 71,
      "count": 2,
      "name": "Absolute energy heating",
      "data_type": "UInt32",
      "units": "kWh",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Low word first."
    },
    {
      "address": 73,
      "count": 2,
      "name": "Absolute energy heating",
      "data_type": "UInt32",
      "units": "kBTU",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Low word first."
    },
    {
      "address": 75,
      "count": 2,
      "name": "Absolute energy heating in the selected unit",
      "data_type": "UInt32",
      "units": "UnitSel",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Unit chosen by register 150, 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."
    },
    {
      "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. 402 for version 4.02."
    },
    {
      "address": 104,
      "count": 1,
      "name": "Malfunction and service information",
      "data_type": "Binary",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 110,
      "count": 1,
      "name": "Nominal volumetric flow (qp)",
      "data_type": "UInt16",
      "units": "l/s",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "Range 0...10000 (x0.01 l/s)."
    },
    {
      "address": 111,
      "count": 1,
      "name": "Nominal volumetric flow (qp)",
      "data_type": "UInt16",
      "units": "gpm",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Range 0...15850 (x0.1 gpm)."
    },
    {
      "address": 112,
      "count": 2,
      "name": "Nominal volumetric flow (qp) in the selected unit",
      "data_type": "UInt32",
      "units": "UnitSel",
      "scale_factor": 0.001,
      "offset": 0,
      "access": "R",
      "description": "Unit chosen by register 147, low word first."
    },
    {
      "address": 120,
      "count": 1,
      "name": "Sensor 1 type",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = none (default), 1 = active, 3 = passive, 4 = switch, 5 = switch (other state)."
    },
    {
      "address": 121,
      "count": 1,
      "name": "Sensor 1 passive type",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = resistance measurement (default), further passive types follow register 120."
    },
    {
      "address": 147,
      "count": 1,
      "name": "Unit selection flow",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = m3/s, 1 = m3/h, 2 = l/s, 3 = l/min, 4 = l/h (default), 5 = gpm, 6 = cfm. Applies to the 32-bit flow registers 9 and 112."
    },
    {
      "address": 148,
      "count": 1,
      "name": "Unit selection power",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = W, 1 = kW (default), 2 = MW, 3 = BTU/h, 4 = kBTU/h, 5 = ton. Applies to the 32-bit power registers 31, 37 and 163."
    },
    {
      "address": 149,
      "count": 1,
      "name": "Unit selection volume",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = m3 (default), 1 = litre, 2 = gallon, 3 = cf. Applies to register 63."
    },
    {
      "address": 150,
      "count": 1,
      "name": "Unit selection energy",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = J, 1 = kJ, 2 = MJ, 3 = GJ, 4 = Wh, 5 = kWh (default), 6 = MWh, 7 = BTU, 8 = kBTU, 9 = ton. Applies to registers 69 and 75."
    },
    {
      "address": 159,
      "count": 2,
      "name": "Nominal power",
      "data_type": "UInt32",
      "units": "kW",
      "scale_factor": 0.001,
      "offset": 0,
      "access": "R",
      "description": "P'nom, low word first. Range 0...1330000 (x0.001 kW)."
    },
    {
      "address": 161,
      "count": 2,
      "name": "Nominal power",
      "data_type": "UInt32",
      "units": "kBTU/h",
      "scale_factor": 0.001,
      "offset": 0,
      "access": "R",
      "description": "P'nom, low word first. Range 0...4538000 (x0.001 kBTU/h)."
    },
    {
      "address": 163,
      "count": 2,
      "name": "Nominal power in the selected unit",
      "data_type": "UInt32",
      "units": "UnitSel",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "P'nom in the unit chosen by register 148, low word first."
    }
  ],
  "combined_registers": [],
  "notes": "Source: Belimo 'Modbus Interface Description - Thermal Energy Meter (TEM) DN 15...50 (Version 4)', edition 2025-11 / V4.2.0, manufacturer date 25.04.2024 (belimo_Modbus-Register_TEM_V4_2_en-gb.pdf), sections Flow, Power, Energy, Temperature and conversion of sensor signals. 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_TEM_V4_2_en-gb.pdf (same MAM document and edition); the URL above is the canonical vendor location. Model numbers in the header are 22PE..-1U.. (e.g. 22PEM-1UC) and 22PF-x1(X)Ux2(x3(x4))-(SG). The meter has both transports: Modbus RTU over RS-485 (38400 Bd default, 1-8-N-2 default, address 1, 9600/19200/76800/115200 Bd and 1-8-N-1 / 1-8-E-1 / 1-8-O-1 selectable) and Modbus TCP over Ethernet. This seed declares the TCP path, so no serial block is needed. Addressing: 'addressed by 1..n (Register No.) or 0..n-1 (Address)' with both columns on every row; the stored values are the Address column (Register No. minus 1) - zero_based. Values above 65535 are split over two registers with the LowWord first, so the two-register rows are entered as UInt32 with word order LowFirst (the document's example: high word at Register No. x+1, low word at x). This is not the Energy Valve map: the TEM has no setpoint, override, command, control-mode or limit registers at all - it only measures flow, temperatures, power, accumulated volume and energy, and sets its units through 147-150. Left out: the energy-meter serial and production order numbers (registers 200-203), register 105's bit list (carried as a bit-coded status word only), and the ranges of registers 110/111 which the table prints with the selected-unit alternatives. Unsupported readings are returned as 65535 and the meter applies its own DN-dependent size limitation inside the printed ranges."
}
