Zum Inhalt

YAML – Lüftung

Dokumentation: Lüftung · Lastenheft

Aktiver Stand

Die Lüftung ist inzwischen als zentrales Package umgesetzt:

  • /config/packages/lueftung.yaml

Die Sicherung enthält:

  • bestehende Package-Skripte und Package-Automationen
  • MQTT-Sensor sensor.vaillant_recovair_275_3_intensivmodus_countdown
  • MQTT-Binary-Sensor binary_sensor.vaillant_recovair_275_3_luftung_kuhlung_status
  • Template-Sensoren für Filterstatus, Modusanzeige und Trigger-Countdown
script:
# Package-Skripte für die Lüftung.
# Diese Skripte werden von den Package-Automationen verwendet
# und sollten deshalb nicht in der UI bearbeitet werden.

  lueftung_modus_setzen_package:
    alias: "Lüftung: Modus setzen [Package]"
    description: "Setzt den Lüftungsmodus auf Tag oder Nacht."
    mode: queued
    fields:
      stufe:
        name: Modus
        description: "Zielmodus der Lüftung, zum Beispiel Tag oder Nacht."
    sequence:
    - action: select.select_option
      target:
        entity_id: select.ebusd_lueftung_vai00_lueftungsstufe_status
      data:
        option: "{{ stufe }}"

  lueftung_bypass_setzen_package:
    alias: "Lüftung: Bypass setzen [Package]"
    description: "Aktiviert oder deaktiviert den Bypass über die Bypass-Tage."
    mode: queued
    fields:
      aktiv:
        name: Aktiv
        description: "1 aktiviert den Bypass, 0 deaktiviert ihn."
      tage:
        name: Tage
        description: "Anzahl der Bypass-Tage bei Aktivierung."
    sequence:
    - choose:
      - conditions:
        - "{{ aktiv | int(0) == 1 }}"
        sequence:
        - action: number.set_value
          target:
            entity_id: number.ebusd_lueftung_vai00_bypass_tage
          data:
            value: "{{ tage | default(1) | int(1) }}"
      default:
      - action: number.set_value
        target:
          entity_id: number.ebusd_lueftung_vai00_bypass_tage
        data:
          value: 0

  lueftung_hi_modus_setzen_package:
    alias: "Lüftung: HI-Modus setzen [Package]"
    description: "Setzt den Intensivmodus der Lüftung."
    mode: queued
    fields:
      status:
        name: HI-Modus
        description: "Zielwert für den Intensivmodus, zum Beispiel Aus oder 3h."
    sequence:
    - action: select.select_option
      target:
        entity_id: select.ebusd_lueftung_vai00_lueftung_hi_status
      data:
        option: "{{ status }}"
automation:
# Package-Automationen für die Lüftung.
# Die Entscheidungslogik bleibt in den Automationen,
# die eigentliche Ausführung läuft über die Skripte oben.

