Unwetterwarnung in OpenHAB
Verfasst: 26. Sep 2015 18:51
Hallo Zusammen,
da wir im vergangenen Jahr zweimal wegen Starkregen abgesoffen sind, wollte ich gerne rechtzeitig wissen, wann eine Unwetterwarnung ausgesprochen wird. Da ich gerne auf die Warnung in meiner Automatisierung zugreifen möchte, macht es Sinn das Ganze über OpenHAB zu bauen. Hier eine kurze Zusammenfassung meiner Lösung:
Gelöst habe ich das zum Einen über das HTTP Binding, da es mir mehr Flexibilität geboten hat. Soll heißen das Binding muss natürlich funktionieren
. Da der kostenlosen API Zugang von wunderground Einschränkungen bzgl. der Häufigkeit der Abfragen hat, habe ich das Caching aktiviert:
der API Key muss natürlich angepasst werden. Wie man sieht komme ich aus dem Bonner Raum (IWACHTBE3.xml). Mit diesem Updateinterval ist sichergestellt, dass der API Zugang nicht gesperrt wird.
Um in OpenHAB die Informationen nutzen zu können, habe ich die folgenden Items definiert:
Mit den beiden Schritten bekomme ich die Informationen die ich haben möchte von wunderground.
Diese Infos verarbeite ich mit folgender rule:
Wenn also keine Nachricht vorhanden ist, existiert aktuell auch keine Unwetterwarnung. Wenn Infos geliefert werden ersetze ich die Sonderzeichen und schicke den Bewohnern des Hauses eine WhatsApp mit der entsprechenden Warnung.
Damit in der GUI nur im Falle eine aktiven Warnung etwas angezeigt wird, steuere ich die Sichtbarkeit über den Switch WeatherAlertActive. So sieht das bei mir aus:
Die Funktion läuft bei mir jetzt ein halbes Jahr ohne Probleme. Aber Verbesserungsvorschläge sind immer willkommen! Screenshots folgen bei der nächsten Unwetterlage 
Grüße,
Seppy
da wir im vergangenen Jahr zweimal wegen Starkregen abgesoffen sind, wollte ich gerne rechtzeitig wissen, wann eine Unwetterwarnung ausgesprochen wird. Da ich gerne auf die Warnung in meiner Automatisierung zugreifen möchte, macht es Sinn das Ganze über OpenHAB zu bauen. Hier eine kurze Zusammenfassung meiner Lösung:
Gelöst habe ich das zum Einen über das HTTP Binding, da es mir mehr Flexibilität geboten hat. Soll heißen das Binding muss natürlich funktionieren

