Blueprint: Markisenwächter (automatisches Einfahren bei Wind und noch mehr)

YAML-Code v1.6

(2025-08-16)

Änderung:

  • Bugfix: Input Sensoren-Timeout (Minuten) wurde im Trigger als Sekunden-Wert übernommen - nun korrigiert
# Changelog:
# v1 - initiale Release mit Basisfunktionen
#
# v1.1 (2025-07-22):
# - Finetuning der Notification im Default (statt auf einen möglichen Fehler wird auch auf eine mögliche
#   unbekannte Sensor-Kombitnation hingewiesen)
# - Bei nachlassendem Wind wurde unter bestimmten Bedingungen der Default-Teil des Ablaufes getriggert - korrigiert
# - Bei Starkwind und eingefahrener Markise wurde der Default-Teil des Ablaufes getriggert - korrigiert
# - Warnung wird ausgegeben und ein Schließen der Markise initiiert, falls Starkwind aufkommt, der Status der Markise
#   jedoch unbekannt ist
#
# v1.2 (2025-07-23):
# - Detailliertere Dokumentation der benötigten Entitäten
# - Karteileiche "Regensensor (Statistik) - Intervall" entfernt
# - Umbenennungen einiger Inputs
# - Erweiterung um zusätzliche Bedingungs-Zweige, um folgende Szenarien explizit zu behandeln und Default-Meldungen zu vermeiden:
#   - Nachlassender Wind, Markise bereits ausgefahren
#   - Regenschauer, Markise bereits eingefahren
#   - Counter-Überlauf, Markise bereits eingefahren
#   - Windsensor-Timeout, Markise bereits eingefahren
# - Das Default-Handling wird damit weiter minimiert und die Automation zuverlässiger.
#
# v1.3 (2025-07-27):
# Kompletter Neuaufbau der zugrundeliegenden Automation:
#  - Code-Struktur vollständig überarbeitet
#  - IDs in Vorbereitung auf eine Übersetzung ins Englische auf Englisch formuliert
#  - Einheitliche Nutzung von choose-Blöcken mit trigger.id statt kombinierter Bedingungen
#  - Bessere Trennung von Aktionen, Bedingungen und Auslösern
#  - Dokumentation deutlich klarer und strukturierter formuliert
#  - Blueprint-Inputs neu strukturiert und besser gruppiert
#  - Automatisches Ausfahren: Nur bei gleichzeitig unterminimiertem Wind und keinem Regen
#  - Reset der Helfer (input.booleans) erfolgt nun gemeinsam mit dem Zähler 
#  - Klare Trennung zwischen manuellem und automatischem Aus- oder Einfahren
#  - Grenzwert für automatische Einfahrvorgänge frei wählbar (automatic_retract_count_threshold)
#    und Hinweis per Notification bei Überschreitung
#
# v1.4 (2025-08-07)
#  - Sensor-Filter für Inputs aufgenommen
#
# v1.5 (2025-08-10)
#  - Schrittgröße für die Regenschwelle vom Default (= 1) auf 0.1 korrigiert
#
# v1.6 (2025-08-16)
#  - Bugfix: Input `Sensoren-Timeout (Minuten)` wurde im Trigger als Sekunden-Wert übernommen


