Integration of heatpump „iDM Terra ML Complete HGL“

The calculation of “PV geschätzte Produktion” is the default plugin for getting forecast values of my geo data. There is a webservice who tells me how long and how strong the sun will shine for my geo data. So nothing important for transfer the PV values between the IDM and your PV inverter.

take this:

  • name: idm_Wohnhimmer_feucht
    slave: 1
    offset: 0
    unit_of_measurement: Prozent
    unique_id: 123r3feucht123
    address: 2020
    data_type: uint16
    scan_interval: 11
    swap: word

Thanks, but it didn’t work :cry:

Does anyone of you guy have a updated modbus tcp register dokumentation? I need to send room temp and humidity from knx to the idm modbus to get cooling working. The Tapko SIM-KNX isnt working…

I tried several iterations, finally for me the following addition worked:

modbus:
  - name: idm_lwp
    type: tcp
    host: 192.168.0.23
    port: 502
    sensors:
      - name: AussentemperaturIDM
        slave: 1
        scale: 1
        offset: 0
        unit_of_measurement: °C
        address: 1000
        input_type: input
        data_type: float32
        scan_interval: 10
        count: 2
        precision: 1
        swap: word

New is: input_type: input

Hopefully this helps anybody else also…

Hi Community…
I just implemented the IDM Integration of @SimowN in Homeassistant with my idm SWM6-17
Everything up and working, great job @SimowN

I read data (e.g. temperatures) and also write the PV values via modbus.write_register
My problem:
I want to trigger the source pump seperatly via modbus…via adress 1714… and it did not work up to now.

my scripts.yaml looks like this:

idm_update_pv_values:
  alias: Update Photovoltaik values to IDM Headpump
  sequence:
  - service: modbus.write_register
    data:
      hub: idm_wp
      unit: 1
      address: 74
    data_template:
      value: >
        [ {{ unpack(pack(states("sensor.haus_pv_ueberschuss_skal")|float, ">f"), ">H", offset=2) }}, 
          {{ unpack(pack(states("sensor.haus_pv_ueberschuss_skal")|float, ">f"), ">H") }} ]

  - service: modbus.write_register
    data:
      hub: idm_wp
      unit: 1
      address: 78
    data_template:
      value: >
        [ {{ unpack(pack(states("sensor.haus_pv_aktuell")|float, ">f"), ">H", offset=2) }}, 
          {{ unpack(pack(states("sensor.haus_pv_aktuell")|float, ">f"), ">H") }} ]
  mode: single
  
idm_start_brunnenpumpe:
  alias: external start source pump IDM Heatpump
  sequence:
  - service: modbus.write_register
    data:
      hub: idm_wp
      unit: 1
      address: 1714
    data_template:
      value: >
        [ {{ unpack(pack("1"|int, ">i"), ">B", offset=2) }}, 
          {{ unpack(pack("1"|int, ">i"), ">B") }} ]
  mode: single
  
idm_stop_brunnenpumpe:
  alias: external stop source pump IDM Heatpump
  sequence:
  - service: modbus.write_register
    data:
      hub: idm_wp
      unit: 1
      address: 1714
    data_template:
      value: >
        [ {{ unpack(pack("0"|int, ">i"), ">B", offset=2) }}, 
          {{ unpack(pack("0"|int, ">i"), ">B") }} ]
  mode: single

So source pump can be started via script “idm_start_brunnenpumpe” but cannot be stopped with “idm_stop_brunnenpumpe” … I assume it has something to do with datatypes and values… it was trial and error so far, I dont know much about modbus protocoll and data types and pack and unpack :wink:

Any advice would be highly appreciated :slight_smile:

Thx, i updated my sources for everyone: GitHub - simowNgithub/Homeassistant-IDM-Integration: I did a complete integration by modbus. I transfer the photovoltaik data from my SMA Tripower to the IDM Terra SW8 Complete HGL Sole-Wärmepumpe with Navigator 2.0.

Thanks a lot for your implementation @SimowN - I recently updated to the newest release of HA 2023.10.0 and this breaks the modbus - solution is to remove the count: 2 from the configuration file.

1 Like

@KVS Tanks for the info. Works for me to! Just trying to integrate my 7 years old IDM TERRA ML 6-8 into homeassistant. Any help for the modbus registers is appreciated… to be honest… i have no clue about modbus and querying it :innocent:

hi ,
i’m currently trying to get values from my idm heatpump with navigator 1.7 via modbus into ha.
works quite ok but with one address i have a “problem” with the reported values
heres the config:

      - name: "IDM_Betriebsart_Wärmepumpe"
        slave: 1
        scale: 1
        offset: 0
        address: 1501
        data_type: uint16
        input_type: input
        scan_interval: 300

here’s the description from the manual:

but i get following values reported in ha:
“Vorrang” which should be 4 is 1028
“Heizen” which should be 1 is reported as 257

but since i’m by far no expert in modbus protocol i would really appreciate any hints if i did something wrong in the configuration…

thanks in advance!

Hi @BombusAlpinus ,

I assume the data type is wrong. But also wanted to share that if you divide 1028 / 257 that equals 4 (and 257 / 257 = 1). If You see that Kühlen equals 517, I guess you could also create a template sensor, which You may want to do anyway to have the String display rather than the numeric value.

