{
 "manufacturer": "Lochinvar",
 "manufacturer_slug": "lochinvar",
 "model": "Crest / Crest with Hellcat boilers (ModBus communication board)",
 "model_slug": "crest-modbus",
 "short_model": "Crest",
 "aliases": [
  "Crest",
  "Crest FB751-6001",
  "Crest OF751-6001",
  "Crest FCB1000-6000",
  "Hellcat",
  "MTR-01"
 ],
 "equipment_type": "Boiler",
 "applies_to": "Lochinvar Crest FB/OF 751-6001 and FCB1000-6000 (including Crest with Hellcat) with the ModBus communication board.",
 "summary": "Lochinvar's Crest condensing boilers expose Modbus RTU through the RS-485 communication board. A BAS writes a configuration word plus enable, rate/setpoint and remote temperature values; read-only data covers outlet/inlet/flue temperatures, firing rate, pump speeds, cascade power, status/blocking/lockout codes and lockout codes for up to eight cascade units. Some discrete inputs exist only on FB/OF1501-6001 or on FCB1000-6000.",
 "transport": [
  "RTU"
 ],
 "defaults": {
  "unit_id": null,
  "baud": null,
  "parity": null,
  "data_bits": null,
  "stop_bits": null,
  "tcp_port": null
 },
 "addressing": {
  "convention": "Modicon",
  "note": "Addresses are printed Modicon-style (00001, 10001, 30001, 40001). Subtract the table base and 1 for the wire address; the manual's exception-code text confirms PDU addresses start at 0."
 },
 "default_word_order": null,
 "firmware": null,
 "source": {
  "title": "ModBus and BACnet Communication Instructions for Crest FB/OF751-6001, FCB1000-6000 and Regent IWH500-1000",
  "doc_number": "100161012_2000020084 Rev X",
  "revision_date": null,
  "url": "https://assets.lochinvar.com/damroot/Original/10017/MODB_100161012_2000020084_REV%20X_(71343).pdf",
  "pages": "pp. 6-9 (Modbus configuration), 10-12 (Crest/Hellcat memory map), 35-37 (unit operation), 41 (rate/temperature conversion), 42-43 (codes)"
 },
 "notes": [
  "Temperatures: the manual's conversion section says the appliance passes temperatures in degrees C multiplied by 10 (worked examples: outdoor 26.7 C sent as 267; outlet 683 read as 68.3 C). Scale 0.1 is applied to every temperature register.",
  "Removed: System/Cascade Setpoint (30004), Outlet Setpoint (30008) and Tank Setpoint (40004). The memory map gives these a 0.5 C resolution while the conversion section says all temperature data is degrees C x 10, and the worked examples only cover other registers (outdoor temperature and outlet temperature). Because the scaling of these three is not settled by the document, they are left out.",
  "Signed types: registers whose published minimum is negative (inlet, flue, tank, outdoor, supply/return temperatures) are listed as INT16; the manual itself only says '16-bit word'.",
  "Dip switch 8 on the communication board selects degrees C (OFF) or F (ON) for the display/data; units here assume C (switch OFF), matching the manual's tables and conversion examples.",
  "Holding register 40002 'Coils' has no bit list: for the Crest, the enable-only table writes 0x0001 to enable the unit, the enable + BMS table writes 0x0010 for the same purpose, and the DHW table writes 0x0010 for the tank thermostat. Prefer the Boiler Enable coil (00001) and confirm on site.",
  "Input registers 30001-30003 are packed copies of the discrete inputs; the bit-to-input order is not stated, so they are listed as UINT16. Use the discrete inputs instead.",
  "Left out: FCB1000-6000 combustion registers 30019-30025 and 30036-30038 (air/gas damper angle, fan speed target, O2 status, trim factor, barometer, flame, O2 reading) because the manual gives no units or scaling for them.",
  "The full Crest lockout-code list (input register 30016) is long; see pp. 43 onward in the manual.",
  "The Regent water heater map in the same manual uses different input-register numbers and is not included."
 ],
 "registers": [
  {
   "table": "coil",
   "address": 0,
   "documented": "00001",
   "name": "Boiler Enable",
   "description": "Enable command written by the BAS.",
   "data_type": "BIT",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "RW",
   "values": {
    "0": "Off",
    "1": "On"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "coil",
   "address": 4,
   "documented": "00005",
   "name": "Tank Thermostat",
   "description": "DHW tank thermostat demand written by the BAS.",
   "data_type": "BIT",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "RW",
   "values": {
    "0": "Off",
    "1": "On"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "discrete_input",
   "address": 0,
   "documented": "10001",
   "name": "Manual Reset High Limit",
   "description": "",
   "data_type": "BIT",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": {
    "0": "Off",
    "1": "On"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "discrete_input",
   "address": 1,
   "documented": "10002",
   "name": "Flow Switch",
   "description": "",
   "data_type": "BIT",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": {
    "0": "Off",
    "1": "On"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "discrete_input",
   "address": 2,
   "documented": "10003",
   "name": "Gas Pressure Switch",
   "description": "",
   "data_type": "BIT",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": {
    "0": "Off",
    "1": "On"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "discrete_input",
   "address": 3,
   "documented": "10004",
   "name": "Louver Proving Switch",
   "description": "",
   "data_type": "BIT",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": {
    "0": "Off",
    "1": "On"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "discrete_input",
   "address": 4,
   "documented": "10005",
   "name": "Blower Proving Switch 1",
   "description": "Crest FB/OF 1501-6001 only.",
   "data_type": "BIT",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": {
    "0": "Off",
    "1": "On"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "discrete_input",
   "address": 5,
   "documented": "10006",
   "name": "Blocked Drain Switch",
   "description": "",
   "data_type": "BIT",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": {
    "0": "Off",
    "1": "On"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "discrete_input",
   "address": 7,
   "documented": "10008",
   "name": "Flame 1",
   "description": "",
   "data_type": "BIT",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": {
    "0": "Off",
    "1": "On"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "discrete_input",
   "address": 8,
   "documented": "10009",
   "name": "Enable",
   "description": "Crest FB/OF 1501-6001 only.",
   "data_type": "BIT",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": {
    "0": "Off",
    "1": "On"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "discrete_input",
   "address": 9,
   "documented": "10010",
   "name": "Tank Thermostat",
   "description": "Crest FB/OF 1501-6001 only.",
   "data_type": "BIT",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": {
    "0": "Off",
    "1": "On"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "discrete_input",
   "address": 10,
   "documented": "10011",
   "name": "Blocked Flue",
   "description": "",
   "data_type": "BIT",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": {
    "0": "Off",
    "1": "On"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "discrete_input",
   "address": 17,
   "documented": "10018",
   "name": "Internal LWCO",
   "description": "Crest FCB1000-6000 only.",
   "data_type": "BIT",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": {
    "0": "Off",
    "1": "On"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "discrete_input",
   "address": 18,
   "documented": "10019",
   "name": "Gas Pressure Switch 2",
   "description": "Crest FCB1000-6000 only.",
   "data_type": "BIT",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": {
    "0": "Off",
    "1": "On"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "discrete_input",
   "address": 20,
   "documented": "10021",
   "name": "Flue Damper Proving Switch",
   "description": "",
   "data_type": "BIT",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": {
    "0": "Off",
    "1": "On"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "discrete_input",
   "address": 22,
   "documented": "10023",
   "name": "Flame 2",
   "description": "",
   "data_type": "BIT",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": {
    "0": "Off",
    "1": "On"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "discrete_input",
   "address": 25,
   "documented": "10026",
   "name": "Enable",
   "description": "Crest FCB1000-6000 only.",
   "data_type": "BIT",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": {
    "0": "Off",
    "1": "On"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "discrete_input",
   "address": 29,
   "documented": "10030",
   "name": "Tank Thermostat",
   "description": "Crest FCB1000-6000 only.",
   "data_type": "BIT",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": {
    "0": "Off",
    "1": "On"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "discrete_input",
   "address": 32,
   "documented": "10033",
   "name": "Run-time Contacts",
   "description": "",
   "data_type": "BIT",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": {
    "0": "Off",
    "1": "On"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "discrete_input",
   "address": 33,
   "documented": "10034",
   "name": "Alarm Contacts",
   "description": "",
   "data_type": "BIT",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": {
    "0": "Off",
    "1": "On"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "discrete_input",
   "address": 34,
   "documented": "10035",
   "name": "SH Pump",
   "description": "",
   "data_type": "BIT",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": {
    "0": "Off",
    "1": "On"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "discrete_input",
   "address": 35,
   "documented": "10036",
   "name": "HWG Pump",
   "description": "",
   "data_type": "BIT",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": {
    "0": "Off",
    "1": "On"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "discrete_input",
   "address": 36,
   "documented": "10037",
   "name": "Louver Relay",
   "description": "",
   "data_type": "BIT",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": {
    "0": "Off",
    "1": "On"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "discrete_input",
   "address": 37,
   "documented": "10038",
   "name": "Gas Valve 1",
   "description": "",
   "data_type": "BIT",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": {
    "0": "Off",
    "1": "On"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "discrete_input",
   "address": 38,
   "documented": "10039",
   "name": "System Pump",
   "description": "",
   "data_type": "BIT",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": {
    "0": "Off",
    "1": "On"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "discrete_input",
   "address": 43,
   "documented": "10044",
   "name": "Vent Damper Relay",
   "description": "",
   "data_type": "BIT",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": {
    "0": "Off",
    "1": "On"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "discrete_input",
   "address": 45,
   "documented": "10046",
   "name": "Gas Valve 2",
   "description": "",
   "data_type": "BIT",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": {
    "0": "Off",
    "1": "On"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "discrete_input",
   "address": 48,
   "documented": "10049",
   "name": "Blower #1 Power",
   "description": "",
   "data_type": "BIT",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": {
    "0": "Off",
    "1": "On"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "discrete_input",
   "address": 49,
   "documented": "10050",
   "name": "Blower #2 Power",
   "description": "Older dual-fan models only.",
   "data_type": "BIT",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": {
    "0": "Off",
    "1": "On"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "discrete_input",
   "address": 50,
   "documented": "10051",
   "name": "Spark Igniter",
   "description": "",
   "data_type": "BIT",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": {
    "0": "Off",
    "1": "On"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "discrete_input",
   "address": 51,
   "documented": "10052",
   "name": "Air Valve Trigger",
   "description": "",
   "data_type": "BIT",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": {
    "0": "Off",
    "1": "On"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "discrete_input",
   "address": 52,
   "documented": "10053",
   "name": "Air Valve Proving",
   "description": "",
   "data_type": "BIT",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": {
    "0": "Off",
    "1": "On"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 0,
   "documented": "30001",
   "name": "Discrete Inputs 1-16",
   "description": "Packed copy of discrete inputs 1-16.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1,
   "documented": "30002",
   "name": "Discrete Inputs 17-32",
   "description": "Packed copy of discrete inputs 17-32.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 2,
   "documented": "30003",
   "name": "Discrete Inputs 33-48",
   "description": "Packed copy of discrete inputs 33-48.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 4,
   "documented": "30005",
   "name": "System Pump Speed In",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 5,
   "documented": "30006",
   "name": "Cascade Total Power",
   "description": "Total cascade capacity (100-800 %).",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 6,
   "documented": "30007",
   "name": "Cascade Current Power",
   "description": "Current cascade output (0-800 %).",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 8,
   "documented": "30009",
   "name": "Outlet Temperature",
   "description": "Raw is degrees C x 10 (manual example: 683 = 68.3 C).",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "scale_factor_ref": null,
   "units": "°C",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 9,
   "documented": "30010",
   "name": "Inlet Temperature",
   "description": "",
   "data_type": "INT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "scale_factor_ref": null,
   "units": "°C",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 10,
   "documented": "30011",
   "name": "Flue Temperature",
   "description": "",
   "data_type": "INT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "scale_factor_ref": null,
   "units": "°C",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 11,
   "documented": "30012",
   "name": "Firing Rate",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 12,
   "documented": "30013",
   "name": "Boiler Pump Speed Out",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 13,
   "documented": "30014",
   "name": "Boiler Status Code",
   "description": "What the boiler is doing; 40 = lockout.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": {
    "2": "Heat demand blocked: high absolute outlet temperature",
    "3": "Heat demand blocked: high absolute flue temperature",
    "4": "Heat demand blocked: high absolute delta T",
    "7": "Heat demand blocked: changed personality plug",
    "8": "Heat demand blocked: low 24 VAC",
    "9": "Outdoor shutdown",
    "10": "Blocked: boiler switched off at display",
    "11": "No heat demand requested",
    "12": "Blocked: line frequency",
    "16": "Service function",
    "19": "DHW function storage tank",
    "21": "SH heat demand from room thermostat",
    "22": "SH heat demand from BMS",
    "23": "SH heat demand from cascade",
    "30": "Heat demand from freeze protection",
    "32": "DHW pump delay",
    "33": "SH pump delay",
    "34": "No heat function (after pump delay)",
    "40": "Lockout"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 14,
   "documented": "30015",
   "name": "Boiler Blocking Code",
   "description": "Reason heat demand is blocked.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": {
    "0": "No blocking",
    "5": "Low 24 VAC supply",
    "6": "MRHL open",
    "7": "High outdoor temperature",
    "8": "Boiler switched off (display)",
    "10": "High delta T",
    "11": "High outlet water temperature",
    "12": "Anti-cycling time",
    "13": "Changed ID plug",
    "14": "Line frequency",
    "15": "High flue temperature"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 15,
   "documented": "30016",
   "name": "Boiler Lockout Code",
   "description": "Lockout reason; only valid while status code is 40. See manual for the code list.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 25,
   "documented": "30026",
   "name": "Discrete Inputs 49-64",
   "description": "Packed copy of discrete inputs 49-64.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 26,
   "documented": "30027",
   "name": "Lock-out Error Leader",
   "description": "Lockout code of the cascade leader.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 27,
   "documented": "30028",
   "name": "Lock-out Error Member 1",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 28,
   "documented": "30029",
   "name": "Lock-out Error Member 2",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 29,
   "documented": "30030",
   "name": "Lock-out Error Member 3",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 30,
   "documented": "30031",
   "name": "Lock-out Error Member 4",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 31,
   "documented": "30032",
   "name": "Lock-out Error Member 5",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 32,
   "documented": "30033",
   "name": "Lock-out Error Member 6",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 33,
   "documented": "30034",
   "name": "Lock-out Error Member 7",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 0,
   "documented": "40001",
   "name": "Configuration",
   "description": "Selects which values the BAS supplies instead of the boiler's own inputs.",
   "data_type": "BITMAP16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "RW",
   "values": null,
   "bits": {
    "0": "Boiler Enable from BAS",
    "1": "Tank Thermostat from BAS",
    "2": "Rate Command / 0-10V Input / Setpoint Command from BAS",
    "3": "Tank Setpoint from BAS",
    "4": "System Supply Temperature from BAS",
    "5": "Outdoor Temperature from BAS",
    "6": "Tank Temperature from BAS",
    "7": "System Return Temperature from BAS"
   },
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 1,
   "documented": "40002",
   "name": "Coils",
   "description": "Command word written by the BAS; the manual's example values disagree, see notes.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 2,
   "documented": "40003",
   "name": "0-10 Volt Input / Rate Command / Setpoint Command",
   "description": "Modulation % or setpoint, per the BMS Type setting (0-100).",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "%",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 4,
   "documented": "40005",
   "name": "Tank Temperature",
   "description": "Tank temperature supplied by the BAS.",
   "data_type": "INT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "scale_factor_ref": null,
   "units": "°C",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 5,
   "documented": "40006",
   "name": "Outdoor Temperature",
   "description": "Outdoor temperature supplied by the BAS (-40 to 60 C).",
   "data_type": "INT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "scale_factor_ref": null,
   "units": "°C",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 6,
   "documented": "40007",
   "name": "System Supply Temperature",
   "description": "System supply temperature supplied by the BAS.",
   "data_type": "INT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "scale_factor_ref": null,
   "units": "°C",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 7,
   "documented": "40008",
   "name": "System Return Temperature",
   "description": "System return temperature supplied by the BAS.",
   "data_type": "INT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "scale_factor_ref": null,
   "units": "°C",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  }
 ],
 "integration": {
  "summary": "Set address, baud and parity on the board DIP switches, set the Demand Configuration in MAIN MENU > SETUP > BMS, then write 40001 (configuration) followed by the commands, using the exact values from the manual for the chosen configuration: enable only is 40001 = 0x0001 with 40002 = 0x0001; enable + BMS is 40001 = 0x0005 with 40002 = 0x0010 and the rate/setpoint in 40003. Monitor 30009-30016.",
  "minimum_registers": [
   {
    "table": "holding_register",
    "address": 0,
    "why": "Configuration bits"
   },
   {
    "table": "coil",
    "address": 0,
    "why": "Boiler enable"
   },
   {
    "table": "holding_register",
    "address": 2,
    "why": "Rate (%) or setpoint command"
   },
   {
    "table": "input_register",
    "address": 8,
    "why": "Outlet temperature"
   },
   {
    "table": "input_register",
    "address": 11,
    "why": "Firing rate"
   },
   {
    "table": "input_register",
    "address": 13,
    "why": "Status code"
   },
   {
    "table": "input_register",
    "address": 14,
    "why": "Blocking code"
   },
   {
    "table": "input_register",
    "address": 15,
    "why": "Lockout code"
   }
  ],
  "enable": "Choose the Demand Configuration (enable only, enable + BMS rate/setpoint, or BMS only) in MAIN MENU > SETUP > BMS; set the BMS type to rate or setpoint for 40003. Re-send 40001 before issuing commands.",
  "watchdog": "Crest: BAS timeout adjustable 5-120 s in MAIN MENU > SETUP > BAS; BAS-supplied temperatures must be refreshed within it or the boiler reverts to its own sensors. Other commands must be refreshed at least every 4 minutes. Hellcat: timeout fixed at 300 s.",
  "quirks": [
   "Modicon addressing: 30009 is input register 8 on the wire.",
   "Temperatures are degrees C x 10.",
   "A setpoint command through 40003 is the 0-10 V equivalent percentage, interpolated from the BMS low/high setpoint parameters, not degrees.",
   "Only read the lockout code when the status code is 40."
  ],
  "setup": [
   "DIP switches 1-7: Modbus address (1-127).",
   "DIP switch 8: OFF = Celsius, ON = Fahrenheit.",
   "DIP switch 9: OFF = 9600 baud, ON = 19200 baud.",
   "DIP switch 10: OFF = no parity with 2 stop bits, ON = even parity with 1 stop bit.",
   "RTU only; terminate both ends of the RS-485 bus."
  ],
  "gotchas": [
   "Some discrete inputs are footnoted as FB/OF1501-6001 only or FCB1000-6000 only; do not expect them on other sizes.",
   "Board LED D7: 1.5 s on / 0.5 s off = no Modbus traffic; 0.5 s on / 1.5 s off = no burner-control communication."
  ]
 },
 "page": "https://easymodbus.com/modbus-register-maps/lochinvar/crest-modbus",
 "address_note": "address = 0-based Modbus wire (PDU) address; documented = as printed in the source.",
 "note": "Re-typed from the manufacturer's public documentation (see source) and verified against it. Registers vary by firmware and options; verify against the live device before writing."
}