blueprint:
  name: Markisenwächter v1.6
  description: |
    Dieser Blueprint bietet eine erweiterte Automatisierung für eine Markise basierend auf verschiedenen Sensordaten wie Wind und Regen.
    ### Funktionen:
    * **Windüberwachung:** Fährt die Markise automatisch ein, wenn eine konfigurierbare Windgeschwindigkeit überschritten wird.
    * **Regenüberwachung:** Fährt die Markise automatisch ein, wenn eine konfigurierbare Regenmenge innerhalb eines Zeitraums erkannt wird.
    * **Wind-Timeout:** Fährt die Markise sicherheitshalber ein, wenn der Windsensor für eine bestimmte Zeit nicht erreichbar ist.
    * **Sensor-Überwachung:** Sendet eine Benachrichtigung, wenn wichtige Sensoren wie Wind, Markisenstatus oder die Steuerungs-Switches nicht erreichbar sind.
    * **Automatisches Ausfahren:** Fährt die Markise wieder aus, wenn der Wind unter den Grenzwert fällt und kein Regen erkannt wird.
    * **Zählerschutz:** Zählt die automatischen Einfahrvorgänge. Bei Überschreiten eines Grenzwertes wird eine Benachrichtigung gesendet und ein weiteres Ausfahren unterbunden, um ein häufiges, unnötiges Ein- und Ausfahren zu verhindern.
    * **Manuelle Steuerung:** Erkennt manuelle Eingriffe (Aus- und Einfahren) und setzt interne Zähler zurück oder passt Status-Helfer an.
    * **Täglicher Reset:** Setzt den Einfahr-Zähler und die internen Status-Helfer täglich zurück.
    ### Notwendige Konfiguration:
    Dieser Blueprint erfordert die Konfiguration der folgenden Helfer (helpers) in Home Assistant:
    1.  Ein `input_boolean` für den Status „Markise automatisch eingefahren“.
    2.  Ein `input_boolean` für den Status „Markise automatisch ausgefahren“.
    3.  Ein `counter` um die Anzahl der automatischen Einfahrvorgänge zu zählen.
    4.  Ein `sensor` (z.B. ein Statistik-Sensor) für die akkumulierte Regenmenge über einen bestimmten Zeitraum.
    
  domain: automation
  
  input:
    marquise_retract_switch:
      name: Markise Einfahr-Switch
      description: |
        Der **Switch** mit dem die Markise eingefahren wird.
        (z.B. `switch.markise_einfahren`)
      selector:
        entity:
          domain: switch
    marquise_extend_switch:
      name: Markise Ausfahr-Switch
      description: |
        Der **Switch** mit dem die Markise ausgefahren wird.
        (z.B. `switch.markise_ausfahren`)
      selector:
        entity:
          domain: switch
    wind_sensor:
      name: Windsensor-Entität
      description: |
        Der **Numerische Sensor** der die aktuelle Windgeschwindigkeit in km/h misst.
        (z.B. `sensor.ecowitt_ws90_wind_max`)
      selector:
        entity:
          domain: sensor
          multiple: false
          filter:
            - device_class: wind_speed
    rain_sensor:
      name: Regensensor-Entität
      description: |-
        Der **Numerische Sensor**, der die Regenmenge misst.
        (z.B. `sensor.rain_last_5_minutes`)
        
        Erfordert einen Statistik-Sensor; der Niederschlag sollte in einem möglichst kurzen
        Zeitraum summiert werden, um schnell auf Regen reagieren zu können. Der Zeitraum darf
        jedoch auch nicht **zu** kurz sein (viele Regensensoren lösen nur in 1mm-Schritten auf).
        
        **Anlegen des Helfers:**
        `Einstellungen → Geräte & Dienste → Helfer → Helfer erstellen → Statistik`
        * **Entität:** dein Regensensor (=Quellsensor für die Berechnung)
        * **Statistikmerkmal:** Summe der Differenzen
        * **Stichprobengröße:** [Quellsensor-Updates / Minute] x [Maximalalter] + [kleiner Puffer]
        * **Maximalalter:** z.B. 5 Minuten
        * **Letzten Messwert behalten:** nein
        * **Genauigkeit:** 1
      selector:
        entity:
          domain: sensor
          multiple: false
          filter:
            - device_class:
                - volume
                - precipitation
    marquise_status_sensor:
      name: Markisenstatus-Sensor
      description: |
        Der **Binärsensor**, der den aktuellen Status der Markise anzeigt.
        (`on` = Markise ausgefahren, `off` = Markise eingefahren)
      selector:
        entity:
          domain: binary_sensor
          multiple: false
          filter:
            - device_class:
                - window
                - opening
    wind_max_threshold:
      name: Maximale Windschwelle (km/h)
      description: |
        Der numerische Wert in km/h, ab dem die Markise automatisch eingefahren wird.
        (Standard: 27 km/h)
      default: 27
      selector:
        number:
          min: 0
          max: 100
          unit_of_measurement: km/h
          mode: box
    wind_min_threshold:
      name: Minimale Windschwelle (km/h)
      description: |
        Der numerische Wert in km/h, unter den die Windgeschwindigkeit fallen muss, damit die Markise wieder automatisch ausgefahren wird.
        (Standard: 20 km/h)
      default: 20
      selector:
        number:
          min: 0
          max: 100
          unit_of_measurement: km/h
          mode: box
    automatic_extend_timeout_minutes:
      name: Zeitspanne für automatisches Ausfahren (Minuten)
      description: |
        Die Zeit in Minuten, die vergehen muss, nachdem Wind und Regen unter den Grenzwert gefallen sind, bevor die Markise wieder ausfährt.
        (Standard: 30 Minuten)
      default: 30
      selector:
        number:
          min: 1
          max: 120
          unit_of_measurement: min
          mode: box
    rain_threshold:
      name: Regenschwelle (mm)
      description: |
        Der numerische Wert in mm/m² (aus der **Regensensor-Entität**), ab dem die Markise eingefahren wird.
        (Standard: 0.7 mm/m²)
      default: 0.7
      selector:
        number:
          step: 0.1
          min: 0
          max: 10
          unit_of_measurement: mm/m²
          mode: box
    wind_sensor_timeout_minutes:
      name: Windsensor-Timeout (Minuten)
      description: |
        Die Zeitspanne in Minuten, nach der ein fehlender Windsensor die Markise automatisch einfährt.
        (Standard: 15 Minuten)
      default: 15
      selector:
        number:
          min: 1
          max: 60
          unit_of_measurement: min
          mode: box
    sensors_timeout_minutes:
      name: Sensoren-Timeout (Minuten)
      description: |
        Die Zeitspanne in Minuten, nach der fehlende Sensoren eine Warnung auslösen und versucht wird, die Markise automatisch einzufahren.
        (Standard: 15 Minuten)
      default: 15
      selector:
        number:
          min: 1
          max: 60
          unit_of_measurement: min
          mode: box
    automatic_retract_count_threshold:
      name: Zählergrenzwert für automatisches Einfahren
      description: |
        Der numerische Wert, wie oft die Markise automatisch eingefahren werden darf, bevor eine Benachrichtigung gesendet wird.
        (Standard: 2 mal)
      default: 2
      selector:
        number:
          min: 1
          max: 10
          mode: box
    automatic_retracted_helper:
      name: Helfer für "automatisch eingefahren"
      description: |
        Ein `input_boolean`-Helfer, der den Status anzeigt, wenn die Markise automatisch eingefahren wurde.
      selector:
        entity:
          domain: input_boolean
    automatic_extended_helper:
      name: Helfer für "automatisch ausgefahren"
      description: |
        Ein `input_boolean`-Helfer, der den Status anzeigt, wenn die Markise automatisch ausgefahren wurde.
      selector:
        entity:
          domain: input_boolean
    retract_counter_helper:
      name: Helfer für Einfahrzähler
      description: |
        Ein `counter`-Helfer, der die Anzahl der automatischen Einfahrvorgänge zählt.
      selector:
        entity:
          domain: counter
    reset_time:
      name: Tägliche Reset-Uhrzeit
      description: |
        Die Uhrzeit, zu der der Zähler und die Status-Helfer täglich zurückgesetzt werden sollen.
        (Standard: 00:00:00)
      default: "00:00:00"
      selector:
        time:

