Wetterdaten für deine smarte Gartenbewässerung integrieren
Wetterdaten für deine smarte Gartenbewässerung integrieren
 

Was wir bauen

Wir nutzen die Wetterdaten von Open-Meteo, die in Home Assistant als Core-Integration ohne API-Key und ohne Anmeldung laufen. Daraus bauen wir zwei Sensoren:

  • Niederschlag heute Vorhersage: die komplette erwartete Regenmenge für heute in mm.
  • Niederschlag Rest des Tages: nur noch das, was ab jetzt bis Mitternacht runterkommt.

Den ersten Wert brauchst du für den Regen-Check, den zweiten, wenn deine Bewässerung mittags läuft und du den Vormittagsregen nicht doppelt zählen willst




Code:

# =====================================================================
# Open-Meteo Niederschlags-Sensoren für GießBot Rain-Check
# =====================================================================
# Was es macht:
#   Liest aus der Open-Meteo Wetter-Entität die erwartete Regenmenge in
#   mm und legt sie als zwei Sensoren ab:
#     - sensor.niederschlag_heute_vorhersage  -> komplette Tagessumme heute
#     - sensor.niederschlag_rest_des_tages    -> nur noch ab jetzt bis 24 Uhr
#
# Anpassen:
#   weather.home  ->  deine Open-Meteo Entität
#   (Entwicklerwerkzeuge -> Zustände -> nach  weather.  filtern)
# =====================================================================

template:
  - trigger:
      - trigger: time_pattern
        minutes: "/30"
      - trigger: homeassistant
        event: start
    action:
      - action: weather.get_forecasts
        target:
          entity_id: weather.home
        data:
          type: daily
        response_variable: daily_fc
      - action: weather.get_forecasts
        target:
          entity_id: weather.home
        data:
          type: hourly
        response_variable: hourly_fc
    sensor:
      # --- Komplette erwartete Tagessumme für heute ---
      - name: "Niederschlag heute Vorhersage"
        unique_id: niederschlag_heute_vorhersage
        unit_of_measurement: "mm"
        device_class: precipitation
        state_class: measurement
        state: >
          {% set fc = (daily_fc.values() | list)[0].forecast %}
          {{ fc[0].precipitation | float(0) | round(1) }}
        availability: >
          {{ daily_fc is defined
             and (daily_fc.values() | list | count) > 0
             and ((daily_fc.values() | list)[0].forecast | count) > 0 }}

      # --- Nur noch erwarteter Regen ab jetzt bis Mitternacht ---
      - name: "Niederschlag Rest des Tages"
        unique_id: niederschlag_rest_des_tages
        unit_of_measurement: "mm"
        device_class: precipitation
        state_class: measurement
        state: >
          {% set fc = (hourly_fc.values() | list)[0].forecast %}
          {% set ns = namespace(total=0) %}
          {% for f in fc %}
            {% set dt = as_local(as_datetime(f.datetime)) %}
            {% if dt.date() == now().date() and dt >= now() %}
              {% set ns.total = ns.total + (f.precipitation | float(0)) %}
            {% endif %}
          {% endfor %}
          {{ ns.total | round(1) }}
        availability: >
          {{ hourly_fc is defined
             and (hourly_fc.values() | list | count) > 0 }}

