Integration Aokol heat pump / working via Gizwits app or modbus

Im trying to get my Aokol heat pump to the HA, but i couldnt set it up.
Heat pump can work with Gizwits app , and i think there is also modbus option.

Regards,
Marko

Some new findings:

Login to gizwits , with home assistant:

sensor:

  • platform: rest
    name: aokol_login
    scan_interval: 172000
    resource: “https://euapi.gizwits.com/app/login
    headers:
    Content-Type: application/json
    X-Gizwits-Application-Id: “927bb7757be0465d87bc2dd05adbc02e”
    method: POST
    payload: ‘{ “username”: “xxxxxxx”, “password”: “xxxxxx”, “lang”: “en” }’
    value_template: “{{ value_json.token }}”
    json_attributes:
    • uid
    • expire_at

List of items at Gizwits:

  • platform: rest
    name: aokol_bindings
    scan_interval: 172000
    resource: “https://euapi.gizwits.com/app/bindings?limit=20&skip=0
    headers:
    Content-Type: application/json
    X-Gizwits-Application-Id: “927bb7757be0465d87bc2dd05adbc02e”
    X-Gizwits-User-token: “xxxxxxxx - uid from login xxxxxxx”
    method: GET
    value_template: “{{ value_json.devices[0].did }}”
    json_attributes_path: “$.devices[0]”
    json_attributes:
    • dev_alias
    • mac
    • host
    • did
    • product_key
    • passcode
    • product_name

and then data from heat pump:

  • platform: rest
    name: aokol_status
    resource: https://euapi.gizwits.com/app/devdata/xxxx - did - xxxxx/latest
    headers:
    Content-Type: application/json
    X-Gizwits-Application-Id: “927bb7757be0465d87bc2dd05adbc02e”
    method: GET
    value_template: “{% if value_json.attr.temp_set > 0%}online{% else %}offline{%endif%}”
    json_attributes_path: “$.attr”
    json_attributes:
    • high_pressure
    • exhaust_temperature
    • power_consumption
    • outlet_water_temperature
      there is a lot of data…

I was trying to do the same , did you make it run ?
How did you get the X-Gizwits-Application-Id ?
Any help wellcome. looks your one is not working with my setup.
if I tray to connect (login) with Postman I get:
{
“error_message”: “user does not exist!”,
“error_code”: 9005,
“detail_message”: null
}

OK solved just mixed up the tokens …

Did you get anywhere with this or the Modbus interface?

I made it run with the Gizwits cloud, works quite OK .
I have written some homeassitant scripts to control it via climate integration …
It works quite well , but having sometime a latency for update. Next will be modbus interface :wink:

Can you share the code?
I still didnt find solution…

Hi I am on vacation , will be able to post you some code next week. What part is you issue ? connection to Gizwits or dashboard ?

I want to get data to home assistant. Maybe to be able to automate hot watter heating or underfloor heating. I have all temperature sensors but cant regulate aokol…

Heloo
I am interested in integration Aokol heat pump in Home Assistant to integrate Gizwits y dashboard.I’m a newbie but I like it and I want to learn.Tk
I have Aokol Prime in my house.

Hello Guys, ok let me share what I have done and what is working for me. I am not a super expert on Homeassistant so please allow if something is not perfect .

My Setup

I am using 2 AKL ( subbrand of AOKOL , same type ) heatpumps
No 1: 18KW , called mainly AKL18 in my code , serving underfloor heating and hot water
No 2: 30KW , called mainly AKL30 in my code , serving radiators
Both heat pumps are connected via wifi to the Gizwits Cloud and I can see them both in the Gitzwits App on my phone … that’s the rough setup you need

In Addition I use some real sensors (tasmota ) toget the different temperature and a circulation pump ( just all optional)

Here is my code , so feel free to dig into it

#read data from heat pump:
# Rest commands to control heatpump
rest_command:
#
# Set temperature of underfloor heating AKL18
#
  my_request_setfb:
    url: http://euapi.gizwits.com/app/control/7km2OAtRRzVxkDPGoqXjnt
    method: POST
    headers:
      X-Gizwits-Application-Id: "927bb7757be0465d87bc2dd05adbc02e"
      X-Gizwits-User-token: "{{ states('sensor.akl_login_token') }}"
    payload: '{"attrs":{"set_temperature_hot": {{ states("sensor.fb_sollwert") }} }}'
    content_type:  'application/json; charset=utf-8'
    verify_ssl: true 

#
# Set power on/off state of AKL18
#    
  my_request_setfbpower:
    url: http://euapi.gizwits.com/app/control/7km2OAtRRzVxkDPGoqXjnt
    method: POST
    headers:
      X-Gizwits-Application-Id: "927bb7757be0465d87bc2dd05adbc02e"
      X-Gizwits-User-token: "{{ states('sensor.akl_login_token') }}"
    payload: '{"attrs":{"power": {{ states("input_text.akl18_power_helper") }} }}'
    content_type:  'application/json; charset=utf-8'
    verify_ssl: true 
#
# Set mode state (chineese combinations) of AKL18
#     
  my_request_setfbmode:
    url: http://euapi.gizwits.com/app/control/7km2OAtRRzVxkDPGoqXjnt
    method: POST
    headers:
      X-Gizwits-Application-Id: "927bb7757be0465d87bc2dd05adbc02e"
      X-Gizwits-User-token: "{{ states('sensor.akl_login_token') }}"
    payload: '{"attrs":{"mode": {{ states("input_text.akl18_mode_helper") }} }}'
    content_type:  'application/json; charset=utf-8'
    verify_ssl: true 
#
# Set temperature of radiators heating AKL30
#    
  my_request_sethk:
    url: http://euapi.gizwits.com/app/control/sHEJbq43vTZFkRNenXSoKI
    method: POST
    headers:
      X-Gizwits-Application-Id: "927bb7757be0465d87bc2dd05adbc02e"
      X-Gizwits-User-token: "{{ states('sensor.akl_login_token') }}"
    payload: '{"attrs":{"set_temperature_hot": {{ states("sensor.hk_sollwert") }} }}'
    content_type:  'application/json; charset=utf-8'
    verify_ssl: true 