trigger:
  # Auslöser: Windgeschwindigkeit über maximalem Schwellenwert
  - platform: numeric_state
    id: trigger_windsensor_max_threshold
    entity_id: !input wind_sensor
    above: !input wind_max_threshold
  # Auslöser: Regenmenge über Schwellenwert
  - platform: numeric_state
    id: trigger_rain_statistic_sensor
    entity_id: !input rain_sensor
    above: !input rain_threshold
  # Auslöser: Markise wird manuell ausgefahren
  - platform: state
    id: trigger_marquise_opened
    entity_id: !input marquise_status_sensor
    from: "off"
    to: "on"
  # Auslöser: Markise wird manuell eingefahren
  - platform: state
    id: trigger_marquise_closed
    entity_id: !input marquise_status_sensor
    from: "on"
    to: "off"
  # Auslöser: Windgeschwindigkeit unter minimalem Schwellenwert für eine bestimmte Zeit
  - platform: numeric_state
    id: trigger_windsensor_min_threshold
    entity_id: !input wind_sensor
    below: !input wind_min_threshold
    for:
      minutes: !input automatic_extend_timeout_minutes
  # Auslöser: Windsensor ist nicht verfügbar oder unbekannt für eine bestimmte Zeit
  - platform: state
    id: trigger_windsensor_unknown
    entity_id: !input wind_sensor
    to:
      - unavailable
      - unknown
    for:
      minutes: !input wind_sensor_timeout_minutes
  # Auslöser: Mehrere Sensoren (Wind, Status, Steuerung) sind nicht verfügbar oder unbekannt
  - platform: state
    id: trigger_sensors_unknown
    entity_id:
      - !input wind_sensor
      - !input marquise_status_sensor
      - !input marquise_retract_switch
      - !input marquise_extend_switch
    to:
      - unavailable
      - unknown
    for:
      minutes: !input sensors_timeout_minutes
  # Auslöser: Der Einfahr-Zähler überschreitet den konfigurierten Grenzwert
  - platform: numeric_state
    id: trigger_retract_counter
    entity_id: !input retract_counter_helper
    above: !input automatic_retract_count_threshold
  # Auslöser: Tägliches Reset um Mitternacht
  - platform: time
    id: trigger_reset_time
    at: !input reset_time