# template bitte nur nutzen, wenn noch keine weiteren Template Sensoren in der YAML sind, # sonst darunter einfügen template:  - trigger:      - platform: time_pattern        minutes: "/15"  # Update alle 15 Minuten (oder nach Bedarf anpassen)      - platform: homeassistant        event: start     # Update beim Start von Home Assistant    action:      - service: weather.get_forecasts  # Der neue Dienstaufruf        data:          type: daily                   # Tägliche Vorhersage abrufen        target:          entity_id: weather.home      # DEINE AccuWeather Wetter-Entität        response_variable: accu_daily  # Name der Variable für das Ergebnis    sensor:      # Dieser Sensor dient nur als "Container" für das forecast-Attribut      - name: "AccuWeather Forecast Attribute"        unique_id: accuweather_forecast_attribute        state: "{{ states('weather.home') }}"  # Zustand kann z.B. der Zustand der Original-Entität sein        attributes:          # Hier wird das 'forecast'-Attribut mit den Daten aus dem Dienstaufruf erstellt          forecast: "{{ accu_daily['weather.home'].forecast }}"   - sensor:      # --- AccuWeather Regen Heute (Separate Sensoren) ---      - name: "Regenwahrscheinlichkeit Heute (Accu)"        unique_id: regen_prob_heute_accu  # Eindeutige ID (ggf. anpassen falls schon vergeben)        unit_of_measurement: '%'        icon: mdi:water-percent        state_class: measurement  # Numerischer Sensor für Statistiken        state: >          {# Holt die Wahrscheinlichkeit für heute (Index 0) #}          {% set fc = state_attr('sensor.accuweather_forecast_attribute', 'forecast') %}          {% if fc and fc|length > 0 and 'precipitation_probability' in fc[0] and fc[0].precipitation_probability is not none %}            {{ fc[0].precipitation_probability }}          {% else %}            unknown  {# Fallback, falls Wert nicht lesbar #}          {% endif %}        availability: >          {# Verfügbar, wenn Quelle existiert und mind. heutigen Forecast hat #}          {{ state_attr('sensor.accuweather_forecast_attribute', 'forecast') is not none and state_attr('sensor.accuweather_forecast_attribute', 'forecast') | length > 0 }}       - name: "Regenmenge Heute (Accu)"        unique_id: regen_menge_heute_accu  # Eindeutige ID        unit_of_measurement: 'mm'        icon: mdi:weather-pouring        state_class: measurement        state: >          {# Holt die Menge für heute (Index 0) #}          {% set fc = state_attr('sensor.accuweather_forecast_attribute', 'forecast') %}          {% if fc and fc|length > 0 and 'precipitation' in fc[0] and fc[0].precipitation is not none %}            {{ fc[0].precipitation }}          {% else %}            unknown          {% endif %}        availability: >          {# Verfügbar, wenn Quelle existiert und mind. heutigen Forecast hat #}          {{ state_attr('sensor.accuweather_forecast_attribute', 'forecast') is not none and state_attr('sensor.accuweather_forecast_attribute', 'forecast') | length > 0 }}       # --- AccuWeather Regen Morgen ---      - name: "Regenwahrscheinlichkeit Morgen (Accu)"        unique_id: regen_prob_morgen_accu  # Eindeutige ID        unit_of_measurement: '%'        icon: mdi:water-percent        state_class: measurement        state: >          {# Holt die Wahrscheinlichkeit für morgen (Index 1) #}          {% set fc = state_attr('sensor.accuweather_forecast_attribute', 'forecast') %}          {# Wichtig: Prüfe auf Länge > 1 für morgigen Forecast #}          {% if fc and fc|length > 1 and 'precipitation_probability' in fc[1] and fc[1].precipitation_probability is not none %}            {{ fc[1].precipitation_probability }}          {% else %}            unknown          {% endif %}        availability: >          {# Verfügbar, wenn Quelle existiert und mind. morgigen Forecast hat #}          {{ state_attr('sensor.accuweather_forecast_attribute', 'forecast') is not none and state_attr('sensor.accuweather_forecast_attribute', 'forecast') | length > 1 }}       - name: "Regenmenge Morgen (Accu)"        unique_id: regen_menge_morgen_accu  # Eindeutige ID        unit_of_measurement: 'mm'        icon: mdi:weather-pouring        state_class: measurement        state: >          {# Holt die Menge für morgen (Index 1) #}          {% set fc = state_attr('sensor.accuweather_forecast_attribute', 'forecast') %}          {# Wichtig: Prüfe auf Länge > 1 für morgigen Forecast #}          {% if fc and fc|length > 1 and 'precipitation' in fc[1] and fc[1].precipitation is not none %}            {{ fc[1].precipitation }}          {% else %}            unknown          {% endif %}        availability: >          {# Verfügbar, wenn Quelle existiert und mind. morgigen Forecast hat #}          {{ state_attr('sensor.accuweather_forecast_attribute', 'forecast') is not none and state_attr('sensor.accuweather_forecast_attribute', 'forecast') | length > 1