Controlling Ecoforest heatpumps via Modbus

Some progress!

I have figured out that many parameters for reading are also for writing.
At first the full addresslist I have discovered and tested:

modbus:
  - name: "ecoforest"
    delay: 5
    type: serial
    method: rtu
    port: /dev/serial/by-id/usb-Prolific_Technology_Inc._USB-Serial_Controller-if00-port0
    baudrate: 19200
    stopbits: 2
    bytesize: 8
    parity: N
    
    binary_sensors:
    - name: heatpump_alarm
      slave: 17
      address: 50
      lazy_error_count: 10
    - name: Heatpump Summer
      slave: 17
      address: 127
      lazy_error_count: 10
    - name: Heatpump Winter
      slave: 17
      address: 128
      lazy_error_count: 10
    - name: Heatpump on/off control by BUS
      slave: 17
      address: 53
      lazy_error_count: 10

    sensors:
    - name: Heatpump Buitentemperatuur
      unit_of_measurement: °C
      scale: 0.1
      precision: 1
      slave: 17
      address: 11
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Boiler
      unit_of_measurement: °C
      scale: 0.1
      precision: 1
      slave: 17
      address: 8
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Pressure Brine
      unit_of_measurement: Bar
      scale: 0.1
      precision: 1
      slave: 17
      address: 13
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Pressure Heating
      unit_of_measurement: Bar
      scale: 0.1
      precision: 1
      slave: 17
      address: 14
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Brine air outlet
      unit_of_measurement: °C
      scale: 0.1
      precision: 1
      slave: 17
      address: 29
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Brine out
      unit_of_measurement: °C
      scale: 0.1
      precision: 1
      slave: 17
      address: 1
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Brine in
      unit_of_measurement: °C
      scale: 0.1
      precision: 1
      slave: 17
      address: 2
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Heating out
      unit_of_measurement: °C
      scale: 0.1
      precision: 1
      slave: 17
      address: 3
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Heating in
      unit_of_measurement: °C
      scale: 0.1
      precision: 1
      slave: 17
      address: 4
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Compressor suction temperature
      unit_of_measurement: °C
      scale: 0.1
      precision: 1
      slave: 17
      address: 5
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Compresor suction pressure
      unit_of_measurement: Bar
      scale: 0.1
      precision: 1
      slave: 17
      address: 6
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Compressor discharge pressure
      unit_of_measurement: Bar
      scale: 0.1
      precision: 1
      slave: 17
      address: 7
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Condensation temperature
      unit_of_measurement: °C
      scale: 0.1
      precision: 1
      slave: 17
      address: 94
      lazy_error_count: 10
      data_type: int16

    - name: Heatpump Thermal Power DHW Min
      unit_of_measurement: "%"
      scale: 0.1
      slave: 17
      address: 74
      lazy_error_count: 10
      data_type: int16
      #set and get
    - name: Heatpump Thermal Power DHW Max
      unit_of_measurement: "%"
      scale: 0.1
      slave: 17
      address: 75
      lazy_error_count: 10
      data_type: int16
      #set and get
    - name: Heatpump Thermal Power Heating Min
      unit_of_measurement: "%"
      scale: 0.1
      slave: 17
      address: 76
      lazy_error_count: 10
      data_type: int16
      #set and get
    - name: Heatpump Thermal Power Heating Max
      unit_of_measurement: "%"
      scale: 0.1
      slave: 17
      address: 77
      lazy_error_count: 10
      data_type: int16
      #set and get
    - name: Heatpump Thermal Power Cooling Min
      unit_of_measurement: "%"
      scale: 0.1
      slave: 17
      address: 78
      lazy_error_count: 10
      data_type: int16
      #set and get
    - name: Heatpump Thermal Power Cooling Max
      unit_of_measurement: "%"
      scale: 0.1
      slave: 17
      address: 79
      lazy_error_count: 10
      data_type: int16
      #set and get
    - name: Heatpump Thermal Power Pool Min
      unit_of_measurement: "%"
      scale: 0.1
      slave: 17
      address: 80
      lazy_error_count: 10
      data_type: int16
      #set and get
    - name: Heatpump Thermal Power Pool Max
      unit_of_measurement: "%"
      scale: 0.1
      slave: 17
      address: 81
      lazy_error_count: 10
      data_type: int16
      #set and get

    - name: Heatpump Superheat
      unit_of_measurement: °C
      scale: 0.1
      precision: 1
      slave: 17
      address: 132
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Expansion valve position
      unit_of_measurement: "%"
      slave: 17
      address: 133
      lazy_error_count: 10
      data_type: int16

    - name: Heatpump BUS DHW Setpoint
      unit_of_measurement: °C
      scale: 0.1
      precision: 1
      slave: 17
      address: 134
      lazy_error_count: 10
      data_type: int16
      #set and get
      
    - name: Heatpump BUS Heating DG1 Setpoint
      unit_of_measurement: °C
      scale: 0.1
      precision: 1
      slave: 17
      address: 135
      lazy_error_count: 10
      data_type: int16
      #set and get
    - name: Heatpump BUS Heating SG2 Setpoint
      unit_of_measurement: °C
      scale: 0.1
      precision: 1
      slave: 17
      address: 136
      lazy_error_count: 10
      data_type: int16
      #set and get
    - name: Heatpump BUS Heating SG3 Setpoint
      unit_of_measurement: °C
      scale: 0.1
      precision: 1
      slave: 17
      address: 137
      lazy_error_count: 10
      data_type: int16
      #set and get
    - name: Heatpump BUS Heating SG4 Setpoint
      unit_of_measurement: °C
      scale: 0.1
      precision: 1
      slave: 17
      address: 138
      lazy_error_count: 10
      data_type: int16
      #set and get

    - name: Heatpump BUS Cooling DG1 Setpoint
      unit_of_measurement: °C
      scale: 0.1
      precision: 1
      slave: 17
      address: 139
      lazy_error_count: 10
      data_type: int16
      #set and get
    - name: Heatpump BUS Cooling SG2 Setpoint
      unit_of_measurement: °C
      scale: 0.1
      precision: 1
      slave: 17
      address: 140
      lazy_error_count: 10
      data_type: int16
      #set and get
    - name: Heatpump BUS Cooling SG3 Setpoint
      unit_of_measurement: °C
      scale: 0.1
      precision: 1
      slave: 17
      address: 141
      lazy_error_count: 10
      data_type: int16
      #set and get
    - name: Heatpump BUS Cooling SG4 Setpoint
      unit_of_measurement: °C
      scale: 0.1
      precision: 1
      slave: 17
      address: 142
      lazy_error_count: 10
      data_type: int16
      #set and get

    - name: Heatpump Supply Temperature SG2
      unit_of_measurement: °C
      scale: 0.1
      precision: 1
      slave: 17
      address: 194
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Supply Temperature SG3
      unit_of_measurement: °C
      scale: 0.1
      precision: 1
      slave: 17
      address: 195
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Supply Temperature SG4
      unit_of_measurement: °C
      scale: 0.1
      precision: 1
      slave: 17
      address: 196
      lazy_error_count: 10
      data_type: int16

    - name: Heatpump Start Temperature DHW
      unit_of_measurement: °C
      scale: 0.1
      precision: 1
      slave: 17
      address: 198
      lazy_error_count: 10
      data_type: int16

    - name: Heatpump Evaporation temperature
      unit_of_measurement: °C
      scale: 0.1
      precision: 1
      slave: 17
      address: 199
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Compressor discharge temperature
      unit_of_measurement: °C
      scale: 0.1
      precision: 1
      slave: 17
      address: 203
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump COP
      unit_of_measurement: COP
      scale: 0.1
      precision: 1
      slave: 17
      address: 30
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump EER
      unit_of_measurement: EER
      scale: 0.1
      precision: 1
      slave: 17
      address: 202
      lazy_error_count: 10
      data_type: int16

    - name: Heatpump Compressor RPM
      unit_of_measurement: RPM
      slave: 17
      address: 5002
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Scroll temperature
      unit_of_measurement: °C
      slave: 17
      address: 5004
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Inverter temperature
      unit_of_measurement: °C
      slave: 17
      address: 5005
      lazy_error_count: 10
      data_type: int16

    - name: Heatpump Working Hours L
      slave: 17
      address: 5080
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Working Hours H
      slave: 17
      address: 5081
      lazy_error_count: 10
      data_type: int16

    - name: Heatpump Production Pump
      unit_of_measurement: "%"
      scale: 0.1
      slave: 17
      address: 5033
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Brine Pump
      unit_of_measurement: "%"
      scale: 0.1
      slave: 17
      address: 5034
      lazy_error_count: 10
      data_type: int16

    - name: Heatpump Powerconsumption
      unit_of_measurement: W
      slave: 17
      address: 5082
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Condensation capacity
      unit_of_measurement: W
      slave: 17
      address: 5083
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Evaporation capacity
      unit_of_measurement: W
      slave: 17
      address: 5185
      lazy_error_count: 10
      data_type: int16

    - name: Heatpump working program by BUS
      slave: 17
      address: 5221
      lazy_error_count: 10
      data_type: int16
      #set and get
      # 0 - mixed, 1 - heating, 2 - cooling, 3 - off
    - name: Heatpump BUS DHW Demand
      slave: 17
      address: 5222
      lazy_error_count: 10
      data_type: int16
      #set and get
      # 0 - off, 1 - on
    - name: Heatpump BUS DG1 Demand
      slave: 17
      address: 5224
      lazy_error_count: 10
      data_type: int16
      #set and get
      # 0 - off, 1 - on
    - name: Heatpump BUS SG2 Demand
      slave: 17
      address: 5225
      lazy_error_count: 10
      data_type: int16
      #set and get
      # 0 - off, 1 - heating, 2 - cooling
    - name: Heatpump BUS SG3 Demand
      slave: 17
      address: 5226
      lazy_error_count: 10
      data_type: int16
      #set and get
      # 0 - off, 1 - heating, 2 - cooling
    - name: Heatpump BUS SG4 Demand
      slave: 17
      address: 5227
      lazy_error_count: 10
      data_type: int16
      #set and get
      # 0 - off, 1 - heating, 2 - cooling

    - name: Heatpump Condensation Energy january
      unit_of_measurement: kWh
      slave: 17
      address: 5144
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Condensation Energy february
      unit_of_measurement: kWh
      slave: 17
      address: 5145
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Condensation Energy march
      unit_of_measurement: kWh
      slave: 17
      address: 5146
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Condensation Energy april
      unit_of_measurement: kWh
      slave: 17
      address: 5147
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Condensation Energy may
      unit_of_measurement: kWh
      slave: 17
      address: 5148
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Condensation Energy june
      unit_of_measurement: kWh
      slave: 17
      address: 5149
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Condensation Energy july
      unit_of_measurement: kWh
      slave: 17
      address: 5150
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Condensation Energy august
      unit_of_measurement: kWh
      slave: 17
      address: 5151
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Condensation Energy september
      unit_of_measurement: kWh
      slave: 17
      address: 5152
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Condensation Energy october
      unit_of_measurement: kWh
      slave: 17
      address: 5153
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Condensation Energy november
      unit_of_measurement: kWh
      slave: 17
      address: 5154
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Condensation Energy december
      unit_of_measurement: kWh
      slave: 17
      address: 5155
      lazy_error_count: 10
      data_type: int16

    - name: Heatpump Evaporation Energy january
      unit_of_measurement: kWh
      slave: 17
      address: 5156
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Evaporation Energy february
      unit_of_measurement: kWh
      slave: 17
      address: 5157
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Evaporation Energy march
      unit_of_measurement: kWh
      slave: 17
      address: 5158
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Evaporation Energy april
      unit_of_measurement: kWh
      slave: 17
      address: 5159
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Evaporation Energy may
      unit_of_measurement: kWh
      slave: 17
      address: 5160
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Evaporation Energy june
      unit_of_measurement: kWh
      slave: 17
      address: 5161
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Evaporation Energy july
      unit_of_measurement: kWh
      slave: 17
      address: 5162
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Evaporation Energy august
      unit_of_measurement: kWh
      slave: 17
      address: 5163
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Evaporation Energy september
      unit_of_measurement: kWh
      slave: 17
      address: 5164
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Evaporation Energy october
      unit_of_measurement: kWh
      slave: 17
      address: 5165
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Evaporation Energy november
      unit_of_measurement: kWh
      slave: 17
      address: 5166
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Evaporation Energy december
      unit_of_measurement: kWh
      slave: 17
      address: 5167
      lazy_error_count: 10
      data_type: int16

    - name: Heatpump Electrical Consumption january
      unit_of_measurement: kWh
      slave: 17
      address: 5168
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Electrical Consumption february
      unit_of_measurement: kWh
      slave: 17
      address: 5169
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Electrical Consumption march
      unit_of_measurement: kWh
      slave: 17
      address: 5170
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Electrical Consumption april
      unit_of_measurement: kWh
      slave: 17
      address: 5171
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Electrical Consumption may
      unit_of_measurement: kWh
      slave: 17
      address: 5172
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Electrical Consumption june
      unit_of_measurement: kWh
      slave: 17
      address: 5173
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Electrical Consumption july
      unit_of_measurement: kWh
      slave: 17
      address: 5174
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Electrical Consumption august
      unit_of_measurement: kWh
      slave: 17
      address: 5175
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Electrical Consumption september
      unit_of_measurement: kWh
      slave: 17
      address: 5176
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Electrical Consumption october
      unit_of_measurement: kWh
      slave: 17
      address: 5177
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Electrical Consumption november
      unit_of_measurement: kWh
      slave: 17
      address: 5178
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Electrical Consumption december
      unit_of_measurement: kWh
      slave: 17
      address: 5179
      lazy_error_count: 10
      data_type: int16

    - name: Heatpump Number Of Starts L
      slave: 17
      address: 5281
      lazy_error_count: 10
      data_type: int16
    - name: Heatpump Number Of Starts H
      slave: 17
      address: 5282
      lazy_error_count: 10
      data_type: int16

The parameters that are writeable are remarked with extra information.
Be aware that if you send a variable that the value needs to be an integer. ie. temperature like 32.5 degrees needs to be sent like 325.

Also keep in mind that ‘control by bus’ needs to be enabled in the installer menu, otherwise it does not respond to modbus writes. External controls are still working ie Digital inputs. (Th Tune is not tested due to that I removed that unit years ago)

Another thing I discovered is that demanding the zones work but keep in mind that these zones need to be ‘open’ or valves that need to be opened first to have flow.

When demanding zones: have the ‘working program by BUS’ set right for the needs ( both (default), heating or cooling) 0 - mixed, 1 - heating, 2 - cooling, 3 - off
Then the target water temperature for heating and/or cooling set per zone.
If those are set, then you can set the ‘BUS x Demand’ with 0 - off, 1 - heating, 2 - cooling

A nice feature is having the ‘Thermal power’ variables to limit the amount of power of the compressor. This can be used while monitoring your solar power and limit heating up the boiler that nearly all power is sourced from the solar panels.
Be carefull with setting these values! Writing wrong values can damage the heatpump.

1 Like