Code: Alles auswählen
http:cacheWeatherAlertsWunderground.url=http://api.wunderground.com/api/XXXXXXXXX/alerts/lang:DL/q/pws:IWACHTBE3.xml
http:cacheWeatherAlertsWunderground.updateInterval=600000
Um in OpenHAB die Informationen nutzen zu können, habe ich die folgenden Items definiert:
Code: Alles auswählen
/**
* Unwetterwarnungen
*/
String WeatherAlert "Unwetterwarnung [%s]" (gWetter)
Switch WeatherAlertActive (gWetter)
String WeatherAlert_RAWMessage (gWetter) {http="<[cacheWeatherAlertsWunderground:300000:XSLT(wunderground_weather_alert.xsl)]" }
String WeatherAlert_Message
- Das erste Item enthält später die eigentliche Unwetterwarnung
- Der zweite Switch zeigt an ob eine Warnung aktiv ist. Das kann man auch anders lösen, aber für mich ging das so am schnellsten.
- Der dritte String enthält die "rohe" Nachricht von Wunderground. Da dort seltsame Sonderzeichen geliefert werden, habe ich mit dem Text noch einiges angestellt (Hier hat vielleicht jemand mehr Ahnung, woher die Sonderzeichen kommen, evtl. UTF-8?). Dazu später mehr.
- Und zum Schluss noch die eigentliche Nachricht, nach Überarbeitung.
Code: Alles auswählen
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output indent="yes" method="xml" encoding="ISO-8859-1" omit-xml-declaration="yes" cdata-section-elements="message" />
<xsl:template match="/">
<xsl:value-of select="response/alerts/alert/message"/>
</xsl:template>
</xsl:stylesheet>
Diese Infos verarbeite ich mit folgender rule:
Code: Alles auswählen
/**
* Änderung am Unwetterwarnungsstatus
*/
rule "WeatherAlert_RAWMessage_Changed"
when
Item WeatherAlert_RAWMessage changed
then
//Leerzeichen am Anfang und Ende entfernen, sowie doppelte Leerzeichen im Text
alertmessage = WeatherAlert_RAWMessage.state.toString.trim().replaceAll("[\\s]+"," ")
//Prüfung ob eine Unwetterwarnung vorliegt (String länger als ein Zeichen und nicht uninitialisiert)
if (alertmessage.length() > 1 && alertmessage != "Uninitialized"){
//Wenn JA Umlaute und falsche Zeichen der API ersetzen bzw. entfernen
logInfo("HomeBox.WeatherAlert_Message_Changed", "Unwetterwarnung erkannt")
val umlaute = newArrayList('Ä','Ö',"Ü","ä","ö","ü","ß","é","è","ê","â","á","à","§","°","ß","","","","","","Ö","Ä","Extrem Temperatur: ")
val replace = newArrayList("Ä","Ö","Ü","ä","ö","ü","ß","é","è","ê","â","á","Ã","§","°","àŸ","&","nbsp","\n","\r"," ","Thunderstorms ","à–"," à„","Extreme high temperature")
umlaute.forEach[x,i|
alertmessage = alertmessage.replace(replace.get(i),x)
]
//Item für Nachricht mit formatiertem String aktualisieren aktualisieren
WeatherAlert_Message.postUpdate(alertmessage)
WeatherAlert.postUpdate(alertmessage)
// Prüfung ob neue Unwettermeldung vorliegt (Aktivität == OFF)
if (WeatherAlertActive.state == OFF){
// Unwetterwarnung aktivieren
sendCommand(WeatherAlertActive,ON)
//Bewohner per WhatsApp informieren
executeCommandLine("/opt/yowsup/yowsup-cli@@demos@@-c@@/opt/yowsup/homebox.config@@-s@@49151XXXXXXX-XXXXXXX@@UNWETTERWARNUNG:\n" + alertmessage)
}
//Wenn NEIN
} else {
//Zurücksetzen der Nachricht
WeatherAlert_Message.postUpdate("Uninitialized")
WeatherAlert.postUpdate("Uninitialized")
//Wenn Aktivität noch ON
if (WeatherAlertActive.state == ON){
//Aktivierung abschalten
sendCommand(WeatherAlertActive,OFF)
//Bewohner per WhatsApp informieren
executeCommandLine("/opt/yowsup/yowsup-cli@@demos@@-c@@/opt/yowsup/homebox.config@@-s@@491511XXXXXX-XXXX@@UNWETTERWARNUNG AUFGEHOBEN")
}
}
// Aktualisierungsdatum setzen
postUpdate(WeatherLastUpdate, new DateTimeType())
logInfo("HomeBox.WeatherRainForecast_Changed", "Updated WeatherLastUpdate: " + WeatherLastUpdate.state)
end
Damit in der GUI nur im Falle eine aktiven Warnung etwas angezeigt wird, steuere ich die Sichtbarkeit über den Switch WeatherAlertActive. So sieht das bei mir aus:
Code: Alles auswählen
Text item=WeatherAlertActive label="Unwetterwarnung" icon="alert" labelcolor=[WeatherAlertActive==ON="red"] visibility=[WeatherAlertActive==ON] {
Text item=WeatherAlert
Image label="Regenradar" url="http://www.wetteronline.de/?ireq=true&pid=p_radar_map&src=radar/vermarktung/p_radar_map_forecast/forecastLoop/RHP/latestForecastLoop.gif"
}

Grüße,
Seppy