sphings-dev.de

Rollladen-Steuerung pro Raum: Taster, Fenster, Kälte und Regen

Ein Rollladen im Wohnraum soll mehrere Dinge auf einmal können: auf Tastendruck fahren, nicht herunterfahren, solange das Fenster offen ist, bei Kälte oder Regen das offene Fenster schützen und morgens in einer festgelegten Stellung stehen. Wenn jede dieser Regeln eine eigene Automation ist, kommen sie sich in die Quere. Deshalb steckt bei mir die gesamte Logik eines Raumes in einer einzigen Automation. Hier als Beispiel die Küche. Die übrigen Räume sind nach derselben Vorlage entstanden und unterscheiden sich in den Entitäten.

Was du brauchst

  • Einen Rollladen als cover-Entität mit Positionsangabe (current_position)
  • Einen Fensterkontakt oder eine Gruppe aus Fensterkontakten des Raumes (binary_sensor, an = offen)
  • Einen Temperatursensor im Raum und einen Regensensor im Freien (bei mir ein Sensor vom Typ Wasserleck im Garten)
  • Drei input_button pro Raum für hoch, Spalt und runter. Wandschalter, Dashboard oder andere Automationen drücken diese Taster
  • Pro Raum zwei Merker-input_boolean: „öffnen angefordert“ und „schließen vorgemerkt“
  • Pro Raum zwei Schalter-input_boolean: einen, der die Aktion eine Stunde vor Sonnenaufgang zulässt, und einen für die Regenüberwachung

So funktioniert es

Alle Auslöser landen in einer Automation und werden über eine id unterschieden. Weil die Automation im Modus restart läuft, bricht ein neues Ereignis einen noch laufenden Durchlauf ab. Der Kern ist ein choose mit einem Zweig pro Auslöser.

Die drei Taster sind der direkte Weg. „Hoch“ setzt den Merker „öffnen angefordert“, löscht „schließen vorgemerkt“ und fährt hoch. „Spalt“ löscht beide Merker und fährt auf die Position 16, bei mir ein schmaler Spalt. „Runter“ löscht „öffnen angefordert“ und schließt sofort, wenn das Fenster zu ist. Ist es offen, passiert nichts außer dem Merken: „schließen vorgemerkt“ geht an.

Das Fenster wirkt in beide Richtungen. Geht es auf und steht der Rollladen unter 90 Prozent, fährt der Rollladen hoch und merkt sich, dass er später wieder herunter soll. Die Bedingung steht mitten im Zweig: Ist der Rollladen schon oben, bricht der Zweig dort ab und es wird nichts vorgemerkt. Geht das Fenster zu, wird nachgeholt, was vorgemerkt war: Steht „schließen vorgemerkt“ an und wurde nicht inzwischen „hoch“ gedrückt, schließt der Rollladen. Wurde in der Zwischenzeit „hoch“ gedrückt, wird nur der Merker gelöscht.

Kälte und Regen schützen das offene Fenster. Fällt die Raumtemperatur fünf Minuten lang unter 17 °C und das Fenster ist offen, schließt der Rollladen, die Merker werden gelöscht. Regen löst nach fünf Sekunden aus und wirkt nur bei offenem Fenster und eingeschalteter Regenüberwachung des Raumes. Beide Zweige löschen dabei die Merker.

Der letzte Zweig läuft eine Stunde vor Sonnenaufgang, aber nur wenn der Schalter für den Raum aktiv ist und der Rollladen nicht schon ganz geschlossen steht. Ist das Fenster offen, fährt der Rollladen auf Position 16. Ist es zu, fährt er ganz zu. In beiden Fällen werden die Merker gelöscht, das ist der Reset im Namen der Automation.

Die Automation

alias: "Rollladen: Küche (Taster, Fenster, Kälte, Regen, Reset)"
mode: restart
triggers:
  - {trigger: state, entity_id: input_button.taste_rollladen_kueche_hoch,   id: btn_hoch,   not_to: [unknown, unavailable]}
  - {trigger: state, entity_id: input_button.taste_rollladen_kueche_rille,  id: btn_rille,  not_to: [unknown, unavailable]}
  - {trigger: state, entity_id: input_button.taste_rollladen_kueche_runter, id: btn_runter, not_to: [unknown, unavailable]}
  - {trigger: state, entity_id: binary_sensor.gruppe_fenster_kueche, id: fenster_auf, to: "on"}
  - {trigger: state, entity_id: binary_sensor.gruppe_fenster_kueche, id: fenster_zu,  to: "off"}
  - trigger: numeric_state
    entity_id: sensor.kueche_temperatur
    below: 17
    for: {minutes: 5}
    id: temp_kalt
  - trigger: state
    entity_id: binary_sensor.regensensor_garten
    to: "on"
    for: {seconds: 5}
    id: regen_on
  - trigger: sun
    event: sunrise
    offset: "-01:00:00"
    id: sunrise_minus_1h