condition: []

action:
  - variables:
      wind_speed: !input wind_sensor
      rain_amount: !input rain_sensor
      retract_count: !input retract_counter_helper
  - choose:
      # Aktion: Starkwind erkannt
      - conditions:
          - condition: trigger
            id:
              - trigger_windsensor_max_threshold
        sequence:
          # Wenn Markise bereits geschlossen ist, tue nichts
          - if:
              - condition: state
                entity_id: !input marquise_status_sensor
                state: "off"
            then: []
            alias: Wenn Markise geschlossen -> tue nichts
          # Wenn Markise geöffnet ist, fahre sie ein
          - alias: Wenn Markise geöffnet -> Einfahren
            if:
              - condition: state
                entity_id: !input marquise_status_sensor
                state: "on"
            then:
              - service: homeassistant.turn_on
                target:
                  entity_id: !input marquise_retract_switch
              - service: counter.increment
                target:
                  entity_id: !input retract_counter_helper
              - service: input_boolean.turn_on
                target:
                  entity_id: !input automatic_retracted_helper
              - service: input_boolean.turn_off
                target:
                  entity_id: !input automatic_extended_helper
              - alias: Benachrichtigung Starkwind
                service: notify.notify
                data:
                  title: "Starkwind erkannt"
                  message: "Markise wurde wegen Starkwind ({{ wind_speed }} km/h) automatisch eingefahren."
          # Wenn Markisenstatus unbekannt ist, fahre sie sicherheitshalber ein
          - alias: Wenn Markisenstatus unbekannt -> Einfahren
            if:
              - condition: state
                entity_id: !input marquise_status_sensor
                state:
                  - unknown
                  - unavailable
            then:
              - service: homeassistant.turn_on
                target:
                  entity_id: !input marquise_retract_switch
              - service: input_boolean.turn_on
                target:
                  entity_id: !input automatic_retracted_helper
              - service: input_boolean.turn_off
                target:
                  entity_id: !input automatic_extended_helper
              - alias: Benachrichtigung Starkwind (Status unbekannt)
                service: notify.notify
                data:
                  title: "Starkwind - Markisenstatus unbekannt"
                  message: "Markise wurde wegen Starkwind ({{ wind_speed }} km/h) automatisch eingefahren. ACHTUNG: Markisenstatus unbekannt!"
        alias: Starkwind
      # Aktion: Windsensor-Timeout
      - conditions:
          - condition: trigger
            id:
              - trigger_windsensor_unknown
        sequence:
          # Wenn Markise geschlossen ist, tue nichts
          - alias: Markise geschlossen -> tue nichts
            if:
              - condition: state
                entity_id: !input marquise_status_sensor
                state: "off"
            then: []
          # Wenn Markisenstatus unbekannt, schließe Markise sicherheitshalber
          - alias: Markisenstatus unbekannt -> schließe Markise
            if:
              - condition: state
                entity_id: !input marquise_status_sensor
                state:
                  - unavailable
                  - unknown
            then:
              - service: homeassistant.turn_on
                target:
                  entity_id: !input marquise_retract_switch
              - service: input_boolean.turn_on
                target:
                  entity_id: !input automatic_retracted_helper
              - service: input_boolean.turn_off
                target:
                  entity_id: !input automatic_extended_helper
              - alias: Benachrichtigung Windsensor-Timeout
                service: notify.notify
                data:
                  title: "Windsensor-Timeout"
                  message: "Markise wird eingefahren, da der Windsensor nicht erreichbar ist."
          # Wenn Markise geöffnet ist, schließe Markise
          - alias: Markise geöffnet -> schließe Markise
            if:
              - condition: state
                entity_id: !input marquise_status_sensor
                state: "on"
            then:
              - service: homeassistant.turn_on
                target:
                  entity_id: !input marquise_retract_switch
              - service: input_boolean.turn_on
                target:
                  entity_id: !input automatic_retracted_helper
              - service: input_boolean.turn_off
                target:
                  entity_id: !input automatic_extended_helper
              - alias: Benachrichtigung Windsensor-Timeout
                service: notify.notify
                data:
                  title: "Windsensor-Timeout"
                  message: "Markise wird eingefahren, da der Windsensor nicht erreichbar ist."
        alias: Windsensor-Timeout
      # Aktion: Regen erkannt
      - conditions:
          - condition: trigger
            id:
              - trigger_rain_statistic_sensor
        sequence:
          # Wenn Markise geschlossen ist, tue nichts
          - alias: Markise geschlossen -> tue nichts
            if:
              - condition: state
                entity_id: !input marquise_status_sensor
                state: "off"
            then: []
          # Wenn Markisenstatus unbekannt, schließe Markise sicherheitshalber
          - alias: Markisenstatus unbekannt -> schließe Markise
            if:
              - condition: state
                entity_id: !input marquise_status_sensor
                state:
                  - unavailable
                  - unknown
            then:
              - service: homeassistant.turn_on
                target:
                  entity_id: !input marquise_retract_switch
              - service: input_boolean.turn_on
                target:
                  entity_id: !input automatic_retracted_helper
              - service: input_boolean.turn_off
                target:
                  entity_id: !input automatic_extended_helper
              - alias: Benachrichtigung Regen (Status unbekannt)
                service: notify.notify
                data:
                  title: "Regen erkannt - Markisenstatus unbekannt"
                  message: "Markise wird wegen Regen ({{ rain_amount }} mm) eingefahren. Status unbekannt!"
          # Wenn Markise geöffnet ist, schließe Markise
          - alias: Markise geöffnet -> schließe Markise
            if:
              - condition: state
                entity_id: !input marquise_status_sensor
                state: "on"
            then:
              - service: homeassistant.turn_on
                target:
                  entity_id: !input marquise_retract_switch
              - service: input_boolean.turn_on
                target:
                  entity_id: !input automatic_retracted_helper
              - service: input_boolean.turn_off
                target:
                  entity_id: !input automatic_extended_helper
              - alias: Benachrichtigung Regen erkannt
                service: notify.notify
                data:
                  title: "Regen erkannt"
                  message: "Markise wird wegen Regen ({{ rain_amount }} mm) eingefahren."
        alias: Regen
      # Aktion: Manuelles Ausfahren
      - conditions:
          - condition: and
            conditions:
              - condition: trigger
                id:
                  - trigger_marquise_opened
              - condition: state
                entity_id: !input automatic_extended_helper
                state: "off"
        sequence:
          - if:
              - condition: numeric_state
                entity_id: !input retract_counter_helper
                above: 0
            then:
              - service: counter.reset
                target:
                  entity_id: !input retract_counter_helper
              - alias: Benachrichtigung Manuell Ausgefahren
                service: notify.notify
                data:
                  title: "Markise manuell ausgefahren"
                  message: "Der Markisen-Zähler wurde durch manuelles Ausfahren zurückgesetzt."
        alias: Markise manuell ausgefahren
      # Aktion: Manuelles Einfahren
      - conditions:
          - condition: and
            conditions:
              - condition: trigger
                id:
                  - trigger_marquise_closed
              - condition: state
                entity_id: !input automatic_retracted_helper
                state: "off"
        sequence:
          - service: input_boolean.turn_off
            target:
              entity_id: !input automatic_extended_helper
        alias: Markise manuell eingefahren
      # Aktion: Zählerschutz-Benachrichtigung
      - conditions:
          - condition: trigger
            id:
              - trigger_retract_counter
        sequence:
          - alias: Benachrichtigung Zählerschutz
            service: notify.notify
            data:
              title: "Markisen-Zählerschutz aktiv"
              message: "Markise wurde in kurzer Zeit {{ retract_count }} Mal automatisch eingefahren. Automatisches Ausfahren ist gesperrt."
        alias: Benachrichtigung Ausfahrsperre aktiv
      # Aktion: Tägliches Reset
      - conditions:
          - condition: trigger
            id:
              - trigger_reset_time
        sequence:
          - service: counter.reset
            target:
              entity_id: !input retract_counter_helper
          - service: input_boolean.turn_off
            target:
              entity_id: !input automatic_extended_helper
          - service: input_boolean.turn_off
            target:
              entity_id: !input automatic_retracted_helper
        alias: Zeitlicher Reset der Automation
      # Aktion: Sensor-Fehlerwarnung
      - conditions:
          - condition: trigger
            id:
              - trigger_sensors_unknown
        sequence:
          - if:
              - condition: state
                entity_id: !input marquise_status_sensor
                state: "on"
            then:
              - service: homeassistant.turn_on
                target:
                  entity_id: !input marquise_retract_switch
              - service: counter.increment
                target:
                  entity_id: !input retract_counter_helper
              - service: input_boolean.turn_on
                target:
                  entity_id: !input automatic_retracted_helper
              - service: input_boolean.turn_off
                target:
                  entity_id: !input automatic_extended_helper
              - alias: Benachrichtigung Sensor-Fehler (Einfahren)
                service: notify.notify
                data:
                  title: "Markisenwächter - Sensor-Fehler"
                  message: "Markise wurde eingefahren, da kritische Sensoren nicht erreichbar sind."
          - if:
              - condition: state
                entity_id: !input marquise_status_sensor
                state:
                  - "off"
            then:
              - alias: Benachrichtigung Sensor-Fehler
                service: notify.notify
                data:
                  title: "Markisenwächter - Sensor-Fehler"
                  message: "Achtung! Einer oder mehrere kritische Sensoren des Markisenwächters sind nicht verfügbar!"
          - if:
              - condition: state
                entity_id: !input marquise_status_sensor
                state:
                  - "unavailable"
                  - "unknown"
            then:
              - service: homeassistant.turn_on
                target:
                  entity_id: !input marquise_retract_switch
              - alias: Benachrichtigung Sensor-Fehler (Status unbekannt)
                service: notify.notify
                data:
                  title: "Markisenwächter - Sensor-Fehler"
                  message: "Achtung! Einer oder mehrere kritische Sensoren des Markisenwächters sind nicht verfügbar! Markise wird sicherheitshalber eingefahren."
        alias: "Warnung: Sensor(en) nicht verfügbar"
      # Aktion: Wind lässt nach, Markise wieder ausfahren
      - conditions:
          - condition: trigger
            id:
              - trigger_windsensor_min_threshold
        sequence:
          - if:
              - condition: and
                conditions:
                  - condition: state
                    entity_id: !input automatic_retracted_helper
                    state: "on"
                  - condition: numeric_state
                    entity_id: !input rain_sensor
                    below: !input rain_threshold
            then:
              - service: input_boolean.turn_off
                target:
                  entity_id: !input automatic_retracted_helper
              - service: input_boolean.turn_on
                target:
                  entity_id: !input automatic_extended_helper
              - service: homeassistant.turn_on
                target:
                  entity_id: !input marquise_extend_switch
              - alias: Benachrichtigung Wind lässt nach
                service: notify.notify
                data:
                  title: "Wind lässt nach"
                  message: "Windstärke ({{ wind_speed }} km/h) und Regen ({{ rain_amount }} mm) sind unter den Schwellenwert gefallen. Markise wird wieder ausgefahren."
        alias: Wind lässt nach
    # Standardaktion, wenn kein Trigger zutrifft
    default:
      - alias: Benachrichtigung unbekannter Fehler
        service: notify.notify
        data:
          title: "Markisenwächter - Fehler"
          message: "Ein Fehler oder eine unbekannte Situation ist aufgetreten. Bitte überprüfe das Log und die Sensoren/Steuerungen."

mode: single

Screenshots: