Home Assistant – Anzeige der niederösterreichischen Flüsse

Nachdem ich die österreichischen Badeplätze (siehe Post) im Dashboard integriert hatte, wollte ich auch die aktuellen Daten der Flüsse in der näheren Umgebung sehen. Nachdem ich im Mostviertel aufgewachsen bin und nun in Wien lebe sind für mich vor allem die Flüsse Ybbs und Donau von Interesse.

Auf der Suche nach den entsprechenden Daten bin ich auf den “Hydrologischen Überblick” vom Land Niederösterreich gestoßen (https://www.noe.gv.at/wasserstand/#/de/Messstellen), wo man sehr aktuelle Daten zu Wasserstand, Temperatur, Durchfluss und Prognose der niederösterreichischen Flüße erhält.

Nach etwas Stöbern habe ich die JSON-Schnittstelle https://www.noel.gv.at/wasserstand/kidata/maplist/MapList.json gefunden, wo alle entsprechenden Daten publiziert werden. Diese Schnittstelle werden wir nun in Home Assistant einrichten um die Daten für die Flüsse Ybbs und Donau zu abonnieren und in weiterer folge im Dashboard zu visualiseren.

Visualisierung der Daten von Ybbs und Donau im Dashboard

Einrichtung der RESTful API

Editiere die Home Assistant Datei configuration.yaml und füge folgende Zeilen hinzu:

rest:
 - resource: https://www.noel.gv.at/wasserstand/kidata/maplist/MapList.json
    scan_interval: 7200
    sensor:
      - name: ybbs_greimpersdorf_temp
        device_class: temperature
        value_template: "{{ value_json | selectattr('Stationnumber', 'eq', '207688') | selectattr('Parameter', 'eq', 'Wassertemperatur') | map(attribute='Value') | first | float }}" 
        unit_of_measurement: "°C"
        force_update: True
        json_attributes_path: "$[?(@.Stationnumber == '207688' && @.Parameter == 'Wassertemperatur')]"
        json_attributes:
          - Stationname
          - Rivername
          - Parameter
      - name: ybbs_greimpersdorf_wasserstand
        device_class: distance
        value_template: "{{ value_json | selectattr('Stationnumber', 'eq', '207688') | selectattr('Parameter', 'eq', 'Wasserstand') | map(attribute='Value') | first | float }}"
        unit_of_measurement: "cm"
        force_update: True
        json_attributes_path: "$[?(@.Stationnumber == '207688' && @.Parameter == 'Wasserstand')]"
        json_attributes:
          - Stationname
          - Rivername
          - Parameter
      - name: ybbs_greimpersdorf_wasserstand_prognose
        device_class: distance
        value_template: "{{ value_json | selectattr('Stationnumber', 'eq', '207688') | selectattr('Parameter', 'eq', 'WasserstandPrognose') | map(attribute='Value') | first | float }}"
        unit_of_measurement: "cm"
        force_update: True
        json_attributes_path: "$[?(@.Stationnumber == '207688' && @.Parameter == 'WasserstandPrognose')]"
        json_attributes:
          - Stationname
          - Rivername
          - Parameter
      - name: ybbs_greimpersdorf_durchfluss
        device_class: volume_flow_rate
        value_template: "{{ value_json | selectattr('Stationnumber', 'eq', '207688') | selectattr('Parameter', 'eq', 'Durchfluss') | map(attribute='Value') | first | float }}"
        unit_of_measurement: "m³/s"
        force_update: True
        json_attributes_path: "$[?(@.Stationnumber == '207688' && @.Parameter == 'Durchfluss')]"
        json_attributes:
          - Stationname
          - Rivername
          - Parameter
      - name: ybbs_greimpersdorf_durchfluss_prognose
        device_class: volume_flow_rate
        value_template: "{{ value_json | selectattr('Stationnumber', 'eq', '207688') | selectattr('Parameter', 'eq', 'DurchflussPrognose') | map(attribute='Value') | first | float }}"
        unit_of_measurement: "m³/s"
        force_update: True
        json_attributes_path: "$[?(@.Stationnumber == '207688' && @.Parameter == 'DurchflussPrognose')]"
        json_attributes:
          - Stationname
          - Rivername
          - Parameter
      - name: donau_baerndorf_temp
        device_class: temperature
        value_template: "{{ value_json | selectattr('Stationnumber', 'eq', '207365') | selectattr('Parameter', 'eq', 'Wassertemperatur') | map(attribute='Value') | first | float }}"
        unit_of_measurement: "°C"
        force_update: True
        json_attributes_path: "$[?(@.Stationnumber == '207365' && @.Parameter == 'Wassertemperatur')]"
        json_attributes:
          - Stationname
          - Rivername
          - Parameter
      - name: donau_baerndorf_wasserstand
        device_class: distance
        value_template: "{{ value_json | selectattr('Stationnumber', 'eq', '207365') | selectattr('Parameter', 'eq', 'Wasserstand') | map(attribute='Value') | first | float }}"
        unit_of_measurement: "cm"
        force_update: True
        json_attributes_path: "$[?(@.Stationnumber == '207365' && @.Parameter == 'Wasserstand')]"
        json_attributes:
          - Stationname
          - Rivername
          - Parameter
      - name: donau_korneuburg_durchfluss
        device_class: volume_flow_rate
        value_template: "{{ value_json | selectattr('Stationnumber', 'eq', '207241') | selectattr('Parameter', 'eq', 'Durchfluss') | map(attribute='Value') | first | float }}"
        unit_of_measurement: "m³/s"
        force_update: True
        json_attributes_path: "$[?(@.Stationnumber == '207241' && @.Parameter == 'Durchfluss')]"
        json_attributes:
          - Stationname
          - Rivername
          - Parameter
      - name: donau_korneuburg_durchfluss_prognose
        device_class: volume_flow_rate
        value_template: "{{ value_json | selectattr('Stationnumber', 'eq', '207241') | selectattr('Parameter', 'eq', 'DurchflussPrognose') | map(attribute='Value') | first | float }}"
        unit_of_measurement: "m³/s"
        force_update: True
        json_attributes_path: "$[?(@.Stationnumber == '207241' && @.Parameter == 'DurchflussPrognose')]"
        json_attributes:
          - Stationname
          - Rivername
          - Parameter
      - name: donau_korneuburg_wasserstand
        device_class: distance
        value_template: "{{ value_json | selectattr('Stationnumber', 'eq', '207241') | selectattr('Parameter', 'eq', 'Wasserstand') | map(attribute='Value') | first | float }}"
        unit_of_measurement: "cm"
        force_update: True
        json_attributes_path: "$[?(@.Stationnumber == '207241' && @.Parameter == 'Wasserstand')]"
        json_attributes:
          - Stationname
          - Rivername
          - Parameter
      - name: donau_korneuburg_wasserstand_prognose
        device_class: distance
        value_template: "{{ value_json | selectattr('Stationnumber', 'eq', '207241') | selectattr('Parameter', 'eq', 'WasserstandPrognose') | map(attribute='Value') | first | float }}"
        unit_of_measurement: "cm"
        force_update: True
        json_attributes_path: "$[?(@.Stationnumber == '207241' && @.Parameter == 'WasserstandPrognose')]"
        json_attributes:
          - Stationname
          - Rivername
          - Parameter

Erläuterungen:

  • resource: Endpoint API; die URL zur oben angeführten JSON-Datei
  • scan_interval: Aktualisierungsintervall in Sekunden; 7200 bedeutet, dass die Werte alle 2 Stunden aktualisiert werden. Dies ist für meine Anforderung ausreichend.
    • Anmerkung: Es handelt sich hier um eine undokumentierte Schnitttstelle und ihre Verwendung ist eigentlich nur für Webseite (https://www.noe.gv.at/wasserstand/#/de/Messstellen) vorgesehen. Es ist daher dem Land NÖ vorbehalten, die Schnittstelle jederzeit zu ändern sodass wir keine Daten mehr erhalten können. Bitte strapaziere auch die API nicht zu oft, indem du sehr kurze Aktualisierungsintervalle wählst!
  • die grün markierten Felder können angepasst werden, sodass du Daten von anderen Gewässern abonnieren kannst. Wichtig ist dabei die Stationnumber entsprechend anzupassen. Die Stationnumber kannst du im JSON (https://www.noel.gv.at/wasserstand/kidata/maplist/MapList.json) heraussuchen.
  • die json_attributes extrahieren die folgenden Felder.
    • Stationname: Name der Mess-Station
    • Rivername: Name des Flusses
    • Parameter: Beschreibung, um welche Daten es sich gerade handelt (Temperatur, Durchfluss, WasserstandPrognose).

Nun Öffnen wir Home Assistant | Entwicklerwerkzeuge | Überprüfen und neu starten und klicken auf “Konfiguration prüfen”. Ist die Konfiguration valide klicken wir auf “Neu starten” um Home Assistant neu zu starten. Nach dem Neustart sollte für jedes name-Attribut in der Konfiguration ein Entity existieren (bspw. sensor.ybbs_greimpersdorf_temp) und den entsprechenden aktuellen Wert beinhalten. Als Attribute sind zusätzlich noch die Werte für Stationname, Rivername und Parameter vorhanden.

Visualisierung im Dashboard

Nun folgt das Visualiseren der zuvor abonnierten Daten im Dashboard.

Hinweis: Um die Werte darzustellen verwende ich template-entity-row aus HACS – siehe https://github.com/thomasloven/lovelace-template-entity-row

Visualisierung der Temperatur

Lege eine neue Karte im Dashboard an und wähle “Manuell”. Im Yaml Code Editor füge dann folgendes ein. Passe eventuell den Namen der Entity an.

type: entities
entities:
  - entity: sensor.ybbs_greimpersdorf_temp
    name: Temperatur | Greimpersdorf
    secondary_info: last-updated
footer:
  type: graph
  entity: sensor.ybbs_greimpersdorf_temp
  hours_to_show: 168

Nach dem Speichern siehst du den aktuellen Wert sowie den Graph über die letzte Woche (168 Stunden)

Visualisierung der Temperatur von der Ybbs

Visualisierung Wasserstand und Wasserstandsprognose

Lege eine neue Karte im Dashboard an und wähle “Manuell”. Im Yaml Code Editor füge dann folgendes ein – passe auch hier eventuelle die Namen der Entities an!

type: entities
entities:
  - type: custom:template-entity-row
    entity: sensor.ybbs_greimpersdorf_wasserstand
    name: Wasserstand | Greimpersdorf
    state: '{{states.sensor.ybbs_greimpersdorf_wasserstand.state_with_unit}}'
  - type: custom:template-entity-row
    entity: sensor.ybbs_greimpersdorf_wasserstand_prognose
    name: Prognose
    state: '{{states.sensor.ybbs_greimpersdorf_wasserstand_prognose.state_with_unit}}'
    color: >
      {% set now = states('sensor.ybbs_greimpersdorf_wasserstand') | float %} 
      {% set now_progn =
      states('sensor.ybbs_greimpersdorf_wasserstand_prognose') | float %} {% if
      now_progn > now %}
        #ff0e0e
      {% elif now_progn < now  %}
        #04a01a
      {% endif %}
    icon: >
      {% set now = states('sensor.ybbs_greimpersdorf_wasserstand') | float %} 
      {% set now_progn =
      states('sensor.ybbs_greimpersdorf_wasserstand_prognose') | float %}  {% if
      now_progn == now %}
        mdi:trending-neutral
      {% elif now_progn > now %}
        mdi:trending-up
      {% else %}
        mdi:trending-down
      {% endif %}
footer:
  type: graph
  entity: sensor.ybbs_greimpersdorf_wasserstand
  hours_to_show: 168

Nach dem Speichern siehst du den aktuellen Wasserstand sowie die aktuelle Prognose und einen Graph vom Wasserstand der letzten Woche (168h). Je nach Prognose wird das Icon angepasst.

Visualisierung des Wasserstands und seiner Prognose von der Ybbs

Visualisierung Durchfluss und Durchflussprognose

Lege eine neue Karte im Dashboard an und wähle “Manuell”. Im Yaml Code Editor füge dann folgendes ein – passe auch hier eventuell die Namen der Entities an!

type: entities
entities:
  - type: custom:template-entity-row
    entity: sensor.ybbs_greimpersdorf_durchfluss
    name: Durchfluss | Greimpersdorf
    icon: mdi:waves-arrow-right
    state: '{{states.sensor.ybbs_greimpersdorf_durchfluss.state_with_unit}}'
  - type: custom:template-entity-row
    entity: sensor.ybbs_greimpersdorf_durchfluss_prognose
    name: Prognose
    state: '{{states.sensor.ybbs_greimpersdorf_durchfluss_prognose.state_with_unit}}'
    color: >
      {% set now = states('sensor.ybbs_greimpersdorf_durchfluss') | float %}  {%
      set now_progn = states('sensor.ybbs_greimpersdorf_durchfluss_prognose') |
      float %} {% if now_progn > now %}
        #ff0e0e
      {% elif now_progn < now  %}
        #04a01a
      {% endif %}
    icon: >
      {% set now = states('sensor.ybbs_greimpersdorf_durchfluss') | float %}  {%
      set now_progn = states('sensor.ybbs_greimpersdorf_durchfluss_prognose') |
      float %}  {% if now_progn == now %}
        mdi:trending-neutral
      {% elif now_progn > now %}
        mdi:trending-up
      {% else %}
        mdi:trending-down
      {% endif %}
footer:
  type: graph
  entity: sensor.ybbs_greimpersdorf_durchfluss
  hours_to_show: 168

Nach dem Speichern siehst du den aktuellen Durchfluss sowie die aktuelle Prognose und einen Graph vom Durchfluss der letzten Woche (168h). Je nach Prognose wird das Icon angepasst.

Visualisierung des Durchflusses und seiner Prognose von der Ybbs

Leave a Reply

Your email address will not be published. Required fields are marked *

*