#
# Set power on/off state of AKL30
#        
  my_request_sethkpower:
    url: http://euapi.gizwits.com/app/control/sHEJbq43vTZFkRNenXSoKI
    method: POST
    headers:
      X-Gizwits-Application-Id: "927bb7757be0465d87bc2dd05adbc02e"
      X-Gizwits-User-token: "{{ states('sensor.akl_login_token') }}"
    payload: '{"attrs":{"power": {{ states("input_text.akl30_power_helper") }} }}'
    content_type:  'application/json; charset=utf-8'
    verify_ssl: true 
#
# Set mode state (chineese combinations) of AKL30
#         
  my_request_sethkmode:
    url: http://euapi.gizwits.com/app/control/sHEJbq43vTZFkRNenXSoKI
    method: POST
    headers:
      X-Gizwits-Application-Id: "927bb7757be0465d87bc2dd05adbc02e"
      X-Gizwits-User-token: "{{ states('sensor.akl_login_token') }}"
    payload: '{"attrs":{"mode": {{ states("input_text.akl30_mode_helper") }} }}'
    content_type:  'application/json; charset=utf-8'
    verify_ssl: true     
    
#
# Read out Status of AKL18
#    
  my_request_get_akl18:
    url: https://euapi.gizwits.com/app/devdata/7km2OAtRRzVxkDPGoqXjnt/latest
    headers:
      Content-Type: application/json
      X-Gizwits-Application-Id: "927bb7757be0465d87bc2dd05adbc02e"
      X-Gizwits-User-token: "{{ states('sensor.akl_login_token') }}"
    method: GET
    verify_ssl: true 
#
# Read out status of AKL30
#    
  my_request_get_akl30:
    url: https://euapi.gizwits.com/app/devdata/sHEJbq43vTZFkRNenXSoKI/latest
    headers:
      Content-Type: application/json
      X-Gizwits-Application-Id: "927bb7757be0465d87bc2dd05adbc02e"
      X-Gizwits-User-token: "{{ states('sensor.akl_login_token') }}"
    method: GET
    verify_ssl: true 
    


rest:

#
#   Cloud login der AKL Gitzwis connection
#   UID User Token für weitere Aktionen
#
#
  - resource: https://euapi.gizwits.com/app/login
    headers:
      Content-Type: application/json
      X-Gizwits-Application-Id: "927bb7757be0465d87bc2dd05adbc02e"
    method: POST
    payload: '{ "username": "mygitzwitsaccount", "password": "xxxmypasswordxxx", "lang": "en" }'
    scan_interval: 172000
    sensor:
      - name: akl_login
        unique_id: aklconnectgizwits
        value_template: "{% if value_json.expire_at > 0%} online {% else %} offline {%endif%}"
        #value_template: "{{ value_json.token }}"
        json_attributes_path: "$.attr"
        json_attributes:
        - token
        - uid
        - expire_at
      - name: akl_login_token
        unique_id: akllogin123456
        value_template: "{{value_json.token}}"
      - name: akl_login_uid
        unique_id: akllogin123457
        value_template: "{{value_json.uid}}"  
      - name:  akl_login_expire_at
        unique_id: akllogin1234568
        value_template: "{{value_json.expire_at}}"    


