Zum Inhalt springen
Alles Automatisch

TRMNL: Dashboard Update

Sendet alle 15 Minuten aktuelle Dashboard-Daten (Energie, Solar, Wetter, YouTube, Webseiten, Kalender) an ein TRMNL E-Ink Display per Webhook. Vollständige Automation mit allen Variablen zum Anpassen.

Entitäten:rest_commandautomationsensorweathercalendarinput_number

Themen:DashboardTRMNLE-InkWebhook

Aktualisiert: 21. April 2026

Was brauchst du dafür?

Integrationen
  • REST Command
Geräte
  • Sensor
Helper
  • Input Number Helper
TRMNL: Dashboard Update
# Entity-IDs sind anonymisiert. Ersetze sie durch deine eigenen.
# Beispiel: light.dein_wohnzimmer_licht -> light.wohnzimmer_deckenlampe
# TRMNL: Dashboard Update
# Sendet alle 15 Minuten aktuelle Dashboard-Daten an das TRMNL E-Ink Display.
# Passe die Entity-IDs an dein Setup an. Entferne Quadranten, die du nicht brauchst.

alias: "TRMNL: Dashboard Update"
description: >-
  Sendet alle 15 Minuten aktuelle Dashboard-Daten (Energie, Solar, Wetter, YouTube, etc.)
  an das TRMNL E-Ink Display via Webhook.

triggers:
  - trigger: time_pattern
    minutes: /15
    alias: Alle 15 Minuten

conditions: []

actions:
  # Tageswerte kommen über die Forecast-Aktion, das forecast-Attribut gibt es seit 2024.4 nicht mehr
  - action: weather.get_forecasts
    alias: Tagesvorhersage holen
    target:
      entity_id: weather.zuhause
    data:
      type: daily
    response_variable: wetter
    # ohne Wetter-Entity sollen die übrigen Werte trotzdem ankommen
    continue_on_error: true
  - action: rest_command.trmnl_dashboard
    alias: Dashboard-Daten an TRMNL senden
    data:
      # --- Smart Home ---
      power_current: "{{ states('sensor.stromverbrauch') | float(0) | round(0) }}"
      solar_production: "{{ states('sensor.solar_produktion') | float(0) | round(1) }}"
      energy_today: "{{ states('sensor.solar_energie_heute') | float(0) | round(1) }}"
      grid_label: >-
        {% if states('sensor.netz_leistung') | float(0) > 0 %}Bezug{% else %}Einspeisung{% endif %}
      grid_value: "{{ states('sensor.netz_leistung') | float(0) | abs | round(0) }}"
      energy_balance: "{{ (states('sensor.einspeisung_heute') | float(0) - states('sensor.netzbezug_heute') | float(0)) | abs | round(1) }}"
      energy_balance_positive: "{{ (states('sensor.einspeisung_heute') | float(0) - states('sensor.netzbezug_heute') | float(0)) > 0 }}"
      battery_level: "{{ states('sensor.batterie_ladezustand') | float(0) | round(0) }}"
      power_price: "{{ states('sensor.strompreis') | float(0) | round(2) }}"
      temp_indoor: "{{ states('sensor.temperatur_wohnzimmer') | float(0) | round(1) }}"
      temp_outdoor: "{{ states('sensor.temperatur_aussen') | float(0) | round(1) }}"

      # --- YouTube ---
      aa_subs: "{{ states('sensor.youtube_kanal_1_abonnenten') }}"
      aa_views: "{{ states('sensor.youtube_kanal_1_aufrufe') }}"
      aa_videos: "{{ states('sensor.youtube_kanal_1_videos') }}"
      kk_subs: "{{ states('sensor.youtube_kanal_2_abonnenten') }}"
      kk_views: "{{ states('sensor.youtube_kanal_2_aufrufe') }}"
      kk_videos: "{{ states('sensor.youtube_kanal_2_videos') }}"

      # --- Webseiten ---
      cf_pg_h: "{{ states('sensor.cloudflare_seite_1_heute') }}"
      cf_pg_g: "{{ states('sensor.cloudflare_seite_1_gestern') }}"
      cf_pg_m: "{{ states('sensor.cloudflare_seite_1_monat') }}"
      cf_db_h: "{{ states('sensor.cloudflare_seite_2_heute') }}"
      cf_db_g: "{{ states('sensor.cloudflare_seite_2_gestern') }}"
      cf_db_m: "{{ states('sensor.cloudflare_seite_2_monat') }}"
      cf_bs_h: "{{ states('sensor.cloudflare_seite_3_heute') }}"
      cf_bs_g: "{{ states('sensor.cloudflare_seite_3_gestern') }}"
      cf_bs_m: "{{ states('sensor.cloudflare_seite_3_monat') }}"
      spark_pg: "{{ states('sensor.sparkline_seite_1') }}"
      spark_db: "{{ states('sensor.sparkline_seite') }}"
      spark_bs: "{{ states('sensor.sparkline_seite_3') }}"

      # --- Wetter ---
      weather_temp: "{{ state_attr('weather.zuhause', 'temperature') | float(0) | round(0) }}"
      weather_desc: "{{ states('weather.zuhause') }}"
      weather_max: >-
        {% set tage = (wetter | default({})).get('weather.zuhause', {}).get('forecast', []) %}
        {{ (tage[0].get('temperature', 0) if tage else 0) | float(0) | round(0) }}
      weather_min: >-
        {% set tage = (wetter | default({})).get('weather.zuhause', {}).get('forecast', []) %}
        {{ (tage[0].get('templow', 0) if tage else 0) | float(0) | round(0) }}
      sunrise: "{{ as_timestamp(state_attr('sun.sun', 'next_rising')) | timestamp_custom('%H:%M') }}"
      sunset: "{{ as_timestamp(state_attr('sun.sun', 'next_setting')) | timestamp_custom('%H:%M') }}"

      # --- Kalender ---
      next_event_time: >-
        {% set e = state_attr('calendar.privat', 'start_time') %}
        {% if e %}{{ as_timestamp(e) | timestamp_custom('%H:%M') }}{% else %}--:--{% endif %}
      next_event: "{{ state_attr('calendar.privat', 'message') | default('Kein Termin') | truncate(30) }}"

      # --- Persönlich ---
      skate_km: "{{ states('input_number.skating_km_jahr') | float(0) | round(0) }}"
      skate_goal: "{{ states('input_number.skating_jahresziel') | float(0) | round(0) }}"
      skate_pct: >-
        {% set ziel = states('input_number.skating_jahresziel') | float(0) %}
        {{ ((states('input_number.skating_km_jahr') | float(0) / ziel * 100) | round(0)) if ziel > 0 else 0 }}
      skate_remaining: "{{ (states('input_number.skating_jahresziel') | float(0) - states('input_number.skating_km_jahr') | float(0)) | round(0) }}"
      skate_sessions: "{{ states('sensor.skating_einheiten_jahr') | default(0) }}"
      next_birthday_date: "{{ states('sensor.naechster_geburtstag_datum') | default('') }}"
      next_birthday: "{{ states('sensor.naechster_geburtstag_name') | default('') }}"

      # --- Meta ---
      greeting: >-
        {% set h = now().hour %}
        {% if h < 12 %}Guten Morgen{% elif h < 18 %}Guten Tag{% else %}Guten Abend{% endif %}
      updated_at: "{{ now().strftime('%d.%m. %H:%M') }}"

mode: single