Unwetterdaten vom DWD in openHAB

Da wir letzte Woche an einem Abend ein größeres Unwetter hatten, habe ich mich entschlossen Unwetterdaten vom Deutschen Wetterdienst in openHAB zu integrieren.

Die Daten vom DWD sollen in der GUI angezeigt werden und wenn ein Unwetter im Anmarsch ist eine Benachrichtigung auf ein mobiles Endgerät senden.

Ein gutes Beispiel wie man die JSON-Daten in openHAB übernimmt, findet Ihr hier im openHAB-Forum.

Vorbereitung

Für die Integration der Unwettermeldungen benötigt Ihr deine “WARNCELLID” für euren Ort.

Außerdem müssen / können noch bestimmte Bilder für die Visualisierung integriert werden (die Images findet Ihr auch in dem oben genannten Forums-Beitrag):

  • Images nach /icons/classic kopieren
  • Dauert eine Zeit bis diese in der Paper UI dargestellt werden
  • Option: Paper UI – Configuration – Services – UI – Basic UI / Classic UI – Icon Format von “Vecotr” auf “Bitmap” stellen (Standard: Vector)
  • Rechte und User in Linux kontrollieren (chmod + chown) – /etc/openhab2/icons/classic

Bindings

Diese Bindings benötigt Ihr für die Integration:

  • Paper UI – Add-ons – Transformations – Javascript Transformation (Version 2.3.0) – INSTALL
  • Paper UI – Add-ons – Transformations – JSONPath Transformation (Version 2.3.0) – INSTALL
  • Paper UI – Add-ons – Transformations – Map Transformation (Version 2.3.0) (war bereits installiert)

Items (Wetter_DWD.items)

Diese Items habe ich für die Visualisierung erstellt:

DateTime        DWD_Warnung_start                   "von: [%1$td.%1$tm.%1$tY %1$tH:%1$tM Uhr]"        <time>                        
DateTime        DWD_Warnung_end                     "bis: [%1$td.%1$tm.%1$tY %1$tH:%1$tM Uhr]"        <time>
Number          DWD_Warnung_level                   "Warnstufe: [MAP(Wetter_DWD.map):%s]"             <dwdwarnung>
String          DWD_Warnung_description             "Beschreibung: [%s]"                              <warnung>
String          DWD_Warnung_headline                "Betreff: [%s]"                                   <warnung>
String          DWD_Warnung_instruction             "Hinweis: [%s]"                                   <warnung>
String          DWD_Warnung_event                   "Event: [%s]"                                     <warnung>

String          DWDSelectedSite

Map (Wetter_DWD.map)

Für die Darstellung muss eine Map erstellt werden:

0=Keine Warnung (0)

1=Wetterwarnung (1)

2=markantes Wetter (2)

3=Unwetterwarnung (3)

4=extremes Unwetter (4)

10=Hitzewarnung (10)

Transform (Wetter_DWD_getWarningsJSON.js)

Die Transformaton der Wetterdaten wird mit diesem Script durchgeführt:

(function(jsonString) {
    var newString = jsonString.replace('warnWetter.loadWarnings(','');
    newString = newString.replace(');','');
    var newJSON = JSON.parse(newString);
    var jsonResult = "";
    if (newJSON.warnings.hasOwnProperty('WARNCELLIC')) {
        jsonResult =JSON.stringify(newJSON.warnings['WARNCELLID'][0]);
    } else jsonResult = 'NULL'
    return jsonResult;
    })(input)

ACHTUNG: Die WARNCELLID muss durch eure individuelle ID ersetzt werden.

Rules (Wetter_DWD.rules)

Für die Automatisierung wird noch folgende Regel erstellt:

rule "DWD Warnungen"
when
Time cron "0 */30 * ? * *"  //every 30 Minutes
//Time cron "0 * * ? * *"    //every 1 Minute

