HowTo: Wetterdashboard für Anfänger

Hallo zusammen,

An dieser Stelle möchte ich euch mein Wetter-Dashboard vorstellen.
Dieses ist erstmal nichts besonderes, eher verwendet es alltbekannte Karten und ist für mich als jemand der sich unter einem Jahr mit HAOS beschäftigt (und damit zähle ich mich immernoch zu den Anfängern) teilweise schon ganz schön knifflig gewesen. Andere schmunzeln da wohl eher drüber :wink:

Als Anfänger und weil ja immer wieder nach solchen Wetter-Dashboards gefragt wird - also für Anfänger, hier einmal von A-Z erklärt und vorgestellt.
Ich erhebe dabei natürlich keinen Anspruch auf Vollständigkeit, oder gar den perfekten Code. Ich rechne sogar damit, dass man das ein oder andere pfiffiger lösen könnte und hoffe natürlich auch auf Vorschläge.
Was ich natürlich hoffe ist, dass keine groben Fehler drinn sind.

So siehts derzeit aus:

Dasselbe auf dem Smartphone:

Was ihr braucht (natürlich braucht ihr nur was euch gefällt :wink: ):

  • HACS - Home Assistant Community Store
  • Wetter Entitäten, die für euch interessant sind. Die können aus einer eigenen Wetterstation kommen, oder von einer aus der Nachbarschaft, oder vom Wetterdienst, oder eine Mischung daraus ;-). Manche Daten bekommt man nur von Extern.

Helfer:

  • Templatehelfer: Wetterlage
  • Templatehelfer: Windrichtung

Dashboardkarten:

Integrationen:

  • Mond (Moon)
  • Sonne (Sun)
  • RSTful
  • Scrape - Damit wird der Staus der Wetterlage ausgelesen
  • Deutscher Wetterdienst (HACS) - Diese Integration benötigt ihr für die grundlegende Vorhersage. Selbstverständlich muss das nicht der DWD sein. Es kann auch eine andere eurer Wahl sein.
  • evtl. eine Integration für eine Wetterstation

Als erstes alle gewünschten Karten und Integrationen installieren. Das sollte problemlos ablaufen.

Grundsätzlich sollte an dieser Stelle klar sein, das ihr die von mir verwendeten Entitäten gegen eure eigenen austauschen müsst.

Helfer und Scrape einrichten

Mit Scrape hole ich die aktuelle Wetterlage von der Webseite

Das geht natürlich auch aus einer der installierten Karten oder Integrationen. Allerdings ist die Aktualisierung der Wetterlage teils so langsam (DWD max einmal in der Stunde), dass das für mich keinen Sinn macht. Ich benötige die auch für die Steuerung meines Sonnenschutz (Jalousiesteurung). Ich hole den Wetterzustand alle 10min ab. Falls ihr das bei euch nicht so häufig benötigt, dann könnt ihr den Helfer für die Wetterlage auch überspringen.

Zum einrichten von Scrape / RESTful / Wetterzustand habe ich dieses Video zu rate gezogen:

Das hat sehr gut funktioniert und soll hier nicht weiter Thema sein.

Generell kann man sich falls man keine eigene Wetterstation hat und dennoch alle Daten aus der Nachbarschaft von einer Wetterstation z.B. von WUnderground abholen möchte folgendermaßen drauf zugreifen:

Je einen Helfer erstellen vom Typ Template. Beispiel zum abholen der Temperatur:

{{ state_attr('sensor.weather_underground_EUER ORT', 'observations') [0] ['metric']['temp'] }}

Auch das ist Thema in dem Video.

Helfer für die Wetterlage:

Die Daten von Weather Underground kommen auf Englisch. Wer das so haben will muss nichts weiter tun. Wer die auf deutsch haben möchte, muss die übersetzen:

{% if is_state('sensor.web_scrape', 'Sunny') %}
  Sonnig
{% elif is_state('sensor.web_scrape', 'Mostly Sunny') %}
  Überwiegend sonnig
{% elif is_state('sensor.web_scrape', 'Sunny/Wind') %}
  Sonnig / windig

{% elif is_state('sensor.web_scrape', 'Fair/Wind') %}
  Freundlich / windig
{% elif is_state('sensor.web_scrape', 'Fair') %}
  Freundlich

{% elif is_state('sensor.web_scrape', 'Clear/Wind') %}
  Klare Nacht / windig
{% elif is_state('sensor.web_scrape', 'Clear') %}
  Klare Nacht

{% elif is_state('sensor.web_scrape', 'Rain') %}
  Regnerisch
{% elif is_state('sensor.web_scrape', 'Rain Shower') %}
  Schauer
{% elif is_state('sensor.web_scrape', 'Light Rain Shower') %}
  Leichte Schauer
{% elif is_state('sensor.web_scrape', 'Showers in the Vicinity') %}
  Örtliche Schauer
{% elif is_state('sensor.web_scrape', 'Light Rain') %}
  Leichter Regen
{% elif is_state('sensor.web_scrape', 'Light Rain with Thunder') %}
  Leichter Regen und Gewitter
{% elif is_state('sensor.web_scrape', 'Light Drizzle') %}
  Nieselregen
{% elif is_state('sensor.web_scrape', 'Rain Shower/Wind') %}
  Regenschauer / windig
{% elif is_state('sensor.web_scrape', 'Light Rain Shower/Wind') %}
  Leichte Schauer / windig
{% elif is_state('sensor.web_scrape', 'Rain/Wind') %}
  Regen / windig
{% elif is_state('sensor.web_scrape', 'Light Rain/Wind') %}
  Leichter Regen / windig

{% elif is_state('sensor.web_scrape', 'Thunder in the Vicinity') %}
  Örtliche Gewitter

