Storensteuerung via Wetterdaten

Liebe Comunnity

Auch wenn die Temperaturen zurzeit frostig sind: der Sommer kommt wieder. Inklusiver dem Thema Sonnenschutz. Ich erstellte bei mir zuhause eine Automation, die den Sonnenstand als Auslöser nimmt und die Wettervorhersage berücksichtigt.

Ich versuche dir mein System zu erklären, beschreibe dir die notwendigen Schritte und stelle dir die Codes zur Verfügung.

Das Endergebnis ist diese Automation. Die Automation stösst dann die eigentliche Automation für die Storenansteuerung an. Dies hat den Vorteil, dass ich den Sonnenschutz auch händisch auslösen kann:


alias: Storen Sonnenschutz aktivieren
description: >-
  Lässt Ostseitig die Storen runter, wenn die Wetter-Bedingungen erfüllt werden
  (Sonnig oder teilweise bewölkt und Tageshöchstwert von 24°C). Der Helfer löst
  die Automation "Storen Sonnenschutz Task" aus
trigger:
  - platform: numeric_state
    entity_id: sun.sun
    above: 105
    attribute: azimuth
    id: Azimut
  - platform: state
    entity_id:
      - input_boolean.away
    from: "off"
    to: "on"
    id: Away
  - platform: template
    value_template: >-
      {{ states('weather.accu_weather', 'state') in ['sunny', 'partlycloudy']
      }}
    alias: "Prüft die aktuelle Wetterbedingung "
    id: Aktuelle Wetterbedingung
  - platform: numeric_state
    entity_id: sensor.temperatur_wohnung
    for:
      hours: 0
      minutes: 15
      seconds: 0
    above: 26
    id: Temperatur Wohnung
    alias: Prüft die Wohnungstemperatur
  - platform: numeric_state
    entity_id: sensor.bewegungsmelder_kuche_illuminance_lux
    for:
      hours: 0
      minutes: 5
      seconds: 0
    above: 3000
    id: LUX Küche
condition:
  - condition: or
    conditions:
      - condition: and
        conditions:
          - condition: numeric_state
            entity_id: sensor.forecast_temperatur_high
            above: 25
          - condition: or
            conditions:
              - condition: trigger
                id: Azimut
              - condition: trigger
                id: Away
              - condition: trigger
                id: Aktuelle Wetterbedingung
              - condition: trigger
                id: LUX Küche
        alias: Prüft Auslöser ID mit Mindestaussenhöchsttemperatur
      - condition: and
        conditions:
          - condition: trigger
            id: Temperatur Wohnung
        alias: Prüft Auslöser ID ohne Mindestaussenhöchsttemperatur
    alias: Auslöser mit oder ohne Mindestaussenhöchsttemperatur
  - condition: state
    entity_id: input_boolean.storen_sonnenschutz
    state: "off"
  - condition: numeric_state
    entity_id: sun.sun
    attribute: azimuth
    above: 105
    below: 180
  - condition: or
    conditions:
      - condition: state
        entity_id: binary_sensor.prufung_heute_sonnig_oder_teilweise_bewolkt
        state: "on"
        enabled: true
      - condition: template
        value_template: >-
          {{ states('weather.accu_weather', 'state') in ['sunny',
          'partlycloudy'] }}
        alias: Bedingung wenn Wetter aktuell sonnig  oder bewölkt
      - condition: state
        entity_id: >-
          binary_sensor.openweathermap_prufung_heute_sonnig_oder_teilweise_bewolkt_nachmittag
        state: "on"
    alias: ODER prüft Wetterbedinungen
action:
  - service: input_boolean.turn_on
    data: {}
    target:
      entity_id: input_boolean.storen_sonnenschutz
mode: single

Kurz zur Erklärung:
Ich habe zwei Auslöser definiert, einmal den Sonnenstand, also ab wann die ersten Sonnenstrahlen durch die Fenster scheinen, und einmal, wenn die Innentemperatur in der Wohnung einen bestimmten Schwellenwert überschreitet. Bei mir ist das, wenn der Wert länger als 15min bei 26°C liegt. Es gibt verschiedene Online-Tools, mit denen man den Azimut für die eigene Wohnung/Haus berechnen kann. In meinem Fall ist der Wert über 105° und unter 180° (Eigentumswohnung Ostseite).

Als Bedingung definiere ich meinen Azimutbereich. Diesen brauche ich nur für den Temperatur-Trigger. Dann brauche ich einen Sensor, der die Tageshöchsttemperatur misst. Wenn der Wert über 24°C liegt, ist die Bedingung erfüllt. Und der letzte Sensor prüft die Wettervorhersage für den Tag. Wird sonnig oder teilweise bewölkt gemeldet, ist die Bedingung erfüllt.

Die Aktion aktiviert dann den Helfer, der die eigentliche Sonnenschutzautomation auslöst. Du kannst hier aber auch direkt deine Automation hinzufügen. Der Vorteil meiner Lösung ist, dass ich im Dahsboard sehe, ob der Sonnenschutz aktiviert wurde und dies auch manuell übersteuern kann.

So viel zur Automation. Nun zu den Sensoren.

Tageshöchstwertsensor:
Zunächst wird eine Wetterintegration benötigt, die eine Vorhersage für den aktuellen Tag liefert. Die vorinstallierte Integration von Met.no kann das nicht. Ich benutze Accu Weather. Um das nutzen zu können, brauchst du einen API-Key. Den bekommst du kostenlos. Die Anleitung findest du hier.
image

Du musst die grünmarkierten Werte auslesen. Also die Vorhersage des aktuellen Tages (Höchsttemperatur) und die Wetterlage. Hier ist der Code dazu:

template:
  - sensor:
      #Exktraktion heutige Höchsttemperatur       
      - name: "Weather Temperature High Today"
        unique_id: fotecast_temphigh_today
        unit_of_measurement: '°C'
        state: >
            {{ state_attr('weather.accu_weather', 'forecast') [0] ['temperature'] }}
  - binary_sensor:
      #Exktraktion heutige Wetterlage       
      - name: "Weather Prüfung Heute Sonnig oder teilweise Bewölkt"
        unique_id: fotecast_condition_today_sunny_partlycloudy
        state: >
            {{ state_attr('weather.accu_weather', 'forecast')[0]['condition'] in ['sunny', 'partlycloudy'] }}

Wenn die Entität nicht weather.accu_weather ist, muss der richtige Name eingegeben werden.

Das Ergebnis sind zwei Sensoren, ein normaler Sensor und ein binärer Sensor.

Der Code muss in die configuration.yaml eingetragen werden. Gehe zu Entwicklerwerkzeuge → YAML → Überprüfen und neu starten und klicke auf Konfiguration prüfen. Wenn keine Fehlermeldung erscheint, klicke auf Neustart.

Den Code meiner eigentlichen Automation füge ich nicht ein, da dieser sehr umfangreich ist. Die Automation prüft in der Aktion, ob z.B. mein Kleiner schläft, damit die Jalousien nicht angesteuert werden oder ob die Balkontüren offen sind. Nicht, dass wir draußen sitzen und die Jalousien runtergehen.

Edit:
Ich erstellte für OpenWeatherMap einen Binärsensor mit den Vorhersagen für die Zeiten 11:00, 14:00 und 17:00. Dieser löst aus, wenn einer der Werte erfüllt wird. Die Automation wurde etwas erweitert.

#OpenWeatherMap prüft Wetterbedinung für die Zeit 11.00, 14.00 und 17.00       
      - name: "OpenWeatherMap Prüfung Heute Sonnig oder teilweise Bewölkt Nachmittag"
        unique_id: openweathermap_forecast_condition_afternoon_today_sunny_partlycloudy
        state: >
            {{ ((as_timestamp(now().strftime('%Y-%m-%d 11:00')) == as_timestamp((state_attr('weather.openweathermap', 'forecast') [0] ['datetime'])) and (state_attr('weather.openweathermap', 'forecast') [0] ['condition']) in ['sunny', 'partlycloudy'])) or
               ((as_timestamp(now().strftime('%Y-%m-%d 14:00')) == as_timestamp((state_attr('weather.openweathermap', 'forecast') [0] ['datetime'])) and (state_attr('weather.openweathermap', 'forecast') [1] ['condition']) in ['sunny', 'partlycloudy'])) or
               ((as_timestamp(now().strftime('%Y-%m-%d 17:00')) == as_timestamp((state_attr('weather.openweathermap', 'forecast') [0] ['datetime'])) and (state_attr('weather.openweathermap', 'forecast') [2] ['condition']) in ['sunny', 'partlycloudy'])) }}

3 „Gefällt mir“

Ich habe das so ähnlich auch mit dem Azimuth, habe allerdings die Wetterdaten nicht eingebunden.
Wie ist deine Erfahrung damit? Passen die immer? also bewölkt und sonnig und so?
Ich nutze diesbezüglich einfach einen mi-Pflanzensensor der auf dem Balkon steht und Helligkeit und Temperatur misst.

Grundsätzlich ist die Vorhersage für den Tag plus/minus richtig. Es geht ja vor allem um die heißen Tage. Außerdem hilft der Trigger mit dem Schwellenwert für die Wohnungstemperatur, dass die Wohnung nicht überhitzt wird.