#
# Here its a bit tricky
# You have to use eg. postman to readout the ID of your heatpump in my case for 18KW it is "7km2OAtRRzVxkDPGoqXjnt" 
# I did not automate it because its unique and not changing, same for my 30KW
# resource: https://euapi.gizwits.com/app/devdata/7km2OAtRRzVxkDPGoqXjnt/latest
#
sensor:
  - platform: rest
    name: akl18_status
    unique_id: akl18
    scan_interval: 5
    resource: https://euapi.gizwits.com/app/devdata/7km2OAtRRzVxkDPGoqXjnt/latest
    headers:
      Content-Type: application/json
      X-Gizwits-Application-Id: "927bb7757be0465d87bc2dd05adbc02e"
      X-Gizwits-User-token: "{{ states('sensor.akl_login_token') }}"
    method: GET
    value_template: "{% if value_json.attr.set_temperature_hot > 0%} online {% else %} offline {%endif%}"
    json_attributes_path: "$.attr"
    json_attributes:
    - high_pressure
    - exhaust_temperature
    - delay_time_on
    - power_consumption
    - fset849
    - fset848
    - tube_mid_temperature
    - fset841
    - fset840
    - fset843
    - fset842
    - fset845
    - fset844
    - fset847
    - fset846
    - liquid_tube_temperature
    - inhalation_temperature
    - fset893
    - L05
    - condensate_pipe_temperature
    - L02
    - electronic_expansion_valve2
    - fset857
    - fset854
    - electronic_expansion_valve1
    - fset852
    - fset853
    - fset850
    - fset851
    - number_of_external_units
    - fset858
    - fset859
    - low_pressure_temperature
    - fset895
    - run_frequency
    - P01
    - P06
    - P09
    - outlet_water_temperature
    - H06
    - H05
    - fset877
    - F05
    - F04
    - fset821
    - F06
    - F01
    - fset826
    - F03
    - fset824
    - fset829
    - fset828
    - F09
    - outlet_water_temperature_user
    - b02
    - fset901
    - mode
    - set_temperature_cold
    - ability
    - power
    - y03
    - drive_DC_bus_voltage
    - drive_input_voltage
    - fset825
    - fset830
    - fset831
    - fset832
    - fset833
    - fset834
    - fset835
    - fset836
    - fset837
    - fset838
    - fset839
    - F10
    - temperature
    - fan_speed_1
    - fan_speed_2
    - external_software_version
    - tube_temperature
    - J03
    - drive_compressor_phase_current
    - low_pressure
    - rate_of_work
    - E32
    - external_parameter_version
    - fset809
    - fset808
    - water_tank_temperature
    - fset805
    - fset804
    - fset807
    - fset806
    - fset801
    - fset800
    - fset803
    - fset802
    - fset885
    - fset884
    - fset887
    - fset886
    - fset881
    - fset880
    - fset883
    - fset882
    - high_pressure_temperature
    - fset889
    - fset888
    - type
    - energy_efficiency
    - fset905
    - defrost
    - fset818
    - fset819
    - L12
    - fset812
    - fset813
    - fset810
    - fset811
    - fset816
    - fset817
    - fset814
    - fset815
    - fset892
    - fset823
    - fset890
    - fset891
    - fset896
    - fset897
    - fset894
    - fset822
    - fset898
    - fset899
    - set_temperature_hot_water
    - b01
    - fset874
    - b03
    - fset820
    - b05
    - b04
    - b07
    - b06
    - b09
    - fset827
    - return_water_temperature
    - A01
    - economizer_inlet_temperature
    - ERR00
    - ERR01
    - F02
    - fset871
    - fset872
    - drive_input_current
    - A11
    - fset869
    - fset868
    - fset867
    - fset866
    - fset865
    - fset864
    - fset863
    - fset862
    - fset861
    - fset860
    - b10
    - E06
    - fset900
    - discharge
    - C04
    - set_temperature_hot
    - C07
    - fset904
    - fset856
    - A08
    - fset878
    - fset879
    - fset902
    - fset903
    - A02
    - fset875
    - fset876
    - economizer_outlet_temperature
    - fset870
    - A07
    - A04
    - fset873
    - fset855

  - platform: template
    sensors:
      akl18_outlet_water_temperature:
        friendly_name: "Vorlauftemperatur"
        unit_of_measurement: '°C'
        value_template: "{{ state_attr('sensor.akl18_status', 'outlet_water_temperature') | int }}"  
      akl18_return_water_temperature:
        friendly_name: "Rücklauftemperatur"
        unit_of_measurement: '°C'
        value_template: "{{ state_attr('sensor.akl18_status', 'return_water_temperature') | int }}"  
      akl18_return_water_tank_temperature:
        friendly_name: "Warmwassetspeicher"
        unit_of_measurement: '°C'
        value_template: "{{ state_attr('sensor.akl18_status', 'liquid_tube_temperature') | int }}"      
      akl18_ambient_temperature:
        friendly_name: "Aussentemperatur"
        unit_of_measurement: '°C'
        value_template: "{{ state_attr('sensor.akl18_status', 'temperature') | int }}"      
      akl18_run_frequency:
        friendly_name: "Frequenz"
        unit_of_measurement: 'Hz'
        value_template: "{{ state_attr('sensor.akl18_status', 'run_frequency') | int }}"
      akl18_run_current:
        friendly_name: "Run Current"
        unit_of_measurement: 'A'
        value_template: "{{ state_attr('sensor.akl18_status', 'drive_compressor_phase_current') | int }}"
      akl18_drive_current:
        friendly_name: "Drive Current"
        unit_of_measurement: 'A'
        value_template: "{{ state_attr('sensor.akl18_status', 'drive_input_current') | int }}"
      akl18_set_temperature_hot_water:
        friendly_name: "set temperature hot water"
        unit_of_measurement: '°C'
        value_template: "{{ state_attr('sensor.akl18_status', 'set_temperature_hot_water') | int }}"
      akl18_set_temperature_hot:
        friendly_name: "set temperature hot"
        unit_of_measurement: '°C'
        value_template: "{{ state_attr('sensor.akl18_status', 'set_temperature_hot') | int }}"
      akl18_power:
        friendly_name: "Zustand"
        unit_of_measurement: ''
        value_template: "{{ state_attr('sensor.akl18_status', 'power') | int }}"  
      akl18_mode:
        friendly_name: "Betriebsmodus"
        value_template: "{{ state_attr('sensor.akl18_status', 'mode') }}" 
      akl18_error_f01:
        friendly_name: "Error F01"
        unit_of_measurement: ''
        value_template: "{{ state_attr('sensor.akl18_status', 'F01') | int }}"
      akl18_error_f02:
        friendly_name: "Error F02"
        unit_of_measurement: ''
        value_template: "{{ state_attr('sensor.akl18_status', 'F02') | int }}"
      akl18_error_f03:
        friendly_name: "Error F03"
        unit_of_measurement: ''
        value_template: "{{ state_attr('sensor.akl18_status', 'F03') | int }}"
      akl18_error_f04:
        friendly_name: "Error F04"
        unit_of_measurement: ''
        value_template: "{{ state_attr('sensor.akl18_status', 'F04') | int }}"
      akl18_error_f05:
        friendly_name: "Error F05"
        unit_of_measurement: ''
        value_template: "{{ state_attr('sensor.akl18_status', 'F05') | int }}"
      akl18_error_f06:
        friendly_name: "Error F06"
        unit_of_measurement: ''
        value_template: "{{ state_attr('sensor.akl18_status', 'F06') | int }}"
      akl18_error_f09:
        friendly_name: "Error F09"
        unit_of_measurement: ''
        value_template: "{{ state_attr('sensor.akl18_status', 'F09') | int }}"
      akl18_error_f10:
        friendly_name: "Error F10"
        unit_of_measurement: ''
        value_template: "{{ state_attr('sensor.akl18_status', 'F10') | int }}" 
      akl18_error:
        friendly_name: "ERR"
        value_template: "
                        {{ state_attr('sensor.akl18_status', 'F01') | int }}
                        {{ state_attr('sensor.akl18_status', 'F02') | int }}
                        {{ state_attr('sensor.akl18_status', 'F03') | int }}
                        {{ state_attr('sensor.akl18_status', 'F04') | int }}
                        {{ state_attr('sensor.akl18_status', 'F05') | int }}
                        {{ state_attr('sensor.akl18_status', 'F06') | int }}
                        {{ state_attr('sensor.akl18_status', 'F09') | int }}
                        {{ state_attr('sensor.akl18_status', 'F10') | int }}
                        "
  - platform: rest
    name: akl30_status
    unique_id: akl30
    scan_interval: 5
    resource: https://euapi.gizwits.com/app/devdata/sHEJbq43vTZFkRNenXSoKI/latest
    headers:
      Content-Type: application/json
      X-Gizwits-Application-Id: "927bb7757be0465d87bc2dd05adbc02e"
      X-Gizwits-User-token: "{{ states('sensor.akl_login_token') }}"
    method: GET
    value_template: "{% if value_json.attr.set_temperature_hot > 0%} online {% else %} offline {%endif%}"
    json_attributes_path: "$.attr"
    json_attributes:
    - high_pressure
    - exhaust_temperature
    - delay_time_on
    - power_consumption
    - fset849
    - fset848
    - tube_mid_temperature
    - fset841
    - fset840
    - fset843
    - fset842
    - fset845
    - fset844
    - fset847
    - fset846
    - liquid_tube_temperature
    - inhalation_temperature
    - fset893
    - L05
    - condensate_pipe_temperature
    - L02
    - electronic_expansion_valve2
    - fset857
    - fset854
    - electronic_expansion_valve1
    - fset852
    - fset853
    - fset850
    - fset851
    - number_of_external_units
    - fset858
    - fset859
    - low_pressure_temperature
    - fset895
    - run_frequency
    - P01
    - P06
    - P09
    - outlet_water_temperature
    - H06
    - H05
    - fset877
    - F05
    - F04
    - fset821
    - F06
    - F01
    - fset826
    - F03
    - fset824
    - fset829
    - fset828
    - F09
    - outlet_water_temperature_user
    - b02
    - fset901
    - mode
    - set_temperature_cold
    - ability
    - power
    - y03
    - drive_DC_bus_voltage
    - drive_input_voltage
    - fset825
    - fset830
    - fset831
    - fset832
    - fset833
    - fset834
    - fset835
    - fset836
    - fset837
    - fset838
    - fset839
    - F10
    - temperature
    - fan_speed_1
    - fan_speed_2
    - external_software_version
    - tube_temperature
    - J03
    - drive_compressor_phase_current
    - low_pressure
    - rate_of_work
    - E32
    - external_parameter_version
    - fset809
    - fset808
    - water_tank_temperature
    - fset805
    - fset804
    - fset807
    - fset806
    - fset801
    - fset800
    - fset803
    - fset802
    - fset885
    - fset884
    - fset887
    - fset886
    - fset881
    - fset880
    - fset883
    - fset882
    - high_pressure_temperature
    - fset889
    - fset888
    - type
    - energy_efficiency
    - fset905
    - defrost
    - fset818
    - fset819
    - L12
    - fset812
    - fset813
    - fset810
    - fset811
    - fset816
    - fset817
    - fset814
    - fset815
    - fset892
    - fset823
    - fset890
    - fset891
    - fset896
    - fset897
    - fset894
    - fset822
    - fset898
    - fset899
    - set_temperature_hot_water
    - b01
    - fset874
    - b03
    - fset820
    - b05
    - b04
    - b07
    - b06
    - b09
    - fset827
    - return_water_temperature
    - A01
    - economizer_inlet_temperature
    - ERR00
    - ERR01
    - F02
    - fset871
    - fset872
    - drive_input_current
    - A11
    - fset869
    - fset868
    - fset867
    - fset866
    - fset865
    - fset864
    - fset863
    - fset862
    - fset861
    - fset860
    - b10
    - E06
    - fset900
    - discharge
    - C04
    - set_temperature_hot
    - C07
    - fset904
    - fset856
    - A08
    - fset878
    - fset879
    - fset902
    - fset903
    - A02
    - fset875
    - fset876
    - economizer_outlet_temperature
    - fset870
    - A07
    - A04
    - fset873
    - fset855

  - platform: template
    sensors:
      akl30_outlet_water_temperature:
        friendly_name: "Vorlauftemperatur"
        unit_of_measurement: '°C'
        value_template: "{{ state_attr('sensor.akl30_status', 'outlet_water_temperature') | int }}"  
      akl30_return_water_temperature:
        friendly_name: "Rücklauftemperatur"
        unit_of_measurement: '°C'
        value_template: "{{ state_attr('sensor.akl30_status', 'return_water_temperature') | int }}"  
      akl30_return_water_tank_temperature:
        friendly_name: "Warmwassetspeicher"
        unit_of_measurement: '°C'
        value_template: "{{ state_attr('sensor.akl30_status', 'liquid_tube_temperature') | int }}"      
      akl30_ambient_temperature:
        friendly_name: "Aussentemperatur"
        unit_of_measurement: '°C'
        value_template: "{{ state_attr('sensor.akl30_status', 'temperature') | int }}"      
      akl30_run_frequency:
        friendly_name: "Frequenz"
        unit_of_measurement: 'Hz'
        value_template: "{{ state_attr('sensor.akl30_status', 'run_frequency') | int }}"
      akl30_run_current:
        friendly_name: "Run Current"
        unit_of_measurement: 'A'
        value_template: "{{ state_attr('sensor.akl30_status', 'drive_compressor_phase_current') | int }}"
      akl30_drive_current:
        friendly_name: "Drive Current"
        unit_of_measurement: 'A'
        value_template: "{{ state_attr('sensor.akl30_status', 'drive_input_current') | int }}"
      akl30_set_temperature_hot_water:
        friendly_name: "set temperature hot water"
        unit_of_measurement: '°C'
        value_template: "{{ state_attr('sensor.akl30_status', 'set_temperature_hot_water') | int }}"
      akl30_set_temperature_hot:
        friendly_name: "set temperature hot"
        unit_of_measurement: '°C'
        value_template: "{{ state_attr('sensor.akl30_status', 'set_temperature_hot') | int }}"
      akl30_power:
        friendly_name: "Zustand"
        unit_of_measurement: ''
        value_template: "{{ state_attr('sensor.akl30_status', 'power') | int }}"  
      akl30_mode:
        friendly_name: "Betriebsmodus"
        value_template: "{{ state_attr('sensor.akl30_status', 'mode') }}" 
      akl30_error_f01:
        friendly_name: "Error F01"
        unit_of_measurement: ''
        value_template: "{{ state_attr('sensor.akl30_status', 'F01') | int }}"
      akl30_error_f02:
        friendly_name: "Error F02"
        unit_of_measurement: ''
        value_template: "{{ state_attr('sensor.akl30_status', 'F02') | int }}"
      akl30_error_f03:
        friendly_name: "Error F03"
        unit_of_measurement: ''
        value_template: "{{ state_attr('sensor.akl30_status', 'F03') | int }}"
      akl30_error_f04:
        friendly_name: "Error F04"
        unit_of_measurement: ''
        value_template: "{{ state_attr('sensor.akl30_status', 'F04') | int }}"
      akl30_error_f05:
        friendly_name: "Error F05"
        unit_of_measurement: ''
        value_template: "{{ state_attr('sensor.akl30_status', 'F05') | int }}"
      akl30_error_f06:
        friendly_name: "Error F06"
        unit_of_measurement: ''
        value_template: "{{ state_attr('sensor.akl30_status', 'F06') | int }}"
      akl30_error_f09:
        friendly_name: "Error F09"
        unit_of_measurement: ''
        value_template: "{{ state_attr('sensor.akl30_status', 'F09') | int }}"
      akl30_error_f10:
        friendly_name: "Error F10"
        unit_of_measurement: ''
        value_template: "{{ state_attr('sensor.akl30_status', 'F10') | int }}" 
      akl30_error:
        friendly_name: "ERR"
        value_template: "
                        {{ state_attr('sensor.akl30_status', 'F01') | int }}
                        {{ state_attr('sensor.akl30_status', 'F02') | int }}
                        {{ state_attr('sensor.akl30_status', 'F03') | int }}
                        {{ state_attr('sensor.akl30_status', 'F04') | int }}
                        {{ state_attr('sensor.akl30_status', 'F05') | int }}
                        {{ state_attr('sensor.akl30_status', 'F06') | int }}
                        {{ state_attr('sensor.akl30_status', 'F09') | int }}
                        {{ state_attr('sensor.akl30_status', 'F10') | int }}
                        "
   

