Making Vaillant Boiler Smart

Hi all,

even if my Project might not be the greates ever seen, i still want to share my results.

What was done?
In short: You can control the heating AND the warm water with two cards + some statistics for nerds like myself :D. And yes, this is still work in Progress.
Plans: Add some more informations without occuping more space
Replace graphs with an actual flow picture of vaillant with realtime stats

What are the requirements?

In my case, i have a Vaillant ecoTEC Plus, an vr_71 and a VCR700. (But this should work with any other vaillant supported by ebusd)
ebusd adapter
ebusd home-assistant AddOn (Or stand alone ebusd, doesnt matter)
HACS
mini-graph-card
Mushroom Cards
MQTT Broker

And what was done?
First of all, i will not focus on ebusd or mqtt that much. Only regarding the important config changes i made there. So lets start.

  1. ebusd: The most important thig here is, to enable WRITE access for HomeAssistant. This is done by adding the filter-direction=r|u|^w to the start Parameters of ebusd
  2. MQTT: If you are using multiple users for MQTT, make sure the homeassistant user can WRITE into the ebusd topics
  3. After you did add the vaillant device over ebusd and mqtt (just follow the official documentation) and make the adaptions, its time to create the climate entities:
###Heizung
  climate:
    - name: "Vaillant EcoTEC Plus"
      unique_id: vaillant_ecotec_plus
      max_temp: 25
      min_temp: 18
      temp_step: 0.5
      precision: 0.1
      action_topic: "ebusd/700/OpMode"
      action_template: "{{ value_json.opmode.value }}"
      modes:
        - auto
        - heat
        - cool
        - "off"
      mode_state_template: >-
        {% set mode_values = { 'auto':'auto', 'day':'heat', 'night':'cool', 'off':'off'} %}
        {{ mode_values[value_json.opmode.value] | default('day') }}
      mode_state_topic: "ebusd/700/OpMode"
      mode_command_template: >-
        {% set values = { 'auto':'auto', 'heat':'day', 'cool':'night', 'off':'off'} %}
        {{ values[value] | default('day') }}
      mode_command_topic: "ebusd/700/OpMode/set"
      value_template: "{{ value_json.tempv.value }}"
      temperature_state_topic: "ebusd/700/z1ActualRoomTempDesired"
      temperature_low_state_topic: "ebusd/700/z1NightTemp"
      temperature_low_command_topic: "ebusd/700/z1NightTemp/set"
      temperature_high_command_topic: "ebusd/700/z1DayTemp/set"
      temperature_high_state_topic: "ebusd/700/z1DayTemp"
      temperature_command_topic: "ebusd/700/z1DayTemp/set"
      current_temperature_topic: "homeassistant/sensor/durchschnittliche_raumtemperatur"
      current_temperature_template: "{{ value_json }}"

###Warmwasser
    - name: "Vaillant EcoTEC Plus Warmwasser"
      unique_id: vaillant_ecotec_plus_warmwasser
      max_temp: 90
      min_temp: 45
      temp_step: 1
      precision: 0.1
      action_topic: "ebusd/700/HwcOpMode"
      action_template: "{{ value_json.opmode.value }}"
      modes:
        - auto
        - "off"
      mode_state_template: >-
        {% set mode_values = { 'auto':'auto', 'off':'off'} %}
        {{ mode_values[value_json.opmode.value] | default('auto') }}
      mode_state_topic: "ebusd/700/HwcOpMode"
      mode_command_template: >-
        {% set values = { 'auto':'auto', 'off':'off'} %}
        {{ values[value] | default('auto') }}
      mode_command_topic: "ebusd/700/HwcOpMode/set"
      value_template: "{{ value_json.tempv.value }}"
      temperature_state_topic: "ebusd/700/HwcTempDesired"
      temperature_command_topic: "ebusd/700/HwcTempDesired/set"
      current_temperature_topic: "ebusd/vr_71/SensorData1"
      current_temperature_template: "{{ value_json.S5.value }}"

