Control Acond Heat Pump over ModBus

Hello, I spent already more than a week to get this working, but I still can not achieve the result I want. I have heat pump from Acond which support communication over ModBus. The problem is that when I set it up it jups between the auto mode and the ModBus mode. In the documentation there is mentioned that it will switch to auto mode when in time = MaxCommDataRefresh there was no value written or read over ModBus. I suspect that this MaxCommDataRefresh is 1s or lower, but Home Assistant only allows me to read in 1s intervals. That is the first problem.

Second problem is that when I setup “climates” it can write only one register, but based on the documentation I need to write multiple registers because some needs to be set to some values. Is there some solution how to write multiple registers when the target temperature is set?

Here are my current settings:

modbus:
  - name: Acond
    type: tcp
    host: 192.168.1.219
    port: 502
    climates:
      - name: "Tepelné čerpadlo - vzduch"
        address: 1
        input_type: input
        max_temp: 35
        min_temp: 10
        scan_interval: 1
        offset: 0
        precision: 1
        scale: 0.1
        target_temp_register: 0
        temp_step: 0.5
        temperature_unit: °C

Hi Jakub! I also have an Acond heat pump and I am just getting my bearings around its Modbus interface. Can you tell me where you obtained the documentation you mentioned?

Also, did you make any headway with the issue you described here? I am currently looking to use the heat pump as a sensor source only, and I want to be able to track its reported outside and inside air temperature, and the heating and hot water temperature. In other words, I am currently only interested in the read registers. Since your question was about writes, I suppose you already succeeded at reads before those?

Hello,
here is my configuration.yaml which I use and it works.
You have to change the IP address.
And technicians from Acond must allow Modbus communication on the unit.
With Best Regards Thomas


Loads default set of integrations. Do not remove.

default_config:

Text to speech

tts:

  • platform: google_translate

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

  • name: Acond
    type: tcp
    host: 192.168.1.21
    port: 502
    close_comm_on_error: false
    delay: 1
    timeout: 1
    retry_on_empty: false
    message_wait_milliseconds: 1
    retries: 1
    climates:
    • name: ACOND_T_set_indoor_0
      slave: 1
      input_type: input
      address: 1
      target_temp_register: 0
      data_type: int16
      scan_interval: 60
      scale: 0.1
      precision: 1
      max_temp: 25
      min_temp: 11
      temp_step: 0.1
      unique_id: 30000
    • name: ACOND_T_set_water_back
      slave: 1
      input_type: input
      address: 8
      target_temp_register: 7
      data_type: int16
      scan_interval: 10
      scale: 0.1
      precision: 1
      max_temp: 55
      min_temp: 11
      temp_step: 0.1
      unique_id: 30008
    • name: ACOND_typ_StandardON
      slave: 1
      input_type: input
      address: 14
      target_temp_register: 6
      data_type: int16
      scan_interval: 10
      scale: 1
      precision: 1
      max_temp: 2
      min_temp: 0
      temp_step: 1
      unique_id: 30007
      sensors:
    • name: ACOND_T_act_indoor1
      slave: 1
      address: 1
      data_type: int16
      scale: 0.1
      precision: 1
      input_type: input
      unit_of_measurement: “°C”
      device_class: temperature
      unique_id: 50001
    • name: ACOND_T_act_water_back
      slave: 1
      address: 8
      data_type: int16
      scale: 0.1
      precision: 1
      input_type: input
      unit_of_measurement: “°C”
      device_class: temperature
      unique_id: 50009
    • name: ACOND_T_act_air
      slave: 1
      address: 9
      data_type: int16
      scale: 0.1
      precision: 1
      input_type: input
      unit_of_measurement: “°C”
      device_class: temperature
      unique_id: 50010
    • name: ACOND_typ_reg_pan
      slave: 1
      address: 14
      data_type: int16
      input_type: input
      unique_id: 50015
    • name: ACOND_T_act_water_outlet
      slave: 1
      address: 17
      data_type: int16
      scale: 0.1
      precision: 1
      input_type: input
      unit_of_measurement: “°C”
      device_class: temperature
      unique_id: 50018
    • name: ACOND_capacity_actual_W
      slave: 1
      address: 23
      data_type: int16
      scale: 1
      input_type: input
      unique_id: 50024
      #logger:

