Controlling Ecoforest heatpumps via Modbus

You are mixing 2 systems together.
Node Red is not needed to read the data.

The entities you made in Node Red need to be in the configuration.yaml file.
There you first make a modbus group, then a sensor group and in that group you put the entities you want to have visible in HA.
For example see my working solution in an earlier post.

Hello, can you Post what device you have take to have this UI?

Hey Niels nice work! Can you say me what device you have take to control you eco forest heat pump?

I am only reading the BMS port but can be controlled with the same device. I am using a USB to rs485 interface. But any rs485 interface (ie. Ethernet/TCP) can work.

Hello Nielss i was on holiday. Ok i don’t know the modbus protocol. Can I only read the data or can I command(turn on the HP, change the temperature)? Nice Day

I have spent some time to figure out if I can control the HP. I got some progress but did not work out well with HA talking to the bus.
I enabled the Modbus control in the HP via the installermenu and it looks like the heatpump does work with BMS and external control (Digital inputs for DG1, SG2-4) simultaneous.
With HA I switched on the DHW but then the start temperature changes to -5 C and could not change it to something different. Turning off changed it back to the earlier start temperature.

So if anybody else would give it a try to control it by Modbus, you’re welcome :sunglasses:

I got some progress in controlling the heatpump via the bus.

First note: controlling the heatpump by bus AND digital inputs for heating/cooling works!

Second note: before the heatpump responds to commands via Modbus, you first need to enable ‘remote control by bus’ in the installer menu.

Then you need to send via Modbus that you want to ‘control by bus’: send a ‘1’ to address 5221. (To disable it you can send a ‘0’ )


I got the DHW working by enabling parameter 5222 (set it to ‘1’ to enable DHW demand)
Then you need to set the target temperature at parameter 134 with the desired value.

A thing I mentioned while enabling the control by bus is that the combined heating and cooling demand switched to heating only. I could not figure out what to set to make it combined and/or to cooling. If anyone finds the parameter or knows how to control, you’re welcome.


I also found a few parameters that are not documented by Ecoforest:

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

(not sure if int16 is ok in this setup)

And for the distribution pumps:

    - 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

(I have added the lazye error counts to suppress the no_data read from bus errors and giving ‘unavailable’ as value in the logs.)

2 Likes

Almost a year later, I have an ecoforest on order, And also have got a list of modbus registers for the Ecoair and Ecogeo from an installer here. Wont be able to properly work at things until I actually get it installed.

I am still fairly new to homeassistant and yaml Have the basics down but still learning. but have worked with others work with modbus (mainly the sofar2mqtt project.)

I have HA running in a VM but have access to Pi’s and esp32’s that can do the RS485. I have also some experience with ESPhome.

Just looking for some advice moving forwards. I suppose a ESPhome could be more turnkey for other users (although would require building some hardware.)

Looks like the geothermal and airsource seem to have slightly different modbus addresses for some things, Need to keep an eye on.that.

For me it is figuring out how to control the heatpump via modbus. There is not a lot of info on the internet. With the info I can find I will post it here after figuring out which parameters have which function.

How to proceed with the information: let’s figure out together and see what is possible.
To me, WiFi is not stable enough to fully control a machine. But if ESPHome can run stand-alone, then why not? Then all logic needs to be in ESPHome and makes it more difficult to maintain.

For me the datalogging was the first approach. Second is controlling the system remote.
If somebody has advise or ideas, let’s put them together.

1 Like

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

Thats great work. Do you have a geothermal or Air to water? (Im getting Air to Water)

ESPhome, would need an esp and a rs485 board, but would be wifi connection. I’m using esp8266 and that for my control of my sofar inverter without issue. ( but not via home assistant, I was using that pre home assistant.)

Mine wont be that close to my HA install which is also running in a VM.

Possibly looking into how the sunsynk addon is doing it. ( Getting Started | Deye/Sunsynk), But that add on is built in python.

Can use mbusd to take a RTU modbus and convert it to TCP.

They do sell a solar excess controller, have been told that it could match the excess coming from solar.

I think what your building currently using the in built modbus in home assistant is currently the best way to go currently to get everything figured out.

Unfortunately cant dabble too much until I get it installed.

How are you writing to the registers within home assistant?

I have an air to water version. Maybe I will convert it to hybrid.
Where I live is the level of ground water within one meter and have a horizontal source.

For writing modbus you can use a service: Modbus Write service.
I am not sure if I am going to use the HA automations. Maybe NodeRed (or a mix of them)

I used a USB to RS485 converter that is on VMWare connected. The twisted pair is around 8 meters to the heatpump. Other devices I read are connected with an EPS8266 for the solarpanels with GoodWeLogger which I maybe switch to an ethernet solution which can control the solarinverter via HA. And a few kWh meters that are also via USB on the VMWare.

I think at some point a github page could be made with the yaml code for all the registers.

I have thrown together a RTU to Modbus TCP bridge with a tasmota and a rs485 board I had to hand, I will keep experimenting with it with the sofar inverter I have to hand. [will need it for a Deye inverter I have ordered anyway]

Started looking into how to create an integration but that is currently beyond me, although a ESPHome device may be doable.

Hello Niels,

Can you confirm the protocol RS232 or RS485?
Because i am on the point to order a converter to TCP

And I have problem with implanting the code on the Yaml maybe you have also a solution for this.

The system cannot restart because the configuration is not valid: Component error: modbus - cannot import name ‘ModbusBaseClient’ from ‘pymodbus.client’ (/usr/local/lib/python3.11/site-packages/pymodbus/client/init.py)

No Hands on here yet, but as far as I know its RS485, Modbus over rs232 is possible but its not the done thing.