{% elif is_state('sensor.web_scrape', 'Snow Shower') %}
  Schnee Schauer
{% elif is_state('sensor.web_scrape', 'Snowy') %}
  Schnee
{% elif is_state('sensor.web_scrape', 'Snow') %}
  Schnee
{% elif is_state('sensor.web_scrape', 'Wintry Mix') %}
  Schneeregen

{% elif is_state('sensor.web_scrape', 'Cloudy') %}
  Bewölkt
{% elif is_state('sensor.web_scrape', 'Partly Cloudy') %}
  Teilweise bewölkt
{% elif is_state('sensor.web_scrape', 'Mostly Cloudy') %}
  Überwiegend bewölkt
{% elif is_state('sensor.web_scrape', 'Cloudy/Wind') %}
  Bewölkt / windig
{% elif is_state('sensor.web_scrape', 'Mostly Cloudy/Wind') %}
  Überwiegend bewölkt / windig
{% elif is_state('sensor.web_scrape', 'Partly Cloudy/Wind') %}
  Teilweise bewölkt / windig

{% elif is_state('sensor.web_scrape', 'Mist') %}
  Nebelig
{% elif is_state('sensor.web_scrape', 'Fog') %}
  Nebel
{% elif is_state('sensor.web_scrape', 'Drizzle and Fog') %}
  Nieselregen und Nebel

{% else %}
  unavailable
{% endif %}

Dieser Helfer übersetzt die einzelnen Eventualitäten. Leider habe ich das erst im laufenden Jahr aufgesetzt. Es hat bisher noch nicht geschneit. Ich kenne also die Wetterzustände für Schnee noch nicht. Es wird wahrscheinlich sowas wie snow, snowy, Snow-Shower, oder Snow-Shower in the Vicinity… noch fehlen.

Dafür habe ich im else ein unavailable hinterlegt. Wird dieser Status ausgegeben, dann ist höchst wahrscheinlich ein Wetterstatus auf Weather Undergrund, der noch nicht in der Liste steht. Das kann man dann im Helfer nachlesen. Der Status geht dann auf unavailable und der korrekte Status steht dabei.

Helfer für die Windrichtung:

Dieser Helfer übersetzt die Werte der Windrichtung von numerischen Werten in Worte. Natürlich können auch nur Buchstaben angezeigt werden. Dann einfach den Helfer anpassen. Alle Möglichkeiten stehen in dem Array.

{% set windrichtung = [
  'Nord',
  'Nord Nord Ost',
  'Nord Ost',
  'Ost Nord Ost',
  'Ost',
  'Ost Süd Ost',
  'Süd Ost',
  'Süd Süd Ost',
  'Süd',
  'Süd Süd West',
  'Süd West',
  'West Süd West',
  'West',
  'West Nord West',
  'Nord West',
  'Nord Nord West',
  'Nord'] %}
{% set winkel = states('sensor.gw1100a_wind_direction') | float %}
{{ windrichtung [(( winkel + 11.25) / 22.5) | int ] }}

Die Karten:

Vorhersage:

Hierbei handelt sich im die Clock Weather Card.

Es ist 3 mal dieselbe Karte mit unterschiedlicher Konfiguration eingepflegt:

Links:

Zusammenfassung
type: custom:clock-weather-card
entity: weather.dwd
title: Aktuell
sun_entity: sun.sun
temperature_sensor: sensor.gw1100a_outdoor_temperature
humidity_sensor: sensor.gw1100a_humidity
weather_icon_type: fill
animated_icon: true
forecast_rows: 6
time_pattern: HH:mm 'Uhr'
time_format: 24
date_pattern: cccc, dd.MM.yyyy
hide_today_section: false
hide_forecast_section: true
show_humidity: true
hide_clock: true
hide_date: false
hourly_forecast: false
use_browser_time: false
show_decimal: true

Mitte:

Zusammenfassung
type: custom:clock-weather-card
entity: weather.dwd
title: 7 - Tage Vorhersage
sun_entity: sun.sun
temperature_sensor: sensor.gw1100a_outdoor_temperature
humidity_sensor: sensor.gw1100a_humidity
weather_icon_type: fill
animated_icon: true
forecast_rows: 6
time_pattern: HH:mm 'Uhr'
time_format: 24
date_pattern: cccc, dd.MM.yyyy
hide_today_section: true
hide_forecast_section: false
show_humidity: true
hide_clock: true
hide_date: false
hourly_forecast: false
use_browser_time: false
show_decimal: true
apparent_sensor: sensor.gw1100a_feels_like_temperature

Rechts:

Zusammenfassung
type: custom:clock-weather-card
entity: weather.dwd
title: Stündliche Vorhersage
sun_entity: sun.sun
temperature_sensor: sensor.gw1100a_outdoor_temperature
humidity_sensor: sensor.gw1100a_humidity
weather_icon_type: fill
animated_icon: false
forecast_rows: 6
time_pattern: HH:mm 'Uhr'
time_format: 24
date_pattern: cccc, dd.MM.yyyy
hide_today_section: true
hide_forecast_section: false
show_humidity: false
hide_clock: true
hide_date: false
hourly_forecast: true
use_browser_time: false
show_decimal: true
apparent_sensor: sensor.gw1100a_feels_like_temperature

Die Einstellungen sollten klar sein. Die Doku hilft euch ansosnten weiter

Weather Chart Card

Dieser Forcast enthält zusätzlich die Regenwahrscheinlichkeit.

Zusammenfassung
type: custom:weather-chart-card
entity: weather.dwd
show_main: false
show_temperature: false
show_current_condition: false
show_attributes: false
show_time: true
show_time_seconds: false
show_day: false
show_date: false
show_humidity: false
show_pressure: false
show_wind_direction: false
show_wind_speed: false
show_sun: false
show_feels_like: false
show_dew_point: false
show_wind_gust_speed: false
show_visibility: false
show_last_changed: false
use_12hour_format: false
icons_size: 40
animated_icons: true
icon_style: style1
autoscroll: false
forecast:
  precipitation_type: rainfall
  show_probability: false
  labels_font_size: "11"
  precip_bar_size: "50"
  style: style2
  show_wind_forecast: true
  condition_icons: true
  round_temp: true
  type: daily
  number_of_forecasts: "7"
  disable_animation: false
  precipitation_color: "#3076b4"
  temperature2_color: "#96a8dc"
  chart_height: 219
