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?

0 Kommentare

Dein Kommentar

An 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.