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?