Now the Climate / Thermostat part

# Setup the thermostat and climate control
# eg.tas_technikraum_xxxxx_temperature are seperate sensors from AKL , using real measurement of various temperatures

climate:
- platform: generic_thermostat
  unique_id: HKFB0001
  name: Fussbodenheizung
  heater: input_boolean.climate1dummyswitch  #switch.tas_gartenhaus_2_gartenhaus_heizung_2
  target_sensor: sensor.tas_technikraum_ds18b20_2_temperature
  min_temp: 24
  max_temp: 35
  target_temp: 25
  hot_tolerance: 1
  initial_hvac_mode: "off"
  away_temp: 16
  precision: 1
  ac_mode: false
  cold_tolerance: 1
  
- platform: generic_thermostat
  unique_id: HKWW0001
  name: Warmwasserheizung
  heater: input_boolean.climate2dummyswitch
  target_sensor: sensor.tas_technikraum_ds18b20_1_temperature
  min_temp: 40
  max_temp: 55
  target_temp: 50
  hot_tolerance: 1
  initial_hvac_mode: "off"
  away_temp: 16
  precision: 1
  ac_mode: false
  cold_tolerance: 1
  
- platform: generic_thermostat
  unique_id: HKHK0001
  name: Heizkoerperheizung
  heater: input_boolean.climate3dummyswitch
  target_sensor: sensor.tas_technikraum_ds18b20_3_temperature
  min_temp: 30
  max_temp: 45
  target_temp: 35
  hot_tolerance: 1
  initial_hvac_mode: "off"
  away_temp: 16
  precision: 1
  ac_mode: false
  cold_tolerance: 1