units:
  speed: ""
temp: sensor.gw1100a_outdoor_temperature
humid: sensor.gw1100a_humidity
uv: sensor.gw1100a_uv_index
dew_point: sensor.gw1100a_dewpoint
winddir: sensor.gw1100a_wind_direction
windspeed: sensor.gw1100a_wind_speed
wind_gust_speed: sensor.gw1100a_wind_gust
press: sensor.gw1100a_absolute_pressure
grid_options:
  columns: 24
  rows: 4

Sonnenauf- und Untergang. MondPhase, sowie Sonnenwinkel

Die Karte zur Anzeige der Sonneauf und Untergang hat ansich erstmal nicht unbedingt etwas mit einem Wetterdashboard zu tun. Ich benötige die Daten von Azimut und Elevation aber regelmäßig für andere Automationen. Verwendet wird die lovelace-horizon-card.

Zusammenfassung
type: custom:horizon-card
refresh_period: 300
fields:
  dawn: false
  noon: false
  dusk: false
  sun_azimuth: true
  sun_elevation: true
  moon_phase: true
moon_phase_rotation: -30
elevation: 0

Wetterzustände:

Die Wetterzustände werden durch die HACS Karte “button-card” eingebunden. Als Entität ist der erstellte Helfer für die Wetterlage, der den Zustand von WUndergrund ausliest, hinterlegt.

Die Karten ändern je nach Zustandskategorie die Hintergrundfarbe, das Icon und natürlich die Stati

Wem das zu verspielt ist, oder zu kompliziert, kann das JavaScript entsprechend einfach entfernen.

Zusammenfassung
type: custom:button-card
entity: sensor.wetterlage_wunderground
layout: icon_name_state
show_state: true
show_name: false
show_label: true
icon: |
  [[[
    if (
      entity.state == "Nieselregen" || 
      entity.state == "Leichte Schauer" || 
      entity.state == "Leichter Regen"
    )
      return "mdi:weather-rainy";
    if (
      entity.state == "Bewölkt" || 
      entity.state == "Überwiegend bewölkt"
    )
      return "mdi:weather-cloudy";
    if (
      entity.state == "Teilweise bewölkt"
    )
      return "mdi:weather-partly-cloudy";
    if (
      entity.state == "Regnerisch" || 
      entity.state == "Schauer" || 
      entity.state == "Örtliche Schauer"
    )
      return "mdi:weather-pouring";
    if (
      entity.state == "Überwiegend bewölkt / windig" || 
      entity.state == "Bewölkt / windig" ||
      entity.state == "Regenschauer / windig" ||
      entity.state == "Leichte Schauer / windig" ||
      entity.state == "Regen / windig" ||
      entity.state == "Teilweise bewölkt / windig" || 
      entity.state == "Freundlich / windig" ||
      entity.state == "Sonnig / windig" ||
      entity.state == "Klar / windig"
    )
      return "mdi:weather-windy";
    if (
      entity.state == "Nebelig" || 
      entity.state == "Nebel" ||
      entity.state == "Nieselregen und Nebel"
    )
      return "mdi:weather-fog";
    if (
      entity.state == "Klare Nacht"
    )
      return "mdi:weather-night";
    if (
      entity.state == "Leichter Regen und Gewitter"
    )
      return "mdi:weather-lightning-rainy";
    if (
      entity.state == "Örtliche Gewitter"
    )
      return "mdi:weather-partly-lightning";
    if (
      entity.state == "Gewitter"
    )
      return "mdi:weather-lightning";
    if (
      entity.state == "Schnee" ||
      entity.state == "Schnee Schauer" ||
      entity.state == "Schneeregen"
    )
      return "mdi:weather-snowy-heavy";
    else
      return "mdi:weather-sunny";
  ]]]
