{
  "spec_version": 1,
  "slug": "in-situ-level-troll",
  "manufacturer": "In-Situ",
  "model": "Level TROLL 400 / 500 / 700 / 700H (Modbus PLC interface)",
  "category": "Water quality sensor",
  "supplier_url": "https://in-situ.com/pub/media/support/documents/Level-TROLL-400-500-700-700h_Manual.pdf",
  "default_configuration": {
    "protocol": "modbus_tcp",
    "port": 502,
    "unit_id": 1,
    "addressing": "zero_based",
    "byte_order": "BigEndian",
    "word_order": "HighFirst",
    "native_interface": "rs485",
    "serial": {
      "parity": "Even",
      "baud_rate": 19200,
      "data_bits": 8,
      "stop_bits": 1
    }
  },
  "coils": [],
  "discrete_inputs": [],
  "input_registers": [],
  "holding_registers": [
    {
      "address": 37,
      "count": 2,
      "name": "Pressure",
      "data_type": "Float32",
      "units": "PSI",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Measured value of parameter 2; 32-bit float, big-endian. Factory default unit is PSI (unit ID 17); the unit is set through the unit register at address 40."
    },
    {
      "address": 39,
      "count": 1,
      "name": "Pressure data quality",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = no errors or warnings, 3 = error reading the parameter."
    },
    {
      "address": 40,
      "count": 1,
      "name": "Pressure units",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Unit ID for the pressure parameter: 17 = PSI (factory default), 19 = kPa, 20 = bar, 21 = mbar, 22 = mmHg, 23 = inHg, 24 = cmH2O, 25 = inH2O."
    },
    {
      "address": 41,
      "count": 1,
      "name": "Pressure parameter ID",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Parameter ID = 2."
    },
    {
      "address": 42,
      "count": 2,
      "name": "Pressure offline sentinel value",
      "data_type": "Float32",
      "units": "PSI",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Value returned on error or when the parameter is unavailable; factory default 0.0."
    },
    {
      "address": 45,
      "count": 2,
      "name": "Temperature",
      "data_type": "Float32",
      "units": "°C",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Measured value of parameter 1; 32-bit float, big-endian. Factory default unit is °C (unit ID 1); the unit is set through the register at address 48."
    },
    {
      "address": 47,
      "count": 1,
      "name": "Temperature data quality",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = no errors or warnings, 3 = error reading the parameter."
    },
    {
      "address": 48,
      "count": 1,
      "name": "Temperature units",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Unit ID for the temperature parameter: 1 = °C (factory default), 2 = °F."
    },
    {
      "address": 49,
      "count": 1,
      "name": "Temperature parameter ID",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Parameter ID = 1."
    },
    {
      "address": 50,
      "count": 2,
      "name": "Temperature offline sentinel value",
      "data_type": "Float32",
      "units": "°C",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Value returned on error or when the parameter is unavailable; factory default 0.0."
    },
    {
      "address": 53,
      "count": 2,
      "name": "Depth / Level",
      "data_type": "Float32",
      "units": "ft",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Measured value of parameter 3 (depth) or 4/5 (level, depth to water / surface elevation, enabled in VuSitu), which share this starting register. Factory default unit is feet (unit ID 38); the unit is set through the register at address 56."
    },
    {
      "address": 55,
      "count": 1,
      "name": "Depth / Level data quality",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = no errors or warnings, 3 = error reading the parameter."
    },
    {
      "address": 56,
      "count": 1,
      "name": "Depth / Level units",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Unit ID for the depth/level parameter: 38 = feet (factory default), 33 = mm, 34 = cm, 35 = m, 37 = inches."
    },
    {
      "address": 57,
      "count": 1,
      "name": "Depth / Level parameter ID",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Parameter ID: 3 = depth, 4 = level (depth to water), 5 = level (surface elevation)."
    },
    {
      "address": 58,
      "count": 2,
      "name": "Depth / Level offline sentinel value",
      "data_type": "Float32",
      "units": "ft",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Value returned on error or when the parameter is unavailable; factory default 0.0."
    },
    {
      "address": 9000,
      "count": 1,
      "name": "Device ID",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "30 = Level TROLL 400, 1 = Level TROLL 500, 2 = Level TROLL 700 / 700H, 3 = Baro TROLL."
    },
    {
      "address": 9001,
      "count": 2,
      "name": "Device serial number",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "32-bit serial number."
    },
    {
      "address": 9006,
      "count": 1,
      "name": "Firmware version",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "For example 100 = firmware 1.00."
    }
  ],
  "combined_registers": [],
  "notes": "Source: In-Situ 'Level TROLL 400, 500, 700, and 700H Operator's Manual', part number 0052212, document revision 2024-23-01 ((c) In-Situ 2023), vendor-hosted PDF at the URL above (opened 7 Nov 2026): section 'Modbus PLC Interface' (page 47 onwards) and Appendices A (parameter numbers and locations) and B (unit IDs). Factory serial settings from the Modbus PLC Interface chapter: Modbus RTU, 1 start bit, 19200 baud, 8 data bits, even parity, 1 stop bit, default device address 1. Addressing: the manual prints a 'Holding Register Number' next to a 'Holding Register Address' that is exactly one lower (device ID 9001 / 9000, temperature 0046 / 0045, pressure 0038 / 0037, depth 0054 / 0053), states that some PLCs need 40000 added to the register number, and its worked example adds the block offsets to the register number before subtracting one - the numbers are decimal (pressure block 38-44, temperature 46-52, depth 54-60), and the addresses are stored unchanged as zero-based wire addresses (37, 45, 53). Every parameter block is 7 registers long: value (2 registers, big-endian float), data quality (1), unit ID (1), parameter ID (1), offline sentinel value (2). All rows are holding registers and the manual states that each register is a holding register. Default units come from Appendix A (temperature 1 = °C, pressure 17 = PSI, depth/level 38 = feet) and are writable through the unit-ID registers. Operating notes from the same chapter: the instrument must be woken with a carriage return (0x0D) or any Modbus command, one second must pass before the next command, and the default end-of-session timeout is 5 seconds (longer after a VuSitu session), so readings must be requested before it expires. Not claimed: the Baro TROLL variant's parameter set and the SDI-12 side of the device."
}