- id: lueftung_package_hauptsteuerung
  alias: "Lüftung: Hauptsteuerung [Package]"
  description: "Zentrale Steuerung für Tag/Nacht, HI-Modus und Bypass."
  mode: restart
  triggers:
  # Schaltzustand-Trigger: reagieren sofort auf Statuswechsel
  - trigger: state
    entity_id: input_boolean.luftung_automatik_aktiv
  - trigger: state
    entity_id: input_boolean.bypass_aktiv
  - trigger: state
    entity_id: input_boolean.bypass_force
  - trigger: state
    entity_id: binary_sensor.beschattung_hitzeschutz_noetig
  - trigger: state
    entity_id: binary_sensor.jemand_zuhause
  - trigger: state
    entity_id: timer.luftung_bad_timer
  # Zeitfenster-Trigger: starten/beenden den Tagbetrieb und wirken
  # gleichzeitig als tägliche Auffrischung der Bypass-Tage
  - trigger: time
    at: input_datetime.luftung_start_wochentag
  - trigger: time
    at: input_datetime.luftung_start_wochenende
  - trigger: time
    at: input_datetime.luftung_ende
  # Helper-Änderungs-Trigger: sofort neu bewerten wenn Einstellungen geändert werden
  - trigger: state
    entity_id: input_number.luftung_bypass_min_aussentemperatur
  - trigger: state
    entity_id: input_number.luftung_bypass_max_aussentemperatur
  - trigger: state
    entity_id: input_number.luftung_bypass_min_innentemperatur
  # Temperatur-Grenzwert-Trigger: nur bei Überschreitung der relevanten
  # Schwellwerte auslösen, nicht bei jeder kleinen Temperaturänderung.
  # for: 3 Minuten entprellt Sensorwerte, die um die Schwelle pendeln.
  # Außentemperatur in beide Richtungen (Bypass-Fenster betreten/verlassen),
  # Innentemperatur nur nach oben (Bypass soll angehen wenn warm genug drinnen).
  - trigger: numeric_state
    entity_id: sensor.ebusd_lueftung_wtw04_airinlettemp
    above: input_number.luftung_bypass_max_aussentemperatur
    for: "00:03:00"
  - trigger: numeric_state
    entity_id: sensor.ebusd_lueftung_wtw04_airinlettemp
    below: input_number.luftung_bypass_max_aussentemperatur
    for: "00:03:00"
  - trigger: numeric_state
    entity_id: sensor.ebusd_lueftung_wtw04_airinlettemp
    above: input_number.luftung_bypass_min_aussentemperatur
    for: "00:03:00"
  - trigger: numeric_state
    entity_id: sensor.ebusd_lueftung_wtw04_airinlettemp
    below: input_number.luftung_bypass_min_aussentemperatur
    for: "00:03:00"
  - trigger: numeric_state
    entity_id: sensor.karell_wandthermostat_temperatur
    above: input_number.luftung_bypass_min_innentemperatur
    for: "00:03:00"
  - trigger: numeric_state
    entity_id: sensor.martha_wandthermostat_temperatur
    above: input_number.luftung_bypass_min_innentemperatur
    for: "00:03:00"
  # Recovery-Trigger: nach HA-Neustart oder Sensorausfall sind die
  # Temperatursensoren kurzzeitig unavailable. Die Bypass-Entscheidung
  # wird dann übersprungen (siehe sensoren_ok) und hier nachgeholt,
  # sobald der Sensor wieder einen Wert liefert.
  - trigger: state
    entity_id: sensor.ebusd_lueftung_wtw04_airinlettemp
    from:
    - unavailable
    - unknown
  - trigger: state
    entity_id: sensor.karell_wandthermostat_temperatur
    from:
    - unavailable
    - unknown
  - trigger: state
    entity_id: sensor.martha_wandthermostat_temperatur
    from:
    - unavailable
    - unknown
  conditions:
  - condition: state
    entity_id: input_boolean.luftung_automatik_aktiv
    state: "on"
  actions:
  - alias: "Grundlagen berechnen"
    variables:
      day_window: >-
        {% set start = states('input_datetime.luftung_start_wochenende') if now().weekday()
        >= 5 else states('input_datetime.luftung_start_wochentag') %}
        {{ 1 if today_at(start) <= now() <= today_at(states('input_datetime.luftung_ende'))
        else 0 }}
      # Sensor-Verfügbarkeit: Bypass-Entscheidungen nur mit echten Messwerten
      # treffen, nie mit Ersatzwerten (verhindert Bypass-Flackern nach Neustart).
      sensoren_ok: >-
        {{ 1 if has_value('sensor.ebusd_lueftung_wtw04_airinlettemp')
        and has_value('sensor.karell_wandthermostat_temperatur')
        and has_value('sensor.martha_wandthermostat_temperatur') else 0 }}
      outside_temp: "{{ states('sensor.ebusd_lueftung_wtw04_airinlettemp') | float(0)
        }}"
      inside_temp: "{{ ((states('sensor.karell_wandthermostat_temperatur') | float(20)
        + states('sensor.martha_wandthermostat_temperatur') | float(20)) / 2) }}"
      # Fallback-Werte entsprechen den Default-Werten der Helper
      bypass_min_aussen: "{{ states('input_number.luftung_bypass_min_aussentemperatur')
        | float(5) }}"
      bypass_max_aussen: "{{ states('input_number.luftung_bypass_max_aussentemperatur')
        | float(23) }}"
      bypass_min_innen: "{{ states('input_number.luftung_bypass_min_innentemperatur')
        | float(23) }}"
      bypass_tage_soll: 2
      bypass_tage_ist: "{{ states('number.ebusd_lueftung_vai00_bypass_tage') | int(0)
        }}"
      bypass_ist_aktiv: "{{ 1 if states('number.ebusd_lueftung_vai00_bypass_tage')
        | int(0) > 0 else 0 }}"
      bypass_helper_aktiv: "{{ 1 if is_state('input_boolean.bypass_aktiv', 'on') else
        0 }}"
      bypass_force_aktiv: "{{ 1 if is_state('input_boolean.bypass_force', 'on') else
        0 }}"
      heizventil_aktiv: "{{ 1 if is_state('binary_sensor.wohnzimmer_wandthermostat_heizventil',
        'on') else 0 }}"
      outside_ok: "{{ 1 if bypass_min_aussen | float(5) <= outside_temp | float(0)
        <= bypass_max_aussen | float(23) else 0 }}"
      inside_ok: "{{ 1 if inside_temp | float(0) >= bypass_min_innen | float(23) else
        0 }}"
      # Außenluft muss mindestens 0,5 °C kühler sein als innen (Puffer,
      # da der Bypass träge ist und sonst um den Gleichstand pendeln würde)
      cooling_ok: "{{ 1 if outside_temp | float(0) < (inside_temp | float(0) - 0.5)
        else 0 }}"
      hi_dauer_bei_abwesenheit: >-
        {% set stunden = states('input_number.luftung_bad_luftungsdauer') | float(1.5)
        %}
        {% if stunden == 0.5 %}
          30 min
        {% elif stunden == (stunden | int) %}
          {{ stunden | int }}h
        {% else %}
          {{ stunden }}h
        {% endif %}
      force_reset_needed: "{{ 1 if sensoren_ok | int(0) == 1 and bypass_force_aktiv
        | int(0) == 1 and (outside_ok | int(0) == 0 or inside_ok | int(0) == 0 or
        cooling_ok | int(0) == 0) else 0 }}"
      bypass_soll_aktiv: >-
        {% set normal_bypass = bypass_helper_aktiv | int(0) == 1 and heizventil_aktiv
        | int(0) == 0 and outside_ok | int(0) == 1 and inside_ok | int(0) == 1 and
        cooling_ok | int(0) == 1 %}
        {% set force_bypass = bypass_force_aktiv | int(0) == 1 and outside_ok | int(0)
        == 1 and inside_ok | int(0) == 1 and cooling_ok | int(0) == 1 %}
        {{ 1 if force_bypass or normal_bypass else 0 }}
      bypass_log_message: >-
        {% if bypass_soll_aktiv | int(0) == 1 %}
          {% if bypass_ist_aktiv | int(0) == 1 and bypass_tage_ist | int(0) != bypass_tage_soll
        | int(2) %}
            Bypass bleibt aktiv: Bypass-Tage von {{ bypass_tage_ist | int(0) }} auf
        {{ bypass_tage_soll | int(2) }} angehoben. Außen {{ outside_temp | round(1)
        }} °C, innen {{ inside_temp | round(1) }} °C.
          {% elif bypass_force_aktiv | int(0) == 1 %}
            Bypass aktiviert: Force aktiv, Außenluft {{ outside_temp | round(1) }}
        °C kühler als innen {{ inside_temp | round(1) }} °C.
          {% else %}
            Bypass aktiviert: Außenluft {{ outside_temp | round(1) }} °C kühler als
        innen {{ inside_temp | round(1) }} °C, Bereich {{ bypass_min_aussen | round(1)
        }} bis {{ bypass_max_aussen | round(1) }} °C erfüllt.
          {% endif %}
        {% elif bypass_force_aktiv | int(0) == 0 and bypass_helper_aktiv | int(0)
        == 0 %}
          Bypass deaktiviert: Bypass-Helfer und Force sind aus.
        {% elif outside_temp | float(0) > bypass_max_aussen | float(23) %}
          Bypass deaktiviert: Außentemperatur {{ outside_temp | round(1) }} °C über
        Maximum {{ bypass_max_aussen | round(1) }} °C.
        {% elif outside_temp | float(0) < bypass_min_aussen | float(5) %}
          Bypass deaktiviert: Außentemperatur {{ outside_temp | round(1) }} °C unter
        Minimum {{ bypass_min_aussen | round(1) }} °C.
        {% elif inside_ok | int(0) == 0 %}
          Bypass deaktiviert: Innentemperatur {{ inside_temp | round(1) }} °C unter
        Mindestwert {{ bypass_min_innen | round(1) }} °C.
        {% elif cooling_ok | int(0) == 0 %}
          Bypass deaktiviert: Außenluft {{ outside_temp | round(1) }} °C ist nicht
        mindestens 0,5 °C kühler als innen {{ inside_temp | round(1) }} °C.
        {% elif bypass_force_aktiv | int(0) == 0 and heizventil_aktiv | int(0) ==
        1 %}
          Bypass deaktiviert: Heizventil ist aktiv.
        {% else %}
          Bypass deaktiviert: Bedingungen nicht erfüllt.
        {% endif %}

  - alias: "Bypass Force bei Bedarf zurücksetzen"
    if:
    - "{{ force_reset_needed | int(0) == 1 }}"
    then:
    - alias: "Force-Bypass ausschalten"
      action: input_boolean.turn_off
      target:
        entity_id: input_boolean.bypass_force

  - alias: "Lüftungsmodus entscheiden"
    choose:
    - conditions:
      - condition: state
        entity_id: binary_sensor.beschattung_hitzeschutz_noetig
        state: "on"
      sequence:
      - alias: "Modus auf Nacht setzen"
        action: script.lueftung_modus_setzen_package
        data:
          stufe: "Nacht"
      - alias: "HI-Modus ausschalten"
        action: script.lueftung_hi_modus_setzen_package
        data:
          status: "Aus"
      - alias: "Hitzeschutz ins Logbuch schreiben"
        action: logbook.log
        data:
          name: "Lüftung [Package]"
          message: >-
            Hitzeschutz aktiv: Nachtbetrieb gesetzt.{% if force_reset_needed | int(0)
            == 1 %} Bypass Force wurde automatisch zurückgesetzt.{% endif %}
    - conditions:
      - condition: state
        entity_id: timer.luftung_bad_timer
        state: active
      - condition: state
        entity_id: binary_sensor.jemand_zuhause
        state: "off"
      sequence:
      - alias: "Modus auf Tag setzen"
        action: script.lueftung_modus_setzen_package
        data:
          stufe: "Tag"
      - alias: "HI-Dauer aus Helper setzen"
        action: script.lueftung_hi_modus_setzen_package
        data:
          status: "{{ hi_dauer_bei_abwesenheit | trim }}"
      - alias: "Bad-Timer Abwesenheit ins Logbuch schreiben"
        action: logbook.log
        data:
          name: "Lüftung [Package]"
          message: >-
            Bad-Timer aktiv: Tagbetrieb mit HI {{ hi_dauer_bei_abwesenheit | trim
            }} bei Abwesenheit.{% if force_reset_needed | int(0) == 1 %} Bypass Force
            wurde automatisch zurückgesetzt.{% endif %}
    - conditions:
      - condition: state
        entity_id: timer.luftung_bad_timer
        state: active
      sequence:
      - alias: "Modus auf Tag setzen"
        action: script.lueftung_modus_setzen_package
        data:
          stufe: "Tag"
      - alias: "HI-Modus ausschalten"
        action: script.lueftung_hi_modus_setzen_package
        data:
          status: "Aus"
      - alias: "Bad-Timer Anwesenheit ins Logbuch schreiben"
        action: logbook.log
        data:
          name: "Lüftung [Package]"
          message: >-
            Bad-Timer aktiv: Tagbetrieb bei Anwesenheit.{% if force_reset_needed |
            int(0) == 1 %} Bypass Force wurde automatisch zurückgesetzt.{% endif %}
    - conditions:
      - condition: state
        entity_id: binary_sensor.jemand_zuhause
        state: "off"
      sequence:
      - alias: "Modus auf Nacht setzen"
        action: script.lueftung_modus_setzen_package
        data:
          stufe: "Nacht"
      - alias: "HI-Modus ausschalten"
        action: script.lueftung_hi_modus_setzen_package
        data:
          status: "Aus"
      - alias: "Abwesenheit ins Logbuch schreiben"
        action: logbook.log
        data:
          name: "Lüftung [Package]"
          message: >-
            Niemand zuhause: Nachtbetrieb gesetzt.{% if force_reset_needed | int(0)
            == 1 %} Bypass Force wurde automatisch zurückgesetzt.{% endif %}
    - conditions:
      - "{{ day_window | int(0) == 0 }}"
      sequence:
      - alias: "Modus auf Nacht setzen"
        action: script.lueftung_modus_setzen_package
        data:
          stufe: "Nacht"
      - alias: "HI-Modus ausschalten"
        action: script.lueftung_hi_modus_setzen_package
        data:
          status: "Aus"
      - alias: "Zeitfenster ins Logbuch schreiben"
        action: logbook.log
        data:
          name: "Lüftung [Package]"
          message: >-
            Außerhalb Zeitfenster: Nachtbetrieb gesetzt.{% if force_reset_needed |
            int(0) == 1 %} Bypass Force wurde automatisch zurückgesetzt.{% endif %}
    default:
    - alias: "Modus auf Tag setzen"
      action: script.lueftung_modus_setzen_package
      data:
        stufe: "Tag"
    - alias: "HI-Modus ausschalten"
      action: script.lueftung_hi_modus_setzen_package
      data:
        status: "Aus"
    - alias: "Normalbetrieb ins Logbuch schreiben"
      action: logbook.log
      data:
        name: "Lüftung [Package]"
        message: >-
          Anwesenheit im Zeitfenster: Tagbetrieb gesetzt.{% if force_reset_needed
          | int(0) == 1 %} Bypass Force wurde automatisch zurückgesetzt.{% endif %}

  - alias: "Bypass entscheiden"
    # Nur mit verfügbaren Temperatursensoren schalten (sensoren_ok),
    # sonst wird die Entscheidung übersprungen und über die
    # Recovery-Trigger nachgeholt.
    choose:
    - conditions:
      - "{{ sensoren_ok | int(0) == 1 and bypass_soll_aktiv | int(0) == 1 and (bypass_ist_aktiv
        | int(0) == 0 or bypass_tage_ist | int(0) != bypass_tage_soll | int(2)) }}"
      sequence:
      - alias: "Bypass aktivieren oder auf 2 Tage anheben"
        action: script.lueftung_bypass_setzen_package
        data:
          aktiv: 1
          tage: "{{ bypass_tage_soll | int(2) }}"
      - alias: "Bypass-Aktivierung ins Logbuch schreiben"
        action: logbook.log
        data:
          name: "Lüftung [Package]"
          message: "{{ bypass_log_message | trim }}"
    - conditions:
      - "{{ sensoren_ok | int(0) == 1 and bypass_soll_aktiv | int(0) == 0 and bypass_ist_aktiv
        | int(0) == 1 }}"
      sequence:
      - alias: "Bypass deaktivieren"
        action: script.lueftung_bypass_setzen_package
        data:
          aktiv: 0
          tage: "{{ bypass_tage_soll | int(2) }}"
      - alias: "Bypass-Deaktivierung ins Logbuch schreiben"
        action: logbook.log
        data:
          name: "Lüftung [Package]"
          message: "{{ bypass_log_message | trim }}"

- id: lueftung_package_badfeuchte_timer
  alias: "Lüftung: Badfeuchte Timer [Package]"
  description: "Startet den Bad-Timer bei hoher Luftfeuchtigkeit."
  mode: single
  triggers:
  - trigger: numeric_state
    entity_id: sensor.badezimmer_wandthermostat_luftfeuchtigkeit
    above: input_number.luftung_bad_feuchte_schwelle
  conditions:
  - condition: state
    entity_id: input_boolean.luftung_automatik_aktiv
    state: "on"
  - condition: not
    conditions:
    - condition: state
      entity_id: binary_sensor.beschattung_hitzeschutz_noetig
      state: "on"
  actions:
  - alias: "Bad-Timer starten"
    action: timer.start
    target:
      entity_id: timer.luftung_bad_timer
    data:
      duration: "{{ (states('input_number.luftung_bad_luftungsdauer') | float(1.5)
        * 3600) | int }}"
  - alias: "Bad-Timer Start ins Logbuch schreiben"
    action: logbook.log
    data:
      name: "Lüftung [Package]"
      message: "Bad-Timer wurde wegen hoher Luftfeuchtigkeit gestartet."

- id: lueftung_package_frostschutz_abschaltung
  alias: "Lüftung: Frostschutz Abschaltung [Package]"
  description: "Schaltet die Lüftung bei Frost 20 Sekunden nach dem Einschalten wieder
    aus."
  mode: single
  triggers:
    # Bei Frost bleibt die Lüftung grundsätzlich aus.
    # Ein manuelles Einschalten wird daher nach kurzer Zeit wieder beendet.
  - trigger: state
    entity_id: switch.luftung
    to: "on"
    for:
      seconds: 20
  conditions:
    # Als Frostkriterium dient die kalibrierte Außentemperatur der Heizung.
  - condition: numeric_state
    entity_id: sensor.heizung_vaillant_aurocompact_outsidetemp_temp
    below: 0
  actions:
  - alias: "Lüftung stromlos schalten"
    action: switch.turn_off
    target:
      entity_id: switch.luftung
  - alias: "Frostschutz ins Logbuch schreiben"
    action: logbook.log
    data:
      name: "Lüftung [Package]"
      message: >-
        Frostschutz aktiv: Lüftung nach 20 Sekunden wieder ausgeschaltet. Außentemperatur
        Heizung {{ states('sensor.heizung_vaillant_aurocompact_outsidetemp_temp')
        | float(0) | round(1) }} °C.