then
var String jsonString = sendHttpGetRequest("https://www.dwd.de/DWD/warnungen/warnapp/json/warnings.json")
var String newString = transform("JS", "Wetter_DWD_getWarningsJSON.js", jsonString)
if (newString !="NULL") {
var String newStart = transform("JSONPATH", "$.start", newString)
var DateTime timestart = new DateTime(Long::parseLong(newStart))
DWD_Warnung_start.postUpdate(new DateTimeType(timestart.toString))
var String newEnd = transform("JSONPATH", "$.end", newString)
if (newEnd !==null) {
var DateTime timeend = new DateTime(Long::parseLong(newEnd))
DWD_Warnung_end.postUpdate(new DateTimeType(timeend.toString))
}

DWD_Warnung_level.postUpdate(transform("JSONPATH","$.level",newString))
DWD_Warnung_description.postUpdate(transform("JSONPATH","$.description",newString))
DWD_Warnung_headline.postUpdate(transform("JSONPATH","$.headline",newString))
DWD_Warnung_instruction.postUpdate(transform("JSONPATH","$.instruction",newString))
DWD_Warnung_event.postUpdate(transform("JSONPATH","$.event",newString))

// Benachrichtigung per Telegram an Bot senden
sendTelegram("BOTNAME", "Wetterwarnung in Altomünster" + "\n" +
                                    "\nWarnstufe: " + DWD_Warnung_level.state.toString +
                                    "\nBeschreibung: " + DWD_Warnung_description.state.toString +
                                    "\nBetreff: " + DWD_Warnung_headline.state.toString +
                                    "\nHinweis: " + DWD_Warnung_instruction.state.toString +
                                    "\nEvent: " + DWD_Warnung_event.state.toString)
}

if (newString =="NULL") {
DWD_Warnung_start.postUpdate("NULL")
DWD_Warnung_end.postUpdate("NULL")
DWD_Warnung_level.postUpdate(0)
DWD_Warnung_description.postUpdate("-")
DWD_Warnung_headline.postUpdate("derzeit keine Warnungen")
DWD_Warnung_instruction.postUpdate("-")
DWD_Warnung_event.postUpdate("-")        
}
end

ACHTUNG: Die Regel wird alle 30 Minuten ausgeführt und aktualisiert so die Daten. Die Funktion sendTelegram sendet an meinen Telegram-Bot die Informationen für die Benachrichtigung auf dem SmartPhone (dieses müsst Ihr dann ggf. hinzufügen oder die Zeilen entfernen – der BOTNAME muss gegen eure Konfiguration getauscht werden).

Sitemap

In der Sitemap können die Inhalte so angezeigt werden:

Text label="Wetterwarnungen" icon="dwdicon" {

Frame label="" {
Selection item=DWDSelectedSite label="Wetter" icon="dwd" mappings=[1="Aktuell", 2="Regenradar", 3="Heute", 4="Morgen", 5="Übermorgen", 6="Unwetter", 7="Pollenflug", 8="Warnungen"]
}

Frame label=" " visibility=[DWDSelectedSite==8] {
Text item=DWD_Warnung_headline label="" valuecolor=[DWD_Warnung_level==1="#ffff00", DWD_Warnung_level==2="#ffa500", DWD_Warnung_level==3="#ff0000", DWD_Warnung_level==4="#800000"]
Text item=DWD_Warnung_level visibility=[DWD_Warnung_level!=0] valuecolor=[1="#ffff00", 2="#ffa500", 3="#ff0000", 4="#800000"]
Text item=DWD_Warnung_start visibility=[DWD_Warnung_start!="NULL"]
Text item=DWD_Warnung_end icon="null" visibility=[DWD_Warnung_end!="NULL"]
}

Frame label=" " visibility=[DWDSelectedSite==8] {
Text item=DWD_Warnung_description visibility=[DWD_Warnung_description!="-"]
Text item=DWD_Warnung_instruction icon="null" visibility=[DWD_Warnung_instruction!="-"]
}

Frame label=" " visibility=[DWDSelectedSite==8] {
Text item=DWD_Warnung_event visibility=[DWD_Warnung_event!="-"] valuecolor=[DWD_Warnung_level==1="#ffff00", DWD_Warnung_level==2="#ffa500", DWD_Warnung_level==3="#ff0000", DWD_Warnung_level==4="#800000"]
}

}

Test

Für einen ersten Test könnt Ihr die DWD-URL manuell aufrufen:

  • https://www.dwd.de/DWD/warnungen/warnapp/json/warnings.json

Bei dieser URL könnt Ihr dann eine WARNCELLID kopieren und in euer Script (JS) einbauen. Damit könnt Ihr dann eine “Warnung” simulieren und die oben genannten Konfigurationen testen.

Fazit

Im Zusammenspiel mit den mobilen Benachrichtigungen und dem Auslesen der Daten des Deutschen Wetterdienstes ergeben sich sinnvolle Anwendungsbeispiele. Wenn man etwas tiefer in openHAB einsteigen möchte (und es keine Standard-Bindings für die Anforderung gibt) kann man mit dem JSON-Binding und dem JavaScript-Binding recht einfach Webservices anbinden.