styles:
  card:
    - background-color: |
        [[[
          if (
            entity.state == "Regnerisch" || 
            entity.state == "Nieselregen" ||
            entity.state == "Schauer" || 
            entity.state == "Leichte Schauer" || 
            entity.state == "Örtliche Schauer" || 
            entity.state == "Regen / windig" ||
            entity.state == "Regenschauer / windig" ||
            entity.state == "Leichte Schauer / windig" ||
            entity.state == "Leichter Regen"
          )
            return "#122f5a";
          if (
            entity.state == "Leichter Regen und Gewitter" ||
            entity.state == "Örtliche Gewitter" ||
            entity.state == "Gewitter"
          )
            return "#04152d";
          if (
            entity.state == "Bewölkt" || 
            entity.state == "Überwiegend bewölkt" ||
            entity.state == "Teilweise bewölkt"
          )
            return "#25252d";
          if (
            entity.state == "Überwiegend bewölkt / windig" || 
            entity.state == "Teilweise bewölkt / windig" ||
            entity.state == "Bewölkt / windig"
          )
            return "#487890";
          if (
            entity.state == "Klare Nacht"
          )
            return "#0b084c";
          if (
            entity.state == "Nebelig" || 
            entity.state == "Nebel" ||
            entity.state == "Nieselregen und Nebel"
          )
            return "#787878";
          if (
            entity.state == "Schnee Schauer" ||
            entity.state == "Schnee" ||
            entity.state == "Schneeregen"
          )
            return "#b1b1b1";
          else
            return "#e4b532";
        ]]]
    - color: |
        [[[
          if (
            entity.state == "Freundlich" || 
            entity.state == "Sonnig" ||
            entity.state == "Überwiegend sonnig" ||
            entity.state == "Schön" || 
            entity.state == "Sonnig / windig" || 
            entity.state == "Freundlich / windig"
          )
            return "#a73d03";
          if (
            entity.state == "Schnee Schauer" ||
            entity.state == "Schnee" ||
            entity.state == "Schneeregen"
          )
            return "#2a374b";
          else
            return "#b1b1b1";
        ]]]
    - background-image: |
        [[[
          if (
            entity.state == "Freundlich" || 
            entity.state == "Sonnig" ||
            entity.state == "Überwiegend sonnig" ||
            entity.state == "Schön" || 
            entity.state == "Sonnig / windig" ||
            entity.state == "Freundlich / windig"
          )
            return "url(/local/bg_img/weather-partly-cloudy22.png)";
          else
            return "url(/local/bg_img/weather-partly-cloudy10.png)";
        ]]]
    - background-repeat: no-repeat
    - background-position: right -10px top 23px
    - background-size: 130px
  icon:
    - color: |
        [[[
          if (
            entity.state == "Freundlich" || 
            entity.state == "Sonnig" ||
            entity.state == "Überwiegend sonnig" ||
            entity.state == "Schön" || 
            entity.state == "Sonnig / windig" ||
            entity.state == "Freundlich / windig"
          )
            return "#a73d03";
          if (
            entity.state == "Schnee Schauer" ||
            entity.state == "Schnee" ||
            entity.state == "Schneeregen"
          )
            return "#2a374b";
          else
            return "#e1e1e1";
        ]]]
    - padding: 0
    - margin: 0 0 0 -40px
  name:
    - display: flex
    - align-items: center
    - font-weight: normal
    - width: 100%
    - font-size: 22px
    - white-space: wrap
    - text-overflow: unset
    - text-align: left
    - padding: 0 10px 0 0
    - margin: 0 0 0 -70px
  label:
    - margin: "-160px 0 0 0"
    - text-align: right
    - width: 100%
    - padding: 0 19px 0 0
label: Aktuelles Wetter
tap_action: none
hold_action: none
double_tap_action: none
section_mode: true
grid_options:
  rows: 2
  columns: full

Die Windrichtung (Ebenfalls mit der “button-card gemacht)

Die Karte ändert je nach Windrichtung das Icon. Der Pfeil zeigt immer in die Richtung in die der Wind bläst. Als Entität ist der erstellte Helfer für die “Übersetzung” der Windrichtung eingebunden.

Zusammenfassung
type: custom:button-card
entity: sensor.windrichtung
layout: icon_name_state
show_state: true
show_label: true
show_name: false
icon: |
  [[[
    if (
      entity.state == "Nord"
    )
      return "mdi:arrow-up-thin-circle-outline";
    if (
      entity.state == "Ost"
    )
      return "mdi:arrow-right-thin-circle-outline";
    if (
      entity.state == "Süd"
    )
      return "mdi:arrow-down-thin-circle-outline";
    if (
      entity.state == "West"
    )
      return "mdi:arrow-left-thin-circle-outline";
    if (
      entity.state == "Nord Nord Ost" || 
      entity.state == "Ost Nord Ost" ||
      entity.state == "Nord Ost"
    )
      return "mdi:arrow-top-right-thin-circle-outline";
    if (
      entity.state == "Ost Süd Ost" || 
      entity.state == "Süd Ost" ||
      entity.state == "Süd Süd Ost"
    )
      return "mdi:arrow-bottom-right-thin-circle-outline";
    if (
      entity.state == "Süd Süd West" || 
      entity.state == "Süd West" ||
      entity.state == "West Süd West"
    )
      return "mdi:arrow-bottom-left-thin-circle-outline";
    else
      return "mdi:arrow-top-left-thin-circle-outline";
  ]]]
styles:
  card:
    - background-color: "#323232"
    - background-image: url(/local/bg_img/compass-rose-tn10.png)
    - background-repeat: no-repeat
    - background-position: right -20px top 29px
    - background-size: 160px
    - color: "#e1e1e1"
  icon:
    - color: "#e1e1e1"
    - padding: 0
    - margin: 0 0 0 -40px
  name:
    - display: flex
    - align-items: center
    - font-weight: normal
    - width: 100%
    - font-size: 22px
    - white-space: wrap
    - text-overflow: unset
    - text-align: left
    - padding: 0 10px 0 0
    - margin: 0 0 0 -70px
  label:
    - margin: "-160px 0 0 0"
    - text-align: right
    - width: 100%
    - padding: 0 19px 0 0
label: Windrichtung
tap_action: none
hold_action: none
double_tap_action: none
section_mode: true
grid_options:
  rows: 2
  columns: full

Hier gilt das gleiche wie oben. Weniger ist manchmal mehr… Bei beiden gezeigten Karten wird ein Hintergrundbild im CSS eingebunden. Das Bild stammt aus den originalen SVG Dateien und kann auf Wunsch auch geändert werden. Die Dateien müssen aber selbst an den passenden Ordnerpfad hochgeladen werden. Der Pfad muss eventuell angepasst werden.

Wingeschwindigkeit, Temperatur, Rel. Luftfeuchtigkeit und Sonneneinstrahlung

Hier wird die Karte mini-graph-card verwendet:

Windgeschwindigkeit:

Zusammenfassung
type: custom:mini-graph-card
icon: mdi:weather-windy
name: Windgeschwindigkeit
align_state: center
entities:
  - entity: sensor.gw1100a_wind_gust
    name: Windböen
    show_fill: true
    color: "#7f91c8"
  - entity: sensor.gw1100a_wind_speed
    name: Windgeschwindigkeit
    show_fill: true
group: false
height: 170
hour24: true
font_size_header: 18
line_width: 1.5
points_per_hour: 6
show:
  extrema: true
  fill: fade
  icon: true
  labels: true
  name: true
  state: true
