{
 "manufacturer": "Lennox",
 "manufacturer_slug": "lennox",
 "model": "Prodigy M3 BACnet Module",
 "model_slug": "prodigy-m3-bacnet-module",
 "aliases": [
  "M3 BACnet Module",
  "BM2",
  "Prodigy M3",
  "Lennox_M3",
  "Prodigy 2.0 BACnet",
  "1404-L4"
 ],
 "equipment_type": "Rooftop unit controller BACnet module",
 "applies_to": "Lennox commercial rooftop units that use the Prodigy M3 unit controller.",
 "summary": "The M3 BACnet module plugs onto a Lennox Prodigy M3 rooftop unit controller and exposes it as a BACnet MS/TP device (BTL listed, B-ASC). The BAS drives the unit by writing Analog Outputs (mode, occupancy, setpoints, enables) and reads status from Analog Inputs; occupied/unoccupied setpoints live in Analog Values. The device instance defaults to the MS/TP MAC address. The module expects regular writes from the BAS; if they stop, it times out and falls back to its local control mode.",
 "bacnet_transport": [
  "BACnet MS/TP"
 ],
 "firmware": null,
 "default_device_instance": "Same as MS/TP MAC address",
 "notes": [
  "Default baud 38.4k; Max_Master 127; Max_Info_Frames 1.",
  "Network values should be refreshed at least every 12 minutes (software v7.08+); the communication time-out is 15 minutes (5 minutes before v7.08).",
  "AO101 Application Mode Control takes coded values (heat/cool/fan/exhaust and direct stage commands); see the source for the full code table.",
  "AI200-AI207 (IMC Version characters) are legacy and not recommended for new installations.",
  "AV134-AV140 airflow targets only apply when SmartAirflow is installed; ranges depend on cabinet size.",
  "The module also has Lennox proprietary object types (compressor, blower, heating, economizer, air sensors) with no instance list; they are not included here."
 ],
 "source": {
  "title": "M3 BACnet Module (Unit Information)",
  "doc_number": "Corp 1404-L4 (450402)",
  "revision_date": "2018-10",
  "url": "https://www.lennox.com/dA/0082a46061/1404e.pdf"
 },
 "points": [
  {
   "type": "AO",
   "instance": 101,
   "name": "Application Mode Control",
   "description": "Unit mode, fan, exhaust and stage command (coded)",
   "units": "",
   "access": "C",
   "states": "0=Auto; 1=Heat; 3=Cool; 6=Off; 9=Fan only; 208=Fan auto; 209=Fan on; 216-222=Power exhaust commands; 224-236=Direct stage commands; 254=Reset; 255=Null (Auto)"
  },
  {
   "type": "AO",
   "instance": 102,
   "name": "Outdoor Air Min Pos Control",
   "description": "Range 0 to 255",
   "units": "%",
   "access": "C",
   "states": ""
  },
  {
   "type": "AO",
   "instance": 103,
   "name": "Occupancy Override Control",
   "description": "Range 0 to 255",
   "units": "",
   "access": "C",
   "states": "0=Occupied; 1=Unoccupied; 2=Refresh occupied override timer"
  },
  {
   "type": "AO",
   "instance": 104,
   "name": "Occupancy Scheduler Control",
   "description": "Range 0 to 255",
   "units": "",
   "access": "C",
   "states": ""
  },
  {
   "type": "AO",
   "instance": 107,
   "name": "Occupancy Sensor Input",
   "description": "Range 0 to 255",
   "units": "",
   "access": "C",
   "states": "0=Sensor sees occupied; 1=Sensor sees unoccupied"
  },
  {
   "type": "AO",
   "instance": 108,
   "name": "Space Dehumidification Setpoint",
   "description": "Range 0 to 100",
   "units": "%",
   "access": "C",
   "states": ""
  },
  {
   "type": "AO",
   "instance": 109,
   "name": "Temperature Setpoint (abs)",
   "description": "Range 36.25 to 100",
   "units": "°F",
   "access": "C",
   "states": ""
  },
  {
   "type": "AO",
   "instance": 110,
   "name": "Temperature Setpoint Offset",
   "description": "Range -32 to 31.75",
   "units": "°F",
   "access": "C",
   "states": ""
  },
  {
   "type": "AO",
   "instance": 113,
   "name": "Space Temperature Input",
   "description": "Range 36.25 to 100",
   "units": "°F",
   "access": "C",
   "states": ""
  },
  {
   "type": "AO",
   "instance": 114,
   "name": "Emergency Override Control",
   "description": "Range 0 to 255",
   "units": "",
   "access": "C",
   "states": ""
  },
  {
   "type": "AO",
   "instance": 115,
   "name": "Compressor Enable Control",
   "description": "Range 0 to 255",
   "units": "",
   "access": "C",
   "states": ""
  },
  {
   "type": "AO",
   "instance": 117,
   "name": "Primary Heat Enable Control",
   "description": "Range 0 to 255",
   "units": "",
   "access": "C",
   "states": ""
  },
  {
   "type": "AO",
   "instance": 119,
   "name": "Auxiliary Heat Enable Control",
   "description": "Range 0 to 255",
   "units": "",
   "access": "C",
   "states": ""
  },
  {
   "type": "AO",
   "instance": 123,
   "name": "Duct Static Setpoint",
   "description": "Range 0 to 5",
   "units": "in. w.c.",
   "access": "C",
   "states": ""
  },
  {
   "type": "AO",
   "instance": 124,
   "name": "Building Static Setpoint",
   "description": "Range -0.5 to 0.5",
   "units": "in. w.c.",
   "access": "C",
   "states": ""
  },
  {
   "type": "AO",
   "instance": 125,
   "name": "Discharge Air Cooling Setpoint",
   "description": "Range -9,40-100",
   "units": "°F",
   "access": "C",
   "states": ""
  },
  {
   "type": "AO",
   "instance": 126,
   "name": "Discharge Air Heating Setpoint",
   "description": "Range -9,60-140",
   "units": "°F",
   "access": "C",
   "states": ""
  },
  {
   "type": "AO",
   "instance": 127,
   "name": "Supply Fan Capacity Input",
   "description": "Range 33 to 255",
   "units": "%",
   "access": "C",
   "states": ""
  },
  {
   "type": "AO",
   "instance": 128,
   "name": "Exhaust Fan Capacity Input",
   "description": "Range 33 to 255",
   "units": "%",
   "access": "C",
   "states": ""
  },
  {
   "type": "AO",
   "instance": 129,
   "name": "Set Economizer Outdoor Air Suitable",
   "description": "Range 0 to 255",
   "units": "",
   "access": "C",
   "states": "0=Economizer disable; 1=Economizer enable"
  },
  {
   "type": "AI",
   "instance": 198,
   "name": "Mac Address",
   "description": "Range 0 - 127",
   "units": "",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 199,
   "name": "IMC Address",
   "description": "Range 1-31",
   "units": "",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 200,
   "name": "IMC Version[4]",
   "description": "Range 0 - 127; legacy, not for new installs",
   "units": "",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 201,
   "name": "IMC Version[5]",
   "description": "Range 0 - 127; legacy, not for new installs",
   "units": "",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 202,
   "name": "IMC Version[6]",
   "description": "Range 0 - 127; legacy, not for new installs",
   "units": "",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 203,
   "name": "IMC Version[7]",
   "description": "Range 0 - 127; legacy, not for new installs",
   "units": "",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 204,
   "name": "IMC Version[8]",
   "description": "Range 0 - 127; legacy, not for new installs",
   "units": "",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 205,
   "name": "IMC Version[9]",
   "description": "Range 0 - 127; legacy, not for new installs",
   "units": "",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 206,
   "name": "IMC Version[10]",
   "description": "Range 0 - 127; legacy, not for new installs",
   "units": "",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 207,
   "name": "IMC Version[11]",
   "description": "Range 0 - 127; legacy, not for new installs",
   "units": "",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 231,
   "name": "Unit ID",
   "description": "Range 0 - 127",
   "units": "",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 232,
   "name": "Unit Status",
   "description": "Range 0 - 255",
   "units": "",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 239,
   "name": "Space Temperature",
   "description": "Range 63.75 - 100.00",
   "units": "°F",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 240,
   "name": "Discharge Air Temperature",
   "description": "Range -8.7 - 164.4",
   "units": "°F",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 241,
   "name": "Effective Occupancy",
   "description": "Range 0 - 2",
   "units": "",
   "access": "R",
   "states": "0=Occupied; 1=Unoccupied; 2=Occupied (timed override)"
  },
  {
   "type": "AI",
   "instance": 242,
   "name": "Local Outside Air Temperature",
   "description": "Range -30.6 - 131.6",
   "units": "°F",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 243,
   "name": "Local Space Temperature",
   "description": "Range 63.75 - 100.00",
   "units": "°F",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 244,
   "name": "Outside Air Damper",
   "description": "Range 0 - 100, 255",
   "units": "%",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 245,
   "name": "Heat Primary",
   "description": "Range 0 - 100",
   "units": "%",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 246,
   "name": "Heat Secondary",
   "description": "Range 0 - 100",
   "units": "%",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 247,
   "name": "Cool Primary",
   "description": "Range 0 - 100",
   "units": "%",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 248,
   "name": "Economizer Enabled",
   "description": "Range 0, 1, 255",
   "units": "%",
   "access": "R",
   "states": "0=Disabled; 1=Enabled (OA suitable); 255=No economizer"
  },
  {
   "type": "AI",
   "instance": 250,
   "name": "Supply Fan Status",
   "description": "Range 0 - 100",
   "units": "%",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 252,
   "name": "Space Temperature Set Point (Effective)",
   "description": "Range 40.0 - 95.0",
   "units": "°F",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 253,
   "name": "Current Error",
   "description": "Range 0 - 255",
   "units": "",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 254,
   "name": "Error Pointer",
   "description": "Range 0 - 83",
   "units": "",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 255,
   "name": "Most recent Error 1",
   "description": "Range 1 - 255",
   "units": "",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 256,
   "name": "Most recent Error 2",
   "description": "Range 1 - 255",
   "units": "",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 257,
   "name": "Most recent Error 3",
   "description": "Range 1 - 255",
   "units": "",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 258,
   "name": "Most recent Error 4",
   "description": "Range 1 - 255",
   "units": "",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 259,
   "name": "Most recent Error 5",
   "description": "Range 1 - 255",
   "units": "",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 260,
   "name": "Most recent Error 6",
   "description": "Range 1 - 255",
   "units": "",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 261,
   "name": "Most recent Error 7",
   "description": "Range 1 - 255",
   "units": "",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 262,
   "name": "Most recent Error 8",
   "description": "Range 1 - 255",
   "units": "",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 263,
   "name": "Most recent Error 9",
   "description": "Range 1 - 255",
   "units": "",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 264,
   "name": "Most recent Error 10",
   "description": "Range 1 - 255",
   "units": "",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 274,
   "name": "Space CO2 Sensor (Effective)",
   "description": "Range 0 - 2000",
   "units": "ppm",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 275,
   "name": "Space CO2 Sensor (Local)",
   "description": "Range 0 - 2000",
   "units": "ppm",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 276,
   "name": "Space Humidity (Effective)",
   "description": "Range 0 - 100",
   "units": "%",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 277,
   "name": "Space Humidity (Local)",
   "description": "Range 0 - 100",
   "units": "%",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 278,
   "name": "Dehumidification Set Point (Effective)",
   "description": "Range 0 - 100",
   "units": "%",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 279,
   "name": "Dehumidification Status",
   "description": "Range 0 - 2",
   "units": "",
   "access": "R",
   "states": "0=Not installed; 1=Installed, not running; 2=Installed and running"
  },
  {
   "type": "AI",
   "instance": 281,
   "name": "Return Air Temperature",
   "description": "Range -8.7 - 164.4",
   "units": "°F",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 282,
   "name": "Building Static Pressure",
   "description": "Range -0.5 - 0.5",
   "units": "in. w.c.",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 283,
   "name": "Duct Static Pressure",
   "description": "Range 0 - 5.00",
   "units": "in. w.c.",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 285,
   "name": "Exhaust Fan Status",
   "description": "Range 0 - 100",
   "units": "%",
   "access": "R",
   "states": "0=Off; 1=Stage 1 on; 2=Stage 2 on; 255=No exhaust"
  },
  {
   "type": "AI",
   "instance": 286,
   "name": "Supply airflow status",
   "description": "Range 0 - 480 CFM per ton of unit size",
   "units": "CFM",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 287,
   "name": "Blower motor speed",
   "description": "Range 0 - 1500",
   "units": "RPM",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 288,
   "name": "Blower motor torque",
   "description": "Range 0 - 100",
   "units": "%",
   "access": "R",
   "states": ""
  },
  {
   "type": "AI",
   "instance": 289,
   "name": "Outdoor airflow",
   "description": "Range 0 - 480 CFM per ton of unit size",
   "units": "CFM",
   "access": "R",
   "states": ""
  },
  {
   "type": "AV",
   "instance": 1,
   "name": "Baud Rate Setting",
   "description": "Range 9600, 19200, 38400, 76800",
   "units": "",
   "access": "W",
   "states": ""
  },
  {
   "type": "AV",
   "instance": 130,
   "name": "Heating Occupied Setpoint",
   "description": "Range 40 to 95",
   "units": "°F",
   "access": "W",
   "states": ""
  },
  {
   "type": "AV",
   "instance": 131,
   "name": "Cooling Occupied Setpoint",
   "description": "Range 40 to 95",
   "units": "°F",
   "access": "W",
   "states": ""
  },
  {
   "type": "AV",
   "instance": 132,
   "name": "Heating Unoccupied Setpoint",
   "description": "Range 40 to 95",
   "units": "°F",
   "access": "W",
   "states": ""
  },
  {
   "type": "AV",
   "instance": 133,
   "name": "Cooling Unoccupied Setpoint",
   "description": "Range 40 to 95",
   "units": "°F",
   "access": "W",
   "states": ""
  },
  {
   "type": "AV",
   "instance": 134,
   "name": "Supply airflow Low Speed Target",
   "description": "SmartAirflow units only",
   "units": "CFM",
   "access": "W",
   "states": ""
  },
  {
   "type": "AV",
   "instance": 135,
   "name": "Supply airflow High Speed Target",
   "description": "SmartAirflow units only",
   "units": "CFM",
   "access": "W",
   "states": ""
  },
  {
   "type": "AV",
   "instance": 136,
   "name": "Supply airflow Medium Low Speed Target",
   "description": "SmartAirflow units only",
   "units": "CFM",
   "access": "W",
   "states": ""
  },
  {
   "type": "AV",
   "instance": 137,
   "name": "Supply airflow Medium High Speed Target",
   "description": "SmartAirflow units only",
   "units": "CFM",
   "access": "W",
   "states": ""
  },
  {
   "type": "AV",
   "instance": 138,
   "name": "Supply airflow Heat Mode Target",
   "description": "SmartAirflow units only",
   "units": "CFM",
   "access": "W",
   "states": ""
  },
  {
   "type": "AV",
   "instance": 139,
   "name": "Ventilation airflow Target",
   "description": "SmartAirflow units only",
   "units": "CFM",
   "access": "W",
   "states": ""
  },
  {
   "type": "AV",
   "instance": 140,
   "name": "Smoke airflow Target",
   "description": "SmartAirflow units only",
   "units": "CFM",
   "access": "W",
   "states": ""
  },
  {
   "type": "AV",
   "instance": 141,
   "name": "Outdoor airflow target",
   "description": "Range 0 to 150 CFM per ton",
   "units": "CFM",
   "access": "W",
   "states": ""
  }
 ],
 "integration": {
  "summary": "Enable the BACnet module in the M3 setup wizard and set the MAC address, baud and Control Mode. In Room Sensor mode the BMS writes occupancy (AO104) and setpoints (AO109 or AV130-133), and can supply space temperature on AO113. In Network Thermostat mode it sends heat/cool/fan demands on AO101 instead. The M3 does not store commands, so every control point in use must be rewritten on a schedule and after every controller reset.",
  "minimum_points": [
   {
    "ref": "AO 104",
    "name": "Occupancy Scheduler Control",
    "why": "0 = occupied, 1-255 = unoccupied; rewrite every 7 min"
   },
   {
    "ref": "AO 101",
    "name": "Application Mode Control",
    "why": "Mode or direct demand command"
   },
   {
    "ref": "AV 130",
    "name": "Heating Occupied Setpoint",
    "why": "Occupied heating setpoint, 40-95 °F"
   },
   {
    "ref": "AV 131",
    "name": "Cooling Occupied Setpoint",
    "why": "Occupied cooling setpoint, 40-95 °F"
   },
   {
    "ref": "AV 132",
    "name": "Heating Unoccupied Setpoint",
    "why": "Unoccupied heating setpoint, 40-95 °F"
   },
   {
    "ref": "AV 133",
    "name": "Cooling Unoccupied Setpoint",
    "why": "Unoccupied cooling setpoint, 40-95 °F"
   },
   {
    "ref": "AI 232",
    "name": "Unit Status",
    "why": "HVAC state code: 0 idle, 1 heat, 3 cool, 6 off, 9 fan"
   },
   {
    "ref": "AI 239",
    "name": "Space Temperature",
    "why": "Space temperature in use"
   },
   {
    "ref": "AI 253",
    "name": "Current Error",
    "why": "Active alarm code"
   }
  ],
  "enable": "At the M3: SETUP > INSTALL wizard, set Configuration ID 1 position 5 to B to enable the BACnet module. Then SETUP > NETWORK INTEGRATION > BACNET to set the address, baud and CONTROL MODE (Monitor Only, Room Sensor, Network Thermostat, Zone or Remote). In Monitor Only the unit ignores network setpoints and mode demands. No occupancy jumper is needed for Zone/Remote modes.",
  "heartbeat": "Network space temperature (AO113) and space RH/CO2 must be rewritten at least every 5 minutes (2-minute interval recommended), or an alarm is raised; some of these alarms only clear with a local reset. AO101 (network thermostat demand), AO109, AV130-133 and AO104 (when not using setpoint control) must be rewritten within 15 minutes (7-minute interval recommended). Without network sensor data for 5 minutes the unit shows Alarm 73. In Room Sensor mode with BACnet setpoints, 15 minutes with no application-level BACnet traffic makes the RTU reset. In Network Thermostat mode, 15 minutes without demands switches it to its backup mode. After losing network data the unit defaults to occupied (Parameter 225 changes this).",
  "remote_sensors": "Space temperature goes to AO113 (Space Temperature Input) when CONTROL MODE = ROOM SENSOR with network TEMPERATURE = YES. Space RH and CO2 are written to the proprietary space air object properties 536 and 537. Before network sensor data arrives the unit idles up to 5 minutes (Alarm 110), then enters backup sensor mode (Alarm 93). The points list has no network outdoor-air-temperature input.",
  "setup": [
   "Default device instance (Object_Identifier) equals the MS/TP MAC address; change it from the BACnet front end.",
   "Default object name is Lennox_M3_ followed by the MAC address.",
   "Baud is selectable 9.6k, 19.2k, 38.4k or 76.8k; default 38.4k. Max_Master defaults to 127 and Max_Info_Frames to 1.",
   "Use consecutive MAC addresses starting at 1, and set Max_Master to the highest MAC on the trunk.",
   "Lennox recommends no repeaters and, above 9.6k baud, no more than 20 Lennox units and 30 devices per router."
  ],
  "gotchas": [
   "Lennox does not support BACnet COV; poll instead, no faster than every 2 minutes per point.",
   "Commands are not stored: rewrite all control points after every M3 reset.",
   "Use ReadPropertyMultiple when reading many analog objects.",
   "AV134-AV140 airflow targets only work with SmartAirflow.",
   "AI200-AI207 (IMC Version) are legacy and not recommended for new jobs."
  ]
 },
 "page": "https://easybacnet.com/bacnet-points-lists/lennox/prodigy-m3-bacnet-module",
 "note": "Re-typed from the manufacturer's public documentation (see source). Point availability varies by firmware and options; verify against the live device."
}