mqtt:
  sensor:
    - name: "Intensivmodus Countdown"
      unique_id: "ebusd_lueftung_vai00_hi_countdown"
      icon: mdi:fan-speed-3
      state_topic: "ebusd-lueftung/vai00/Lueftung_HI_Status"
      value_template: "{{ value_json['0'].value }}"
      unit_of_measurement: "min"
      device:
        identifiers: "vaillant_recovair_275"
        name: "Vaillant recoVAIR 275/3"
        model: "recoVAIR 275/3"
        manufacturer: "Vaillant"

  binary_sensor:
    - name: "Lüftung Kühlung Status"
      unique_id: "ebusd_lueftung_kuehlung_status"
      state_topic: "ebusd-lueftung/vai00/Kuehlung"
      value_template: >-
        {% if value_json['0'].value == "EIN" %}
          ON
        {% else %}
          OFF
        {% endif %}
      payload_on: "ON"
      payload_off: "OFF"
      device:
        identifiers: "ebusd-lueftung"
        name: "Vaillant recoVair 275/3"
        model: "recoVair 275/3"
        manufacturer: "Vaillant"

template:
  - sensor:
      - name: "Lüftung Filterstatus"
        unique_id: luftung_filterstatus
        icon: mdi:air-filter
        state: >
          {% set power = states('sensor.luftung_switch_0_power') | float(-1) %}
          {% set modus = states('select.ebusd_lueftung_vai00_lueftungsstufe_status') %}
          {% set intensiv = states('select.ebusd_lueftung_vai00_lueftung_hi_status') %}
          {% if intensiv != 'Aus' %}
            Intensivbetrieb
          {% elif modus == 'Nacht' %}
            {% set warn = states('input_number.luftung_schwelle_warnung_nacht') | float(20) %}
            {% set krit = states('input_number.luftung_schwelle_kritisch_nacht') | float(28) %}
            {% if power < 0 %}Unbekannt
            {% elif power > krit %}Reinigung nötig
            {% elif power > warn %}Prüfen
            {% else %}OK{% endif %}
          {% else %}
            {% set warn = states('input_number.luftung_schwelle_warnung_tag') | float(50) %}
            {% set krit = states('input_number.luftung_schwelle_kritisch_tag') | float(65) %}
            {% if power < 0 %}Unbekannt
            {% elif power > krit %}Reinigung nötig
            {% elif power > warn %}Prüfen
            {% else %}OK{% endif %}
          {% endif %}
        attributes:
          leistung_aktuell: "{{ states('sensor.luftung_switch_0_power') | float(0) | round(1) }} W"
          modus: "{{ states('select.ebusd_lueftung_vai00_lueftungsstufe_status') }}"
          filter: "{{ states('input_select.luftung_filtertyp') }}"

      - name: "Lüftungsmodus Anzeige"
        unique_id: luftung_modus_anzeige
        icon: mdi:fan-auto
        state: "{{ states('select.ebusd_lueftung_vai00_lueftungsstufe_status') }}"

  - triggers:
      - trigger: mqtt
        topic: "ebusd-lueftung/vai00/Lueftung_HI_Status"
    sensor:
      - name: "Intensivmodus Countdown"
        unique_id: luftung_hi_countdown_v3
        icon: mdi:fan-speed-3
        unit_of_measurement: "min"
        state: >
          {% set val = trigger.payload_json['0'].value %}
          {% if val == 'Aus' %}0{% else %}{{ val | int(0) }}{% endif %}