color_thresholds:
  - value: 0
    color: "#3134f9"
  - value: 10
    color: "#3485fa"
  - value: 20
    color: "#38d6fc"
  - value: 30
    color: "#3cfed8"
  - value: 40
    color: "#3cfe8e"
  - value: 50
    color: "#3cfe50"
  - value: 60
    color: "#87fe51"
  - value: 70
    color: "#d7ff52"
  - value: 80
    color: "#ffd64c"
  - value: 90
    color: "#fe8540"
  - value: 100
    color: "#fe3739"
  - value: 110
    color: "#f80c0e"
  - value: 120
    color: "#ff0000"
color_thresholds_transition: smooth

Temperatur und Taupunkt

Zusammenfassung
type: custom:mini-graph-card
name: Temperatur & Taupunkt
align_state: center
entities:
  - entity: sensor.gw1100a_outdoor_temperature
    name: Temperatur
  - entity: sensor.gw1100a_dewpoint
    name: Taupunkt
    color: "#4b75ec"
hour24: true
hours_to_show: 24
font_size_header: 18
height: 170
line_width: 1.5
points_per_hour: 6
show:
  graph: line
  extrema: true
  fill: fade
  icon: true
  labels: true
  name: true
  state: true
color_thresholds:
  - value: -10
    color: "#3134f9"
  - value: 0
    color: "#3485fa"
  - value: 5
    color: "#38d6fc"
  - value: 12
    color: "#3cfed8"
  - value: 15
    color: "#3cfe8e"
  - value: 20
    color: "#3cfe50"
  - value: 23
    color: "#87fe51"
  - value: 25
    color: "#d7ff52"
  - value: 28
    color: "#ffd64c"
  - value: 30
    color: "#fe8540"
  - value: 33
    color: "#fe3739"
  - value: 35
    color: "#f80c0e"
  - value: 36
    color: "#ff0000"
color_thresholds_transition: smooth

Ich denke das sollte als Beispiel genügen. Bei den anderen Karten wiederholt sich das am Ende nur. Und es soll auch auch noch Raum für Eigenes bleiben.

Die Apexchart Card

Diese Karte verwende ich für den relativen Luftduck:

Zusammenfassung
type: custom:apexcharts-card
update_interval: 10min
header:
  title: Relativer Luftdruck
  show: true
  show_states: true
  standard_format: true
  colorize_states: true
now:
  show: true
  color: "#4b75f1"
  label: Aktuell
graph_span: 24h
span:
  start: day
apex_config:
  chart:
    height: 220px
    width: 100%
yaxis:
  - min: "|-1|"
    max: "|+0.5|"
    decimals: 1
experimental:
  color_threshold: true
series:
  - entity: sensor.gw1100a_relative_pressure
    name: Relativer Luftdruck
    type: line
    unit: " hPa"
    color: "#4b75f1"
    stroke_width: 2
    color_threshold:
      - value: 970
        color: "#3134f9"
      - value: 980
        color: "##3485fa"
      - value: 990
        color: "#38d6fc"
      - value: 1000
        color: "#3cfed8"
      - value: 1013
        color: "#3cfe50"
      - value: 1020
        color: "#d7ff52"
    group_by:
      duration: 1h
      func: last

und auch für die Regenmenge eines Jahres nach Monat:

Zusammenfassung
type: custom:apexcharts-card
update_interval: 24h
header:
  title: Niederschlag des Jahres
  show: true
  show_states: true
  standard_format: false
  colorize_states: true
graph_span: 12month
span:
  start: year
apex_config:
  xaxis:
    type: datetime
    labels:
      style:
        fontSize: 13
      minHeight: 20
      hideOverlappingLabels: false
      datetimeFormatter:
        month: MMM
  dataLabels:
    enabled: true
  stroke:
    show: true
    width: 0
    curve: smooth
  chart:
    type: area
    height: 260px
    width: 100%
yaxis:
  - min: 0
    max: "|+5|"
series:
  - entity: sensor.gw1100a_monthly_rain
    opacity: 1
    name: Dieser Monat
    unit: " mm"
    type: column
    color: "#4b75f1"
    group_by:
      duration: 1month
      func: max
grid_options:
  columns: 24
  rows: auto

Gerade bei der ApexchartCard hat mir auch diese Referenz geholfen:

Regenmenge Total und Jahr:

Für die Regenmenge des Jahres und der Regenmenge Insgesamt, habe ich ebenfalls die button-card verwendet.

Hier die Jahresmenge als Beispiel:

Zusammenfassung
type: custom:button-card
entity: sensor.gw1100a_yearly_rain
show_state: true
name: "Regen dieses Jahr:"
styles:
  card:
    - background-color: "#3b65a5"
    - color: "#b1b1b1"
  icon:
    - color: "#e1e1e1"
  name:
    - font-weight: normal
  state:
    - font-weight: normal
    - font-size: 20px
tap_action: none
hold_action: none
double_tap_action: none
section_mode: true
grid_options:
  rows: 2
  columns: 6

Windgeschwindigkeit (Windrose)

Für die Wingeschwindigkeit ist die Karte windrose-card in Verwendung:

Zusammenfassung
type: custom:windrose-card
title: Windgeschwindigkeit
data_period:
  period_back: "-24h"
refresh_interval: 300
windspeed_bar_location: right
wind_direction_entity:
  entity: sensor.gw1100a_wind_direction
  use_statistics: false
  direction_compensation: 0
windspeed_entities:
  - entity: sensor.gw1100a_wind_speed
    name: ""
    speed_unit: kph
    use_statistics: false
    windspeed_bar_full: true
    output_speed_unit: kph
    speed_range_beaufort: false
direction_labels:
  cardinal_direction_letters: NOSW
rose_config:
  windrose_draw_north_offset: 0
  center_calm_percentage: true
current_direction:
  show_arrow: true
  arrow_size: 50
  center_circle_size: 30