actions:
  - choose:
      # Eine Stunde vor Sonnenaufgang
      - conditions:
          - {condition: trigger, id: sunrise_minus_1h}
          - {condition: state, entity_id: input_boolean.sonnenaufgang_kueche_rille_aktiv, state: "on"}
          - condition: not
            conditions:
              - {condition: state, entity_id: cover.rollladen_kueche, state: closed}
        sequence:
          - choose:
              - conditions:
                  - {condition: state, entity_id: binary_sensor.gruppe_fenster_kueche, state: "on"}
                sequence:
                  - action: input_boolean.turn_off
                    target:
                      entity_id: [input_boolean.rollladen_kueche_oeffnen_angefordert, input_boolean.rollladen_kueche_schliessen_vorgemerkt]
                  - action: cover.set_cover_position
                    data: {position: 16}
                    target: {entity_id: cover.rollladen_kueche}
              - conditions:
                  - {condition: state, entity_id: binary_sensor.gruppe_fenster_kueche, state: "off"}
                sequence:
                  - action: input_boolean.turn_off
                    target:
                      entity_id: [input_boolean.rollladen_kueche_oeffnen_angefordert, input_boolean.rollladen_kueche_schliessen_vorgemerkt]
                  - action: cover.close_cover
                    target: {entity_id: cover.rollladen_kueche}

      # Regen: nur bei offenem Fenster und aktiver Regenüberwachung
      - conditions:
          - {condition: trigger, id: regen_on}
          - {condition: state, entity_id: binary_sensor.gruppe_fenster_kueche, state: "on"}
          - {condition: state, entity_id: input_boolean.regenueberwachung_kueche_rollladen_runter, state: "on"}
        sequence:
          - action: input_boolean.turn_off
            target:
              entity_id: [input_boolean.rollladen_kueche_schliessen_vorgemerkt, input_boolean.rollladen_kueche_oeffnen_angefordert]
          - action: cover.close_cover
            target: {entity_id: cover.rollladen_kueche}

      # Kälte: nur bei offenem Fenster
      - conditions:
          - {condition: trigger, id: temp_kalt}
          - {condition: state, entity_id: binary_sensor.gruppe_fenster_kueche, state: "on"}
        sequence:
          - action: input_boolean.turn_off
            target:
              entity_id: [input_boolean.rollladen_kueche_schliessen_vorgemerkt, input_boolean.rollladen_kueche_oeffnen_angefordert]
          - action: cover.close_cover
            target: {entity_id: cover.rollladen_kueche}

      # Taster hoch
      - conditions:
          - {condition: trigger, id: btn_hoch}
        sequence:
          - {action: input_boolean.turn_on,  target: {entity_id: input_boolean.rollladen_kueche_oeffnen_angefordert}}
          - {action: input_boolean.turn_off, target: {entity_id: input_boolean.rollladen_kueche_schliessen_vorgemerkt}}
          - {action: cover.open_cover, target: {entity_id: cover.rollladen_kueche}}

      # Taster Rille (Spaltposition 16 %)
      - conditions:
          - {condition: trigger, id: btn_rille}
        sequence:
          - action: input_boolean.turn_off
            target:
              entity_id: [input_boolean.rollladen_kueche_oeffnen_angefordert, input_boolean.rollladen_kueche_schliessen_vorgemerkt]
          - action: cover.set_cover_position
            data: {position: 16}
            target: {entity_id: cover.rollladen_kueche}

      # Taster runter: bei offenem Fenster nur vormerken
      - conditions:
          - {condition: trigger, id: btn_runter}
        sequence:
          - {action: input_boolean.turn_off, target: {entity_id: input_boolean.rollladen_kueche_oeffnen_angefordert}}
          - choose:
              - conditions:
                  - {condition: state, entity_id: binary_sensor.gruppe_fenster_kueche, state: "on"}
                sequence:
                  - {action: input_boolean.turn_on, target: {entity_id: input_boolean.rollladen_kueche_schliessen_vorgemerkt}}
              - conditions:
                  - {condition: state, entity_id: binary_sensor.gruppe_fenster_kueche, state: "off"}
                sequence:
                  - {action: cover.close_cover, target: {entity_id: cover.rollladen_kueche}}
                  - {action: input_boolean.turn_off, target: {entity_id: input_boolean.rollladen_kueche_schliessen_vorgemerkt}}

      # Fenster geht auf: Rollladen hoch und Schließen vormerken
      - conditions:
          - {condition: trigger, id: fenster_auf}
        sequence:
          - condition: numeric_state
            entity_id: cover.rollladen_kueche
            attribute: current_position
            below: 90
          - {action: cover.open_cover, target: {entity_id: cover.rollladen_kueche}}
          - {action: input_boolean.turn_on, target: {entity_id: input_boolean.rollladen_kueche_schliessen_vorgemerkt}}

      # Fenster geht zu: vorgemerktes Schließen nachholen
      - conditions:
          - {condition: trigger, id: fenster_zu}
        sequence:
          - choose:
              - conditions:
                  - {condition: state, entity_id: input_boolean.rollladen_kueche_schliessen_vorgemerkt, state: "on"}
                  - {condition: state, entity_id: input_boolean.rollladen_kueche_oeffnen_angefordert, state: "off"}
                sequence:
                  - {action: cover.close_cover, target: {entity_id: cover.rollladen_kueche}}
                  - {action: input_boolean.turn_off, target: {entity_id: input_boolean.rollladen_kueche_schliessen_vorgemerkt}}
              - conditions:
                  - {condition: state, entity_id: input_boolean.rollladen_kueche_oeffnen_angefordert, state: "on"}
                sequence:
                  - {action: input_boolean.turn_off, target: {entity_id: input_boolean.rollladen_kueche_schliessen_vorgemerkt}}
    default: []