Regards

hey, thanks for the reply… in the meantime i’ve already created a template displaying a string based on the “wrong” values. but the hint for dividing by 257 is interesting. unfortunately we are only using Off (0), Heizen (1/257), Vorrang (4/1028) so i’m not able to verify your assumption regarding the values for Kühlen (2) and Abtauen (8).
the other sensors which are providing values between 0 and 4 are working fine with the data_type uint16:

they are also defined with uchar in the idm document:
image

maybe because of the different register… don’t know.
but i can live with the template and displaying the string instead of the numbers
regards
hans

Hi @BombusAlpinus,

I understand You’re also an owner of a IDM Terra heatpump running Navigator v1.7.

Are You also interested in passing excess energy from a photovoltaic system into the heatpump (PV-Überschuss für Überhöhung der Wärmepump)? If yes, I’d be interested in what the Modbus registers are, which You’re accessing for this.

Actually, now that I think about it, the question goes to anybody reading this:
What are the Modbus registers incase of Navigator 1.7 to read / set excess energy from PV? I read something of 74, 78 and / or 4122, but I seemingly don’t get values from that.

Regards

i got information from idm support that this are the registers for connecting heatpump and pv system for e.g. “Überschussladung”.

These registers are missing in the original docs because they where included in a later state.

i configured them but i’m also not getting any values from this registers.
e.g. config of register 4122 - “Aktuelle Leistungsaufnahme Wärmepumpe”

image

and here’s the description:

unfortunately i get no values:

there is also the possibility that my config is incorrect… /me “no modbus expert” :wink:

i scheduled a system maintenance (last was several years ago) with an technician on november the 9th which also includes updating to the latest firmware if there is any. they could do it remotely but they prefer it on-site in case something breaks. the support also told me that the newer 1.7 versions improved the heatpump - pv cooperation.

maybe i will get more informations during this maintanance…
if so i will report back

regards

Same here… no way near an expert for Modbus. Trying my best to compile a configuration that works. So far just a couple of sensors - just for having them.

Now, things get more serious with actually having a PV system on the roof. For this, I want to achieve the benefit of properly combined heatpump and PV system.

I‘ve been researching quite a lot recently. Specifically the openwb-forums indicate that that software orchestrates chargers, heatpumps and other high-wattage devices. According to a couple of posts I see that IDM heatpumps with Navigator v1.7 are supported. Unfortunately, I can’t get openWB to run on my existing Raspberries.

Attaching a screenshot of my firmware version, which was installed in September '22:

Keep me posted on the outcomes of the firmware update. I have just sent a request to IDM to enable Modbus in the „Fachmannebene“. I assume You already have that, right?

mine was installed in the beginning of 2017 and as far as i can remember there was no update of the fw in the meantime. my version:

image

as far as i know activating of modbus by idm support is mandatory for using modbus tcp with the idm heatpump and yes i’ve done this when my pv got installed in spring this year.

IDM has updated my heatpump to allow for ModBus connectivity. I can read values now on 4122. Over the course of the weekend and if the weather permits, I will try to tinker with the other register to set the PV surplus.

Any updates on your end, @BombusAlpinus? Did the update happen? Do You now make use of the PV surplus?

unfortunately not. technician had an emergency and we switched the maintenance to 16th of november.

Hi All,
I just managed to solve my problem recently:

Problem was to get the water source pump to start and stop via modbus… in the docu there were no hints which message to send to the modbus register…

Solution was “1” for start and “-1” for stop :slight_smile: :slight_smile: sounds quite easy :slight_smile:
here my current working scripts.yaml:

#########################################

idm_start_brunnenpumpe:
  alias: idm_start_brunnenpumpe
  sequence:
  - service: modbus.write_register
    data:
      hub: idm_wp
      unit: 1
      address: 1714
    data_template:
      value: >
         [ {{ unpack(pack("1" |float, ">f"), ">B", offset=2) }}, 
           {{ unpack(pack("1" |float, ">f"), ">B") }} ]
  mode: single
  
idm_stop_brunnenpumpe:
  alias: idm_stop_brunnenpumpe
  sequence:
  - service: modbus.write_register
    data:
      hub: idm_wp
      unit: 1
      address: 1714
    data_template:
      value: >
         [ {{ unpack(pack("-1" |float, ">f"), ">B", offset=2) }}, 
           {{ unpack(pack("-1" |float, ">f"), ">B") }} ]
  mode: single
  

Thanks, @yeti0815, that’s interesting. I have managed to instruct my IDM heatpump to use PV surplus, too. For now at least by the help of a similar script. But, my plan is to automate this either through HA or alternatives (evcc, openWB).

I see that You’re using a {{ unpack(pack("-1" |float, ">f"), ">B", offset=2) }}, {{ unpack(pack("-1" |float, ">f"), ">B") }} in order to set the array, which my scripts currently are setting with hard-coded values, which in turn were manually determined by the help of some online calculators.

Assuming that this is working the same way (conversion of decimal value to a hex-based float32) is there no simpler way to determine the array’s tuples or the array itself?