compass_direction:
  auto_rotate: false
  entity: ""
matching_strategy:
  name: direction-first
colors:
  rose_cardinal_direction_labels: "#e1e1e1"
  rose_secondary_intercardinal_direction_labels: "#e1e1e1"
  rose_current_direction_arrow: red
  bar_border: none
  bar_unit_name: "#e1e1e1"
  bar_unit_values: "#e1e1e1"

Ich hoffe das euch das Dashboard etwas gefällt und eventuell ist für den ein oder anderen auch etwas dabei.

44 „Gefällt mir“

Vielen Dank für diese Zusammenstellung, das ist eine tolle Referenz für viele Fragen zur Darstellung des Wetters.

1 „Gefällt mir“

Sehr gerne :slight_smile:

Werde es zwischendurch mal ergänzen wenn sich was ergibt…

Ganz toll, vielen Dank für die Mühe, das alles hier zu zeigen. :grinning_face:
Da werde ich mir sicherlich noch die ein oder andere Karte von installieren.

1 „Gefällt mir“

Barometer

Gemacht ist das “Barometer“ mit Hilfe der folgende Karte:

So sieht die Karte fertig aus:

Die Karte zeigt mehrere Ringe (Gauges) an.

  1. Der äußere Ring zeigt in Segmenten je nach Veränderung des Wertes - blau = niedrige Werte bis orange = höhere Werte. Die Range geht von 950hPa bis 1030 hPa. Beim Barometer geht es ja eher nicht um einen bestimmten Wert von einem bestimmtem Wert, sondern einem erreichten Wert auf einer Skala, daher bleibt…
  2. … der mittlere Ring immer voll gefüllt, egal wie der Wert ist.
  3. der innerste Ring dient nur der Abgrenzung, ohne Funktion, kann auch einfach entfernt werden.

Es gibt mehrere Werte zum Anzeigen:

  1. Ganz oben erscheint das Icon, allerdings nicht das Icon des Druck-Wertes, sondern ein Icon je nach Wettertrend. Also entweder - Sonnig- , - Teilweise / sonnig / bewölkt - oder regnerisch
  2. Darunter kommt der Trend des Luftdrucks. Entweder - Steigend - , - Gleichbleibend - oder Fallend
  3. In der Mitte folgt der Status des eingestellten Segmentringes außen. Hier dann sonnig - freundlich - veränderlich, oder regnerisch
  4. Abschließend der tatsächliche Status des Relativen Luftdrucks.

Das ist der Inhalt der Karte:

Zusammenfassung
type: custom:modern-circular-gauge
entity: sensor.gw1100a_relative_pressure
name: Barometer
needle: true
decimals: 0
start_from_zero: false
adaptive_state_color: true
smooth_segments: true
adaptive_icon_color: true
show_unit: false
state_font_size: 12
state-size: big
show_header: true
header_font_size: 29
header_position: bottom
header_offset: -13
icon: |-
  {% if is_state('binary_sensor.rel_luftruck_steigt','on') %}
    mdi:weather-sunny
  {% elif is_state('binary_sensor.rel_luftdruck_fallt','on') %}
    mdi:weather-pouring
  {% elif is_state('binary_sensor.rel_luftdruck_fallt','off'),
        is_state('binary_sensor.rel_luftdruck_steigt','off')
  %}
    mdi:weather-partly-cloudy
  {% else %}
  {% endif %}
icon_size: 14
icon_vertical_position: 80
tap_action:
  action: none
gauge_background_style:
  width: 4
  opacity: 1
gauge_foreground_style:
  width: 6
  color: "#048bd8"
min: 950
segments:
  - from: 950
    label: regnerisch
    color:
      - 15
      - 138
      - 215
  - from: 995
    color:
      - 255
      - 247
      - 0
    label: veränderlich
  - from: 1014
    color:
      - 115
      - 255
      - 0
    label: freundlich
  - from: 1020
    color:
      - 234
      - 157
      - 14
    label: sonnig
max: 1050
secondary:
  entity: sensor.gw1100a_relative_pressure
  show_gauge: inner
  state_size: small
  state_font_size: 8
  show_unit: true
  adaptive_state_color: false
  segments:
    - from: 0
      color:
        - 15
        - 138
        - 215
  gauge_radius: 42
  gauge_foreground_style:
    width: 2
    color: "#048bd8"
tertiary:
  entity: sensor.rel_luftdruck_trend
  state_size: small
  state_font_size: 6
  show_state: true
  show_unit: false
  adaptive_state_color: false
  show_gauge: inner
  gauge_radius: 40
  gauge_foreground_style:
    width: 1
    color: "#95d1f2"
grid_options:
  columns: 12
  rows: 4.5

Für das wechselnde Icon ist dann das hier verantwortlich:

{% if is_state('binary_sensor.rel_luftruck_steigt','on') %}
  mdi:weather-sunny
{% elif is_state('binary_sensor.rel_luftdruck_fallt','on') %}
  mdi:weather-pouring
{% elif is_state('binary_sensor.rel_luftdruck_fallt','off'),
        is_state('binary_sensor.rel_luftdruck_steigt','off')
%}
  mdi:weather-partly-cloudy
{% else %}
{% endif %}

Dazu benötigt ihr neben der oben erwähnten Karte auch noch das Folgende:

Integration: Trend

sowie insgesamt 3 Helfer:

  1. und da bin ich mir noch nicht gfanz sicher ob ich die Trendhelfer korrekt eingerichtet habe. Folgende Einstellungen habe ich da vorgenommen:
    1. ein Trendhelfer der den steigenden Druck verfolgt.

Interessant ist hier wohl die Mindestrate für die Veränderung. Die habe ich mal auf 0,5 hPa / 1h (Steigerung) eingestellt. Laut Doku wäre das dann ein Wert von 0,000138889 weil WERT / Zeit (0,5) / (60x60).