#### get the status of each
sensor:  
  - platform: template
    sensors:
      fb_sollwert:
        value_template: "{{ state_attr('climate.fussbodenheizung', 'temperature') }}"
  - platform: template
    sensors:
      fb_status:
        value_template: "{{states('climate.fussbodenheizung')}}"
  - platform: template
    sensors:
      ww_sollwert:
        value_template: "{{ state_attr('climate.warmwasserheizung', 'temperature') }}"
  - platform: template
    sensors:
      ww_status:
        value_template: "{{states('climate.warmwasserheizung')}}"
  - platform: template
    sensors:
      hk_sollwert:
        value_template: "{{ state_attr('climate.heizkoerperheizung', 'temperature') }}"
  - platform: template
    sensors:
      hk_status:
        value_template: "{{states('climate.heizkoerperheizung')}}" 

And Finally soem related automations

#
# Time scheduled switching of circulation pump for hot water
#
- id: '1730476655851'
  alias: Steuerung Zirkulationspumpe
  description: ''
  triggers:
  - at: 05:00:00
    trigger: time
  - at: 07:00:00
    trigger: time
  - at: 09:00:00
    trigger: time
  - at: '11:00:00'
    trigger: time
  - at: '13:00:00'
    trigger: time
  - at: '15:00:00'
    trigger: time
  - at: '17:00:00'
    trigger: time
  - at: '19:00:00'
    trigger: time
  conditions:
  - condition: time
    after: 04:00:00
    before: '21:00:00'
    weekday:
    - mon
    - tue
    - wed
    - thu
    - fri
    - sat
    - sun
  actions:
  - sequence:
    - type: turn_on
      device_id: cf093374112a6398b3e5a6c647e591dc
      entity_id: 06f0fd36ce0af7a6b5c36e010be85476
      domain: switch
    - delay:
        hours: 0
        minutes: 15
        seconds: 0
        milliseconds: 0
    - type: turn_off
      device_id: cf093374112a6398b3e5a6c647e591dc
      entity_id: 06f0fd36ce0af7a6b5c36e010be85476
      domain: switch
  mode: single
