ThermIQ Integration to control Thermia and Danfoss heatpumps

Hello! I’ve been wondering about a few things, perhaps you could help me understand…

What is the (original) purpose of EVU function? I can’t even figure out what it stands for, and Danfoss installation manual only mentions it briefly. It seems activating EVU prevents the compressor, the electric heater, and the flowline pump from running. But how is that functionally different from just putting the heatpump into an “off” mode? How are you using the EVU?

Another thing are the registers d102 Legionella peak heating enable, and d103 Legionella peak heating durations. Can these be used to trigger legionella function? Or is this simply enabling the internal scheduled run?
In my case, both of these registers were (and still are) set to 0. Does that mean the whole anti-legionella functionality is off for me? I haven’t changed the registers through ThermIQ, and these are not even accessible from the screen service menu, so that makes me a bit confused.

The best match for EVU I’ve found is “Elektrizitäts Versorgungs Unternehmen” and it will basically park the heatpump algorithms AND stopp all pumps until released. If adding a 10k resistor you will instead get “Lowered Night temperature” based on your settings in reg 59. ThermIQ-room2 boards with a mechanical switch has this implemented on board.

The benefit, I see think, is that the algorithm will start from where it was. A negative integral will remain and cause an immediate start wheras the OFF function will reset all states in the algorith (including salmonella cycles I believe)

I don’t think you can do that, there are somde discussions that these regs are wrongly named but in spite off better names they keep their current. There are still som exploration to do…

1 Like

Hi!

Started to hook up my two pumps now. Can someone be bothered to paste a correctly formatted yaml here, since the one provided on github is not ok?

This “dashboard” code works on beta version 2.0.2. I have also tested versione 2.0.5 but it did not work for me. Let’s hope there will be an update soon.