logs:

homeassistant.components.modbus: debug

pymodbus.client: debug

Hi,

though I haven’t made much headway yet, I just wanted to say thanks for the pointers thus far. :slight_smile:

I have put in this request with the contractor that installed my heat pump, and am still waiting to hear back from them.

I have found this video though; it contains some information about Modbus from about the 14-minute mark:

Unfortunately I don’t speak Czech, and Youtube’s auto-caption/auto-translate feature doesn’t appear to work for this video. So I can’t make out a whole lot. One question that I do have is this, though: do the Modbus registers expose the system’s current power consumption? Is that the ACOND_capacity_actual_W sensor you define, @tnovicky?

Ahoj Jakube,
I see your modbus with ACOND is working. I have ACOND as well, I have paper protocol from ACOND, and I think I made it all exactly according this protocol, but answer is ILLEGAL DATA ADDRESS. Can you send me a couple of packets from communication recorded by wireshark or can you check where should be problem on my side please? I have info from ACOND that it should works, but not in my case. Thank you Vasek.

Continuing the discussion from Control Acond Heat Pump over ModBus:

Hello,
below is my configuration.yaml. I think I copied it correctly from you, but I can’t get the correct result.
After restarting HA it gives me an error:

Logger: homeassistant.setup
Source: setup.py:190
First occurred: 11:41:39 (2 occurrences)
Last logged: 11:41:40

Setup failed for sensors: Integration not found.
Setup failed for climates: Integration not found.

Could you please help me with what I am doing wrong.
I’m sorry, but I’m a beginner with HA, so please be patient and forgiving.
thank you very much

Loads default set of integrations. Do not remove.

default_config:

Load frontend themes from the themes folder

frontend:
themes: !include_dir_merge_named themes

Text to speech

tts:

  • platform: google_translate

http:
use_x_forwarded_for: true
trusted_proxies:
- 172.30.33.0/24

modbus:

  • name: Acond
    type: tcp
    host: 10.254.251.199
    port: 502
    close_comm_on_error: false
    delay: 1
    timeout: 1
    retry_on_empty: false
    message_wait_milliseconds: 1
    retries: 1
    climates:
  • name: ACOND_T_set_indoor_0
    slave: 1
    input_type: input
    address: 1
    target_temp_register: 0
    data_type: int16
    scan_interval: 60
    scale: 0.1
    precision: 1
    max_temp: 25
    min_temp: 11
    temp_step: 0.1
    unique_id: 30000
  • name: ACOND_T_set_water_back
    slave: 1
    input_type: input
    address: 8
    target_temp_register: 7
    data_type: int16
    scan_interval: 10
    scale: 0.1
    precision: 1
    max_temp: 55
    min_temp: 11
    temp_step: 0.1
    unique_id: 30008
  • name: ACOND_typ_StandardON
    slave: 1
    input_type: input
    address: 14
    target_temp_register: 6
    data_type: int16
    scan_interval: 10
    scale: 1
    precision: 1
    max_temp: 2
    min_temp: 0
    temp_step: 1
    unique_id: 30007
    sensors:
  • name: ACOND_T_act_indoor1
    slave: 1
    address: 1
    data_type: int16
    scale: 0.1
    precision: 1
    input_type: input
    unit_of_measurement: “°C”
    device_class: temperature
    unique_id: 50001
  • name: ACOND_T_act_water_back
    slave: 1
    address: 8
    data_type: int16
    scale: 0.1
    precision: 1
    input_type: input
    unit_of_measurement: “°C”
    device_class: temperature
    unique_id: 50009
  • name: ACOND_T_act_air
    slave: 1
    address: 9
    data_type: int16
    scale: 0.1
    precision: 1
    input_type: input
    unit_of_measurement: “°C”
    device_class: temperature
    unique_id: 50010
  • name: ACOND_typ_reg_pan
    slave: 1
    address: 14
    data_type: int16
    input_type: input
    unique_id: 50015
  • name: ACOND_T_act_water_outlet
    slave: 1
    address: 17
    data_type: int16
    scale: 0.1
    precision: 1
    input_type: input
    unit_of_measurement: “°C”
    device_class: temperature
    unique_id: 50018
  • name: ACOND_capacity_actual_W
    slave: 1
    address: 23
    data_type: int16
    scale: 1
    input_type: input
    unique_id: 50024