#  
# preload status to helper for use with climate control
#   
- id: '1730817080913'
  alias: AKLTokenID
  description: AKLTokenID Beschreibung
  trigger:
  - platform: state
    entity_id:
    - sensor.akl_login
  - platform: homeassistant
    event: start
  condition: []
  action:
  - action: input_text.set_value
    target:
      entity_id: input_text.aokol_helfer
    data:
      value: '{{ states(''sensor.akl_login'') }}'
  mode: single
#
# Update the mode setting ( I used only the for me necessary state: 制热+热水 state: 制热
# background climate control is heat or off ... AKL is using mode and power in combination
#      
- id: '1731826380455'
  alias: Climate_Update_Mode_Fussbodenheizung_From_AKL
  description: ''
  trigger:
  - platform: state
    entity_id:
    - sensor.akl18_set_temperature_hot
  - platform: state
    entity_id:
    - sensor.akl18_mode
  - platform: state
    entity_id:
    - sensor.akl18_power
  - platform: homeassistant
    event: start
  condition: []
  action:
  - action: climate.set_temperature
    metadata: {}
    data:
      temperature: '{{states(''sensor.akl18_set_temperature_hot'')}}'
    target:
      entity_id: climate.fussbodenheizung
  - if:
    - condition: and
      conditions:
      - condition: state
        entity_id: sensor.akl18_power
        state: '1'
      - condition: or
        conditions:
        - condition: state
          entity_id: sensor.akl18_mode
          state: 制热+热水
        - condition: state
          entity_id: sensor.akl18_mode
          state: 制热
    then:
    - action: climate.set_hvac_mode
      metadata: {}
      data:
        hvac_mode: heat
1 Like

For completenes … thats the final dashboard

I think one of the tricky things is to get the mashine ID via Postman …
I just wrote some small routine to do it within Homeassistant … its reading out the “did” in my case it works for 2 … if you have only one heatpump there should be only devicebindingsdid1 with a valid one you can use to readout the heatpump

# just a help to read out did of devices which is needed for device access        
  - resource: https://euapi.gizwits.com/app/bindings
    headers:
      Content-Type: application/json
      X-Gizwits-Application-Id: "927bb7757be0465d87bc2dd05adbc02e"
      X-Gizwits-User-token: "{{ states('sensor.akl_login_token') }}"
    method: GET
    scan_interval: 5
    sensor:
      - name: devicebindingsdid1
        value_template: "{{ value_json.devices[0].did }}"
      - name: devicebindingsdid2
        value_template: "{{ value_json.devices[1].did }}"

Hi Peter
How have you integrated the code step by step into Home Assistant? I’m a newbie. And I installed climate. I’m trying to add the code manually…but it doesn’t work.
Thank you for sharing information

do you have the cloud access for AOKOL / AKL setup done ?
do you have access to all data?
not sure where to start ?

If I have access to the sensors and gizwits account, I am deleting the akl 30 kw for code is ok .
I have error in climate

duplicated mapping key (486:1)

483 | cold_tolerance: 1
484 |
485 | #### get the status of each
486 | sensor:
-------^
487 | - platform: template
488 | sensors:
I am testing…tk

Could you send the complete yaml ?

Heloo Peter
.


# Loads default set of integrations. Do not remove.
default_config:

# Load frontend themes from the themes folder
frontend:
  themes: !include_dir_merge_named themes

automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml

###Aokol prime 18kw###

#read data from heat pump:
# Rest commands to control heatpump
rest_command:
#
# Set temperature of underfloor heating AKL18
#
  my_request_setfb:
    url: http://euapi.gizwits.com/app/control/MY ID GIZWITS
    method: POST
    headers:
      X-Gizwits-Application-Id: "927bb7757be0465d87bc2dd05adbc02e"
      X-Gizwits-User-token: "{{ states('sensor.akl_login_token') }}"
    payload: '{"attrs":{"set_temperature_hot": {{ states("sensor.fb_sollwert") }} }}'
    content_type:  'application/json; charset=utf-8'
    verify_ssl: true 

#
# Set power on/off state of AKL18
#    
  my_request_setfbpower:
    url: http://euapi.gizwits.com/app/control/MY ID GIZWITS
    method: POST
    headers:
      X-Gizwits-Application-Id: "927bb7757be0465d87bc2dd05adbc02e"
      X-Gizwits-User-token: "{{ states('sensor.akl_login_token') }}"
    payload: '{"attrs":{"power": {{ states("input_text.akl18_power_helper") }} }}'
    content_type:  'application/json; charset=utf-8'
    verify_ssl: true 
#
# Set mode state (chineese combinations) of AKL18
#     
  my_request_setfbmode:
    url: http://euapi.gizwits.com/app/control/MY ID GIZWITS
    method: POST
    headers:
      X-Gizwits-Application-Id: "927bb7757be0465d87bc2dd05adbc02e"
      X-Gizwits-User-token: "{{ states('sensor.akl_login_token') }}"
    payload: '{"attrs":{"mode": {{ states("input_text.akl18_mode_helper") }} }}'
    content_type:  'application/json; charset=utf-8'
    verify_ssl: true 
#


# Read out Status of AKL18
#    
  my_request_get_akl18:
    url: https://euapi.gizwits.com/app/devdata/MY ID GIZWITS/latest
    headers:
      Content-Type: application/json
      X-Gizwits-Application-Id: "927bb7757be0465d87bc2dd05adbc02e"
      X-Gizwits-User-token: "{{ states('sensor.akl_login_token') }}"
    method: GET
    verify_ssl: true 
#



rest:

