Daikin Altherma 3 Heat Pump and Home Assistant
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
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)') }}