Unwetterwarnung in OpenHAB

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

Benutzeravatar
seppy
Beiträge: 738
Registriert: 24. Sep 2015 20:25
Answers: 4
Wohnort: Bonn

Unwetterwarnung in OpenHAB

Beitrag von seppy »

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

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.
Das Stylesheet (wunderground_weather_alert.xsl) zum extrahieren der passenden Infos sieht bei mir wie folgt aus:

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>
Mit den beiden Schritten bekomme ich die Informationen die ich haben möchte von wunderground.

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("Ä","Ö","Ãœ","ä","ö","ü","ß","é","è","ê","â","á","Ã","§","°","à&#159;","&","nbsp","\n","\r","  ","Thunderstorms ","à&#150;"," à&#132;","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
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.
Unwetterwarnung.JPG
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" 			
		}	
openhab_unwetter1.png
openhab_unwetter2.png
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 :mrgreen:

Grüße,
Seppy
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Homematic und HomematicIP über Raspberrymatic (RaspPi 4 4GB) mit 2x HMLAN. Steuerung und Visualisierung durch OpenHAB2 auf RaspPi in Hutschienengehäuse im Sicherungskasten. Rund 100 Aktoren/Sensoren

- Abgesichert durch APC USV
- Bewässerungssteuerung mit Hunter Magnetventilen (HM-LC-Sw4-DR)
- Beleuchtungssteuerung Innen und Aussen (HM-LC-Sw4-DR + HM-LC-SW1-FM + HMW-IO-12-SW7-DR)
- Rolladensteuerung mit Beschattungsautomatik über Temperaturdifferenzsensor (HM-LC-Bl1PBU-FM)
- Wetter und Unwetterinformationen von wunderground
- Benachrichtigung der Bewohner via Pushover
- Multimediawand und Dreambox Steuerung (HM-LC-SW1-FM)
- Heizungssteuerung mit Komfort und Energiesparfunktionen (HM-CC-RT-DN + HM-Sec-SC-2 + HMIP-eTRV-2)
- Werkstatt Kompressorsteuerung (HMW-IO-12-SW7-DR)
- Weihnachtsbeleuchtung außen
- Präsenzerkennung über Geolocation (iCloud Binding), iBeacon und WLAN (Unifi Binding)
- Philips HUE & Tasmota Devices (Tuya) Einbindung

Benutzeravatar
seppy
Beiträge: 738
Registriert: 24. Sep 2015 20:25
Answers: 4
Wohnort: Bonn

Re: Unwetterwarnung in OpenHAB

Beitrag von seppy »

Hier eine Rückfrage aus dem Blog "openhabblog.de":
Christian
Vielen Dank für die tolle Anleitung.
Mein Wunderground API spuckt leider jetzt im Juli das hier aus, ist also immer >1 auch wenn keine Unwetterwarnung vorliegt:

„0.1 http://www.wunderground.com/weather/api/d/terms.html alerts“

Wie kannst du das mit der Regel raus löschen?
Danke & Grüße
seppy
Hallo Christian,

kann es sein das Du das Abruflimit überschritten hast? Da der Link der zurückgegeben wird auf die „WEATHER UNDERGROUND API TERMS AND CONDITIONS OF USE“ verweist würde ich das vermuten.

Grüße,
Seppy
Homematic und HomematicIP über Raspberrymatic (RaspPi 4 4GB) mit 2x HMLAN. Steuerung und Visualisierung durch OpenHAB2 auf RaspPi in Hutschienengehäuse im Sicherungskasten. Rund 100 Aktoren/Sensoren

- Abgesichert durch APC USV
- Bewässerungssteuerung mit Hunter Magnetventilen (HM-LC-Sw4-DR)
- Beleuchtungssteuerung Innen und Aussen (HM-LC-Sw4-DR + HM-LC-SW1-FM + HMW-IO-12-SW7-DR)
- Rolladensteuerung mit Beschattungsautomatik über Temperaturdifferenzsensor (HM-LC-Bl1PBU-FM)
- Wetter und Unwetterinformationen von wunderground
- Benachrichtigung der Bewohner via Pushover
- Multimediawand und Dreambox Steuerung (HM-LC-SW1-FM)
- Heizungssteuerung mit Komfort und Energiesparfunktionen (HM-CC-RT-DN + HM-Sec-SC-2 + HMIP-eTRV-2)
- Werkstatt Kompressorsteuerung (HMW-IO-12-SW7-DR)
- Weihnachtsbeleuchtung außen
- Präsenzerkennung über Geolocation (iCloud Binding), iBeacon und WLAN (Unifi Binding)
- Philips HUE & Tasmota Devices (Tuya) Einbindung

Benutzeravatar
alkaline
Beiträge: 173
Registriert: 20. Apr 2017 13:25

Re: Unwetterwarnung in OpenHAB

Beitrag von alkaline »

Ich habe deine Konfiguration in OH 2 übernommen, habe jedoch keinen Erfolg damit:

