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:
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