Die Speicherdauer dann eben auf 3600 da ich der Meinung bin dass das zusammen passen muss/sollte (3600 = ebenfalls 1h)

Hier nehme ich gerne Verbesserungen / Korrekturen) entgegen.

  1. der zweite Helfer ist dann ebenfalls ein Trend Helfer. Dieser verfolgt die fallenden Werte. Anlage erfolgt analog wie beschrieben, aber der Wert für die Mindestrate der Veränderungen muss dann logischerweise negativ sein, also -0,000138889
  2. der dritte Helfer liest die beiden Trendhelfer aus und ist vom Typ Template / Sensor. Dieser hat den folgenden Inhalt:
{% if is_state('binary_sensor.rel_luftruck_steigt','on') %}
  Steigend
{% elif is_state('binary_sensor.rel_luftdruck_fallt','on') %}
  Fallend
{% elif is_state('binary_sensor.rel_luftdruck_fallt','off'),
is_state('binary_sensor.rel_luftdruck_steigt','off')
%}
  Gleichbleibend
{% else %}
{% endif %}
  • Wenn der Steigende Trend-Helfer an ist, dann Steigend ausgeben
  • Wenn der Fallende Trend-Helfer an ist, dann Fallend ausgeben
  • Wenn beide Trend-Helfer aus sind, dann Gleichbleibend ausgeben (“An” können nicht gleichzeitig beide sein)
  • Das else darf laut Doku leer sein

Ist hier der Syntax so richtig??? Ich hatte in der JINJA2 Doku als Operator für eine UND-Verknüfung eigentlich and gefunden. das funktionierte aber nicht.

11 „Gefällt mir“

Vielen Dank, da habe ich mir gleich ein paar Teile geschnappt und in mein Dashboard eingebaut.

1 „Gefällt mir“

Super! Hoffe, dass ich als blutiger Anfänger in HA auch mal so was erstellen kann.

1 „Gefällt mir“

Das ist ein super Beitrag und wird mein Dashboard deutlich verbessern. Danke dafür!

1 „Gefällt mir“

toller Beitrag, definitiv kein Anfängerdashboard :wink:

Frage: Kann man den Pfeil der die Windrichtung im Kompass anzeigt auch drehen, damit der Pfeil in die Windrichtung zeigt und nicht gegen die Windrichting?

Danke dir. :slight_smile:

Zu deiner Frage:

Klar, kann man machen, ist dann falsch :wink:

Dazu änderst du entweder die Reihenfolge im Array des Helfers “Windrichtung”, oder du änderst die Zuordnung von Grafik und Status im JavaScript der Karte.

Wenn du möchest, das bei Südwind der Pfeil nach Norden (nach oben) zeigt (was falsch wäre :wink: ), dann würdest du anstatt:

