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?
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
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
Ich habe gerade eine Formatierungsfehler in dem Sitemap-Teil mit doppelten Anführungszeichen geändert. Vielen Dank für die Information!
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?!
Hallo Ole,
was funktioniert denn genau nicht? Bekommst du eine Fehlermeldung?
Schöne Grüße,
Reinahrd
Hi, habs dann doch iwann hinbekommen 🙂 gibt es sowas auch für eine regenvorhersage?
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
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/
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!