#
#   Cloud login der AKL Gitzwis connection
#   UID User Token für weitere Aktionen
#
#
  - resource: https://euapi.gizwits.com/app/login
    headers:
      Content-Type: application/json
      X-Gizwits-Application-Id: "927bb7757be0465d87bc2dd05adbc02e"
    method: POST
    payload: '{ "username": "MYUSERNAME GIZWITS", "password": "PASSWORD GIZWITYS ", "lang": "en" }'
    scan_interval: 172000
    sensor:
      - name: akl_login
        unique_id: aklconnectgizwits
        value_template: "{% if value_json.expire_at > 0%} online {% else %} offline {%endif%}"
        #value_template: "{{ value_json.token }}"
        json_attributes_path: "$.attr"
        json_attributes:
        - token
        - uid
        - expire_at
      - name: akl_login_token
        unique_id: akllogin123456
        value_template: "{{value_json.token}}"
      - name: akl_login_uid
        unique_id: akllogin123457
        value_template: "{{value_json.uid}}"  
      - name:  akl_login_expire_at
        unique_id: akllogin1234568
        value_template: "{{value_json.expire_at}}"    


#
# Here its a bit tricky
# You have to use eg. postman to readout the ID of your heatpump in my case for 18KW it is "7km2OAtRRzVxkDPGoqXjnt" 
# I did not automate it because its unique and not changing, same for my 30KW
# resource: https://euapi.gizwits.com/app/devdata/7km2OAtRRzVxkDPGoqXjnt/latest
#
sensor:
  - platform: rest
    name: akl18_status
    unique_id: akl18
    scan_interval: 5
    resource: https://euapi.gizwits.com/app/devdata/MY ID GIZWITS/latest
    headers:
      Content-Type: application/json
      X-Gizwits-Application-Id: "927bb7757be0465d87bc2dd05adbc02e"
      X-Gizwits-User-token: "{{ states('sensor.akl_login_token') }}"
    method: GET
    value_template: "{% if value_json.attr.set_temperature_hot > 0%} online {% else %} offline {%endif%}"
    json_attributes_path: "$.attr"
    json_attributes:
    - high_pressure
    - exhaust_temperature
    - delay_time_on
    - power_consumption
    - fset849
    - fset848
    - tube_mid_temperature
    - fset841
    - fset840
    - fset843
    - fset842
    - fset845
    - fset844
    - fset847
    - fset846
    - liquid_tube_temperature
    - inhalation_temperature
    - fset893
    - L05
    - condensate_pipe_temperature
    - L02
    - electronic_expansion_valve2
    - fset857
    - fset854
    - electronic_expansion_valve1
    - fset852
    - fset853
    - fset850
    - fset851
    - number_of_external_units
    - fset858
    - fset859
    - low_pressure_temperature
    - fset895
    - run_frequency
    - P01
    - P06
    - P09
    - outlet_water_temperature
    - H06
    - H05
    - fset877
    - F05
    - F04
    - fset821
    - F06
    - F01
    - fset826
    - F03
    - fset824
    - fset829
    - fset828
    - F09
    - outlet_water_temperature_user
    - b02
    - fset901
    - mode
    - set_temperature_cold
    - ability
    - power
    - y03
    - drive_DC_bus_voltage
    - drive_input_voltage
    - fset825
    - fset830
    - fset831
    - fset832
    - fset833
    - fset834
    - fset835
    - fset836
    - fset837
    - fset838
    - fset839
    - F10
    - temperature
    - fan_speed_1
    - fan_speed_2
    - external_software_version
    - tube_temperature
    - J03
    - drive_compressor_phase_current
    - low_pressure
    - rate_of_work
    - E32
    - external_parameter_version
    - fset809
    - fset808
    - water_tank_temperature
    - fset805
    - fset804
    - fset807
    - fset806
    - fset801
    - fset800
    - fset803
    - fset802
    - fset885
    - fset884
    - fset887
    - fset886
    - fset881
    - fset880
    - fset883
    - fset882
    - high_pressure_temperature
    - fset889
    - fset888
    - type
    - energy_efficiency
    - fset905
    - defrost
    - fset818
    - fset819
    - L12
    - fset812
    - fset813
    - fset810
    - fset811
    - fset816
    - fset817
    - fset814
    - fset815
    - fset892
    - fset823
    - fset890
    - fset891
    - fset896
    - fset897
    - fset894
    - fset822
    - fset898
    - fset899
    - set_temperature_hot_water
    - b01
    - fset874
    - b03
    - fset820
    - b05
    - b04
    - b07
    - b06
    - b09
    - fset827
    - return_water_temperature
    - A01
    - economizer_inlet_temperature
    - ERR00
    - ERR01
    - F02
    - fset871
    - fset872
    - drive_input_current
    - A11
    - fset869
    - fset868
    - fset867
    - fset866
    - fset865
    - fset864
    - fset863
    - fset862
    - fset861
    - fset860
    - b10
    - E06
    - fset900
    - discharge
    - C04
    - set_temperature_hot
    - C07
    - fset904
    - fset856
    - A08
    - fset878
    - fset879
    - fset902
    - fset903
    - A02
    - fset875
    - fset876
    - economizer_outlet_temperature
    - fset870
    - A07
    - A04
    - fset873
    - fset855

  - platform: template
    sensors:
      akl18_outlet_water_temperature:
        friendly_name: "Vorlauftemperatur"
        unit_of_measurement: '°C'
        value_template: "{{ state_attr('sensor.akl18_status', 'outlet_water_temperature') | int }}"  
      akl18_return_water_temperature:
        friendly_name: "Rücklauftemperatur"
        unit_of_measurement: '°C'
        value_template: "{{ state_attr('sensor.akl18_status', 'return_water_temperature') | int }}"  
      akl18_return_water_tank_temperature:
        friendly_name: "Warmwassetspeicher"
        unit_of_measurement: '°C'
        value_template: "{{ state_attr('sensor.akl18_status', 'liquid_tube_temperature') | int }}"      
      akl18_ambient_temperature:
        friendly_name: "Aussentemperatur"
        unit_of_measurement: '°C'
        value_template: "{{ state_attr('sensor.akl18_status', 'temperature') | int }}"      
      akl18_run_frequency:
        friendly_name: "Frequenz"
        unit_of_measurement: 'Hz'
        value_template: "{{ state_attr('sensor.akl18_status', 'run_frequency') | int }}"
      akl18_run_current:
        friendly_name: "Run Current"
        unit_of_measurement: 'A'
        value_template: "{{ state_attr('sensor.akl18_status', 'drive_compressor_phase_current') | int }}"
      akl18_drive_current:
        friendly_name: "Drive Current"
        unit_of_measurement: 'A'
        value_template: "{{ state_attr('sensor.akl18_status', 'drive_input_current') | int }}"
      akl18_set_temperature_hot_water:
        friendly_name: "set temperature hot water"
        unit_of_measurement: '°C'
        value_template: "{{ state_attr('sensor.akl18_status', 'set_temperature_hot_water') | int }}"
      akl18_set_temperature_hot:
        friendly_name: "set temperature hot"
        unit_of_measurement: '°C'
        value_template: "{{ state_attr('sensor.akl18_status', 'set_temperature_hot') | int }}"
      akl18_power:
        friendly_name: "Zustand"
        unit_of_measurement: ''
        value_template: "{{ state_attr('sensor.akl18_status', 'power') | int }}"  
      akl18_mode:
        friendly_name: "Betriebsmodus"
        value_template: "{{ state_attr('sensor.akl18_status', 'mode') }}" 
      akl18_error_f01:
        friendly_name: "Error F01"
        unit_of_measurement: ''
        value_template: "{{ state_attr('sensor.akl18_status', 'F01') | int }}"
      akl18_error_f02:
        friendly_name: "Error F02"
        unit_of_measurement: ''
        value_template: "{{ state_attr('sensor.akl18_status', 'F02') | int }}"
      akl18_error_f03:
        friendly_name: "Error F03"
        unit_of_measurement: ''
        value_template: "{{ state_attr('sensor.akl18_status', 'F03') | int }}"
      akl18_error_f04:
        friendly_name: "Error F04"
        unit_of_measurement: ''
        value_template: "{{ state_attr('sensor.akl18_status', 'F04') | int }}"
      akl18_error_f05:
        friendly_name: "Error F05"
        unit_of_measurement: ''
        value_template: "{{ state_attr('sensor.akl18_status', 'F05') | int }}"
      akl18_error_f06:
        friendly_name: "Error F06"
        unit_of_measurement: ''
        value_template: "{{ state_attr('sensor.akl18_status', 'F06') | int }}"
      akl18_error_f09:
        friendly_name: "Error F09"
        unit_of_measurement: ''
        value_template: "{{ state_attr('sensor.akl18_status', 'F09') | int }}"
      akl18_error_f10:
        friendly_name: "Error F10"
        unit_of_measurement: ''
        value_template: "{{ state_attr('sensor.akl18_status', 'F10') | int }}" 
      akl18_error:
        friendly_name: "ERR"
        value_template: "
                        {{ state_attr('sensor.akl18_status', 'F01') | int }}
                        {{ state_attr('sensor.akl18_status', 'F02') | int }}
                        {{ state_attr('sensor.akl18_status', 'F03') | int }}
                        {{ state_attr('sensor.akl18_status', 'F04') | int }}
                        {{ state_attr('sensor.akl18_status', 'F05') | int }}
                        {{ state_attr('sensor.akl18_status', 'F06') | int }}
                        {{ state_attr('sensor.akl18_status', 'F09') | int }}
                        {{ state_attr('sensor.akl18_status', 'F10') | int }}
                        "