Hello, did You solve the problem? If not I will try to help, but prefer email conversation. So send Your question to [email protected].
With Best Regards Thomas

Returning to this thread with additional information, just in case someone finds it useful.

I’ve finally added my Acond PRO-R to my Home Assistant configuration via Modbus, using the documentation available from loxone-library as a reference (this appears to be a translation of https://acond.cz/wp-content/uploads/Acond_ModbusTCP-v2.34.pdf though the version IDs don’t match up, and also I’m not sure if the translation comes directly from Acond or from a third party).

Here’s what I’ve added to my modbus configuration thus far:

- name: Acond PRO-R
  type: tcp
  host: acond.lan  # This is a DNS entry in my local network; using an IP address is fine too
  port: 502
  delay: 1
  timeout: 1
  message_wait_milliseconds: 1
  retries: 1
  climates:
    - name: ACOND_T_set_indoor1  # Indoor temperature, sensor #1 (I only have one at this time)
      slave: 1
      address: 1
      target_temp_register: 0
      input_type: input
      data_type: int16
      scan_interval: 60
      scale: 0.1
      precision: 1
      max_temp: 28
      min_temp: 10
      temp_step: 0.1
    - name: ACOND_T_set_TUV  # Domestic hot water temperature
      slave: 1
      address: 5
      target_temp_register: 4
      input_type: input
      data_type: int16
      scan_interval: 60
      scale: 0.1
      precision: 1
      max_temp: 55
      min_temp: 10
      temp_step: 0.1
  sensors:
    - name: ACOND_T_act_indoor1  # Current indoor temperature at sensor #1
      slave: 1
      address: 1
      data_type: int16
      scale: 0.1
      precision: 1
      input_type: input
      device_class: temperature
      unit_of_measurement: "°C"
    - name: ACOND_T_act_TUV  # Current domestic hot water temperature
      slave: 1
      address: 5
      data_type: int16
      scale: 0.1
      precision: 1
      input_type: input
      device_class: temperature
      unit_of_measurement: "°C"
    - name: ACOND_T_act_water_back  # Current return water temperature in heating circuit
      slave: 1
      address: 8
      data_type: int16
      scale: 0.1
      precision: 1
      input_type: input
      device_class: temperature
      unit_of_measurement: "°C"
    - name: ACOND_T_act_air  # Current outside air temperature
      slave: 1
      address: 9
      data_type: int16
      scale: 0.1
      precision: 1
      input_type: input
      device_class: temperature
      unit_of_measurement: "°C"
    - name: ACOND_err_number  # General error number, should always be 0 in normal operation
      slave: 1
      address: 20
      data_type: int16
      input_type: input
    - name: ACOND_err_number_SECMono  # SECMono error number, should always be 0 in normal operation
      slave: 1
      address: 21
      data_type: int16
      input_type: input
    - name: ACOND_err_number_driver  # Driver error number, should always be 0 in normal operation
      slave: 1
      address: 22
      data_type: int16
      input_type: input
    - name: ACOND_capacity_actual_W  # Current heat production
      slave: 1
      address: 23
      data_type: int16
      input_type: input
      device_class: power
      unit_of_measurement: "W"

If you’d like to be able to reconfigure these in the Home Assistant GUI, be sure to add unique_id variables to those entities.

1 Like

Thanks for the update!