Note: Currently, the “day” or heating mode is the only working mode and i really recommend to use it (that means, but the heater into the day mode and make sure its not changing automatially, because that will be done by HA in the future). I didnt have time and effort to further debugg there but i leave my current state here, so maybe someone else cann digg deeper.

  1. Switches
    This is a switch to load the storage ONCE. (Called "Speicherfüllung)
  - platform: template
    switches:
      speicher_fullen:
        turn_on:
          - service: select.select_option
            metadata: {}
            data:
              option: load
            target:
              entity_id: select.multimatic_700_hwcsfmode_sfmode
        turn_off:
          - service: select.select_option
            metadata: {}
            data:
              option: auto
            target:
              entity_id: select.multimatic_700_hwcsfmode_sfmode
        friendly_name: "Speicher füllen"
        unique_id: speicher_fullen
        value_template: "{{ is_state('select.multimatic_700_hwcsfmode_sfmode', 'load') }}"
        icon_template: |
          {% if is_state('select.multimatic_700_hwcsfmode_sfmode', 'load') %}
            mdi:water-boiler
          {% else %}
            mdi:water-boiler-off
          {% endif %}
  1. Finally, the actual Dashboard:
views:
  - title: Home
    type: sidebar
    badges: []
    cards:
      - type: thermostat
        entity: climate.vaillant_ecotec_plus
        features:
          - style: icons
            hvac_modes:
              - heat
              - 'off'
              - auto
              - cool
            type: climate-hvac-modes
        show_current_as_primary: true
      - type: custom:mini-graph-card
        entities:
          - entity: sensor.ecotec_plus_flowtemp_temp
            name: Vorlauf
            show_points: false
            line_width: 1
          - entity: sensor.ecotec_plus_returntemp_temp
            name: Rücklauf
            show_points: false
            line_width: 1
        hours_to_show: 8
        points_per_hour: 24
        animate: false
        hour24: true
        upper_bound: 35
      - type: thermostat
        entity: climate.vaillant_ecotec_plus_warmwasser
        features:
          - style: icons
            hvac_modes:
              - heat
              - 'off'
              - auto
            type: climate-hvac-modes
        show_current_as_primary: true
      - type: horizontal-stack
        cards:
          - type: conditional
            conditions:
              - condition: state
                entity: sensor.multimatic_700_hc1pumpstatus
                state: '1'
              - condition: or
                conditions:
                  - condition: state
                    entity: sensor.multimatic_700_hc1pumpstatus
                    state: '1'
                  - condition: state
                    entity: select.multimatic_700_hwcsfmode_sfmode
                    state: load
            card:
              type: custom:mushroom-entity-card
              entity: switch.speicher_fullen
              fill_container: false
              layout: vertical
          - type: conditional
            conditions:
              - condition: state
                entity: sensor.multimatic_700_hc1pumpstatus
                state: '0'
              - condition: state
                entity: select.multimatic_700_hwcsfmode_sfmode
                state: auto
            card:
              type: custom:mushroom-template-card
              primary: Speicher wird geheizt
              secondary: ''
              icon: mdi:water-boiler-auto
              layout: vertical
      - type: custom:mini-graph-card
        entities:
          - entity: sensor.ebusd_vr_71_sensordata1_s5
            name: Speichertemperatur Gas
            show_points: false
            line_width: 1
          - entity: sensor.ebusd_vr_71_sensordata1_s6
            name: Speichertemperatur Solar
            show_points: false
            line_width: 1
          - entity: sensor.ebusd_vr_71_sensordata1_s7
            name: Solar Temperatur
            show_points: false
            line_width: 1
        hours_to_show: 8
        points_per_hour: 24
        lower_bound: 10
        animate: false
        hour24: true

Notes about that: I’ve used a condition card, becauseif the boiler is actually heating automatically the water (based on the time plan, if set up) it should not be overwritten by the one time loading. The second graph is showing some solar details. this can be removed if no solar system is active.

Looks very good!

Question from a HA beginner: where do I have to put these configurations?

Hi,
Mit frischen HACS update tut’s nich mehr. Eine Idee?

Was geht denn nicht? Hier klappt noch alles ? (Hab alles aktuell)

Hi
I already have EbusD running in HA. Ik get all kinds off values. Mainly BAI and 350.
What i want to do is:

  • The floorheating system should work the oldfashioned way. Meaning: When the living room request heat it should work No matter the state of HA, and or the TRV’s
  • I want TRV’s with zigbee. (already have one for experimenting

When I have all TRV’s working and Ebusd, the setup would be

  • When the livingromm request heat: (no automation neede for this)
    Boiler on
    TRV’s wanting heat just open and get heated

  • One of the TRV’s wants heat and the livingroom is not requesting heat:
    Boiler On
    Valve on floorheating will be actively closed (It should be a NO valve)

Is this possible you think?