Daikin Altherma 3 Heat Pump and Home Assistant

March 2nd, 2024
YouTube video

IMPORTANT! Once again an article is immediately out of date as soon as it’s published! Daikin have very recently changed their API and from 11th March 2024 the cloud integration shown in this video will no longer work. There is an alternative out there (Daikin Onecta: https://github.com/jwillemsen/daikin_onecta) which does work, I’ve tested it, but for the moment it’s using generic temporary access keys. Daikin are working to fix this and hopefully later in March there will be a permanent solution. As soon as that solution is finalised I will of course bring you a new guide.

This article is to accompany the video that’s embedded above (or here: https://youtu.be/sMcVDphvlzQ). In that video I give you a quick demo of connecting your Daikin Altherma 3 heat pump to Home Assistant using their cloud connectivity option. This is great, and gives you lots of data and a useful climate entity to control your heating system, but if you want proper live data then connecting locally is the way forward.

I used ESPAltherma, an open source project located here:
https://github.com/raomin/ESPAltherma

Using an ESP32 NodeMCU Dev Board from AZ Delivery (available from Amazon here: https://amzn.to/48Ru0Vx)

I placed the dev board in a custom-made case from an eBay seller named hobbystuffltd (https://ebay.us/dIPGBd)* eBay Partner Network Affiliate Link

If you’d like to say thank you, please consider donating to help support the site and YouTube channel. All donations are really appreciated, but of course totally optional!

Buy Me A Coffee

Within Visual Studio Code, I uncommented the following sensor values before compiling and uploading the project to the dev board:

{0x10,0,217,1,-1,"Operation Mode"},
{0x10,1,304,1,-1,"Defrost Operation"},
{0x20,0,105,2,1,"Outdoor air temp.(R1T)"},
{0x21,0,105,2,-1,"INV primary current (A)"},
{0x21,2,105,2,-1,"INV secondary current (A)"},
{0x21,4,101,2,-1,"Voltage (N-phase) (V)"},
{0x30,0,152,1,-1,"INV frequency (rps)"},
{0x30,1,152,1,-1,"INV frequency 2 (rps)"},
{0x30,0,211,1,-1,"Fan 1 (10 rpm)"},
{0x60,2,303,1,-1,"Thermostat ON/OFF"},
{0x60,2,302,1,-1,"Freeze Protection"},
{0x60,7,105,2,1,"DHW setpoint"},
{0x60,9,105,2,1,"LW setpoint (main)"},
{0x60,12,306,1,-1,"3way valve(On:DHW_Off:Space)"},
{0x61,2,105,2,1,"Leaving water temp. before BUH (R1T)"},
{0x61,4,105,2,1,"Leaving water temp. after BUH (R2T)"},
{0x61,8,105,2,1,"Inlet water temp.(R4T)"},
{0x61,10,105,2,1,"DHW tank temp. (R5T)"},
{0x61,12,105,2,1,"Indoor ambient temp. (R1T)"},
{0x61,14,105,2,1,"Ext. indoor ambient sensor (R6T)"},
{0x62,2,304,1,-1,"Powerful DHW Operation. ON/OFF"},
{0x62,2,303,1,-1,"Space heating Operation ON/OFF"},
{0x62,8,302,1,-1,"Circulation pump operation"},
{0x62,9,105,2,-1,"Flow sensor (l/min)"},
{0x62,11,105,1,2,"Water pressure"},
{0x63,14,161,1,-1,"Current measured by CT sensor of L1"},
{0x63,15,161,1,-1,"Current measured by CT sensor of L2"},
{0x63,16,161,1,-1,"Current measured by CT sensor of L3"},

Once plugged in to the heat pump and online sending data back to Home Assistant, you must create template sensors to separate the values out and make them usable. I created the following template sensors. Please note that for the live ‘COP’ entity, the sensor named sensor.ashp_power is the power reading in watts supplied by the Shelly Pro EM energy monitor:

template:
  - sensor:
    # ===============================================================
    # Daikin Altherma ASHP Sensors from ESPAltherma
    - name: ESPAltherma - Operation Mode
        unique_id: espaltherma_operationmode
        state: "{{ state_attr('sensor.althermasensors','Operation Mode') }}"

    - name: ESPAltherma - Freeze Protection
        unique_id: espaltherma_freezeprotection
        state: "{{ state_attr('sensor.althermasensors','Freeze Protection') }}"
        
    - name: ESPAltherma - Outdoor Air Temperature
        unique_id: espaltherma_outdoorairtemp
        state: "{{ state_attr('sensor.althermasensors','Outdoor air temp.(R1T)') }}"
        state_class: measurement
        device_class: temperature
        unit_of_measurement: "°C"
        
    - name: ESPAltherma - Indoor Air Temperature
        unique_id: espaltherma_indoorairtemp
        state: "{{ state_attr('sensor.althermasensors','Indoor ambient temp. (R1T)') }}"
        state_class: measurement
        device_class: temperature
        unit_of_measurement: "°C"
        
    - name: ESPAltherma - Ext. indoor ambient sensor (R6T)
        unique_id: espaltherma_extindoorambientsensor
        state: "{{ state_attr('sensor.althermasensors','Ext. indoor ambient sensor (R6T)') }}"
        state_class: measurement
        device_class: temperature
        unit_of_measurement: "°C"
        
    - name: ESPAltherma - LW setpoint (main)
        unique_id: espaltherma_lwsetpointmain
        state: "{{ state_attr('sensor.althermasensors','LW setpoint (main)') }}"
        state_class: measurement
        device_class: temperature
        unit_of_measurement: "°C"
        
    - name: ESPAltherma - Hot Water Tank Temperature
        unique_id: espaltherma_hotwatertemp
        state: "{{ state_attr('sensor.althermasensors','DHW tank temp. (R5T)') }}"
        state_class: measurement
        device_class: temperature
        unit_of_measurement: "°C"
        
    - name: ESPAltherma - Leaving Water Temperature Before BUH
        unique_id: espaltherma_leavingwatertempbeforebuh
        state: "{{ state_attr('sensor.althermasensors','Leaving water temp. before BUH (R1T)') }}"
        state_class: measurement
        device_class: temperature
        unit_of_measurement: "°C"    
        
    - name: ESPAltherma - Inlet Water Temperature
        unique_id: espaltherma_inletwatertemp
        state: "{{ state_attr('sensor.althermasensors','Inlet water temp.(R4T)') }}"
        state_class: measurement
        device_class: temperature
        unit_of_measurement: "°C"  
        
    - name: ESPAltherma - Water Pressure
        unique_id: espaltherma_waterpressure
        state: "{{ state_attr('sensor.althermasensors','Water pressure') }}"
        state_class: measurement
        device_class: pressure
        unit_of_measurement: "bar"    
        
    - name: ESPAltherma - Flow Sensor
        unique_id: espaltherma_flowsensor
        state: "{{ state_attr('sensor.althermasensors','Flow sensor (l/min)') }}"
        state_class: measurement
        unit_of_measurement: "l/min" 
        
    - name: ESPAltherma - Fan Speed
        unique_id: espaltherma_fanspeed
        state: "{{ state_attr('sensor.althermasensors','Fan 1 (10 rpm)')|int * 10 }}"
        state_class: measurement
        unit_of_measurement: "rpm" 
        
    - name: ESPAltherma - Heat Power Out
        unique_id: espaltherma_heatpowerout
        state: "{{ (((state_attr('sensor.althermasensors','Flow sensor (l/min)')| float / 60) * 4.1816 * (state_attr('sensor.althermasensors','Leaving water temp. before BUH (R1T)') | float - state_attr('sensor.althermasensors','Inlet water temp.(R4T)')|float) )) |round(2) }}"
        state_class: measurement
        device_class: power
        unit_of_measurement: "kW"    
        
    - name: ESPAltherma - COP
        unique_id: espaltherma_cop
        unit_of_measurement: 'COP'
        state_class: measurement
        state: >
        {% if is_state_attr('sensor.althermasensors','Operation Mode', 'Heating') and is_state_attr('sensor.althermasensors','Freeze Protection', 'OFF')  %}
            {{ ( states('sensor.espaltherma_heat_power_out')|float / (states('sensor.ashp_power')|float/1000))|round(2) }}
        {% else -%}     
            0
        {% endif %}

  - binary_sensor:
    - name: "ESPAltherma - 3way valve(On:DHW_Off:Space)"
      unique_id: espaltherma_threewayvalve
      device_class: power
      icon: mdi:valve
      state: >
          {{ state_attr('sensor.althermasensors','3way valve(On:DHW_Off:Space)') }}
  • As an Amazon Associate I earn from qualifying purchases.