{
  "spec_version": 1,
  "slug": "evapco-eco-air-controller",
  "manufacturer": "EVAPCO",
  "model": "eco-Air controller with AC fan motors (adiabatic coolers, fluid coolers and refrigerant condensers)",
  "category": "Cooling tower",
  "supplier_url": "https://www.evapco.eu/",
  "default_configuration": {
    "protocol": "modbus_tcp",
    "port": 502,
    "unit_id": 1,
    "addressing": "one_based",
    "byte_order": "BigEndian",
    "word_order": "HighFirst",
    "native_interface": "rs485",
    "serial": {
      "parity": "Even",
      "baud_rate": 19200,
      "data_bits": 8,
      "stop_bits": 1
    }
  },
  "coils": [],
  "discrete_inputs": [],
  "input_registers": [],
  "holding_registers": [
    {
      "address": 16384,
      "count": 2,
      "name": "Setpoint #1 temperature",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Primary process temperature setpoint used when no alternate setpoint is active."
    },
    {
      "address": 16386,
      "count": 2,
      "name": "Setpoint #2 temperature",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Alternate process temperature setpoint, activated by the scheduler, ambient temperature or a digital input."
    },
    {
      "address": 16388,
      "count": 1,
      "name": "Maximum allowed fan speed",
      "data_type": "Int16",
      "units": "%",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Maximum allowable fan speed, 0 to 100 %."
    },
    {
      "address": 16389,
      "count": 1,
      "name": "Quiet operation maximum fan speed",
      "data_type": "Int16",
      "units": "%",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Maximum allowable fan speed while quiet operation is active, 0 to 100 %."
    },
    {
      "address": 16390,
      "count": 1,
      "name": "Energy savings fan speed",
      "data_type": "Int16",
      "units": "%",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Fan speed above which the pre-cooling system activates, 0 to 100 %."
    },
    {
      "address": 16391,
      "count": 1,
      "name": "Minimum allowed fan speed",
      "data_type": "Int16",
      "units": "%",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Minimum allowable fan speed, 0 to 100 %."
    },
    {
      "address": 16393,
      "count": 2,
      "name": "Proportional temperature regulation band",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Temperature band between minimum and maximum fan speed for proportional fan control, 0.0 to 30.0."
    },
    {
      "address": 16395,
      "count": 2,
      "name": "PID controller gain",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Proportional gain constant of the PID fan-speed controller, 0.0 to 10.0."
    },
    {
      "address": 16397,
      "count": 1,
      "name": "PID controller Ti term",
      "data_type": "Int16",
      "units": "s",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "PID integral term, 0 to 999 s."
    },
    {
      "address": 16398,
      "count": 1,
      "name": "PID controller Td term",
      "data_type": "Int16",
      "units": "s",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "PID derivative term, 0 to 999 s."
    },
    {
      "address": 16399,
      "count": 2,
      "name": "Setpoint #2 ambient temperature trigger",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Ambient temperature below which control switches to setpoint #2, -100.0 to 200.0."
    },
    {
      "address": 16401,
      "count": 2,
      "name": "Setpoint #2 ambient trigger differential",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Temperature differential added to the setpoint #2 ambient trigger before control returns to setpoint #1, 0.0 to 20.0."
    },
    {
      "address": 16419,
      "count": 1,
      "name": "Condenser refrigerant type",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "1=R22, 2=R134a, 3=R404A, 4=R407C, 5=R410A, 6=R407A, 7=R407F, 8=R290, 9=R507A, 10=R717 (NH3), 11=R723, 12=R1234ze, 13=R744 (CO2), 14=R448A, 15=R427A, 16=R450A, 17=R513A, 18=R449A, 19=R1234yf, 20=R454B, 21=R454C, 22=R455A, 23=R434A, 24=R422A, 25=R32, 26=R452B, 27=R452A, 28=Custom."
    },
    {
      "address": 16421,
      "count": 2,
      "name": "Low temperature pre-cooling system lockout",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Minimum ambient temperature at which the pre-cooling system may operate, -9,999.0 to 9,999.0."
    },
    {
      "address": 16423,
      "count": 2,
      "name": "Low temperature differential for pre-cooling lockout",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Ambient temperature offset added to the lockout temperature, 0.0 to 20.0."
    },
    {
      "address": 16425,
      "count": 1,
      "name": "Stage #1 increase time setpoint",
      "data_type": "Int16",
      "units": "s",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Seconds the process temperature must stay above setpoint before stage 1 activates, 0 to 32,767."
    },
    {
      "address": 16426,
      "count": 1,
      "name": "Stage #1 decrease time setpoint",
      "data_type": "Int16",
      "units": "s",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Seconds the process temperature must stay below setpoint before stage 1 deactivates, 0 to 32,767."
    },
    {
      "address": 16427,
      "count": 1,
      "name": "Stage #2-4 increase time setpoint",
      "data_type": "Int16",
      "units": "s",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Seconds the process temperature must stay above setpoint before stages 2-4 activate, 0 to 32,767."
    },
    {
      "address": 16428,
      "count": 1,
      "name": "Stage #2-4 decrease time setpoint",
      "data_type": "Int16",
      "units": "s",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Seconds the process temperature must stay below setpoint before stages 2-4 deactivate, 0 to 32,767."
    },
    {
      "address": 16429,
      "count": 2,
      "name": "Stage #1 ambient temperature switch point",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Minimum ambient temperature above which stage 1 may operate, -999.9 to 999.9."
    },
    {
      "address": 16431,
      "count": 2,
      "name": "Stage #2 ambient temperature switch point",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Minimum ambient temperature above which stage 2 may operate, -999.9 to 999.9."
    },
    {
      "address": 16433,
      "count": 2,
      "name": "Stage #3 ambient temperature switch point",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Minimum ambient temperature above which stage 3 may operate, -999.9 to 999.9."
    },
    {
      "address": 16435,
      "count": 2,
      "name": "Stage #4 ambient temperature switch point",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Minimum ambient temperature above which stage 4 may operate, -999.9 to 999.9."
    },
    {
      "address": 16438,
      "count": 1,
      "name": "Stage #1 minimum run time",
      "data_type": "Int16",
      "units": "s",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Minimum time stage 1 stays active before it may turn off, 0 to 32,767 s."
    },
    {
      "address": 16439,
      "count": 1,
      "name": "Stage #2 minimum run time",
      "data_type": "Int16",
      "units": "s",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Minimum time stage 2 stays active before it may turn off, 0 to 32,767 s."
    },
    {
      "address": 16440,
      "count": 1,
      "name": "Stage #3 minimum run time",
      "data_type": "Int16",
      "units": "s",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Minimum time stage 3 stays active before it may turn off, 0 to 32,767 s."
    },
    {
      "address": 16441,
      "count": 1,
      "name": "Stage #4 minimum run time",
      "data_type": "Int16",
      "units": "s",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Minimum time stage 4 stays active before it may turn off, 0 to 32,767 s."
    },
    {
      "address": 16443,
      "count": 1,
      "name": "Pre-cooling flush period",
      "data_type": "Int16",
      "units": "min",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Minutes the flushing routine runs, 0 to 9,999."
    },
    {
      "address": 16444,
      "count": 1,
      "name": "Pre-cooling drying period",
      "data_type": "Int16",
      "units": "min",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Minutes the pre-cooling pads are dried after a flush, 0 to 9,999."
    },
    {
      "address": 16445,
      "count": 2,
      "name": "Pre-cooling flush fan speed",
      "data_type": "Float32",
      "units": "%",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Fan speed used during a flushing cycle, 0.0 to 100.0 %."
    },
    {
      "address": 16448,
      "count": 1,
      "name": "Source for fan speed control",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "1 = analog input, 2 = communication (see register 409158)."
    },
    {
      "address": 16449,
      "count": 2,
      "name": "Signal failure ambient trigger",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "When fan-speed control comes from the analog input, decides whether a signal failure falls back to the high or low default fan speed, -100.0 to 200.0."
    },
    {
      "address": 16451,
      "count": 1,
      "name": "Signal failure high default fan speed",
      "data_type": "Int16",
      "units": "%",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Fan speed used when the analog input is lost and the ambient temperature is above the trigger, 0 to 100 %."
    },
    {
      "address": 16452,
      "count": 1,
      "name": "Signal failure low default fan speed",
      "data_type": "Int16",
      "units": "%",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Fan speed used when the analog input is lost and the ambient temperature is below the trigger, 0 to 100 %."
    },
    {
      "address": 8961,
      "count": 1,
      "name": "Actual unit state",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "1 = unit on and operational, 2 = off by alarm, 4 = off via BMS, 6 = off via digital input, 7 = switched off locally, 8 = manual fan-speed mode."
    },
    {
      "address": 8962,
      "count": 2,
      "name": "Process temperature",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Outlet temperature of the process fluid; on condenser applications a saturated value calculated from the condensing pressure."
    },
    {
      "address": 8964,
      "count": 2,
      "name": "Ambient temperature",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Temperature read by the ambient sensor."
    },
    {
      "address": 8966,
      "count": 1,
      "name": "Reference fan speed",
      "data_type": "Int16",
      "units": "%",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Fan speed the controller is requesting, 0 to 100 %."
    },
    {
      "address": 8967,
      "count": 2,
      "name": "Current active temperature setpoint",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Setpoint the eco-Air unit is currently maintaining."
    },
    {
      "address": 8969,
      "count": 2,
      "name": "Inlet pressure",
      "data_type": "Float32",
      "units": "psig/bar",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Inlet pressure from the pressure-sensor input."
    },
    {
      "address": 9158,
      "count": 1,
      "name": "Remote fan speed reference (communication)",
      "data_type": "Int16",
      "units": "%",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "RW",
      "description": "Fan speed reference when remote fan speed is enabled and the source is communications; value is x10, 1000 = 100.0 %."
    },
    {
      "address": 9159,
      "count": 2,
      "name": "Remote fan speed reference (analog input)",
      "data_type": "Float32",
      "units": "%",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Fan speed reference derived from the analog input, 0.0 to 100.0 %."
    }
  ],
  "combined_registers": [],
  "notes": "Source: EVAPCO \"Controller User's Manual - Addendum, Communications Guide AC Motor Edition\", COMM24AC-E_1025, October 2025 (https://www.evapco.eu/sites/evapco.eu/files/2025-12/EVAPCO%20eco-Air%20Communications%20Guide%20AC%20Motor%20COMM24AC-E_1025.pdf), with the factory communication defaults from the \"EVAPCO Controller User's Manual\" dated 5/10/2022, Table 23 (https://www.evapco.com/sites/evapco.com/files/2022-05/Controller%20Users%20Manual_edited_5_10_22.pdf): Modbus RTU, node address 1, 19200 bps, even parity, 1 stop bit, 8 data bits (Modbus RTU). The guide publishes holding registers as six-digit 4xxxxx references (e.g. 416384), i.e. a 4 followed by the five-digit one-based register number, so this file stores the register number (16384) and declares one_based addressing. Rows ending in ',nn' in the source are single bits inside a holding register and are not modelled. 32-bit runtime counters are also left out because the document does not state their word order. The source's Units column renders as '0°' for temperature rows without saying °C or °F, so those rows carry no units and use whatever temperature scale the controller is configured for; fan speeds and percentages are %. Values are transmitted in engineering units, with the one documented exception of register 409158, which is x10."
}
