{
 "manufacturer": "Hydrotherm",
 "manufacturer_slug": "hydrotherm",
 "model": "KN2 / KN4 / rAy boilers - HeatNet BACnet Bridge",
 "model_slug": "kn2-kn4-ray-heatnet-bacnet-bridge",
 "aliases": [
  "KN2",
  "KN-2",
  "KN4",
  "KN-4",
  "rAy",
  "HeatNet",
  "HeatNet bridge",
  "KNSLM",
  "Mestek"
 ],
 "equipment_type": "Commercial boiler controller",
 "applies_to": "Hydrotherm (Mestek) KN2 and KN4 boilers and rAy boilers with a HeatNet control and a HeatNet BACnet IP or BACnet MS/TP bridge (bridge configuration 2.40+).",
 "summary": "On Hydrotherm KN2, KN4 and rAy boilers the HeatNet control is linked to BACnet through a HeatNet bridge that translates its Modbus registers into a fixed object list. The BMS writes heat demand, the system setpoint (with a countdown failsafe timer), outdoor-reset settings, DHW setpoint and the clock. Read-only objects give plant temperatures, boilers on, modulation, raw spare inputs and per-boiler run time, cycles, temperatures, modulation and status flags for up to 16 boilers.",
 "bacnet_transport": [
  "BACnet IP",
  "BACnet MS/TP"
 ],
 "firmware": "Bridge configuration 2.40+ (2.50+ for some points); HeatNet firmware 2.70 / 3.48+ for some points",
 "default_device_instance": null,
 "access_inferred": false,
 "notes": [
  "Per-boiler binary values are printed once as Boiler##_<name> with an instance formula and are listed here at the boiler 1 instance: 1000-series base + (n - 1) x 32, 2000/3000-series base + (n - 1) x 16. Boiler 1 is the master or stand-alone boiler; members are 2-16.",
  "Per-boiler analog inputs are printed as ranges and listed here for boiler 1 only: Runtime AI 48-63, Cycles AI 64-79, SupplyTemp AI 80-95, ReturnTemp AI 96-111, DHWTemp AI 112-127, Modulation AI 128-143 (boiler n = boiler 1 instance + n - 1).",
  "Bridge configuration 2.50+ is needed for AV 15 (with HeatNet firmware 2.70+) and for AI 112-144 and BV 3000-3011 (with HeatNet firmware 3.48+).",
  "This list has fewer per-boiler flags than the KNSX and KN HeatNet V3 lists (no LWCO, VFD, gas-prove or operator interlocks), and adds BV 3004-3008 (blocked inlet/flue, DHW input, low-fire input, DHW fault).",
  "The document describes Boiler##_OutsideSensorNA with the same text as HeaderSensorNA ('Header Sensor not available'); the name suggests the outside sensor.",
  "Weekday values here run 1 (Monday) to 7 (Sunday)."
 ],
 "integration": {
  "summary": "Connect the BMS to the master (boiler 1) HeatNet control. Write BV 1 HeatDemand to call for heat and AV 2 Setpoint for the system setpoint, and keep reloading AV 1 SetpointTimer so the plant does not fall back to its local setpoint. Read header/supply/return temperatures, boilers on, modulation and the per-boiler alarm and failed flags.",
  "minimum_points": [
   {
    "ref": "BV 1",
    "name": "HeatDemand",
    "why": "Heat demand from the BMS (1 = heat)"
   },
   {
    "ref": "AV 2",
    "name": "Setpoint",
    "why": "System setpoint, 40-220 °F"
   },
   {
    "ref": "AV 1",
    "name": "SetpointTimer",
    "why": "Failsafe countdown; reload before it reaches 0"
   },
   {
    "ref": "AI 144",
    "name": "OperatingSetpoint",
    "why": "Active setpoint in use"
   },
   {
    "ref": "AI 3",
    "name": "HeaderTemp",
    "why": "Header / system temperature, °F"
   },
   {
    "ref": "AI 1",
    "name": "BoilersOn",
    "why": "Number of boilers running"
   },
   {
    "ref": "AI 2",
    "name": "Modulation",
    "why": "System target modulation, %"
   },
   {
    "ref": "BV 1005",
    "name": "Boiler##_Running",
    "why": "Boiler 1 firing (add 32 per boiler number)"
   },
   {
    "ref": "BV 1002",
    "name": "Boiler##_Alarm",
    "why": "Boiler 1 alarm (add 32 per boiler number)"
   },
   {
    "ref": "BV 1003",
    "name": "Boiler##_Failed",
    "why": "Boiler 1 failed (add 32 per boiler number)"
   }
  ],
  "enable": "BV 1 HeatDemand puts the boiler (plant) into heating mode when set to 1; 0 removes the demand. The setpoint the BMS writes is AV 2 Setpoint.",
  "heartbeat": "AV 1 SetpointTimer (0-65535 s) is a BMS failsafe countdown. The BMS must reload it periodically; if it reaches zero the control assumes the BMS has stopped and reloads its own saved local setpoint. Writing any read/write variable reloads the timer to 60 s if it is below 60 (on control firmware below 2.70 only writing the setpoint does this).",
  "remote_sensors": "AV 3-7 and BV 2 set up outdoor air reset; there is no writable outdoor temperature or flow value on this bridge.",
  "setup": [
   "The HeatNet bridge comes as a BACnet IP or a BACnet MS/TP version (an extra-cost option); it translates the HeatNet Modbus registers to these objects.",
   "BACnet IP bridge defaults, from Mestek's separate 'HeatNet Communication Protocols' v1.01 document (not the object list): IP 192.168.1.24, mask 255.255.255.0, BACnet MAC 11, BACnet node 11.",
   "BACnet MS/TP bridge defaults (same HeatNet Communication Protocols document): MAC 11, BACnet node 11, 38400 baud.",
   "To set the clock, write AV 8-14 (month, day, year, hour, minute, second, weekday) and then write 1 to BV 3 SetClock."
  ],
  "gotchas": [
   "If SetpointTimer runs out, the plant quietly returns to its local setpoint.",
   "Per-boiler objects are listed at the boiler 1 instance; offset them by boiler number using the formulas in the notes. Boiler 1 is the master or stand-alone boiler.",
   "Per-boiler modulation (AI 128-143) does not work in AA/High Fire, T1 or T2 modes.",
   "The bridge polls the HeatNet Modbus registers continuously; a few less important registers are not carried over to BACnet."
  ]
 },
 "source": {
  "title": "KN2/KN4/rAy BACnet Bridge Objects",
  "doc_number": "v2.50",
  "revision_date": null,
  "url": "https://www.literature.mestek.com/dms/Hydrotherm%20Boilers/HeatNet/KNSLM%20BACnet%20Objects%20v2-50.pdf"
 },
 "points": [
  {
   "type": "AV",
   "instance": 1,
   "name": "SetpointTimer",
   "description": "BMS failsafe countdown; reload before it reaches zero; 0 – 65535 seconds",
   "units": "s",
   "access": "W",
   "states": ""
  },
  {
   "type": "AV",
   "instance": 2,
   "name": "Setpoint",
   "description": "System setpoint written by the BMS; 40 - 220 °F (4.5 – 104.4 °C)",
   "units": "°F",
   "access": "W",
   "states": ""
  },
  {
   "type": "AV",
   "instance": 3,
   "name": "OARSetpoint",
   "description": "Outdoor temperature at which the boiler shuts down; 40 – 100 °F (4.5 – 37.8 °C)",
   "units": "°F",
   "access": "W",
   "states": ""
  },
  {
   "type": "AV",
   "instance": 4,
   "name": "OARHighWaterTemp",
   "description": "Water setpoint at the high outdoor temperature; 60 – 190 °F (15.6 – 87.8 °C)",
   "units": "°F",
   "access": "W",
   "states": ""
  },
  {
   "type": "AV",
   "instance": 5,
   "name": "OARHighAirTemp",
   "description": "High outdoor air temperature reset point; 50 – 90 °F (10 – 32.2 °C)",
   "units": "°F",
   "access": "W",
   "states": ""
  },
  {
   "type": "AV",
   "instance": 6,
   "name": "OARLowWaterTemp",
   "description": "Header/supply setpoint at the low outdoor temperature; 70 – 220 °F (21.1 – 104.4 °C)",
   "units": "°F",
   "access": "W",
   "states": ""
  },
  {
   "type": "AV",
   "instance": 7,
   "name": "OARLowAirTemp",
   "description": "Low outdoor air temperature reset point; -35 – 40 °F (-37.2 – 4.4 °C)",
   "units": "°F",
   "access": "W",
   "states": ""
  },
  {
   "type": "AV",
   "instance": 8,
   "name": "SetMonth",
   "description": "Clock set value: month (0 = January); 0 (January) – 11 (December)",
   "units": "months",
   "access": "W",
   "states": ""
  },
  {
   "type": "AV",
   "instance": 9,
   "name": "SetDay",
   "description": "Clock set value: day; 1 – 31",
   "units": "days",
   "access": "W",
   "states": ""
  },
  {
   "type": "AV",
   "instance": 10,
   "name": "SetYear",
   "description": "Clock set value: year (0-99); 0 – 99",
   "units": "years",
   "access": "W",
   "states": ""
  },
  {
   "type": "AV",
   "instance": 11,
   "name": "SetHour",
   "description": "Clock set value: hour; 0 – 23",
   "units": "h",
   "access": "W",
   "states": ""
  },
  {
   "type": "AV",
   "instance": 12,
   "name": "SetMinute",
   "description": "Clock set value: minute; 0 – 59",
   "units": "min",
   "access": "W",
   "states": ""
  },
  {
   "type": "AV",
   "instance": 13,
   "name": "SetSecond",
   "description": "Clock set value: second; 0 – 59",
   "units": "s",
   "access": "W",
   "states": ""
  },
  {
   "type": "AV",
   "instance": 14,
   "name": "SetWeekday",
   "description": "Clock set value: weekday; 1 (Monday) – 7 (Sunday)",
   "units": "",
   "access": "W",
   "states": ""
  },
  {
   "type": "AV",
   "instance": 15,
   "name": "DHWSetpoint",
   "description": "DHW setpoint; 40 – 200 °F (4.4 – 93.3 °C)",
   "units": "°F",
   "access": "W",
   "states": ""
  },
  {
   "type": "BV",
   "instance": 1,
   "name": "HeatDemand",
   "description": "BMS heat demand: 1 puts the boiler plant into heating",
   "units": "",
   "access": "W",
   "states": "0=no heat demand, 1=heat demand"
  },
  {
   "type": "BV",
   "instance": 2,
   "name": "OAResetEnable",
   "description": "Enable outdoor air reset",
   "units": "",
   "access": "W",
   "states": "0=disabled, 1=enabled"
  },
  {
   "type": "BV",
   "instance": 3,
   "name": "SetClock",
   "description": "Write 1 to load the Set... values into the clock",
   "units": "",
   "access": "W",
   "states": "1=set the clock"
  },
  {
   "type": "BV",
   "instance": 1000,
   "name": "Boiler##_Disabled",
   "description": "Boiler is disabled",
   "units": "",
   "access": "R",
   "states": "0=enabled, 1=disabled"
  },
  {
   "type": "BV",
   "instance": 1001,
   "name": "Boiler##_LocalOverride",
   "description": "Local Override (member boilers only)",
   "units": "",
   "access": "R",
   "states": "0=no override, 1=override"
  },
  {
   "type": "BV",
   "instance": 1002,
   "name": "Boiler##_Alarm",
   "description": "Boiler Alarm",
   "units": "",
   "access": "R",
   "states": "0=ok, 1=alarm"
  },
  {
   "type": "BV",
   "instance": 1003,
   "name": "Boiler##_Failed",
   "description": "Boiler Failed",
   "units": "",
   "access": "R",
   "states": "0=ok, 1=failed"
  },
  {
   "type": "BV",
   "instance": 1004,
   "name": "Boiler##_MemberError",
   "description": "Member Alarm or Failed",
   "units": "",
   "access": "R",
   "states": "0=ok, 1=error"
  },
  {
   "type": "BV",
   "instance": 1005,
   "name": "Boiler##_Running",
   "description": "Boiler is running/firing",
   "units": "",
   "access": "R",
   "states": "0=off, 1=running (firing)"
  },
  {
   "type": "BV",
   "instance": 1006,
   "name": "Boiler##_PumpOn",
   "description": "Local pump is on/running",
   "units": "",
   "access": "R",
   "states": "0=off, 1=on (running)"
  },
  {
   "type": "BV",
   "instance": 1011,
   "name": "Boiler##_Spare4Interlock",
   "description": "Spare 4 (application defined) Interlock",
   "units": "",
   "access": "R",
   "states": "0=open, 1=closed"
  },
  {
   "type": "BV",
   "instance": 1013,
   "name": "Boiler##_FlowInterlock",
   "description": "Local Flow Interlock",
   "units": "",
   "access": "R",
   "states": "0=open, 1=closed"
  },
  {
   "type": "BV",
   "instance": 1015,
   "name": "Boiler##_MainValve",
   "description": "Main Valve",
   "units": "",
   "access": "R",
   "states": "0=closed, 1=open"
  },
  {
   "type": "BV",
   "instance": 1017,
   "name": "Boiler##_BlowerOn",
   "description": "Blower is on/running",
   "units": "",
   "access": "R",
   "states": "0=off, 1=on (running)"
  },
  {
   "type": "BV",
   "instance": 1018,
   "name": "Boiler##_IgnitionAlarm",
   "description": "Ignition Circuit Alarm",
   "units": "",
   "access": "R",
   "states": "0=ok, 1=alarm"
  },
  {
   "type": "BV",
   "instance": 1020,
   "name": "Boiler##_HighLimit",
   "description": "High Limit",
   "units": "",
   "access": "R",
   "states": "0=ok, 1=tripped"
  },
  {
   "type": "BV",
   "instance": 1023,
   "name": "Boiler##_SoftwareOperator",
   "description": "Software Operator Tripped",
   "units": "",
   "access": "R",
   "states": "0=not tripped, 1=tripped"
  },
  {
   "type": "BV",
   "instance": 1024,
   "name": "Boiler##_HeaderSensorNA",
   "description": "Header Sensor not available (detected)",
   "units": "",
   "access": "R",
   "states": "0=detected, 1=not available"
  },
  {
   "type": "BV",
   "instance": 1025,
   "name": "Boiler##_SupplySensorNA",
   "description": "Supply/Outlet Sensor not available (detected)",
   "units": "",
   "access": "R",
   "states": "0=detected, 1=not available"
  },
  {
   "type": "BV",
   "instance": 1026,
   "name": "Boiler##_ReturnSensorNA",
   "description": "Return/Inlet Sensor not available (detected)",
   "units": "",
   "access": "R",
   "states": "0=detected, 1=not available"
  },
  {
   "type": "BV",
   "instance": 1027,
   "name": "Boiler##_OutsideSensorNA",
   "description": "Header Sensor not available (detected)",
   "units": "",
   "access": "R",
   "states": "0=detected, 1=not available"
  },
  {
   "type": "BV",
   "instance": 1029,
   "name": "Boiler##_DamperProve1",
   "description": "Combustion Air Damper Prove (J10B)",
   "units": "",
   "access": "R",
   "states": "0=not proven, 1=proven"
  },
  {
   "type": "BV",
   "instance": 1030,
   "name": "Boiler##_Master",
   "description": "This is the Master Boiler",
   "units": "",
   "access": "R",
   "states": "0=member, 1=master"
  },
  {
   "type": "BV",
   "instance": 1031,
   "name": "Boiler##_Detected",
   "description": "Boiler ## is detected (present)",
   "units": "",
   "access": "R",
   "states": "0=not detected, 1=detected"
  },
  {
   "type": "BV",
   "instance": 2000,
   "name": "Boiler##_AAHighFire",
   "description": "AA/High Fire Input",
   "units": "",
   "access": "R",
   "states": "0=open, 1=closed"
  },
  {
   "type": "BV",
   "instance": 2001,
   "name": "Boiler##_HeatDemand",
   "description": "Heat Demand (Local Override) Input",
   "units": "",
   "access": "R",
   "states": "0=open, 1=closed"
  },
  {
   "type": "BV",
   "instance": 2002,
   "name": "Boiler##_4to20Remote",
   "description": "4 to 20ma Remote Input",
   "units": "",
   "access": "R",
   "states": "0=open, 1=closed"
  },
  {
   "type": "BV",
   "instance": 3000,
   "name": "Boiler##_DHWSensorEnabled",
   "description": "DHW Sensor has been enabled in the menus",
   "units": "",
   "access": "R",
   "states": "0=disabled, 1=enabled"
  },
  {
   "type": "BV",
   "instance": 3001,
   "name": "Boiler##_DamperProve2",
   "description": "Combustion Air Damper Prove",
   "units": "",
   "access": "R",
   "states": "0=not proven, 1=proven"
  },
  {
   "type": "BV",
   "instance": 3003,
   "name": "Boiler##_BlowerFault",
   "description": "Blower fault",
   "units": "",
   "access": "R",
   "states": "0=ok, 1=fault"
  },
  {
   "type": "BV",
   "instance": 3004,
   "name": "Boiler##_BlockedInlet",
   "description": "Blocked Inlet",
   "units": "",
   "access": "R",
   "states": "0=blocked, 1=ok"
  },
  {
   "type": "BV",
   "instance": 3005,
   "name": "Boiler##_BlockedFlue",
   "description": "Blocked Flue",
   "units": "",
   "access": "R",
   "states": "0=blocked, 1=ok"
  },
  {
   "type": "BV",
   "instance": 3006,
   "name": "Boiler##_DHWInput",
   "description": "DHW Input",
   "units": "",
   "access": "R",
   "states": ""
  },
  {
   "type": "BV",
   "instance": 3007,
   "name": "Boiler##_LowFireInput",
   "description": "Low Fire Input",
   "units": "",
   "access": "R",
   "states": ""
  },
  {
   "type": "BV",
   "instance": 3008,
   "name": "Boiler##_DHWFault",
   "description": "DHW Fault",
   "units": "",
   "access": "R",
   "states": "0=ok, 1=fault"
  },
  {
   "type": "BV",
   "instance": 3009,
   "name": "Boiler##_DHWSensorNA",
   "description": "DHW Sensor is not available (detected)",
   "units": "",
   "access": "R",
   "states": "0=detected, 1=not available"
  },
  {
   "type": "BV",
   "instance": 3011,
   "name": "Boiler##_OpLimitClamp",
   "description": "Boiler input is limited (clamped) due to high supply (outlet) temperature",
   "units": "",
   "access": "R",
   "states": "0=not clamped, 1=clamped"
  },
  {
   "type": "AI",
   "instance": 1,
   "name": "BoilersOn",
   "description": "Number of boilers running",
   "units": "",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 2,
   "name": "Modulation",
   "description": "System target modulation",
   "units": "%",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 3,
   "name": "HeaderTemp",
   "description": "Header / system temperature",
   "units": "°F",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 4,
   "name": "SupplyTemp",
   "description": "Supply temperature",
   "units": "°F",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 5,
   "name": "ReturnTemp",
   "description": "Return temperature",
   "units": "°F",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 6,
   "name": "OutsideTemp",
   "description": "Outside air temperature",
   "units": "°F",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 7,
   "name": "Spare1",
   "description": "Raw A/D value of spare input 1",
   "units": "",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 8,
   "name": "Spare2",
   "description": "Raw A/D value of spare input 2",
   "units": "",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 9,
   "name": "Month",
   "description": "Clock: month (0-11)",
   "units": "months",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 10,
   "name": "Day",
   "description": "Clock: day",
   "units": "days",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 11,
   "name": "Year",
   "description": "Clock: year (0-99)",
   "units": "years",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 12,
   "name": "Hour",
   "description": "Clock: hour",
   "units": "h",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 13,
   "name": "Minute",
   "description": "Clock: minute",
   "units": "min",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 14,
   "name": "Second",
   "description": "Clock: second",
   "units": "s",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 15,
   "name": "Weekday",
   "description": "Clock: weekday",
   "units": "",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 16,
   "name": "DHWTemp",
   "description": "DHW temperature",
   "units": "°F",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 48,
   "name": "Boiler01_Runtime",
   "description": "Boiler 1 run time on the current board (boiler n = 47 + n)",
   "units": "min",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 64,
   "name": "Boiler01_Cycles",
   "description": "Boiler 1 cycle count (boiler n = 63 + n)",
   "units": "",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 80,
   "name": "Boiler01_SupplyTemp",
   "description": "Boiler 1 supply (outlet) temperature (boiler n = 79 + n)",
   "units": "°F",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 96,
   "name": "Boiler01_ReturnTemp",
   "description": "Boiler 1 return (inlet) temperature (boiler n = 95 + n)",
   "units": "°F",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 112,
   "name": "Boiler01_DHWTemp",
   "description": "Boiler 1 DHW sensor temperature (boiler n = 111 + n)",
   "units": "°F",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 128,
   "name": "Boiler01_Modulation",
   "description": "Boiler 1 modulation (boiler n = 127 + n)",
   "units": "%",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 144,
   "name": "OperatingSetpoint",
   "description": "Active setpoint in use (heating, DHW, reset or 4-20 mA)",
   "units": "°F",
   "access": "R",
   "states": ""
  }
 ],
 "page": "https://easybacnet.com/bacnet-points-lists/hydrotherm/kn2-kn4-ray-heatnet-bacnet-bridge",
 "note": "Provided as-is. Point availability varies by firmware and options; verify against the live device.",
 "disclaimer": "DISCLAIMER: reference only, provided AS IS with no warranty. May contain errors or be out of date. You must verify every point against the manufacturer's current documentation and the live device before use. easybacnet.com accepts no liability for its use and is not affiliated with the manufacturer. Terms: https://easybacnet.com/terms#content"
}
