Skip to content

Itho WPU Heat pump support

Arjen Hiemstra edited this page Oct 3, 2024 · 29 revisions

Requirements

  1. A supported Itho heat pump, e.g. WPU 5G 5.5kW, WPU 4G.
    Other versions / prior generations may work but have not been tested yet.
  2. Non-CVE add-on obtained from NRG Watch
  3. In case of problems, check for a newer version of the add-on firmware, e.g. by using the Web-Interface

Installation

  1. Connect the non-CVE add-on via a straight UTP cable (e.g. CAT5E/CAT6) to the black service socket on the heat-pump.
    Do NOT connect a UTP cable from the WPU unit to your laptop!
  2. Perform further configuration via the web page of the add-on: join existing WiFi network, MQTT as per non-CVE guide.

Tweakers forum about the add-on and WPU:

There is a special topic about this add-on and usage with the WPU with a lot of information: Tweakers.net WPU topic

Functionality:

Supported

  1. All operational parameters in the status page.
  2. Used electric energy (kWh) per mode (boiler, heating, cooling, standby)
    Note: Electric energy is not (or may not be) available in units sold from 2023 (hardware version 78). It is confirmed to work on hardware version 76 (2022).
  3. WPU counters: Runtime, number of compressor starts etc.
    Note: Must be enabled separately (see below)
  4. View device type / version (Under debug)
  5. Experimental features (see below)

Unsupported

For now:

  1. Control of temperature and heating preference
    Using manual control (see below) it is possible to block and enable heating/cooling/DHW at will.
  2. Anything related to fan speed on the add-on web page.

WPU Counters

The WPU records counters (depending on firmware version), which can be viewed when enabled in system settings.

Enable counters (4210) in i2c commands on the system settings page in the webinterface:

image

polling frequency can be set separately for counters in the system settings page. The default is 3600 seconds, one hour, as counter data does not need to be polled as frequently as other status info, and the i2c bus is quite overloaded as it is. It is recommended to keep the polling interval large.

When enabled the counter information is visible in the status page (after the first poll) and it is also added to the ithostatus MQTT message.

Example: (note that depending on the WPU firmware version, not all rows may be visible)

image

E-consumption is only available in WPU firmware >= 34. Source energy is only available in WPU firmware >= 37.

Note that the used electrical energy is in kWh * 10, and is reported in normal kWh in the normal status message. This info can be considered obsolete and can be disregarded. The energy to/from source seems to be in kWh * 10 as well (MWh/100).

If there is no counter information in the status page, you can use the "Query Counters" button on the Debug page to poll counters. When the command is succesful (reply is visible on the debug page) counters should be added to status page and MQTT.

Home assistant integration

Example config for sensors measuring pressure, temperature in boiler, room, CV supply and return temp, status, boiler mode (e.g. Eco / Comfort) and kWh total to date. It is possible to calculate via Home Assistant the daily kWh usage.
The WPU Power Used sensor can be used with the Energy dashboard too. Adjust sensors to meet your own requirements.

The below works with the current 2.3.5 version

mqtt:
  sensor:
    - name: "Itho WPU CV Pressure"
      state_topic: "itho/ithostatus"
      value_template: "{{ value_json['CV pressure (Bar)'] }}"
      unique_id: "itho_wpu_bar"
      state_class: "measurement"
      device_class: "pressure"
      unit_of_measurement: "bar"

    - name: "Itho WPU Flow rate (l/h)"
      state_topic: "itho/ithostatus"
      value_template: "{{ value_json['Flow sensor (lt_hr)'] }}"
      unique_id: "itho_wpu_flowrate"
      state_class: "measurement"

    - name: "Itho WPU CV Return"
      state_topic: "itho/ithostatus"
      value_template: "{{ value_json['CV return temp (°C)'] }}"
      unique_id: "itho_wpu_cv_return"
      state_class: "measurement"
      device_class: "temperature"
      unit_of_measurement: "°C"

    - name: "Itho WPU Status"
      state_topic: "itho/ithostatus"
      value_template:  >
          {% set st = value_json.Status| int %}
          {% if st == 0 %}
          init
          {% elif st == 1 %}
          off
          {% elif st == 2 %}
          cv
          {% elif st == 3 %}
          boiler
          {% elif st == 4 %}
          cooling
          {% elif st == 5 %}
          venting  
          {% endif %}
      unique_id: "itho_wpu_status"

    - name: "Itho WPU Boiler temp"
      state_topic: "itho/ithostatus"
      value_template: "{{ value_json['Boiler temp up (°C)'] }}"
      unique_id: "itho_wpu_boiler_temp"
      state_class: "measurement"
      device_class: "temperature"
      unit_of_measurement: "°C"
  
    - name: "Itho WPU CV Supply"
      state_topic: "itho/ithostatus"
      value_template: "{{ value_json['CV supply temp (°C)'] }}"
      unique_id: "itho_wpu_cv_supply"
      state_class: "measurement"
      device_class: "temperature"
      unit_of_measurement: "°C"

    - name: "Itho WPU Requested temp"
      state_topic: "itho/ithostatus"
      value_template: "{{ value_json['Requested room temp (°C)'] }}"
      unique_id: "itho_wpu_cv_req_temp"
      state_class: "measurement"
      device_class: "temperature"
      unit_of_measurement: "°C"

    - name: "Itho WPU Temp from source"
      state_topic: "itho/ithostatus"
      value_template: "{{ value_json['Temp from source (°C)'] }}"
      unique_id: "itho_wpu_temp_from_source"
      state_class: "measurement"
      device_class: "temperature"
      unit_of_measurement: "°C"

    - name: "Itho WPU Temp to source"
      state_topic: "itho/ithostatus"
      value_template: "{{ value_json['Temp to source (°C)'] }}"
      unique_id: "itho_wpu_temp_to_source"
      state_class: "measurement"
      device_class: "temperature"
      unit_of_measurement: "°C"
    
    - name: "Itho WPU Total Power Used"
      state_topic: "itho/ithostatus"
      value_template: >
        {% if is_number(value_json['E-consumption during stand-by (kWh)']) %}
        {{ (value_json['E-consumption during stand-by (kWh)']| float + value_json['E-consumption during DHW (kWh)']| float + value_json['E-consumption during heating (kWh)']| float + value_json['E-consumption during cooling (kWh)']| float) | float }}
        {% else %}
        None
        mqtt{% endif %}
      unique_id: "itho_wpu_total_energy"
      state_class: "total"
      device_class: "energy"
      unit_of_measurement: "kWh"
  
    - name: "Itho WPU Current Room temp"
      state_topic: "itho/ithostatus"
      value_template: "{{ value_json['Room temp (°C)'] }}"
      unique_id: "itho_wpu_roomtemp"
      state_class: "measurement"
      device_class: "temperature"
      unit_of_measurement: "°C"

    - name: "Itho WPU CV pump percent"
      state_topic: "itho/ithostatus"
      value_template: "{{ value_json['Cv pump (%)'] }}"
      unique_id: "itho_wpu_cv_pump"
      state_class: "measurement"
      unit_of_measurement: '%'

    - name: "Itho WPU Source pump percent"
      state_topic: "itho/ithostatus"
      value_template: "{{ value_json['Well pump (%)'] }}"
      unique_id: "itho_wpu_well_pump"
      state_class: "measurement"
      unit_of_measurement: '%'

    - name: "Itho WPU Thermostat mode"
      state_topic: "itho/ithostatus"
      value_template: >
          {% if value_json['ECO selected on thermostat']  == 1 %}Eco{% endif %}
          {% if value_json['Comfort selected on thermostat'] == 1 %}Comfort{% endif %}
          {% if value_json['Boiler boost from thermostat'] == 1 %}Boost{% endif %}
          {% if value_json['Venting from thermostat']  == 1 %}Venting{% endif %}
          {% if value_json['Tariff low from thermostat'] == 1 %}Low{% endif %}
          {% if value_json['Boiler blocked from thermostat'] == 1 %}Off{% endif %}
      unique_id: "itho_wpu_thermostat_mode"