MQTT-Sensoren

Quelle in HA: /config/packages/lueftung.yaml

Live-Entity:

  • sensor.vaillant_recovair_275_3_intensivmodus_countdown
  • Plattform: mqtt
  • unique_id: ebusd_lueftung_vai00_hi_countdown
- name: "Intensivmodus Countdown"
  unique_id: "ebusd_lueftung_vai00_hi_countdown"
  icon: mdi:fan-speed-3
  state_topic: "ebusd-lueftung/vai00/Lueftung_HI_Status"
  value_template: "{{ value_json['0'].value }}"
  unit_of_measurement: "min"
  device:
    identifiers: "vaillant_recovair_275"
    name: "Vaillant recoVAIR 275/3"
    model: "recoVAIR 275/3"
    manufacturer: "Vaillant"

MQTT-Binary-Sensoren

Quelle in HA: /config/packages/lueftung.yaml

Live-Entity:

  • binary_sensor.vaillant_recovair_275_3_luftung_kuhlung_status
  • Plattform: mqtt
  • unique_id: ebusd_lueftung_kuehlung_status
# ===============================
# eBUSd Lueftung - Binary Sensoren
# ===============================

- name: "Lueftung Kuehlung Status"
  unique_id: "ebusd_lueftung_kuehlung_status"
  state_topic: "ebusd-lueftung/vai00/Kuehlung"
  value_template: >-
    {% if value_json['0'].value == "EIN" %}
      ON
    {% else %}
      OFF
    {% endif %}
  payload_on: "ON"
  payload_off: "OFF"
  device:
    identifiers: "ebusd-lueftung"
    name: "Vaillant recoVair 275/3"
    model: "recoVair 275/3"
    manufacturer: "Vaillant"

Migrationshinweis

Die Lüftung hat aktive MQTT-Sensoren, aktive Template-Sensoren und die zugehörigen Automationen/Skripte in einem Paket. Die Sicherung enthält deshalb alle relevanten Blöcke in einer Datei:

  • mqtt.sensor
  • mqtt.binary_sensor
  • template
  • script
  • automation

Die früheren MQTT- und Template-Dateien aus custom/ sind im Wiki nur noch historisch erwähnt. Die aktive Logik liegt im Package.