Code: Alles auswählen

2017-06-16 12:28:55.161 [ERROR] [.script.engine.ScriptExecutionThread] - Rule 'WeatherAlert_RAWMessage_Changed': An error occured during the script execution: Could not invoke method: org.eclipse.xtext.xbase.lib.ArrayExtensions.length(short[]) on instance: null
Was mir auffiel im Designer ist die Meldung:

Code: Alles auswählen

The method alertmessage(String) is undefined
Die kann ich zwar umgehen, indem ich mit

Code: Alles auswählen

val alertmessage
die variable definiere, es ändert jedoch nichts :?

Frage daher:
Arbeitet das Script bei dir (noch)?

Benutzeravatar
seppy
Beiträge: 738
Registriert: 24. Sep 2015 20:25
Answers: 4
Wohnort: Bonn

Re: Unwetterwarnung in OpenHAB

Beitrag von seppy »

Hi,
ja tut es, aber ich checke mal ob ich in der Zwischenzeit Anpassungen vorgenommen hatte.
Grüße,
Seppy
Homematic und HomematicIP über Raspberrymatic (RaspPi 4 4GB) mit 2x HMLAN. Steuerung und Visualisierung durch OpenHAB2 auf RaspPi in Hutschienengehäuse im Sicherungskasten. Rund 100 Aktoren/Sensoren

- Abgesichert durch APC USV
- Bewässerungssteuerung mit Hunter Magnetventilen (HM-LC-Sw4-DR)
- Beleuchtungssteuerung Innen und Aussen (HM-LC-Sw4-DR + HM-LC-SW1-FM + HMW-IO-12-SW7-DR)
- Rolladensteuerung mit Beschattungsautomatik über Temperaturdifferenzsensor (HM-LC-Bl1PBU-FM)
- Wetter und Unwetterinformationen von wunderground
- Benachrichtigung der Bewohner via Pushover
- Multimediawand und Dreambox Steuerung (HM-LC-SW1-FM)
- Heizungssteuerung mit Komfort und Energiesparfunktionen (HM-CC-RT-DN + HM-Sec-SC-2 + HMIP-eTRV-2)
- Werkstatt Kompressorsteuerung (HMW-IO-12-SW7-DR)
- Weihnachtsbeleuchtung außen
- Präsenzerkennung über Geolocation (iCloud Binding), iBeacon und WLAN (Unifi Binding)
- Philips HUE & Tasmota Devices (Tuya) Einbindung

Benutzeravatar
alkaline
Beiträge: 173
Registriert: 20. Apr 2017 13:25

Re: Unwetterwarnung in OpenHAB

Beitrag von alkaline »

Wollte nochmals nachfragen, hattest du Zeit mal nachzusehen?
Oder post einfach die Rule bzw Items ... ;)

Danke für die Mühe

tobidd
Beiträge: 14
Registriert: 10. Jul 2017 20:16

Re: Unwetterwarnung in OpenHAB

Beitrag von tobidd »

Super Project, das würde ich bei mir auch gern ans laufen bringen.
Reicht das binding-http1 - 1.10.0 Binding aus oder muss da noch mehr installiert werden?
Ich nutze OH 2.1

Kannst du mir eventuell verraten, wo ich die XML Datei hinkopieren muss?

und wie sieht deine .things Datei aus.

Gruß Tobi

Benutzeravatar
alkaline
Beiträge: 173
Registriert: 20. Apr 2017 13:25

Re: Unwetterwarnung in OpenHAB

Beitrag von alkaline »

Die XSL Dateien kommen in den Ordner Transformations rein, eine *things benötigst du nicht.

tobidd
Beiträge: 14
Registriert: 10. Jul 2017 20:16

Re: Unwetterwarnung in OpenHAB

Beitrag von tobidd »

Danke für die Antwort.

Leider stehe ich auf dem Schlauch.

Wenn ich keine Things brauche, wo kommt dann das hier hin?

Code: Alles auswählen

http:cacheWeatherAlertsWunderground.url=http://api.wunderground.com/api/XXXXXXXXX/alerts/lang:DL/q/pws:IWACHTBE3.xml
http:cacheWeatherAlertsWunderground.updateInterval=600000
Danke für deine Hilfe

Gruß Tobi

tobidd
Beiträge: 14
Registriert: 10. Jul 2017 20:16

Re: Unwetterwarnung in OpenHAB

Beitrag von tobidd »

ok. ich denke ich weis wo ich das einfügen muss "Services/http.cfg", ist das so weit richtig?

Nur leider bekomme ich immer noch eine leere Seite (:

Gruß Tobi

Benutzeravatar
alkaline
Beiträge: 173
Registriert: 20. Apr 2017 13:25

Re: Unwetterwarnung in OpenHAB

Beitrag von alkaline »

In die HTTP.cfg.
Den Key holst du dir bei Wunderground, dort registrieren und Key erstellen, danach in die cfg einfügen.

Antworten