{
  "spec_version": 1,
  "slug": "vaisala-hmp110",
  "manufacturer": "Vaisala",
  "model": "HMP110 / HMP110T humidity and temperature probe (also HMP60, HMP63, HMP113, HMP115)",
  "category": "Sensor",
  "supplier_url": "https://docs.vaisala.com/r/M211060EN-N/en-US",
  "default_configuration": {
    "protocol": "modbus_tcp",
    "port": 502,
    "unit_id": 240,
    "addressing": "one_based",
    "byte_order": "BigEndian",
    "word_order": "LowFirst",
    "native_interface": "rs485",
    "serial": {
      "parity": "None",
      "baud_rate": 19200,
      "data_bits": 8,
      "stop_bits": 2
    }
  },
  "coils": [],
  "discrete_inputs": [],
  "input_registers": [],
  "holding_registers": [
    {
      "address": 1,
      "count": 2,
      "name": "Relative humidity (floating point)",
      "data_type": "Float32",
      "units": "%RH",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Register 1 (address 0x0000), 32-bit float. The table lists the low word at the register and the high word at address + 1."
    },
    {
      "address": 3,
      "count": 2,
      "name": "Temperature 1 (floating point)",
      "data_type": "Float32",
      "units": "degC",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Register 3 (address 0x0002), 32-bit float."
    },
    {
      "address": 9,
      "count": 2,
      "name": "Dew/frost point temperature (floating point)",
      "data_type": "Float32",
      "units": "degC",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Register 9 (address 0x0008), 32-bit float."
    },
    {
      "address": 15,
      "count": 2,
      "name": "Absolute humidity (floating point)",
      "data_type": "Float32",
      "units": "g/m3",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Register 15 (address 0x000E), 32-bit float."
    },
    {
      "address": 17,
      "count": 2,
      "name": "Mixing ratio (floating point)",
      "data_type": "Float32",
      "units": "g/kg",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Register 17 (address 0x0010), 32-bit float."
    },
    {
      "address": 19,
      "count": 2,
      "name": "Wet-bulb temperature (floating point)",
      "data_type": "Float32",
      "units": "degC",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Register 19 (address 0x0012), 32-bit float."
    },
    {
      "address": 27,
      "count": 2,
      "name": "Enthalpy (floating point)",
      "data_type": "Float32",
      "units": "kJ/kg",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Register 27 (address 0x001A), 32-bit float."
    },
    {
      "address": 257,
      "count": 1,
      "name": "Relative humidity (integer)",
      "data_type": "Int16",
      "units": "%RH",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Register 257 (address 0x0100), 16-bit signed integer scaled by 10, as the table's unit column states (%RH * 10)."
    },
    {
      "address": 258,
      "count": 1,
      "name": "Temperature 1 (integer)",
      "data_type": "Int16",
      "units": "degC",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Register 258 (address 0x0101), 16-bit signed integer, unit degC * 10."
    },
    {
      "address": 261,
      "count": 1,
      "name": "Dew/frost point temperature (integer)",
      "data_type": "Int16",
      "units": "degC",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Register 261 (address 0x0104), 16-bit signed integer, unit degC * 10."
    },
    {
      "address": 264,
      "count": 1,
      "name": "Absolute humidity (integer)",
      "data_type": "Int16",
      "units": "g/m3",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Register 264 (address 0x0107), 16-bit signed integer, unit g/m3 * 10."
    },
    {
      "address": 265,
      "count": 1,
      "name": "Mixing ratio (integer)",
      "data_type": "Int16",
      "units": "g/kg",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Register 265 (address 0x0108), 16-bit signed integer, unit g/kg * 10."
    },
    {
      "address": 266,
      "count": 1,
      "name": "Wet-bulb temperature (integer)",
      "data_type": "Int16",
      "units": "degC",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Register 266 (address 0x0109), 16-bit signed integer, unit degC * 10."
    },
    {
      "address": 270,
      "count": 1,
      "name": "Enthalpy (integer)",
      "data_type": "Int16",
      "units": "kJ/kg",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Register 270 (address 0x010D), 16-bit signed integer, unit kJ/kg * 10."
    },
    {
      "address": 785,
      "count": 2,
      "name": "Measurement filtering factor",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Register 785 (address 0x0310), 32-bit float, 0.001 (maximum filtering) to 1.000 (no filtering)."
    },
    {
      "address": 1537,
      "count": 1,
      "name": "Modbus address",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Register 1537 (address 0x0600), 1 to 247. The new address is activated on device restart."
    },
    {
      "address": 1538,
      "count": 1,
      "name": "Bit rate",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Register 1538 (address 0x0601): 5 = 9600, 6 = 19200, 7 = 38400, 8 = 57600 bit/s. Activated on restart."
    },
    {
      "address": 1539,
      "count": 1,
      "name": "Parity, data and stop bits",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Register 1539 (address 0x0602): 0 = none/8/1, 1 = none/8/2, 2 = even/8/1, 3 = even/8/2, 4 = odd/8/1, 5 = odd/8/2. Activated on restart."
    },
    {
      "address": 1540,
      "count": 1,
      "name": "Response delay",
      "data_type": "UInt16",
      "units": "ms",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Register 1540 (address 0x0603), 0 to 1020 ms."
    },
    {
      "address": 1541,
      "count": 1,
      "name": "Protocol",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Register 1541 (address 0x0604): 6 = Modbus RTU. Activated on restart."
    },
    {
      "address": 1542,
      "count": 1,
      "name": "Restart device",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "W",
      "description": "Register 1542 (address 0x0605): writing 1 restarts the device so the communication settings above take effect."
    },
    {
      "address": 513,
      "count": 1,
      "name": "Error status",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Register 513 (address 0x0200): 0x0000 = one or more errors active, 0x0001 = no errors."
    },
    {
      "address": 516,
      "count": 2,
      "name": "Error code",
      "data_type": "Int32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Register 516 (address 0x0203), 32-bit integer; the error-code table gives the bit values (1 = temperature measurement error, 2 = humidity measurement error, 4 = humidity sensor failure, ... 16384 = calibration certificate checksum mismatch)."
    },
    {
      "address": 518,
      "count": 2,
      "name": "Security hash",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Register 518 (address 0x0205), 32-bit integer; it changes when any device setting or adjustment changes."
    }
  ],
  "combined_registers": [],
  "notes": "RS-485 probe: Modbus RTU over RS-485, reached through a Modbus RTU-to-TCP gateway; the serial block holds the factory settings of a device ordered with the Modbus option. Source: Vaisala \"HMP60 and HMP110 Series User Guide\" M211060EN-N, chapters \"Modbus reference\" - \"Communication settings\" (19200 bit/s, parity None, 8 data bits, 2 stop bits, device address 240, Modbus RTU) and \"Modbus registers\" (measurement data registers, configuration registers, status registers). Addressing: the guide states that registers are numbered in decimal starting from 1 and that register number 1 corresponds to address 0x0 in the PDU, so this seed stores the printed register numbers with one-based addressing. Word order: the guide places the least significant 16 bits of a 32-bit value at the listed register and the most significant 16 bits at the next register (\"little-endian\" or \"Modicon\" word order), which is the LowFirst setting used here; the guide warns that a wrong floating point setting can produce correct-looking but wrong values. The integer rows are the fixed-point alternative to the floating point rows for the same value (the guide recommends the 32-bit register) and are listed with the scaling column it prints (value * 10); the guide's own interpretation table applies to them, so raw 32767 means the value is 32767 or larger, 32768 means not available, 32769 means -32767 or smaller, and any other raw value is a plain two's-complement integer. The registers are reached with function code 03 and written with function code 16; function code 43/14 serves the device identification objects, which are not registers and are therefore not listed. The guide notes that the HMP110T model measures temperature only."
}