Die Bad-Variante weicht an zwei Stellen ab: Dort fährt der Rollladen beim Schließen auf Position 16 statt ganz zu, wenn die Sonne auf die Fassade steht. Das betrifft die Zweige „runter“ (Fenster zu) und „Fenster zu“. Wie die Sonnenbedingung entsteht, steht im nächsten Beitrag zum Sonnenschutz.

# Variante für Räume mit Sonnenseite (hier: Bad EG, Südwestfassade):
# statt cover.close_cover im Zweig "btn_runter" (Fenster zu) und im Zweig "fenster_zu"
- if:
    - {condition: state, entity_id: binary_sensor.rollladen_sonne_suedwest, state: "on"}
  then:
    - action: cover.set_cover_position
      data: {position: 16}
      target: {entity_id: cover.rollladen_bad_eg}
  else:
    - action: cover.close_cover
      target: {entity_id: cover.rollladen_bad_eg}

Anpassen

  • Ersetze die Entitäten für Rollladen, Fenster, Temperatur, Taster und Helfer. Die Namen folgen bei mir dem Muster …_kueche_…, sodass sich die Automation pro Raum per Suchen und Ersetzen kopieren lässt.
  • Die Schwellen 17 °C, 5 Minuten, 5 Sekunden und Position 16 passen zu meinen Rollläden. Position 90 in der Fensterbedingung heißt: ab 90 Prozent offen gilt der Rollladen als oben.
  • Wer keinen Regensensor hat, streicht den Regen-Zweig samt Trigger. Ohne Kältebedingung genauso.

Stolpersteine

Der Zweig „Fenster geht auf“ hat die Positionsbedingung mitten in der Sequenz, nicht in conditions. Scheitert sie, endet der Durchlauf an dieser Stelle, die folgenden Aktionen laufen nicht. An den Tastern schließt not_to: [unknown, unavailable] Wechsel von und nach diesen Zuständen aus. Und weil die Automation restart nutzt, dürfen die Zweige keine langen Wartezeiten enthalten. Bei mir steht darin keine einzige.

Tags

Unterstützen

Diese Tools entstehen in meiner Freizeit und bleiben kostenlos, offen und cloud-frei. Wenn dir eins davon einen Nachmittag gespart hat, freue ich mich über einen Kaffee oder ein Stück Pizza.

Kaffee oder Pizza

Weitere Beiträge