What heatpump do you have? the EcoAir+ has slightly different registers than the EcoGeo.

I have put together an untested, readonly esphome device. can put it up on git hub if interested

1 Like

As mentioned by @graememk it is RS485

Your config looks like there is something missing or has wrong indents.
Can you post your complete yaml? (remove passwords and other personal information)

Hi Niels,

Thanks for the answer about the RS version. And her is my compleet YAML file. Maybe you see the problem.

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

rflink:
port: /dev/serial/by-id/usb-Arduino__www.arduino.cc__Arduino_Mega_2560_12252601009322316566-if00
wait_for_ack: false
light:

  • platform: rflink
    automatic_add: true
    sensor:
  • platform: rflink
    automatic_add: true
    logger:
    default: error
    logs:
    rflink: debug
    homeassistant.components.rflink: debug
    cover:
  • platform: rflink
    devices:
    brelmotor_064770_05:
    name: Zonneluifel

utility_meter:
util_water_usage_hourly:
source: sensor.water_total
cycle: hourly
util_water_usage_daily:
source: sensor.water_total
cycle: daily
util_water_usage_monthly:
source: sensor.water_total
cycle: monthly
util_water_usage_yearly:
source: sensor.water_total
cycle: yearly

modbus:

  • name: “ecoforest”
    delay: 5
  • name: “hub1”
    type: rtuovertcp
    host: IP_ADDRESS
    port: 502

Can you put the yaml into a ‘preformatted text’ block? You can do that by clicking the </> on top of the editor.
The code is now missing indents and has markups that do not exist in yaml.

# 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

rflink:
  port: /dev/serial/by-id/usb-Arduino__www.arduino.cc__Arduino_Mega_2560_12252601009322316566-if00
  wait_for_ack: false
light:
  - platform: rflink
    automatic_add: true
sensor:
  - platform: rflink
    automatic_add: true
logger:
  default: error
  logs:
    rflink: debug
    homeassistant.components.rflink: debug
cover:
  - platform: rflink
    devices:
      brelmotor_064770_05:
        name: Zonneluifel

utility_meter:
  util_water_usage_hourly:
    source: sensor.water_total
    cycle: hourly
  util_water_usage_daily:
    source: sensor.water_total
    cycle: daily
  util_water_usage_monthly:
    source: sensor.water_total
    cycle: monthly
  util_water_usage_yearly:
    source: sensor.water_total
    cycle: yearly

modbus:
  - name: "ecoforest"
    delay: 5
  - name: "hub1"
    type: rtuovertcp
    host: IP_ADDRESS
    port: 502
    binary_sensors:
    - name: heatpump_alarm
      slave: 17
      address: 50
    - name: Heatpump Summer
      slave: 17
      address: 127
    - name: Heatpump Winter
      slave: 17
      address: 128
    sensors:
    - name: Heatpump Buitentemperatuur
      unit_of_measurement: °C
      scale: 0.1
      precision: 1
      slave: 17
      address: 11
      data_type: int16
    - name: Heatpump Boiler
      unit_of_measurement: °C
      scale: 0.1
      precision: 1
      slave: 17
      address: 8
      data_type: int16
    - name: Heatpump Pressure Brine
      unit_of_measurement: Bar
      scale: 0.1
      precision: 1
      slave: 17
      address: 13
      data_type: int16
    - name: Heatpump Pressure Heating
      unit_of_measurement: Bar
      scale: 0.1
      precision: 1
      slave: 17
      address: 14
      data_type: int16
    - name: Heatpump Brine air outlet
      unit_of_measurement: °C
      scale: 0.1
      precision: 1
      slave: 17
      address: 29
      data_type: int16
    - name: Heatpump Brine out
      unit_of_measurement: °C
      scale: 0.1
      precision: 1
      slave: 17
      address: 1
      data_type: int16
    - name: Heatpump Brine in
      unit_of_measurement: °C
      scale: 0.1
      precision: 1
      slave: 17
      address: 2
      data_type: int16
    - name: Heatpump Heating out
      unit_of_measurement: °C
      scale: 0.1
      precision: 1
      slave: 17
      address: 3
      data_type: int16
    - name: Heatpump Heating in
      unit_of_measurement: °C
      scale: 0.1
      precision: 1
      slave: 17
      address: 4
      data_type: int16
    - name: Heatpump Compressor suction temperature
      unit_of_measurement: °C
      scale: 0.1
      precision: 1
      slave: 17
      address: 5
      data_type: int16
    - name: Heatpump Compresor suction pressure
      unit_of_measurement: Bar
      scale: 0.1
      precision: 1
      slave: 17
      address: 6
      data_type: int16
    - name: Heatpump Compressor discharge pressure
      unit_of_measurement: Bar
      scale: 0.1
      precision: 1
      slave: 17
      address: 7
      data_type: int16
    - name: Heatpump Condensation temperature
      unit_of_measurement: °C
      scale: 0.1
      precision: 1
      slave: 17
      address: 94
      data_type: int16

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

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

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


    - name: Heatpump Compressor RPM
      unit_of_measurement: RPM
      slave: 17
      address: 5002
      data_type: int16
    - name: Heatpump Scroll temperature
      unit_of_measurement: °C
      slave: 17
      address: 5004
      data_type: int16
    - name: Heatpump Inverter temperature
      unit_of_measurement: °C
      slave: 17
      address: 5005
      data_type: int16
      
    - name: Heatpump Working Hours L
      slave: 17
      address: 5080
      data_type: int16
    - name: Heatpump Working Hours H
      slave: 17
      address: 5081
      data_type: int16

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

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

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

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