{
  "spec_version": 1,
  "slug": "solarfocus-ecomanager-touch",
  "manufacturer": "SOLARFOCUS",
  "model": "ecomanager-touch heating controller (therminator II touch, pelletelegance, octoplus, pellettop touch, vampair)",
  "category": "Boiler controller",
  "supplier_url": "https://www.solarfocus.com/produkte/Waermepumpe/EcoManager-t_Modbus-TCP-Registerdaten_Anleitung.pdf",
  "default_configuration": {
    "protocol": "modbus_tcp",
    "port": 502,
    "unit_id": 1,
    "addressing": "zero_based",
    "byte_order": "BigEndian",
    "word_order": "HighFirst"
  },
  "coils": [],
  "discrete_inputs": [],
  "input_registers": [
    {
      "address": 1100,
      "count": 1,
      "name": "Flow temperature heating circuit 1",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Flow temperature as a three-digit value, scale 1/10 (490 = 49.0 °C)."
    },
    {
      "address": 1101,
      "count": 1,
      "name": "Room temperature heating circuit 1",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Room temperature, scale 1/10. Valid only when a Solarfocus room sensor is used; otherwise read the external room temperature from holding register 32606."
    },
    {
      "address": 1102,
      "count": 1,
      "name": "Room humidity heating circuit 1",
      "data_type": "Int16",
      "units": "%",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Room humidity in %. Valid only with the room control unit that has a humidity sensor; otherwise use holding register 32607."
    },
    {
      "address": 1103,
      "count": 1,
      "name": "Limit thermostat heating circuit 1",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = open, 1 = closed (ok)."
    },
    {
      "address": 1105,
      "count": 1,
      "name": "Heating circuit pump 1",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = off, 1 = on."
    },
    {
      "address": 1106,
      "count": 1,
      "name": "Mixer position heating circuit 1",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Mixer position 0-100 %."
    },
    {
      "address": 1107,
      "count": 1,
      "name": "Heating circuit 1 status",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Enumeration: 0 off, 1 setback, 2 heating, 3 holiday, 4 screed program, 5 frost protection, 6 chimney sweep, 7 circuit not released, 8 heat dissipation, 9 outdoor cut-off reached, 10 room set-point reached, 11 DHW priority, 12 continuous heating, 13 continuous setback, 14 outdoor sensor fault, 15 minimum source temperature undercut, 16 flow sensor fault, 17 minimum source temperature undercut with frost protection, 18 pump test run, 19 party mode, 20 limit thermostat open, 21 pump overrun, 22 defrost, 23 cooling, 24 cooling priority, 25 heating priority, 26 pool priority, 27 outdoor cut-off setback reached, 28 room set-point setback reached. therminator models add 200 to these values."
    },
    {
      "address": 1150,
      "count": 1,
      "name": "Flow temperature heating circuit 2",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Scale 1/10; same semantics as heating circuit 1 (1100)."
    },
    {
      "address": 1151,
      "count": 1,
      "name": "Room temperature heating circuit 2",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Scale 1/10; see 1101."
    },
    {
      "address": 1152,
      "count": 1,
      "name": "Room humidity heating circuit 2",
      "data_type": "Int16",
      "units": "%",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "See 1102."
    },
    {
      "address": 1153,
      "count": 1,
      "name": "Limit thermostat heating circuit 2",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = open, 1 = closed (ok)."
    },
    {
      "address": 1155,
      "count": 1,
      "name": "Heating circuit pump 2",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = off, 1 = on."
    },
    {
      "address": 1156,
      "count": 1,
      "name": "Mixer position heating circuit 2",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Mixer position 0-100 %."
    },
    {
      "address": 1157,
      "count": 1,
      "name": "Heating circuit 2 status",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "See 1107."
    },
    {
      "address": 1900,
      "count": 1,
      "name": "Buffer 1 temperature top",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Scale 1/10 (560 = 56.0 °C)."
    },
    {
      "address": 1901,
      "count": 1,
      "name": "Buffer 1 temperature bottom",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Scale 1/10."
    },
    {
      "address": 1902,
      "count": 1,
      "name": "Buffer 1 temperature X35",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Scale 1/10. therminator only; -999 = X35 not connected or not assigned to this buffer."
    },
    {
      "address": 1903,
      "count": 1,
      "name": "Buffer 1 charge pump",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = not charging, 1 = charging."
    },
    {
      "address": 1904,
      "count": 1,
      "name": "Buffer 1 status",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Enumeration: 0 not present, 1 standby, 2 charging, 3 frost protection, 4 chimney sweep, 5 heat dissipation, 6 pump test run, 7 DHW tank charging. therminator models add 200."
    },
    {
      "address": 1905,
      "count": 1,
      "name": "Buffer 1 release type",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = always off, 1 = always on, 2 = time schedule."
    },
    {
      "address": 2100,
      "count": 1,
      "name": "Collector temperature 1",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Solar collector temperature, scale 1/10 (550 = 55.0 °C)."
    },
    {
      "address": 2101,
      "count": 1,
      "name": "Collector temperature 2",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Second collector temperature, scale 1/10."
    },
    {
      "address": 2102,
      "count": 1,
      "name": "Collector flow temperature",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Scale 1/10."
    },
    {
      "address": 2103,
      "count": 1,
      "name": "Collector return temperature",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Scale 1/10."
    },
    {
      "address": 2104,
      "count": 1,
      "name": "Flow rate heat meter",
      "data_type": "Int16",
      "units": "l",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Current flow rate of the heat meter in litres."
    },
    {
      "address": 2105,
      "count": 1,
      "name": "Current solar power",
      "data_type": "Int16",
      "units": "kW",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Scale 1/10 (230 = 23.0 kW)."
    },
    {
      "address": 2110,
      "count": 1,
      "name": "Solar storage sensor 1",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Scale 1/10."
    },
    {
      "address": 2111,
      "count": 1,
      "name": "Solar storage sensor 2",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Scale 1/10."
    },
    {
      "address": 2112,
      "count": 1,
      "name": "Solar storage sensor 3",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Scale 1/10."
    },
    {
      "address": 2113,
      "count": 1,
      "name": "Solar status line",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Enumeration: 0 solar circuit operating, 1 collector sensor short circuit, 2 solar circuit off, 3 storage sensor short circuit, 4 storage sensor interruption, 5 check circulation, 6 collector overtemperature, 7 waiting time, 8 measuring flush impulse. therminator models add 200."
    },
    {
      "address": 500,
      "count": 1,
      "name": "Boiler 1 temperature",
      "data_type": "UInt16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Boiler 1 temperature, raw value in 0.1 °C (the document's remark: value 600 = 60 °C). The document types this row unsigned (uint); the boiler 2 temperature row is typed int."
    },
    {
      "address": 501,
      "count": 1,
      "name": "Boiler 1 status",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Enumeration: 0 not present, 1 standby, 2 charging, 3 frost protection, 4 chimney sweep, 5 legionella protection, 6 demand, 7 source too hot, 8 blocking protection, 9 one-time release active, 10 sensor short circuit, 11 sensor interruption, 12 holiday mode, 13 defrost. therminator models use the DHW-tank enumeration with +200."
    },
    {
      "address": 502,
      "count": 1,
      "name": "Boiler 1 release type (actual)",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = always off, 1 = always on, 2 = Monday-Sunday, 3 = block (Mon-Fri, Sat-Sun), 4 = day by day."
    },
    {
      "address": 550,
      "count": 1,
      "name": "Boiler 2 temperature",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Scale 1/10."
    },
    {
      "address": 551,
      "count": 1,
      "name": "Boiler 2 status",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "See 501."
    },
    {
      "address": 552,
      "count": 1,
      "name": "Boiler 2 release type (actual)",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "See 502."
    },
    {
      "address": 2300,
      "count": 1,
      "name": "Heat pump flow temperature",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Scale 1/10."
    },
    {
      "address": 2301,
      "count": 1,
      "name": "Heat pump return temperature",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Scale 1/10."
    },
    {
      "address": 2302,
      "count": 1,
      "name": "Heat pump flow rate",
      "data_type": "Int16",
      "units": "l/h",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Flow rate in l/h (up to four digits)."
    },
    {
      "address": 2303,
      "count": 1,
      "name": "Compressor speed",
      "data_type": "Int16",
      "units": "rpm",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0-7000 rpm."
    },
    {
      "address": 2304,
      "count": 1,
      "name": "EVU lock active",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = EVU lock not active (normal operation), 1 = EVU lock active."
    },
    {
      "address": 2306,
      "count": 1,
      "name": "Defrost active",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = no defrost, 1 = defrost active."
    },
    {
      "address": 2307,
      "count": 1,
      "name": "Boiler charging active",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = no boiler charging, 1 = boiler charging active."
    },
    {
      "address": 2322,
      "count": 1,
      "name": "Current electrical power consumption",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Current electrical power of the heat pump in W."
    },
    {
      "address": 2323,
      "count": 1,
      "name": "Current thermal power, cooling",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Current thermal power in cooling mode, in W."
    },
    {
      "address": 2324,
      "count": 1,
      "name": "Current thermal power, heating",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Current thermal power in heating mode, in W."
    }
  ],
  "holding_registers": [
    {
      "address": 32600,
      "count": 1,
      "name": "Flow set-point heating circuit 1 (heating / cooling)",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "RW",
      "description": "Set-point must be written multiplied by 10 (45 °C = 450). Heating range 22 °C to the configured maximum; cooling range 7-35 °C. One register serves both modes."
    },
    {
      "address": 32602,
      "count": 1,
      "name": "Cooling on/off heating circuit 1",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = circuit heats when the flow set-point is above 0, 1 = circuit cools when the flow set-point is above 0."
    },
    {
      "address": 32603,
      "count": 1,
      "name": "Operating mode heating circuit 1",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = continuous, 1 = setback, 2 = automatic (time schedule), 3 = circuit off (frost protection only)."
    },
    {
      "address": 32605,
      "count": 1,
      "name": "Room set-point heating circuit 1",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "RW",
      "description": "5-45 °C, written multiplied by 10 (23 °C = 230). Room influence must be enabled on the display; writing 0 makes the controller ignore the room set-point."
    },
    {
      "address": 32606,
      "count": 1,
      "name": "External actual room temperature heating circuit 1",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "RW",
      "description": "5-45 °C, written multiplied by 10. Used to feed an external room sensor value to the controller, or to read the value it uses."
    },
    {
      "address": 32607,
      "count": 1,
      "name": "External room humidity heating circuit 1",
      "data_type": "Int16",
      "units": "%",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "1-100 %. Writing 0 makes the controller ignore the value."
    },
    {
      "address": 32650,
      "count": 1,
      "name": "Flow set-point heating circuit 2 (heating / cooling)",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "RW",
      "description": "See 32600."
    },
    {
      "address": 32652,
      "count": 1,
      "name": "Cooling on/off heating circuit 2",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "See 32602."
    },
    {
      "address": 32653,
      "count": 1,
      "name": "Operating mode heating circuit 2",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "See 32603."
    },
    {
      "address": 32655,
      "count": 1,
      "name": "Room set-point heating circuit 2",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "RW",
      "description": "See 32605."
    },
    {
      "address": 32656,
      "count": 1,
      "name": "External actual room temperature heating circuit 2",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "RW",
      "description": "See 32606."
    },
    {
      "address": 32657,
      "count": 1,
      "name": "External room humidity heating circuit 2",
      "data_type": "Int16",
      "units": "%",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "See 32607."
    }
  ],
  "combined_registers": [],
  "notes": "Source: SOLARFOCUS \"Regelung ecomanager-touch: Modbus TCP - Registerdaten\", DR-0180-DE / v6-202008 (German), sections 3, 5 and 6 (https://www.solarfocus.com/produkte/Waermepumpe/EcoManager-t_Modbus-TCP-Registerdaten_Anleitung.pdf). Modbus TCP on port 502 with unit ID 1 is stated in section 3; the interface must be enabled once on the controller (section 4). Required controller software: therminator II touch from V19.072, pelletelegance / octoplus / pellettop touch, ecomanager-touch and vampair from V19.050. The document gives the register addresses directly and the seed stores them unchanged (zero-based). Temperatures and some analogue values are scaled 1/10 and the row descriptions say so. Omitted on purpose: every value the document marks \"2 x 16-bit Register\" (heat-meter yield 2106/2108, energy counters 2310-2320, PV power 2500-2508) because the document does not state the word order of those 32-bit values; heating circuits 3-8 (base 1200, 1250, 1300, 1350, 1400, 1450 with the same 7-register pattern), buffers 2-4 (1920/1940/1960) and boilers 3-4 (600/650) are not repeated. The DHW-tank block is not part of this document."
}