Das Auslesen der JSON-Datei klappt recht einfach und ist mit wenigen Zeilen Scripting erledigt.

Würdet Ihr Unwetterdaten in eure SmartHome-Umgebung integrieren? Fallen euch noch weitere Szenarien z.B. Pollenflug etc. ein?

9 Kommentare
  1. Patrick
    Patrick sagte:

    Hallo,

    du hast in deiner hier geposteten Sitemap ja noch die Vorschau für die nächsten Tage und weiteres abgebildet. Hast du diese Dinge bereits in OpenHAB integriert und könntest diese auch Bereitstellen?

    Viele Grüße
    Patrick

  2. Reinhard
    Reinhard sagte:

    Hallo Patrick,

    ich hatte das Beispiel für die Unwetterwarnung damals von hier übernommen und an meine Anforderungen angepasst (habe aber nur die Unwetterwarnungen verwendet und wollte die weiteren Elemente aus der Sitemap noch einbauen – bin da aber leider nicht dazu gekommen).

    Vielleicht hilft der Link noch was: https://community.openhab.org/t/solved-json-path-weather-warnings-dwd-deutscher-wetterdienst/46295/48

    Etwas ähnliches mit “Pollenflug” hatte ich hier noch gefunden: https://community.openhab.org/t/solved-json-path-dwd-deutscher-wetterdienst-pollenflug-pollen-flying/45139/11

    Schöne Grüße,
    Reinhard

  3. Reinhard
    Reinhard sagte:

    Ich habe gerade eine Formatierungsfehler in dem Sitemap-Teil mit doppelten Anführungszeichen geändert. Vielen Dank für die Information!

  4. Ole
    Ole sagte:

    Hi, coole Sache mit den Warnung. Ich bekomm es aber leider nicht hin, dass die Icon entsprechend den Warnstufen angezeigt werden. Wo werden diese im Code aufgerufen und woher weiss ich, wann ich welches Icon benutzen muss?!

  5. Reinhard
    Reinhard sagte:

    Hallo Ole,

    was funktioniert denn genau nicht? Bekommst du eine Fehlermeldung?

    Schöne Grüße,
    Reinahrd

  6. ole
    ole sagte:

    Hi, habs dann doch iwann hinbekommen 🙂 gibt es sowas auch für eine regenvorhersage?

  7. Steffen
    Steffen sagte:

    Hallo,

    habe oben stehende Anleitung ausprobiert, bekomme aber folgenden Fehler.

    ERROR] [ntime.internal.engine.ExecuteRuleJob] – Error during the execution of rule ‘DWD Warnungen’: For input string: “warnWetter.loadWa

    Im .JS habe ich die ID wie folgt eingetragen

    if (newJSON.warnings.hasOwnProperty(‘106535000’)) {
    jsonResult =JSON.stringify(newJSON.warnings[‘106535000’][0]);

    Eine Idee?

    Grüße

  8. Reinhard
    Reinhard sagte:

    Hi Steffen,

    kann es sein das du mit verschiedenen “Hochkommata” ein Formatierungsfehler hast? Ggf. wurde das hier aber auch nur im Blog anders formatiert. Vielleicht prüfst du das mal kurz.

    Alternativ habe ich gesehen, dass es jetzt ein fertiges Binding für openHAB 2.5.x gibt d.h. das kannst du wahrscheinlich einfacher verwenden als meinen manuellen Weg: https://www.openhab.org/addons/bindings/dwdunwetter/

  9. Reinhard Eidelsburger
    Reinhard Eidelsburger sagte:

    Beim Update von openHAB 2 auf 3 wollte ich auf das DWD Unwetter Binding umsteigen. Leider hat das bei mir nicht ganz funktioniert und ich wollte die hier beschriebene Scripting-Lösung wieder aktivieren.

    In der Facebook-Gruppe „OpenHAB Germany“ wurde beschrieben was man entsprechend anpassen muss:
    https://www.facebook.com/groups/303797373437980/permalink/1021048128379564

    Die Änderungen wurden von Patrick hier beschrieben:
    https://pastebin.com/BpbQjnwB?fbclid=IwAR2kqqBnoD5C1eu1767W53KrFUaQZH1TtLLG0_k1zTMsSWLE3oT3IPLDzds

    Damit funktioniert auch ohne Probleme der manuelle Weg für die Unwetterdaten wieder in openHAB 3!

Hinterlasse einen Kommentar

An der Diskussion beteiligen?
Hinterlasse uns deinen Kommentar!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.