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)') }}

