{
  "spec_version": 1,
  "slug": "sentera-ech-8-dm",
  "manufacturer": "Sentera",
  "model": "ECH-8-DM controller for water heaters / coolers with EC fan",
  "category": "Fan controller",
  "supplier_url": "https://www.sentera.eu/en/productdetails/air-heater-cooler-controller-ec-fans/172832",
  "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": [
    {
      "address": 1,
      "count": 1,
      "name": "Operating mode",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = standby, 1...5 = position 1...5, 6 = auto mode, 7 = remote mode."
    },
    {
      "address": 2,
      "count": 1,
      "name": "Temperature sensor state",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = connected, 1 = not connected or temperature above the working range, 2 = short circuit or temperature below the working range, 3 = not calibrated."
    },
    {
      "address": 3,
      "count": 1,
      "name": "Temperature setpoint",
      "data_type": "UInt16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Raw 50...350 = 5.0...35.0 °C."
    },
    {
      "address": 4,
      "count": 1,
      "name": "Actual temperature",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Raw -100...500 = -10.0...50.0 °C."
    },
    {
      "address": 5,
      "count": 1,
      "name": "Relay output state",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = off / 0 VAC, 1 = on / supply voltage."
    },
    {
      "address": 6,
      "count": 1,
      "name": "Analogue output mode",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = 0...6 VDC, 1 = 0...10 VDC."
    },
    {
      "address": 7,
      "count": 1,
      "name": "Analogue output value",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Raw 0...1000 = 0.0...100.0 % output."
    },
    {
      "address": 8,
      "count": 1,
      "name": "Control mode",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = cooling, 1 = heating."
    },
    {
      "address": 9,
      "count": 1,
      "name": "LED indication",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = overwrite, 1 = blue, 2 = cyan, 3 = green, 4 = yellow, 5 = red, 6 = white."
    }
  ],
  "holding_registers": [
    {
      "address": 1,
      "count": 1,
      "name": "Device slave address",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "1...247, factory default 1."
    },
    {
      "address": 2,
      "count": 1,
      "name": "Modbus baud rate",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = 4800, 1 = 9600, 2 = 19200, 3 = 38400, 4 = 57600, 5 = 115200, 6 = 230400 bps. Factory default 2 (19200 bps)."
    },
    {
      "address": 3,
      "count": 1,
      "name": "Modbus parity",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = 8N1, 1 = 8E1, 2 = 8O1. Factory default 1 (8E1)."
    },
    {
      "address": 4,
      "count": 1,
      "name": "Device type",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Read-only device code, 2.117 = ECH-8-DM."
    },
    {
      "address": 5,
      "count": 1,
      "name": "Hardware version",
      "data_type": "Hex",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Read-only, e.g. 0x0100 = hardware version 1.0."
    },
    {
      "address": 6,
      "count": 1,
      "name": "Firmware version",
      "data_type": "Hex",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Read-only; the document prints 0x0100 = FW version 1.1 (the HW register uses the same 0x0100 code for hardware version 1.0)."
    },
    {
      "address": 8,
      "count": 1,
      "name": "Modbus safety timeout",
      "data_type": "UInt16",
      "units": "min",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0...60 minutes, 0 = no timeout. After the timeout the analogue output falls back to 'Analogue output position 1'. Factory default 0."
    },
    {
      "address": 9,
      "count": 1,
      "name": "Modbus termination resistor",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = disconnected, 1 = connected. Factory default 0."
    },
    {
      "address": 10,
      "count": 1,
      "name": "Reset Modbus holding registers",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Write 1 to reset the holding registers to their default values; the register resets itself to 0 when finished. Factory default 0."
    },
    {
      "address": 11,
      "count": 1,
      "name": "Proportional control range",
      "data_type": "UInt16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "RW",
      "description": "Raw 1...100 = 0.1...10.0 °C. Factory default 20 (2.0 °C)."
    },
    {
      "address": 12,
      "count": 1,
      "name": "Analogue output, position 1",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "RW",
      "description": "Raw 0...1000 = 0.0...100.0 % output. Factory default 250 (25.0 %)."
    },
    {
      "address": 13,
      "count": 1,
      "name": "Analogue output, position 2",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "RW",
      "description": "Factory default 400 (40.0 %)."
    },
    {
      "address": 14,
      "count": 1,
      "name": "Analogue output, position 3",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "RW",
      "description": "Factory default 600 (60.0 %)."
    },
    {
      "address": 15,
      "count": 1,
      "name": "Analogue output, position 4",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "RW",
      "description": "Factory default 800 (80.0 %)."
    },
    {
      "address": 16,
      "count": 1,
      "name": "Analogue output, position 5",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "RW",
      "description": "Factory default 1000 (100.0 %)."
    },
    {
      "address": 17,
      "count": 1,
      "name": "Minimum temperature, LED indication",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "RW",
      "description": "Lower limit for the green indication, raw -100...500 = -10.0...50.0 °C. Factory default 50 (5.0 °C)."
    },
    {
      "address": 18,
      "count": 1,
      "name": "Maximum temperature, LED indication",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "RW",
      "description": "Upper limit for the green indication. Factory default 350 (35.0 °C)."
    },
    {
      "address": 19,
      "count": 1,
      "name": "LED brightness",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = off, 10 = 100 % brightness. Factory default 5."
    },
    {
      "address": 20,
      "count": 1,
      "name": "Remote mode",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = off, 1 = on (all manual control disabled, the next four registers are allowed). Factory default 0."
    },
    {
      "address": 21,
      "count": 1,
      "name": "Relay output control",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Unregulated relay output, allowed in remote mode only: 0 = off / 0 VAC, 1 = on. Factory default 0."
    },
    {
      "address": 22,
      "count": 1,
      "name": "Analogue output range",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Allowed in remote mode only: 0 = 0...6 VDC, 1 = 0...10 VDC. Factory default 0."
    },
    {
      "address": 23,
      "count": 1,
      "name": "Analogue output overwrite value",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "RW",
      "description": "Allowed in remote mode only, raw 0...1000 = 0.0...100.0 %. Factory default 0."
    },
    {
      "address": 24,
      "count": 1,
      "name": "LED overwrite",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Allowed in remote mode only: 0 = LED off, 1 = blue, 2 = cyan, 3 = green, 4 = yellow, 5 = red, 6 = white. Factory default 0."
    }
  ],
  "combined_registers": [],
  "notes": "Source: Sentera 'ECH-8-DM Controller for water heaters / coolers with EC fan - Modbus register map', MBRM-ECH-8-DM-EN-000 dated 07/06/2024, vendor-hosted PDF at https://www.sentera.eu/en/files/article/document/mbrm/ech-8-dm-modbus-register-map-1266049.pdf (SHA-256 e43e24cc4dd34957b376e103f54c99c1a636fa032e476a61cbf82037e666979a), linked from the 'Modbus register map' entry on the product page at the URL above (opened 7 Nov 2026): page 2 input registers, pages 3-4 holding registers. That page now also serves a newer, unversioned edition (no document code, no date) whose holding map runs to register 34, prints FW 0x0130 = 1.3 and calls the 'Remote mode' of input register 1 and holding register 20 'Overwrite mode'; this seed transcribes only the dated edition it cites. Factory settings from the holding-register table's 'Factory default values' column: slave address 1, baud rate 2 (19200 bps out of 0 = 4800, 1 = 9600, 2 = 19200, 3 = 38400, 4 = 57600, 5 = 115200, 6 = 230400), parity 1 (8E1 out of 0 = 8N1, 1 = 8E1, 2 = 8O1). Addressing: the map numbers its input registers 1...9 and holding registers 1...24 with no wire address or frame example, which is the supplier's 1-based register numbering (Modbus register 1 = address 0x0000), so the seed declares one_based and stores the numbers exactly as printed. Scaling is taken from the document's own raw/engineering pairs: temperature and the proportional range in 0.1 °C steps, analogue output positions and the overwrite value in 0.1 % steps (0...1000 = 0.0...100.0 %). The register numbered 7 in the holding block is documented only as 'Reserved, returns 0' and is left out, which is why the holding block skips from 6 to 8. The device is a general-purpose EC-fan / heater-cooler controller for greenhouse, shed and stable ventilation, and its input registers expose the fan output, setpoint and actual temperature."
}
