{
 "manufacturer": "AERCO",
 "manufacturer_slug": "aerco",
 "model": "C-More Boiler Controller (Benchmark / KC series)",
 "model_slug": "c-more-controller",
 "short_model": "Benchmark C-More",
 "aliases": [
  "C-More",
  "Benchmark",
  "KC1000",
  "KC Series",
  "Benchmark boiler",
  "Benchmark water heater"
 ],
 "equipment_type": "Boiler / water heater controller",
 "applies_to": "AERCO C-More boiler controllers (software 2.00 or later) used on Benchmark and KC Series boilers and water heaters, as a Modbus RTU slave.",
 "summary": "The C-More controller on AERCO Benchmark and KC Series units is a Modbus RTU slave on RS-485, normally driven by an AERCO BMS/ACS or a third-party EMS. A master can monitor temperatures, firing rate, flame strength, run hours and status messages, and can control the unit either by writing a network setpoint (Remote Setpoint mode) or a firing rate (Direct Drive mode). Temperatures are transferred as 0-1000 counts that must be converted with AERCO's equations.",
 "transport": [
  "RTU"
 ],
 "defaults": {
  "unit_id": null,
  "baud": 9600,
  "parity": null,
  "data_bits": null,
  "stop_bits": null,
  "tcp_port": null
 },
 "addressing": {
  "convention": "0-based",
  "note": "The manual lists generic Modbus data addresses in decimal and hex (e.g. Outlet Temp 2 (0x0002)) and states that BAS tools using 30001/40001 notation add 30001/40001 to them. The listed number is the wire address."
 },
 "default_word_order": "CDAB",
 "firmware": "C-More software 2.00 or higher",
 "source": {
  "title": "Modbus Communications User Manual - C-More Controller, Boiler Management System (BMS/BMS II), AERCO Control System (ACS)",
  "doc_number": "OMM-0035_D / GF-114",
  "revision_date": "2026-04-07",
  "url": "https://www.aerco.com/dfsmedia/0533dbba17714b1ab581ab07a4cbb521/58215-source/639112726810000000/omm-0035-0b-gf-114-modbus-communications-manual-05-18-12-0.pdf",
  "pages": "pp. 4-8 (requirements, function codes), 10-16 (C-More input and holding registers), 36-38 (password, direct drive, remote setpoint), 49-50 (termination/bias), 58-59 (setup), 70-75 (status messages, conversion equations)"
 },
 "notes": [
  "Temperature registers are raw counts (0-1000), not degrees, and are listed with scale 1 and units 'counts'. AERCO Table A-3 converts them with integer (floor) brackets: DEGREES_1 °F = floor((counts x 230 + 500) / 1000) + 20; DEGREES_2 °F = floor((counts x 330 + 500) / 1000) - 80; DEGREES_3 °F = floor((counts x 520 + 500) / 1000) + 40 (Celsius versions: x128 - 7, x183 - 62, x289 - 4). Because the result is rounded to whole degrees the conversion is a step function, not an exact scale/offset, so it is not encoded as one. Table A-4 gives the reverse (degrees to counts) for writes, e.g. DEGREES_1 counts = floor(((°F - 20) x 1000 + 115) / 230).",
  "ABS_DEG_1 registers (prop band, min/max load adjust, setpoint limit band) are temperature differences in counts (published range 0-1000): °F = floor((counts x 230 + 500) / 1000) for counts >= 0 and floor((counts x 230 - 500) / 1000) for counts < 0. They are typed INT16 because the manual gives a negative-count formula; within the published range INT16 and UINT16 read the same.",
  "Exhaust Temp (input 6) is printed as DEGREES_2 while Sensor Log Exhaust Temp (input 32, not listed) is DEGREES_3; check the conversion on site.",
  "32-bit counters (run cycles, run hours, fault-log cycle) are stored low word first (low word at the lower address), hence CDAB. The high word only ranges 0-15.",
  "The Unit Status / message code list is Table A-2 in the manual even though the register table points to Table A-1.",
  "Left out: reserved registers, the sensor-log and time-log history registers (28-43), the log pointers (68-70) and all BMS/BMS II/ACS registers (a separate controller covered in the same manual)."
 ],
 "registers": [
  {
   "table": "input_register",
   "address": 0,
   "documented": "0 (0x0000)",
   "name": "Default Message Display Code",
   "description": "Current display status/fault message (codes 1-64).",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": {
    "1": "DISABLED",
    "2": "STANDBY",
    "3": "DEMAND DELAY",
    "4": "PURGING",
    "5": "IGNITION TRIAL",
    "6": "FLAME PROVEN",
    "7": "WARMUP",
    "8": "HIGH WATER TEMP SWITCH OPEN",
    "9": "LOW WATER LEVEL",
    "10": "LOW GAS PRESSURE",
    "11": "HIGH GAS PRESSURE",
    "12": "INTERLOCK OPEN",
    "13": "DELAYED INTERLOCK OPEN",
    "14": "AIRFLOW FAULT DURING PURGE",
    "15": "SSOV FAULT DURING PURGE",
    "16": "PRG SWTCH OPEN DURING PURGE",
    "17": "IGN SWTCH OPEN DURING IGNITION",
    "18": "AIRFLOW FAULT DURING IGN",
    "19": "AIRFLOW FAULT DURING RUN",
    "20": "SSOV FAULT DURING IGN",
    "21": "SSOV FAULT DURING RUN",
    "22": "FLAME LOSS DURING IGN",
    "23": "FLAME LOSS DURING RUN",
    "24": "HIGH EXHAUST TEMPERATURE",
    "25": "LOSS OF POWER",
    "26": "LOSS OF SENSOR",
    "27": "LOSS OF SIGNAL",
    "28": "HIGH O2 LEVEL",
    "29": "LOW O2 LEVEL",
    "30": "HIGH CO LEVEL",
    "31": "SSOV RELAY FAILURE",
    "32": "RESIDUAL FLAME",
    "33": "HEAT DEMAND FAILURE",
    "34": "IGN SWTCH CLOSED DURING PURGE",
    "35": "PRG SWTCH CLOSED DURING IGNITION",
    "36": "SSOV SWITCH OPEN",
    "37": "IGNITION BOARD COMM FAULT",
    "38": "WAIT",
    "39": "DIRECT DRIVE SIGNAL FAULT",
    "40": "REMOTE SETPT SIGNAL FAULT",
    "41": "OUTDOOR TEMP SENSOR FAULT",
    "42": "OUTLET TEMP SENSOR FAULT",
    "43": "FFWD TEMP SENSOR FAULT",
    "44": "HIGH WATER TEMPERATURE",
    "45": "LINE VOLTAGE OUT OF PHASE",
    "46": "STEPPER MOTOR FAILURE",
    "47": "SETPT LIMITING ACTIVE",
    "48": "MODBUS COMM FAULT",
    "49": "WAIT IGNITION RETRY",
    "50": "WAIT FAULT PURGE",
    "51": "WAIT RETRY PAUSE",
    "52": "EXHAUST TEMP SENSOR SHORT",
    "53": "EXHAUST TEMP SENSOR OPEN",
    "54": "WARNING EXHAUST TEMP HIGH",
    "55": "EXHAUST TEMP HIGH",
    "56": "INLET WATER TEMP SENSOR SHORT",
    "57": "INLET WATER TEMP SENSOR OPEN",
    "58": "WARNING IN WATER TEMP HIGH",
    "59": "WARNING IN WATER TEMP LOW",
    "60": "INLET GAS PRESS SENSOR OPEN",
    "61": "GAS PLATE DP SENSOR OPEN",
    "62": "INLET WATER FLOW SENSOR OPEN",
    "63": "WARNING IN WTR FLOW LOW",
    "64": "INLET WATER HIGH FLOW"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1,
   "documented": "1 (0x0001)",
   "name": "Unit Status",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": {
    "0": "Disabled",
    "1": "Standby",
    "2": "Manual",
    "3": "Remote",
    "4": "Auto",
    "5": "Fault"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 2,
   "documented": "2 (0x0002)",
   "name": "Outlet Temp",
   "description": "Outlet temperature as DEGREES_1 counts (0-1000); °F = floor((counts×230+500)/1000)+20.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "counts",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 3,
   "documented": "3 (0x0003)",
   "name": "Inlet Temp",
   "description": "Inlet temperature, DEGREES_1 counts; °F = floor((counts×230+500)/1000)+20.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "counts",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 4,
   "documented": "4 (0x0004)",
   "name": "Aux Temp",
   "description": "Aux temperature, DEGREES_1 counts; °F = floor((counts×230+500)/1000)+20.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "counts",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 5,
   "documented": "5 (0x0005)",
   "name": "Outdoor Temp",
   "description": "Outdoor temperature, DEGREES_2 counts; °F = floor((counts×330+500)/1000)-80.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "counts",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 6,
   "documented": "6 (0x0006)",
   "name": "Exhaust Temp",
   "description": "Printed as DEGREES_2 (exhaust log uses DEGREES_3); °F = floor((counts×330+500)/1000)-80.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "counts",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 7,
   "documented": "7 (0x0007)",
   "name": "FFWD Temp",
   "description": "Feed-forward (header) temperature, DEGREES_1 counts; °F = floor((counts×230+500)/1000)+20.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "counts",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 8,
   "documented": "8 (0x0008)",
   "name": "Fire Rate Out",
   "description": "Firing rate output (0-100).",
   "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": 9,
   "documented": "9 (0x0009)",
   "name": "O2 Level",
   "description": "0-25 %.",
   "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": 10,
   "documented": "10 (0x000A)",
   "name": "CO Level",
   "description": "0-500 ppm.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "ppm",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 11,
   "documented": "11 (0x000B)",
   "name": "Run Cycles",
   "description": "Low word at 11, high word (0-15) at 12; range 0-999,999.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 13,
   "documented": "13 (0x000D)",
   "name": "Run Hours",
   "description": "Low word at 13, high word (0-15) at 14; range 0-999,999.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "scale_factor_ref": null,
   "units": "h",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 15,
   "documented": "15 (0x000F)",
   "name": "Flame Strength",
   "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": 16,
   "documented": "16 (0x0010)",
   "name": "Active Set point",
   "description": "DEGREES_1 counts; °F = floor((counts×230+500)/1000)+20.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "counts",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 17,
   "documented": "17 (0x0011)",
   "name": "Fire Rate 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": 18,
   "documented": "18 (0x0012)",
   "name": "Manual Fire Rate",
   "description": "Only meaningful in Manual mode from the front panel.",
   "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": 19,
   "documented": "19 (0x0013)",
   "name": "Comm Address",
   "description": "Modbus address 0-127; 0 (default) disables Modbus on the controller.",
   "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": 20,
   "documented": "20 (0x0014)",
   "name": "Software Version",
   "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": 23,
   "documented": "23 (0x0017)",
   "name": "Fault Log Code",
   "description": "Fault code of the selected fault-log entry.",
   "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": 24,
   "documented": "24 (0x0018)",
   "name": "Fault Log Cycle",
   "description": "Cycle count of the selected fault-log entry (low word first).",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 26,
   "documented": "26 (0x001A)",
   "name": "Fault Log Date",
   "description": "Date of the selected fault-log entry, 1 count per day.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "days",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 27,
   "documented": "27 (0x001B)",
   "name": "Fault Log Time",
   "description": "Minutes since midnight (0-1439).",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "min",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 0,
   "documented": "0 (0x0000)",
   "name": "Net Remote Set Point",
   "description": "Remote Setpoint mode only; DEGREES_1 counts; °F = floor((counts×230+500)/1000)+20.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "counts",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 1,
   "documented": "1 (0x0001)",
   "name": "Net Direct Drive",
   "description": "Fire rate from the network; writable only in Direct Drive mode.",
   "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": "2 (0x0002)",
   "name": "Modbus Password",
   "description": "Security password for the RS-485 Modbus port (default 0).",
   "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": 3,
   "documented": "3 (0x0003)",
   "name": "Password",
   "description": "Security password for the RS-232 front-panel port (default 0).",
   "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": "4 (0x0004)",
   "name": "Internal Set Point",
   "description": "DEGREES_1 counts (default 130 °F); °F = floor((counts×230+500)/1000)+20.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "counts",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 6,
   "documented": "6 (0x0006)",
   "name": "Time",
   "description": "Controller clock, minutes since midnight (0-1439).",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "min",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 7,
   "documented": "7 (0x0007)",
   "name": "Date",
   "description": "Controller date, days since 1 Jan 2000.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "days",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 8,
   "documented": "8 (0x0008)",
   "name": "Unit of Temp",
   "description": "Display unit (default °F).",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "RW",
   "values": {
    "0": "Degrees Fahrenheit",
    "1": "Degrees Celsius"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 9,
   "documented": "9 (0x0009)",
   "name": "Baud Rate",
   "description": "RS-232 front-panel port only (default 9.6k).",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "RW",
   "values": {
    "0": "2400",
    "1": "4800",
    "2": "9600",
    "3": "19200"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 10,
   "documented": "10 (0x000A)",
   "name": "Unit Type",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "RW",
   "values": {
    "0": "Boiler",
    "1": "Water Heater"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 11,
   "documented": "11 (0x000B)",
   "name": "Unit Size",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "RW",
   "values": {
    "0": "0.5 MBTU",
    "1": "1 MBTU",
    "2": "1.5 MBTU",
    "3": "2 MBTU",
    "4": "2.5 MBTU",
    "5": "3 MBTU"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 12,
   "documented": "12 (0x000C)",
   "name": "Boiler Mode",
   "description": "Control mode (default Constant Setpt).",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "RW",
   "values": {
    "0": "Constant Setpt",
    "1": "Remote Setpt",
    "2": "Direct Drive",
    "3": "Combo Unit",
    "4": "Outdoor Reset"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 13,
   "documented": "13 (0x000D)",
   "name": "Remote Signal",
   "description": "Source of the remote signal; Network = Modbus.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "RW",
   "values": {
    "0": "4-20 mA / 1-5 V",
    "1": "0-20 mA / 0-5 V",
    "2": "PWM Input",
    "3": "Network"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 14,
   "documented": "14 (0x000E)",
   "name": "Bldg Ref Temp",
   "description": "Outdoor-reset reference, DEGREES_1 counts; °F = floor((counts×230+500)/1000)+20.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "counts",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 15,
   "documented": "15 (0x000F)",
   "name": "Reset Ratio",
   "description": "Outdoor-reset ratio 0.1-9.9 (counts = ratio x 10; default 1.2).",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "scale_factor_ref": null,
   "units": "",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 16,
   "documented": "16 (0x0010)",
   "name": "Outdoor Sensor Enable",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "RW",
   "values": {
    "0": "False",
    "1": "True"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 17,
   "documented": "17 (0x0011)",
   "name": "System Start Temp",
   "description": "DEGREES_2 counts (default 60 °F); °F = floor((counts×330+500)/1000)-80.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "counts",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 18,
   "documented": "18 (0x0012)",
   "name": "Set Point Lo Limit",
   "description": "DEGREES_1 counts (default 60 °F); °F = floor((counts×230+500)/1000)+20.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "counts",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 19,
   "documented": "19 (0x0013)",
   "name": "Set Point Hi Limit",
   "description": "DEGREES_1 counts (default 200 °F); °F = floor((counts×230+500)/1000)+20.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "counts",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20,
   "documented": "20 (0x0014)",
   "name": "Temp Hi Limit",
   "description": "Outlet limit, DEGREES_1 counts (default 210 °F); °F = floor((counts×230+500)/1000)+20.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "counts",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 21,
   "documented": "21 (0x0015)",
   "name": "Max Fire Rate",
   "description": "40-100 % (default 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": 22,
   "documented": "22 (0x0016)",
   "name": "Pump Delay Timer",
   "description": "0-30 min.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "min",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 23,
   "documented": "23 (0x0017)",
   "name": "Aux Start On Delay",
   "description": "0-120 s.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "s",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 24,
   "documented": "24 (0x0018)",
   "name": "Failsafe Mode",
   "description": "Action on loss of the remote/Modbus signal.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "RW",
   "values": {
    "0": "Shutdown",
    "1": "Constant Setpoint"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 25,
   "documented": "25 (0x0019)",
   "name": "Low Fire Timer",
   "description": "2-60 s (default 2).",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "s",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 26,
   "documented": "26 (0x001A)",
   "name": "Prop Band",
   "description": "Proportional band, ABS_DEG_1 counts (a temperature difference); see notes for conversion.",
   "data_type": "INT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "counts",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 27,
   "documented": "27 (0x001B)",
   "name": "Integral Gain",
   "description": "0.00-2.00.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.01,
   "scale_factor_ref": null,
   "units": "",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 28,
   "documented": "28 (0x001C)",
   "name": "Derivative Time",
   "description": "0.00-2.00 min.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.01,
   "scale_factor_ref": null,
   "units": "min",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 29,
   "documented": "29 (0x001D)",
   "name": "Min Load Adjust",
   "description": "Water heater only; ABS_DEG_1 counts (temperature difference); see notes for conversion.",
   "data_type": "INT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "counts",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 30,
   "documented": "30 (0x001E)",
   "name": "Max Load Adjust",
   "description": "Water heater only; ABS_DEG_1 counts (temperature difference); see notes for conversion.",
   "data_type": "INT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "counts",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 31,
   "documented": "31 (0x001F)",
   "name": "Outlet Feedback",
   "description": "Water heater only (default On).",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "RW",
   "values": {
    "0": "Off",
    "1": "On"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 60,
   "documented": "60 (0x003C)",
   "name": "Set Point Limiting",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "RW",
   "values": {
    "0": "Disabled",
    "1": "Enabled"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 61,
   "documented": "61 (0x003D)",
   "name": "Set Point Limit Band",
   "description": "ABS_DEG_1 counts (temperature difference); see notes for conversion.",
   "data_type": "INT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "counts",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 67,
   "documented": "67 (0x0043)",
   "name": "Sensor Log Interval",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "scale_factor_ref": null,
   "units": "",
   "access": "RW",
   "values": {
    "0": "Off",
    "1": "1 min",
    "2": "5 min",
    "3": "15 min",
    "4": "30 min",
    "5": "1 h",
    "6": "6 h",
    "7": "12 h",
    "8": "24 h"
   },
   "bits": null,
   "offset": 0
  }
 ],
 "integration": {
  "summary": "Give the C-More a Comm Address (1-127) in its Setup menu, set Boiler Mode to Remote Setpoint or Direct Drive and Remote Signal to Network, then write holding register 0 (setpoint counts) or 1 (fire rate %) at least every 10 seconds. Read input registers 1-16 for status, temperatures, fire rate and run hours.",
  "minimum_registers": [
   {
    "table": "holding_register",
    "address": 0,
    "why": "Network setpoint (Remote Setpoint mode)"
   },
   {
    "table": "holding_register",
    "address": 1,
    "why": "Network fire rate (Direct Drive mode)"
   },
   {
    "table": "holding_register",
    "address": 12,
    "why": "Boiler mode"
   },
   {
    "table": "input_register",
    "address": 1,
    "why": "Unit status"
   },
   {
    "table": "input_register",
    "address": 2,
    "why": "Outlet temperature"
   },
   {
    "table": "input_register",
    "address": 8,
    "why": "Fire rate out"
   },
   {
    "table": "input_register",
    "address": 15,
    "why": "Flame strength"
   },
   {
    "table": "input_register",
    "address": 0,
    "why": "Status / fault message code"
   }
  ],
  "enable": "Setup menu: Comm Address 1-127 (0, the default, disables Modbus). Configuration menu: Boiler Mode = Direct Drive or Remote Setpoint and Remote Signal = Network. Changing settings needs the right password level; register 2 holds the Modbus-port password and writes to protected registers fail with exception 02 until it matches.",
  "watchdog": "Fixed 10 s heartbeat: each received Net Direct Drive or Net Remote Setpoint write resets it. If it expires the controller shows MODBUS COMM FAULT and falls back to the Failsafe Mode in holding register 24 (Shutdown or Constant Setpoint).",
  "quirks": [
   "Temperatures are 0-1000 counts that need AERCO's conversion equations; they are not tenths of a degree.",
   "Function code 16 (write multiple registers) is not supported and returns Illegal Function; write one register at a time with function 06.",
   "A multi-register read (FC03/FC04) that includes any register the current password level cannot access fails as a whole with Illegal Data Address.",
   "32-bit counters are low word first."
  ],
  "setup": [
   "RS-485 2-wire with shield, RTU only, fixed 9600 baud on the C-More; up to 127 slaves (32 when driven by a BMS/ACS).",
   "Terminate and bias only the last C-More on the bus: TERM, BIAS1 and BIAS2 DIP switches on the PMC board behind the front panel; that unit must stay powered for bias.",
   "Address 0 is broadcast; a broadcast Net Direct Drive or Net Remote Setpoint sets all enabled slaves at once."
  ],
  "gotchas": [
   "Do not write to registers marked Reserved.",
   "Front-panel, RS-232 and Modbus changes are not interlocked; the last write wins.",
   "AERCO recommends enabling Set Point Limiting and choosing the Failsafe Mode before handing control to Modbus."
  ]
 },
 "page": "https://easymodbus.com/modbus-register-maps/aerco/c-more-controller",
 "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."
}