# just a help to read out did of devices which is needed for device access        
  - resource: https://euapi.gizwits.com/app/bindings
    headers:
      Content-Type: application/json
      X-Gizwits-Application-Id: "927bb7757be0465d87bc2dd05adbc02e"
      X-Gizwits-User-token: "{{ states('sensor.akl_login_token') }}"
    method: GET
    scan_interval: 5
    sensor:
      - name: devicebindingsdid1
        value_template: "{{ value_json.devices[0].did }}"
      

#####teste climate###

# Setup the thermostat and climate control
# eg.tas_technikraum_xxxxx_temperature are seperate sensors from AKL , using real measurement of various temperatures

climate:
- platform: generic_thermostat
  unique_id: HKFB0001
  name: Fussbodenheizung
  heater: input_boolean.climate1dummyswitch  #switch.tas_gartenhaus_2_gartenhaus_heizung_2
  target_sensor: sensor.tas_technikraum_ds18b20_2_temperature
  min_temp: 24
  max_temp: 35
  target_temp: 20
  hot_tolerance: 1
  initial_hvac_mode: "off"
  away_temp: 16
  precision: 1
  ac_mode: false
  cold_tolerance: 1
  
- platform: generic_thermostat
  unique_id: HKWW0001
  name: Warmwasserheizung
  heater: input_boolean.climate2dummyswitch
  target_sensor: sensor.tas_technikraum_ds18b20_1_temperature
  min_temp: 40
  max_temp: 55
  target_temp: 2
  hot_tolerance: 1
  initial_hvac_mode: "off"
  away_temp: 16
  precision: 1
  ac_mode: false
  cold_tolerance: 1
  
- platform: generic_thermostat
  unique_id: HKHK0001
  name: Heizkoerperheizung
  heater: input_boolean.climate3dummyswitch
  target_sensor: sensor.tas_technikraum_ds18b20_3_temperature
  min_temp: 30
  max_temp: 20
  target_temp: 35
  hot_tolerance: 1
  initial_hvac_mode: "off"
  away_temp: 16
  precision: 1
  ac_mode: false
  cold_tolerance: 1
  

I think the part which is generating the error message is missing ?
the posted part has no error

In the final dashboard I don’t have the image of yours, something has to be configured.
D


o you have something configured in climate?
To start the recirculations pump and im have a 220 contactor with relay delay for 10 minutes, if it is of any use.

Actually beside of the setup in the yaml and the automation nothing to be done . Actually the climate control is only used to set the “set temperature” not doing any real control since this is done by the heat pump itself … its just a nice visualization of the set temperature

for your relays and time delay I can not judge … I am switching my circulation pump every 2 hours for 15 min thats enough to keep the water hot and not loose to much …
i am doing this with a very cheap tasiota switch …