{
  "spec_version": 1,
  "slug": "paradigma-systasmartc",
  "manufacturer": "Paradigma",
  "model": "SystaSmartC heating controller (Modbus TCP smart-home interface)",
  "category": "Boiler controller",
  "supplier_url": "https://www.paradigma.de/wp-content/uploads/2020/10/TH-2833_V1.0_1018_Heizungsregler_SystaSmartC_Modbus-Schnittstelle-Smarthome.pdf",
  "default_configuration": {
    "protocol": "modbus_tcp",
    "port": 502,
    "unit_id": 1,
    "addressing": "zero_based",
    "byte_order": "BigEndian",
    "word_order": "HighFirst"
  },
  "coils": [
    {
      "address": 0,
      "count": 1,
      "name": "Smart-home system enabled",
      "data_type": "Binary",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Register 1 (0x01@0): the smart-home interface is active. Read only."
    },
    {
      "address": 1,
      "count": 1,
      "name": "Heating circuit 1 present",
      "data_type": "Binary",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Register 2 (0x01@1): heating circuit 1 is configured. Read only."
    },
    {
      "address": 2,
      "count": 1,
      "name": "Heating circuit 2 present",
      "data_type": "Binary",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Register 3 (0x01@2): heating circuit 2 is configured. Read only."
    },
    {
      "address": 4,
      "count": 1,
      "name": "DHW enable",
      "data_type": "Binary",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Register 5 (0x01@4): enable domestic-hot-water heating. Writable only if released in the controller."
    },
    {
      "address": 5,
      "count": 1,
      "name": "DHW disable",
      "data_type": "Binary",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Register 6 (0x01@5): block domestic-hot-water heating. Writable only if released in the controller."
    },
    {
      "address": 6,
      "count": 1,
      "name": "DHW circulation enable",
      "data_type": "Binary",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Register 7 (0x01@6): enable domestic-hot-water circulation. Writable only if released in the controller."
    },
    {
      "address": 7,
      "count": 1,
      "name": "DHW circulation disable",
      "data_type": "Binary",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Register 8 (0x01@7): block domestic-hot-water circulation. Writable only if released in the controller."
    }
  ],
  "discrete_inputs": [],
  "input_registers": [
    {
      "address": 0,
      "count": 1,
      "name": "Outside temperature (TA)",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Register 30001 (0x04@0). Temperature values are transmitted in 0.1 °C."
    },
    {
      "address": 1,
      "count": 1,
      "name": "Flow temperature heating circuit 1 (TV)",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Register 30002 (0x04@1). 0.1 °C."
    },
    {
      "address": 2,
      "count": 1,
      "name": "Return temperature heating circuit 1",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Register 30003 (0x04@2). 0.1 °C."
    },
    {
      "address": 3,
      "count": 1,
      "name": "DHW temperature",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Register 30004 (0x04@3). 0.1 °C."
    },
    {
      "address": 4,
      "count": 1,
      "name": "Buffer temperature top",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Register 30005 (0x04@4). 0.1 °C."
    },
    {
      "address": 5,
      "count": 1,
      "name": "Buffer temperature bottom",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Register 30006 (0x04@5). 0.1 °C."
    },
    {
      "address": 6,
      "count": 1,
      "name": "Circulation return temperature",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Register 30007 (0x04@6). 0.1 °C."
    },
    {
      "address": 7,
      "count": 1,
      "name": "Flow temperature heating circuit 2",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Register 30008 (0x04@7). 0.1 °C."
    },
    {
      "address": 8,
      "count": 1,
      "name": "Return temperature heating circuit 2",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Register 30009 (0x04@8). 0.1 °C."
    },
    {
      "address": 9,
      "count": 1,
      "name": "Room temperature heating circuit 1",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Register 30010 (0x04@9). 0.1 °C."
    },
    {
      "address": 10,
      "count": 1,
      "name": "Room temperature heating circuit 2",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Register 30011 (0x04@10). 0.1 °C."
    },
    {
      "address": 11,
      "count": 1,
      "name": "Collector temperature (solar)",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Register 30012 (0x04@11). 0.1 °C."
    },
    {
      "address": 12,
      "count": 1,
      "name": "Boiler flow temperature",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Register 30013 (0x04@12): boiler flow temperature transferred from the boiler. 0.1 °C."
    },
    {
      "address": 13,
      "count": 1,
      "name": "Boiler return temperature",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Register 30014 (0x04@13): boiler return temperature transferred from the boiler. 0.1 °C."
    },
    {
      "address": 14,
      "count": 1,
      "name": "Wood boiler flow temperature",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Register 30015 (0x04@14): flow temperature of the wood boiler (SystaComfort Wood extension). 0.1 °C."
    },
    {
      "address": 15,
      "count": 1,
      "name": "Wood boiler return temperature",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Register 30016 (0x04@15): return temperature of the wood boiler (SystaComfort Wood extension). 0.1 °C."
    },
    {
      "address": 16,
      "count": 1,
      "name": "Wood boiler buffer temperature top",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Register 30017 (0x04@16): buffer top temperature of the wood boiler (SystaComfort Wood extension). 0.1 °C."
    },
    {
      "address": 19,
      "count": 1,
      "name": "Pool temperature",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Register 30020 (0x04@19): pool temperature (SystaComfort Pool extension). 0.1 °C."
    },
    {
      "address": 20,
      "count": 1,
      "name": "Pool heating circuit flow temperature",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Register 30021 (0x04@20): flow temperature of the pool heating circuit (SystaComfort Pool extension). 0.1 °C."
    },
    {
      "address": 21,
      "count": 1,
      "name": "Pool heating circuit return temperature",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Register 30022 (0x04@21): return temperature of the pool heating circuit (SystaComfort Pool extension). 0.1 °C."
    }
  ],
  "holding_registers": [
    {
      "address": 0,
      "count": 1,
      "name": "Smart-home system type",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Register 40001 (0x03@0): identification of the smart-home system. 0 = unknown, 1 = WiButler."
    },
    {
      "address": 1,
      "count": 1,
      "name": "Error code from smart-home system",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Register 40002 (0x03@1): fault message transmitted by the smart-home system."
    },
    {
      "address": 2,
      "count": 1,
      "name": "Flow set-point heating circuit 1",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "RW",
      "description": "Register 40003 (0x03@2): flow-temperature set-point for heating circuit 1 transmitted by the smart-home system. 0.1 °C."
    },
    {
      "address": 3,
      "count": 1,
      "name": "Flow set-point heating circuit 2",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "RW",
      "description": "Register 40004 (0x03@3): flow-temperature set-point for heating circuit 2. 0.1 °C."
    },
    {
      "address": 8,
      "count": 1,
      "name": "DHW set-point",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "RW",
      "description": "Register 40009 (0x03@8): domestic-hot-water set-point. 0.1 °C."
    },
    {
      "address": 9,
      "count": 1,
      "name": "Maximum flow temperature heating circuit 1",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Register 40010 (0x03@9): maximum flow temperature configured on the heating controller. 0.1 °C."
    },
    {
      "address": 10,
      "count": 1,
      "name": "Maximum flow temperature heating circuit 2",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Register 40011 (0x03@10): maximum flow temperature configured on the heating controller. 0.1 °C."
    },
    {
      "address": 12,
      "count": 1,
      "name": "Heating controller error code",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Register 40013 (0x03@12): error code reported by the heating controller. 0 = no fault."
    },
    {
      "address": 13,
      "count": 1,
      "name": "Solar controller error code",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Register 40014 (0x03@13): error code reported by the solar controller."
    },
    {
      "address": 14,
      "count": 1,
      "name": "Modula II boiler error code",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Register 40015 (0x03@14): error code reported by the Modula II boiler. 0xFFFF = no fault."
    },
    {
      "address": 15,
      "count": 1,
      "name": "Modula NT / Modula III boiler error code",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Register 40016 (0x03@15): error code reported by the Modula NT / Modula III boiler. 0xFFFF = no fault."
    },
    {
      "address": 16,
      "count": 1,
      "name": "PMI boiler error code",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Register 40017 (0x03@16): error code reported by the PMI boiler. 0xFFFF = no fault."
    },
    {
      "address": 17,
      "count": 1,
      "name": "PELLETTI III pellet boiler error code",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Register 40018 (0x03@17): error code reported by the PELLETTI III pellet boiler. 0xFFFF = no fault."
    }
  ],
  "combined_registers": [],
  "notes": "Source: Paradigma \"Heizungsregler SystaSmartC - Modbus-Schnittstelle Smarthome\", TH-2833, version 1.0, 10/2018 (German), appendix B \"Register\" (https://www.paradigma.de/wp-content/uploads/2020/10/TH-2833_V1.0_1018_Heizungsregler_SystaSmartC_Modbus-Schnittstelle-Smarthome.pdf). Modbus TCP, factory port 502 and unit ID 1 are stated in section 1. Addressing: the document's register tables print both the \"register\" (e.g. 30001, 40001) and the access path with the offset actually used in the frame (0x04@0, 0x03@0, 0x01@0); the seed stores those offsets, hence zero-based. The name-to-address pairing was re-read from the PDF's word coordinates (each table row's register, offset, designation, function and read/write cells share one baseline), which confirms every row carried here: the coil offsets 0x01@0,1,2,4,5,6,7 (register numbers 1,2,3,5,6,7,8), the input offsets 0x04@0-@16, @19-@21 and the holding offsets 0x03@0,1,2,3,8,9,10,12-17 with the document's own Lesen/Schreiben flags (writable: 0x03@0-3 and @8 only). Temperatures are transmitted in 0.1 °C. The bit registers (coils) are the smart-home control bits; writes only take effect where the controller has released the function. The extension blocks (SystaComfort Wood and SystaComfort Pool) are included where the document prints an address; registers 30018, 30019 and 30023 are absent from the source table and are not invented. Left out on purpose: the 0x04 input rows of heating circuits 3-8 (0x04@14 onward share the same layout), buffer 2-4, the PV/consumption rows 2500-2508 and the boiler rows 2400-2411, and the holding rows 0x03@18-@45 (status words, energy and runtime counters, 0x03@44/45 set-points) - the multi-register counters among those (0x03@21, @23, @25, @27, @29, @31) run over two registers and the document states no word order, so they are not claimed rather than guessed."
}