type: entities
title: ThermIQ
theme: default
show_header_toggle: false
entities:
  - type: custom:html-template-card
    title: null
    ignore_line_breaks: true
    content: >
      <!-- 
       * ------------------------------------------------------------
       * Copyright (c) 2015 ThermIQ.net 
       * This software is the proprietary information of ThermIQ
       * All Rights Reserved.
       * ------------------------------------------------------------

      Last committed:     $Revision: 847 $
      Last changed by:    $Author: anders $
      Last changed date:    $Date: 2021-10-13 21:12:25 +0200 (ons, 13 okt 2021) $
      ID:            $Id: widget_hp.php 847 2021-10-13 19:12:25Z anders $
      -->
      <style> 
      .hpwidget-val {width:35px;height:16px;background:#a0a0a0;text-align: center;color:white;border-radius: 0.25em;}
      .hpwidget-name-span{}
      .hpwidget-unit-span{text-align:right;overflow:hidden;color:white;font-size:70%}
      @keyframes rotating {to { transform: rotate(1turn); }}
      @keyframes blink { to {visibility: hidden;}}
      </style>

      <div style="height:330px;width:100%;{% if (states('sensor.thermiq_mqtt_vp1_alarm_indication_on')=='on') %}background-color:red;{% endif %}">
      <div style="position:absolute;left:130px;">
      {% if states('sensor.thermiq_mqtt_vp1_hotwaterproduction_on')=='on' %}
      <div><img class="hp_basepict hw" style="position:absolute;top:0px;left:0px;height:300px;" alt="vp missing" src="/local/community/vp_base_hw.jpg" title=""></div>     
      {% else %}
      {% if (states('sensor.thermiq_mqtt_vp1_opt_hgw_installed')=='on') and (states('sensor.thermiq_mqtt_vp1_compressor_on')=='on')  %}
      <div><img class="hp_basepict hgw" style="position:absolute;top:0px;left:0px;height:300px;" alt="vp missing" src="/local/community/vp_base_hgwon.jpg" title=""></div> 
      {% else %}
      <div><img class="hp_basepict base active" style="position:absolute;top:0px;left:0px;height:300px;" alt="vp missing" src="/local/community/vp_base.jpg" title="ThermIQ"></div> 
      {% endif %}    
      {% endif %}    
      <div class="hpwidget-val" title="Time" style="position:absolute;top:303px;left:20px;width:150px;z-index:3;>   <span class="hpwidget-name-span" id="hpwidget-timestamp_d">{{ states('sensor.thermiq_mqtt_vp1_time_str') }}</span><span class="hpwidget-unit-span"></span></span></div>
      <div class="hpwidget-val" title="Brine in" style="position:absolute;top:100px;left:8px;</div>z-index:3;">           <span class="hpwidget-name-span" id="hpwidget-T_BRINE_IN">{{ states('sensor.thermiq_mqtt_vp1_brine_in_t') }}</span><span class="hpwidget-unit-span"> C</span></div>
      <div class="hpwidget-val" title="Brine out" style="position:absolute;top:193px;left:8px;z-index:3;">          <span class="hpwidget-name-span" id="hpwidget-T_BRINE_UT">{{ states('sensor.thermiq_mqtt_vp1_brine_out_t') }}</span><span class="hpwidget-unit-span">&nbsp;C</span></div>
      <div class="hpwidget-val" title="Boiler Temperature" style="position:absolute;top:89px;left:138px;z-index:3;"><span class="hpwidget-name-span" id="hpwidget-T_VATTEN"></span>{{ states('sensor.thermiq_mqtt_vp1_boiler_t') }}<span class="hpwidget-unit-span">&nbsp;C</span></div>
      <div class="hpwidget-val" title="HGW Temperature" style="position:absolute;top:87px;left:76px;z-index:3;     <span class="hpwidget-name-span" id="hpwidget-HGW_VV"></span>{{ states('sensor.thermiq_mqtt_vp1_hgw_water_t') }}<span class="hpwidget-unit-span">&nbsp;C</span></div>
      <div class="hpwidget-val" title="Supply-line Temperature" style="position:absolute;top:131px;left:138px;z-index:3;"><span class="hpwidget-name-span" id="hpwidget-T_FRAM"></span>{{ states('sensor.thermiq_mqtt_vp1_supplyline_t') }}<span class="hpwidget-unit-span">&nbsp;C</span></div>
      <div class="hpwidget-val" title="Supply pump" style="position:absolute;top:257px;left:146px;z-index:3;{% if (states('sensor.thermiq_mqtt_vp1_opt_optimum_installed')=='off') %}display:none;{% endif %}"><span class="hpwidget-name-span" id="hpwidget-CIRK_SPEED"></span>{{ states('sensor.thermiq_mqtt_vp1_supply_pump_speed') }}<span class="hpwidget-unit-span">&nbsp;%</span></div>
      <div class="hpwidget-val" title="Brine pump" style="position:absolute;top:156px;left:8px;z-index:3;{% if (states('sensor.thermiq_mqtt_vp1_opt_optimum_installed')=='off') %}display:none;{% endif %}"><span class="hpwidget-name-span" id="hpwidget-BRINE_SPEED"></span>{{ states('sensor.thermiq_mqtt_vp1_brine_pump_speed') }}<span class="hpwidget-unit-span">&nbsp;%</span></div>
      <div class="hpwidget-val" title="Return line Temperature" style="position:absolute;top:200px;left:146px;z-index:3;"><span class="hpwidget-name-span" id="hpwidget-T_RETUR"></span>{{ states('sensor.thermiq_mqtt_vp1_returnline_t') }}<span class="hpwidget-unit-span">&nbsp;C</span></div>
      <div class="hpwidget-val" title="Pressure pipe Temperature" style="position:absolute;top:125px;left:76px;z-index:3;"><span class="hpwidget-name-span" id="hpwidget-TRYCKR_T"></span>{{ states('sensor.thermiq_mqtt_vp1_pressurepipe_t') }}<span class="hpwidget-unit-span">&nbsp;C</span></div>
      <ha-icon icon="mdi:flash" id="hpwidget-ELEFF" style="color:yellow;position:absolute;top:42px;left:82px;z-index:2;{% if ((states('sensor.thermiq_mqtt_vp1_boiler_3kw_on')=='off') and (states('sensor.thermiq_mqtt_vp1_boiler_6kw_on')=='off') ) %}display:none{% endif %}"></ha-icon>
      <ha-icon icon="mdi:cog" id="hpwidget-KOMPR" style="position:absolute;top:155px;left:70px;--mdc-icon-size:45px;z-index:2;{% if (states('sensor.thermiq_mqtt_vp1_compressor_on')=='on') %}animation: rotating 2s linear infinite;{% endif %}"></ha-icon>
      <ha-icon icon="mdi:fan" id="hpwidget-BRINESPIN" style="position:absolute;top:126px;left:11px;z-index:2;{% if (states('sensor.thermiq_mqtt_vp1_brine_pump_on')=='on') %}animation: rotating 2s linear infinite;{% endif %}"></ha-icon>
      <ha-icon icon="mdi:fan" id="hpwidget-CIRKPSPIN" style="position:absolute;top:228px;left:147px;z-index:2;{% if (states('sensor.thermiq_mqtt_vp1_supply_pump_on')=='on') %}animation: rotating 2s linear infinite;{% endif %}"></ha-icon>
      <ha-icon icon="mdi:alert-circle" id="hpwidget-ALERT" style="color:red;position:absolute;top:42px;left:82px;z-index:120;animation: blink  1s steps(5, start) infinite;{% if (states('sensor.thermiq_mqtt_vp1_communication_status')=='Ok') %}display:none{% endif %}"></ha-icon>
      <ha-icon icon="mdi:stop" id="hpwidget-EVU" style="color:red;position:absolute;top:62px;left:82px;z-index:120;animation: blink  1s steps(5, start) infinite;{% if (states('sensor.thermiq_mqtt_vp1_heatpump_evu_block')=='0') %}display:none{% endif %}">EVU</ha-icon>
      </div>
      </div>

  - entity: input_select.thermiq_mqtt_vp1_main_mode
  - type: custom:numberbox-card
    entity: input_number.thermiq_mqtt_vp1_indoor_requested_t
  # Room sensor only works together with Thermiq-Room ##################################################################
  - type: custom:numberbox-card
    entity: input_number.thermiq_mqtt_vp1_room_sensor_set_t
  - entity: input_number.thermiq_mqtt_vp1_heatpump_evu_block
  - type: custom:fold-entity-row
    head:
      type: section
      label:
    entities:
      - type: custom:fold-entity-row
        head:
          type: section
          label: Main Status
        entities:
          - entity: sensor.thermiq_mqtt_vp1_outdoor_t
          - entity: sensor.thermiq_mqtt_vp1_indoor_t
          - entity: sensor.thermiq_mqtt_vp1_supplyline_t
          - entity: sensor.thermiq_mqtt_vp1_returnline_t
          - entity: sensor.thermiq_mqtt_vp1_boiler_t
          - entity: sensor.thermiq_mqtt_vp1_integral1
          - entity: sensor.thermiq_mqtt_vp1_brine_out_t
          - entity: sensor.thermiq_mqtt_vp1_brine_in_t
          - entity: sensor.thermiq_mqtt_vp1_supply_shunt_t
          - entity: sensor.thermiq_mqtt_vp1_cooling_t
          - entity: sensor.thermiq_mqtt_vp1_supply_pump_speed
          - entity: sensor.thermiq_mqtt_vp1_brine_pump_speed
      - type: custom:fold-entity-row
        head:
          type: section
          label: Runtimes
        entities:
          - entity: sensor.thermiq_mqtt_vp1_compressor_runtime_h
          - entity: sensor.thermiq_mqtt_vp1_boiler_3kw_runtime_h
          - entity: sensor.thermiq_mqtt_vp1_boiler_6kw_on_runtime_h
          - entity: sensor.thermiq_mqtt_vp1_hotwater_runtime_h
          - entity: sensor.thermiq_mqtt_vp1_passive_cooling_runtime_h
          - entity: sensor.thermiq_mqtt_vp1_active_cooling_runtime_h
      - type: custom:fold-entity-row
        head:
          type: section
          label: Heater settings (A1)
        entities:
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_indoor_requested_t
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_integral1_curve_slope
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_integral1_curve_min
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_integral1_curve_max
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_integral1_curve_p5
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_integral1_curve_0
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_integral1_curve_n5
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_heating_stop_t
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_reduction_t
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_room_factor
      - type: custom:fold-entity-row
        head:
          type: section
          label: Hot-water settings
        entities:
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_hotwater_start_t
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_hotwater_runtime_m
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_heatpump_runtime_m
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_legionella_interval_d
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_legionella_stop_t
      - type: custom:fold-entity-row
        head:
          type: section
          label: Curve 2 (A2)
        entities:
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_integral2_curve_slope
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_integral2_curve_min
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_integral2_curve_max
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_integral2_curve_target
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_integral2_curve_actual
      - type: custom:fold-entity-row
        head:
          type: section
          label: Heater limits
        entities:
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_integral1_a_limit
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_integral1_hysteresis_t
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_returnline_max_t
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_start_interval_min_m
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_brine_min_t
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_pressure_pipe_limit_t
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_outdoor_stop_t
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_cooling_target_t
      - type: custom:fold-entity-row
        head:
          type: section
          label: Curve 2 limits
        entities:
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_integral2_a_limit
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_integral2_hysteresis_t
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_elect_boiler_steps_max
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_current_consumption_max_a
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_shunt_time_s
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_hotwater_stop_t
      - type: custom:fold-entity-row
        head:
          type: section
          label: Misc control
        entities:
          - entity: sensor.thermiq_mqtt_vp1_language
          - entity: sensor.thermiq_mqtt_vp1_manual_test_mode_on
          - entity: sensor.thermiq_mqtt_vp1_factory_reset_req
          - entity: sensor.thermiq_mqtt_vp1_runtime_counters_reset_req
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_outdoor_sensor_offset_t
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_supplyline_sensor_offset_t
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_returnline_sensor_offset_t
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_boiler_sensor_offset_t
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_brine_in_sensor_offset_t
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_brine_out_sensor_offset_t
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_heatingsystem_type
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_internal_logging_t
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_brine_runout_t
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_brine_run_in_t
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_legionella_run_on
          - type: custom:numberbox-card
            entity: input_number.thermiq_mqtt_vp1_legionella_run_length_h

1 Like

Thanks! Running 2.0.5 so I’ll have a look at it tomorrow to see how it is here.

I can’t see any obvious problems with the lovelace in 2.0.5. Just tried a copy paste from github into HA which looks good, at least form me.

Could it be that you are editing in the wrong place? You should do it as stated in the top of lovelace file…

# ################################################
# ##### ThermIQ Lovelace config. Add in Raw configuration editor

In HA do “Edit Dashbord” - “Raw configuration editor”, then copy and paste the lovelace file. Please replace _vp1 with _yourid if you customize your install or if adding more than one instance.

@ThermIQ The formatting in the file from github is incorrect.

@RH_Dreambox What didn’t work for you? I’ve looked at it now, and those things I tried was functional. Any specifics I can look for to see if I get the same?

@eirik_nor Which formatting? Is there some mismatch with unix/dos lineends or?

@ThermIQ
When I, eirik_nor and most others create an object in the dashboard, we create it via the GUI and then the code from Github doesn’t work until it’s cleaned of unwanted characters.
Copying in the code as you suggest works, but I want more control over what I do because programming is not my best skill :slight_smile:
And the reason I write Dashboard is because the name Lovelace is no longer used.

I’m also going to try upgrading to 2.0.5 again, but previous attempts have ended with the interface running amok and the heat pump switching to electric power.
EDIT
Now I tried again to update to 2.0.5 and it seems to work now. Maybe I did something wrong before.

Then I tried copying the Lovelace config directly into the raw configurator, but it didn’t work.
I got this error message…

Det går inte att analysera YAML: YAMLException: bad indentation of a mapping entry (2003:13) 2000 | badges: [] 2001 | cards: [] 2002 | title: Tablet i hallen 2003 | - type: entities --------------------^ 2004 | title: ThermIQ 2005 | theme: default
1 Like

Ok,
If you want to add it as a “Add Card → Manual” the you currently have to unindent the lovelace_config file so that the first line starting with “-type: entities” appears without indentation.

There seems to be a bit of change ongoing, lovelace → dashboard as well as some new inbuilt statistics etc. I will put these fixes on the backlog and continue makeing sure the base functionality of the integration is working ok.

1 Like

After looking at the integration for a few moments now and start to use it, there is two things:

  1. Missing unique_id for enteties. Then we can’t set more suitable names for each value.

  2. Service calls, where are they?

I might get time later today to include HP#2 and see how it functions with two separate.

Second HP integration went well, at least after a restart.

Hi Anders. Can you tell if the bus is UART or I2c?

@ThermIQ
You have mentioned on your ThermIQ forum that if I want a “night-time temperature drop”, then I should do this by lowering the “Room indoor target temp”.
But if I instead connect the ThermIQ-ROOM2 EVU (307-308) in series with a 10 kOhm resistor, won’t I get a “night-time temperature drop” function when the EVU is activated?
Or is the ThermIQ EVU only intended to turn off the heat pump?

EVU function by adding a 10k resistor you will instead get “Lowered Night temperature” based on your settings in reg 59. ThermIQ-room2 boards with a mechanical switch has this 10k resistor implemented on board. Look at the labeling of the switch…

@ThermIQ
Two follow-up questions…

  1. My ThermIQ-ROOM2 (3 months old) has no extra switch as you mention. Is there another model that has this switch or do I have an old model?
    EDIT
    Now I see that there is an LP model with an extra switch.

  2. Possible bug.
    I tested activating the EVU (without external resistor) and then the heat pump stopped immediately which is correct.
    When I then deactivated the EVU, the pump started again, but now there is a red flashing square in the top window of the animation.
    In the WEB interface there is no flashing square which I think is correct.
    So what does the flashing square mean?
    EDIT
    The red flashing square disappeared after HA restart.

The red square is supposed to mean “stopped” and should be blinking as long as EVU is acitve. AND There’s a bug here, will fix…

The thermiq hw has gone through a couple of rapid changes during 2022 to accommodate for the explosive interest in energy monitoring. The new “daughterboard” kind of solution has the switch whereas the “cableconnected” solution exists in two version with one having a black jumper which can be removed for “10k mode”, the other not.

The “10k mode” is as of to today not advertised as a feature for any of the versions but might be there.

The new generation of thermia pumps, Atlas etc, are modbus whereas previous generations have mostly proprietary interfaces. I suggest asking Thermia for specs.

@ThermIQ
Is it possible to update the MQTT values from ThermIQ more regularly?
I log values to Influx in HA but some values are updated extremely rarely so there are big gaps in the graphs (up to 4 hours for some values).
It would be best if they were always updated every minute.

If you look at the MQTT message you will see that all values are Sent every 30s. The ThermIQ integration updates with every message, what happens after that is beyond my understanding