...
icon: |
  [[[
    ...
    if (
      entity.state == "Süd"
    )
      return "mdi:arrow-down-thin-circle-outline";
    ...

dann eben das hier nehmen:

...
icon: |
  [[[
    ...
    if (
      entity.state == "Süd"
    )
      return "mdi:arrow-up-thin-circle-outline";
    ...

Du musst also alle Icons spiegeln…

Hatte ich erwähnt dass es dann falsch herum ist :wink:

1 „Gefällt mir“

Danke für die Erklärung. Ich belasse es lieber bei der richtigen Art und Weise. Hab ja keine Ahnung. :smiley:

Trotzdem stellt sich mir die Frage, welche Pfeilrichtung ist denn dann nun richtig?

Wind weht von NO oder Wind weht nach NO in diesem Fall und welcher Pfeil zeigt falsch an?

Gute Frage

Mh.. Das ist bei mir nicht der Fall… WindroseCard und mein Pfeil decken sich…

Aber:

Meine WindroseCard ist so ausgerichtet, das Norden unten ist, das deshalb weil wenn ich von oben auf mein Haus schaue eben vorne(!) (oben) dann Süden ist…

Meine Wetterstation muss Richtung Westen ausgerichtet sein. Der Windpfeil der Wetterstation zeigt in die Richtung aus der der Wind kommt. Derzeit haben wir Nord… Nord West Wind… also zeigt der Pfeil der Wetterstation in diese Richtung. Der Wind bläst aber in Richtung Süd … Süd Ost. Der Pfeil der Winrose Card ist also korrekt (bei mir aus meiner Sicht). Der Wind komt aus Nord-West und der Pfeil zeigt genau in die andere Richtung.

Im Prinzip haben wir also beide Recht.

Du hast Recht, weil deine Windrose Card nach Norden ausgerichtet ist (ist ja bei den Meisten auch so. Meine aber eben nach Süden. Deshalb decken sich bei mir beide Pfeile. Passt also für mich.

Hier einmal der geänderte Code für Dich und für alle die das so nicht wollen und eine Analogie zur Windrose Card erreichen wollen:

type: custom:button-card
entity: sensor.windrichtung
layout: icon_name_state
show_state: true
show_label: true
show_name: false
icon: |
  [[[
    if (
      entity.state == "Nord"
    )
      return "mdi:arrow-down-thin-circle-outline";
    if (
      entity.state == "Ost"
    )
      return "mdi:arrow-left-thin-circle-outline";
    if (
      entity.state == "Süd"
    )
      return "mdi:arrow-up-thin-circle-outline";
    if (
      entity.state == "West"
    )
      return "mdi:arrow-right-thin-circle-outline";
    if (
      entity.state == "Nord Nord Ost" || 
      entity.state == "Ost Nord Ost" ||
      entity.state == "Nord Ost"
    )
      return "mdi:arrow-bottom-left-thin-circle-outline";
    if (
      entity.state == "Ost Süd Ost" || 
      entity.state == "Süd Ost" ||
      entity.state == "Süd Süd Ost"
    )
      return "mdi:arrow-top-left-thin-circle-outline";
    if (
      entity.state == "Süd Süd West" || 
      entity.state == "Süd West" ||
      entity.state == "West Süd West"
    )
      return "mdi:arrow-top-right-thin-circle-outline";
    else
      return "mdi:arrow-bottom-right-thin-circle-outline";
  ]]]
styles:
  card:
    - background-color: "#323232"
    - background-image: url(/local/bg_img/compass-rose-tn10.png)
    - background-repeat: no-repeat
    - background-position: right -20px top 29px
    - background-size: 160px
    - color: "#e1e1e1"
  icon:
    - color: "#e1e1e1"
    - padding: 0
    - margin: 0 0 0 -40px
  name:
    - display: flex
    - align-items: center
    - font-weight: normal
    - width: 100%
    - font-size: 22px
    - white-space: wrap
    - text-overflow: unset
    - text-align: left
    - padding: 0 10px 0 0
    - margin: 0 0 0 -70px
  label:
    - margin: "-160px 0 0 0"
    - text-align: right
    - width: 100%
    - padding: 0 19px 0 0
label: Windrichtung
tap_action: none
hold_action: none
double_tap_action: none
section_mode: true
grid_options:
  rows: 2
  columns: full

Bitte teste das doch mal.

Also Fakt ist, dass der Windpfeil in die Richtugn zeigt in die der Wind weht und die Windrichtung gibt an aus welcher Richtung der Wind kommt. (also nicht wie ich es oben geschrieben hatte (hab ich mal gelöscht)).

Hey,

Vielen Dank dafür. Sieht jetzt so aus als würde es zusammen passen.

Was am Code hast du denn geändert? Konnte keinen unterschied finden bzw. war blind dafür.

Hallo, vielen dank für die tolle Anleitung, allerdings , habe ich noch 2-3 Sachen nicht so ganz verstanden:

zb oben nutzt du entity: weather.dwd, hat es einen gewissen Grund, warum du nicht die eigene Station verlinkt?

entity: sensor.wetterlage_wunderground << wo kommt das her?

Die Helfer werden benötigt damit zb Worten dargestellt werde kann, woher der wind kommt, aber wie mache ich das mit den Helfern? Einszellungen>Geräte&Dienste und dort Helfer und dann auf erstellen, aber dann kommen noch einiges an fragen.. ich verstehe es nicht

und die letzte Frage: bei 2 bekomme ich folgende Meldung” ButtonCardJSTemplateError” und ich weiss nicht warum

Falls ich die Antworten übersehen, gehört habe. tut mir leid

mein Helfer für die Windrichtung in Wörtern sieht so aus

Helfer→Template

{% set direction = ['N','NNO','NO','ONO','O','OSO','SO','SSO','S','SSW','SW','WSW','W','WNW','NW','NNW','N'] %}
{% set degree = states('sensor.wetter_windrichtung')|float %}
{{ direction[((degree+11.25)/22.5)|int] }}

Die Entität dazu(sensor.wetter_windrichtung gibt die Richtung in Grad aus) ist eine in meiner Nachbarschaft befindliche Wetterstation von wunderground.com. Der Helfer wandelt dann die Grad in N, NNO, S, W etc. um.

Eine Anleitung dazu findest du hier: GitHub - cytech/Home-Assistant-wundergroundpws: Home Assistant custom component sensor for Weather Underground personal weather station users

Bitte korrigiert mich wenn ich hier was falsches schreib. So hat bei mir funktioniert.

1 „Gefällt mir“

Genau ich verwende den DWD für die Vorhersage in der Clock Weather Card und in der Weather Charts-Card. Meine eigene Wetterstation liefert nur die aktuellen Wetterdaten, aber keine Vorhersage. Das machen in aller Regel nur Wetterdienste…

Das kommt aus dem Teil:

Da geht es um den Wetterzustand, also ob es gerade sonig, oder regnerisch ist. Die Daten benbötige ich bei mir für meine Rollo-Steuerung. Da Wunderground hier mMn sehr akurat ist und auch die Zustände zügig angepasst werden, Scrape ich das von deren Seite.

Wie das geht erfährst du in dem verlinkten Video.

Genau. Da bist du schonmal richtig.

Der Helfer für die Windrichtung ist ein Helfer vom Typ “Template”

So sieht der z.B. aus:

Guck dir das von @mhl doch auch gerne mal an. Hab ich bei mir nicht damit gemacht, aber viele Wege führen ja bekanntlich nach Rom :slight_smile:

Danke dir :slight_smile:

Ich weiß nicht wo genau du bist.. Ich tippe mal dass ein simpler Syntax Fehler ist. Zeig deinen Code der dir Probleme macht (Bitte direkt in Code Tags: </>, oder vergleich deinen Code mit den Vorlagen.

Hallo,

was mir gerade in den sinn kommt:

Es gibt doch Empfehlungen, wann man Lüften sollte.. Dass wird irgendwie mit dem Wetter oder so von außen berechnet und dann ergibt es, wann man am besten lüftet… Ich habe es leider noch nie verstanden, trotz einigen Videos…

Falls du es kannst und lust hast, könntest du sowas nicht auch noch basteln ? ich denke, es würde perfekt zum Wetter-Dashboard passen und allen wie mir helfen^^

Hallo,

Vielen Dank fürs Teilen!
Kannst Du mir auch Deine Hintergrundbilder zur Verfügung stellen?

Ich finde diese sehr schön.
Vielen Dank in Voraus.

Gunter

Welche? Die auf den Karten der Wetterzustände? Die findest du im oberen Beitrag mit hochgeladen. Im hellen Design des Forums sind die nen bischen schlecht zu sehen, da die transparent sind …. Guck mal oben

Habe jetzt Bild gemacht, es geht um :”Wetterzustände:”

und bei dir sieht es schön eben aus, bei mir aber so:-(