To report on daily usage in kWh, configure the utility meter in configuration.yaml

utility_meter:
  energy_wpu:
    source: sensor.itho_wpu_total_power_used
    cycle: daily
    name: Daily WPU power use

This is generated daily and it can take a day before the calculation is available.

Experimental features:

Outside temperature

The WPU can recieve outside temperature information from a monitoring service, when no sensor is present. We can set the outside temp in the WPU by spoofing this i2c command (i2c message class CE30). The WPU main Spider will transmit this outdoor temperature to paired Autotemp units.

Note

The WPU might already receive the outside temperature via a contract with a company, e.g. often Klimaatgarant for The Netherlands.

Outside temperature can be set in de Debug menu using the CE30 button and via MQTT. Example MQTT command (topic: itho/cmd)

{
   "outside_temp": 12
}

Optionally one can set a temporary temperature that will be valid until the specified unix timestamp. After the timestamp, the temperature will fall back to the specified outside temp.

{
   "outside_temp": 4
   "temporary_outside_temp": 10
   "valid_until": 1677936000
}

This will set the outside temp to 10 degrees until timestamp 1677936000. After that timestamp the outside temp will remain at 4 degrees.

Behaviour of the outside temperature / outdoor sensor is controlled by the setting "Outdoor sensor" (usually setting number 8):

  • For WPU firmware below version 35, set setting "Outdoor sensor" to 2.
  • For WPU firmware from version 35 and up this setting can be left at the default 0.
  • When this setting is at 1, the connected outdoor sensor will be read and CE30 commands will be ignored.

Manual control

Manual control ie. the 4030 command is low level "manual control" of your itho unit. Use with care and use only if you know what you are doing! Make sure you set the "Max manual operation time" setting in the settings page. The itho unit will remain in manual mode until the timer expires. 0 means unlimited.

json keys explaination:
"manual_operation_index": manual_operation_index description (dataype uint16_t) "manual_operation_datatype": manual_operation_datatype description (dataype uint8_t) "manual_operation_value": manual_operation_value description (dataype uint16_t) "manual_operation_checked": manual_operation_checked description (dataype uint8_t)

Example of an MQTT manual operation json:

{
            "manual_operation_index":34,
            "manual_operation_datatype":0,
            "manual_operation_value":0,
            "manual_operation_checked":1
}

This example blocks cooling. (Set "enable cooling" to 0)

Index Description Value Datatype
0 Outside temperature -25 - 50 146 (0x92)
15 Enable low tariff 0/1 0
20 Source pump speed 0 - 100 0
30 Set total heat demand 0 - 100 0
31 Enable electric element 0/1 0
33 Enable CH heating 0/1 0
34 Enable Cooloing 0/1 0
36 Set DHW Mode 0=Eco 0
1=Reserved
2=Comfort
3=Blocked
37 Reset All Faults 0/1 0

Examples:

Set total heat demand to 0 to block heating:

{
    "manual_operation_index":30,
    "manual_operation_datatype":0,
    "manual_operation_value":0,
    "manual_operation_checked":1
}

Enable "tariff low" to trigger DHW. This will trigger the boiler, if boiler temps are below setpoints.

{
    "manual_operation_index":15,
    "manual_operation_datatype":0,
    "manual_operation_value":1,
    "manual_operation_checked":1
}