{
  "spec_version": 1,
  "slug": "daikin-altherma-homehub",
  "manufacturer": "Daikin",
  "model": "Altherma 3 via Daikin HomeHub (EKRHH)",
  "category": "Heat pump",
  "supplier_url": "https://www.daikin.eu/en_us/products/ekrhh.html",
  "default_configuration": {
    "protocol": "modbus_tcp",
    "port": 502,
    "unit_id": 1,
    "addressing": "one_based",
    "byte_order": "BigEndian",
    "word_order": "HighFirst"
  },
  "coils": [],
  "discrete_inputs": [],
  "input_registers": [
    {
      "address": 21,
      "count": 1,
      "name": "Unit error",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = no error, 1 = error, 2 = warning."
    },
    {
      "address": 22,
      "count": 1,
      "name": "Unit error code",
      "data_type": "Ascii",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Two ASCII characters in one register (high byte first), e.g. \"U8\"."
    },
    {
      "address": 23,
      "count": 1,
      "name": "Unit error subcode",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "32766 when there is no error, 0-99 together with an error."
    },
    {
      "address": 30,
      "count": 1,
      "name": "Circulation pump running",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = off, 1 = on."
    },
    {
      "address": 31,
      "count": 1,
      "name": "Compressor running",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = off, 1 = on."
    },
    {
      "address": 32,
      "count": 1,
      "name": "Backup heater running",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = off, 1 = on."
    },
    {
      "address": 33,
      "count": 1,
      "name": "Disinfection operation",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = off, 1 = on."
    },
    {
      "address": 35,
      "count": 1,
      "name": "Defrost / startup",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = off, 1 = on."
    },
    {
      "address": 36,
      "count": 1,
      "name": "Hot start",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = off, 1 = on."
    },
    {
      "address": 37,
      "count": 1,
      "name": "3-way valve",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = space heating, 1 = domestic hot water."
    },
    {
      "address": 38,
      "count": 1,
      "name": "Operation mode",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "1 = heating, 2 = cooling."
    },
    {
      "address": 40,
      "count": 1,
      "name": "Leaving water temperature, plate heat exchanger",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "Flow temperature at the plate heat exchanger (Temp16 format: raw value / 100)."
    },
    {
      "address": 41,
      "count": 1,
      "name": "Leaving water temperature, backup heater",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 42,
      "count": 1,
      "name": "Return water temperature",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 43,
      "count": 1,
      "name": "Domestic hot water temperature",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 44,
      "count": 1,
      "name": "Outdoor air temperature",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 45,
      "count": 1,
      "name": "Liquid refrigerant temperature",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 49,
      "count": 1,
      "name": "Flow rate",
      "data_type": "Int16",
      "units": "l/min",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "Water flow rate, raw value divided by 100."
    },
    {
      "address": 50,
      "count": 1,
      "name": "Remote controller room temperature",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 51,
      "count": 1,
      "name": "Heat pump power consumption",
      "data_type": "Int16",
      "units": "kW",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "Pow16 format: raw value / 100 gives kW."
    },
    {
      "address": 52,
      "count": 1,
      "name": "DHW normal operation",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = idle/buffering, 1 = in operation."
    },
    {
      "address": 53,
      "count": 1,
      "name": "Space heating/cooling normal operation",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = idle/buffering, 1 = in operation."
    },
    {
      "address": 54,
      "count": 1,
      "name": "Main LWT heating setpoint, lower limit",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 55,
      "count": 1,
      "name": "Main LWT heating setpoint, upper limit",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 56,
      "count": 1,
      "name": "Main LWT cooling setpoint, lower limit",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 57,
      "count": 1,
      "name": "Main LWT cooling setpoint, upper limit",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 58,
      "count": 1,
      "name": "Additional LWT heating setpoint, lower limit",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 59,
      "count": 1,
      "name": "Additional LWT heating setpoint, upper limit",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 60,
      "count": 1,
      "name": "Additional LWT cooling setpoint, lower limit",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 61,
      "count": 1,
      "name": "Additional LWT cooling setpoint, upper limit",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    }
  ],
  "holding_registers": [
    {
      "address": 1,
      "count": 1,
      "name": "Main heating leaving water setpoint",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW"
    },
    {
      "address": 2,
      "count": 1,
      "name": "Main cooling leaving water setpoint",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW"
    },
    {
      "address": 3,
      "count": 1,
      "name": "Operation mode",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = automatic, 1 = heating, 2 = cooling. Heating-only units return 32766."
    },
    {
      "address": 4,
      "count": 1,
      "name": "Space heating / cooling on-off",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = off, 1 = on."
    },
    {
      "address": 6,
      "count": 1,
      "name": "Room thermostat heating setpoint",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Room setpoint used in room thermostat control, 12-30 °C."
    },
    {
      "address": 7,
      "count": 1,
      "name": "Room thermostat cooling setpoint",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "15-35 °C."
    },
    {
      "address": 9,
      "count": 1,
      "name": "Quiet mode",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = off, 1 = on."
    },
    {
      "address": 10,
      "count": 1,
      "name": "DHW setpoint",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Domestic hot water setpoint, 30-60 °C. Only served while a tank is configured, the heat pump is in reheat-only mode and the setpoint mode is constant."
    },
    {
      "address": 12,
      "count": 1,
      "name": "DHW reheat on-off",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = off, 1 = on."
    },
    {
      "address": 13,
      "count": 1,
      "name": "DHW booster heater on-off",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = off, 1 = on."
    },
    {
      "address": 53,
      "count": 1,
      "name": "Weather dependent mode, main",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = fixed, 1 = weather dependent, 2 = fixed + scheduled, 3 = weather dependent + scheduled."
    },
    {
      "address": 54,
      "count": 1,
      "name": "Weather dependent main LWT heating setpoint offset",
      "data_type": "Int16",
      "units": "K",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "-10 to 10 K."
    },
    {
      "address": 55,
      "count": 1,
      "name": "Weather dependent main LWT cooling setpoint offset",
      "data_type": "Int16",
      "units": "K",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "-10 to 10 K."
    },
    {
      "address": 56,
      "count": 1,
      "name": "Smart grid operation mode",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = free, 1 = forced off, 2 = recommended on, 3 = forced on."
    },
    {
      "address": 57,
      "count": 1,
      "name": "Power limit during recommended on / buffering",
      "data_type": "Int16",
      "units": "kW",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "RW",
      "description": "Pow16 format: raw value / 100 = kW, 0-20 kW."
    },
    {
      "address": 58,
      "count": 1,
      "name": "General power limit",
      "data_type": "Int16",
      "units": "kW",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "RW",
      "description": "Pow16 format: raw value / 100 = kW, 0-20 kW."
    },
    {
      "address": 59,
      "count": 1,
      "name": "Thermostat main input A",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = off, 1 = on. Only valid with an external room thermostat configured as SW contact ([C-05] = 0)."
    },
    {
      "address": 61,
      "count": 1,
      "name": "Thermostat additional input A",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = off, 1 = on."
    },
    {
      "address": 63,
      "count": 1,
      "name": "Additional heating leaving water setpoint",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW"
    },
    {
      "address": 64,
      "count": 1,
      "name": "Additional cooling leaving water setpoint",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW"
    },
    {
      "address": 65,
      "count": 1,
      "name": "Weather dependent mode, additional",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = fixed, 1 = weather dependent, 2 = fixed + scheduled, 3 = weather dependent + scheduled."
    },
    {
      "address": 66,
      "count": 1,
      "name": "Weather dependent additional LWT heating setpoint offset",
      "data_type": "Int16",
      "units": "K",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "-10 to 10 K."
    },
    {
      "address": 67,
      "count": 1,
      "name": "Weather dependent additional LWT cooling setpoint offset",
      "data_type": "Int16",
      "units": "K",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "-10 to 10 K."
    }
  ],
  "combined_registers": [],
  "notes": "Source: Daikin, \"Daikin HomeHub EKRHH - Reference for installers\", 4P744838-1D (2024.05), section 9 \"Use case 3 - Modbus TCP/IP or RTU for Daikin Altherma\", tables 9.2.1 (holding) and 9.2.2 (input). The HomeHub gives Altherma 3 a Modbus TCP/RTU server on port 502 (RTU: RS-485, 9600 baud, 8 data bits, even parity, 1 stop bit). Register numbering in the Daikin data model is 1-based while PDU addressing is 0-based, hence one_based: register 1 is PDU address 0. Sensor temperatures use Temp16 (raw / 100), power Pow16 (raw / 100 = kW), flow rate raw / 100 in l/min, the error code two ASCII characters in one register; holding setpoints are plain integers in their documented unit. Holding rows 6, 7, 53, 59, 61 and 65 were re-checked against the vendor table (pages 38-39): 6 = room thermostat heating setpoint 12-30 C, 7 = cooling counterpart 15-35 C, 53 = weather dependent mode main, 59/61 = thermostat main/additional input A, 65 = weather dependent mode additional, so the labels stand. The daikin-ha-ekrhh-modbus integration also uses 68/69, 74/75 and 76/77 and marks 6/7 obsolete for its newer firmware / Altherma 4 set; this edition does not list those offsets, so a newer unit may expose the room setpoints at 76/77 instead of 6/7. Offsets without a documented meaning (5, 8, 11, 14-52, 60, 62) are application-dependent and left out. Writing a setpoint outside its range clamps it to the nearest limit (limits in input registers 54-61). Altherma 3 R/3 M indoor units with Micon ID 20002203 do not support 59, 61, 63 and 64."
}
