Als Workaround kann man auf einem php fähigen Webserver (der von der CCU erreichbar ist) folgendes PHP Script installieren und die URL in der Scriptzeile ~30 (String url = ...) entsprechend anpassen.
Code: Alles auswählen
<?php
echo file_get_contents("https://www.dwd.de/DWD/warnungen/warnapp/json/warnings.json");
?>
Interessanterweise gab es kein Unwetterscript, welches zuverlässig funktioniert hat und gleichzeitig die Möglichkeit bietet, auf eine aktive Unwetterwarnung zu reagieren.
Nachfolgendes Script ist hauptsächlich durch copy & paste von anderen Scripten entstanden und bietet folgende Vorteile:
- Einfachste Konfiguration, nur 2 3 Systemvariablen und 2 Anpassungen im Script
- Aktionen basierend auf Unwetterwarnungen möglich
Da dem Script Startzeit und Endzeit einer Unwetterwarnung bekannt sind, kann und wird die o.g. Variable während einer aktiven Unwetterwarnung entsprechend auf "aktiv" gesetzt.
Gleichzeitig kann man über die 2. Systemvariable "Wetterwarnung_Typ" den Typ der Wetterwarnung auslesen ( unbekannt;Gewitter;Wind/Sturm/Orkan;Stark- und Dauerregen;Schneefall/Schneeverwehungen;Nebel;Frost;Glätte/Glatteis;Tauwetter;Hitzewarnungen;UV-Warnungen;Küstenwarnungen;Binnenseewarnungen).
So ist es zum Beispiel automatisiert möglich, die Markise bei aktiver Sturmwarnung einzufahren, oder die Rolläden bei Gewitter herunterzufahren: Das hier gezeigte Script "installiert" man als Programm wie folgt:
Code: Alles auswählen
!------------------------------------------------------------------------------------------------------------
! Unwetterwarnungsscript von Grrzzz
! Version vom 11.09.2017
! https://homematic-forum.de/forum/viewtopic.php?f=31&t=38161
!------------------------------------------------------------------------------------------------------------
!------------------------------------------------------------------------------------------------------------
! Konfiguration
!------------------------------------------------------------------------------------------------------------
!Virtuelles CUxD-Exec-Device hier angeben
string execdevice = "CUxD.CUX2801001:1";
!Die Region-ID aus der JSON Datei
!http://www.dwd.de/DWD/warnungen/warnapp/json/warnings.json
!Für Berlin z.B. 111000000
string city = "111000000";
!Nötige CCU-Systemvariablen
!In der CCU anzulegende Systemvariablen stehen nachfolgend in Anführungszeichen
var wetterwarnungAktiv = "Wetterwarnung_aktiv"; !Logikwert
var wetterwarnungText = "Wetterwarnung_Text"; !Zeichenketten
var wetterwarnungTyp = "Wetterwarnung_Typ"; !Werteliste mit: unbekannt;Gewitter;Wind/Sturm/Orkan;Stark- und Dauerregen;Schneefall/Schneeverwehungen;Nebel;Frost;Glätte/Glatteis;Tauwetter;Hitzewarnungen;UV-Warnungen;Küstenwarnungen;Binnenseewarnungen
!------------------------------------------------------------------------------------------------------------
! Das wars an Konfiguration
! DWD-Warntabelle in 25k(+25k)-Abschnitten laden bis die Region gefunden wurde
!------------------------------------------------------------------------------------------------------------
string url = "http://www.dwd.de/DWD/warnungen/warnapp/json/warnings.json";
string downloader = "LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl";
integer rangefrom = 1;
integer rangeto = 25000;
integer loopcounter = 1;
string cmd = downloader # " --range " # rangefrom # "-" # rangeto # " " # url;
string cut2 = "],";
dom.GetObject(execdevice # ".CMD_SETS").State(cmd);
dom.GetObject(execdevice # ".CMD_QUERY_RET").State(1);
string stdout = dom.GetObject(execdevice # ".CMD_RETS").State();
integer find1 = stdout.Find(city);
if ((find1 >= 0) && (stdout.Length() >= 25000)) {
rangefrom = rangeto - 99;
rangeto = rangeto + 24900;
cmd = downloader # " --range " # rangefrom # "-" # rangeto # " " # url;
dom.GetObject(execdevice # ".CMD_SETS").State(cmd);
dom.GetObject(execdevice # ".CMD_QUERY_RET").State(1);
stdout = stdout + dom.GetObject(execdevice # ".CMD_RETS").State();
}
while ((find1 < 0) && (stdout.Length() >= 25000) && (loopcounter <= 30)) {
loopcounter = loopcounter + 1;
rangefrom = rangeto - 99;
rangeto = rangeto + 24900;
cmd = downloader # " --range " # rangefrom # "-" # rangeto # " " # url;
dom.GetObject(execdevice # ".CMD_SETS").State(cmd);
dom.GetObject(execdevice # ".CMD_QUERY_RET").State(1);
stdout = dom.GetObject(execdevice # ".CMD_RETS").State();
find1 = stdout.Find(city);
if ((find1 >= 0) && (stdout.Length() >= 25000)) {
rangefrom = rangefrom + 25000;
rangeto = rangeto + 25000;
cmd = downloader # " --range " # rangefrom # "-" # rangeto # " " # url;
dom.GetObject(execdevice # ".CMD_SETS").State(cmd);
dom.GetObject(execdevice # ".CMD_QUERY_RET").State(1);
stdout = stdout + dom.GetObject(execdevice # ".CMD_RETS").State();
}
}
boolean found = false;
if(stdout.Find(city)>=0) {
found = true;
}
!------------------------------------------------------------------------------------------------------------
! Relevanter Bereich ausschneiden und zuweisen
!------------------------------------------------------------------------------------------------------------
if(found) {
stdout = stdout.Substr(stdout.Find(city));
stdout = stdout.Substr(0, stdout.Find(cut2)+1);
stdout = stdout.Substr(stdout.Find("end")+5);
integer end = stdout.Substr(0, stdout.Find(",")-3);
stdout = stdout.Substr(stdout.Find("start")+7);
integer start = stdout.Substr(0, stdout.Find(",")-3);
!In folgender Tabelle sind Warntypen mit ? markiert, die noch nicht in der Praxis getestet werden konnten!
!0 = Gewitter
!1 = Wind/Sturm/Orkan
!2 = Stark- und Dauerregen
!3 = Schneefall/Schneeverwehungen
!4 = Nebel ?
!5 = Frost
!6 = Glätte/Glatteis
!7 = Tauwetter ?
!8 = Hitzewarnungen ?
!9 = UV-Warnungen ?
!10 = Küstenwarnungen ?
!11 = Binnenseewarnungen ?
stdout = stdout.Substr(stdout.Find("type")+6);
var type = stdout.Substr(0, stdout.Find(","));
!Vermutung 0 = Vorabwarnung, 1..10 tatsächliche Warnungen
stdout = stdout.Substr(stdout.Find("level")+7);
var level = stdout.Substr(0, stdout.Find(","));
stdout = stdout.Substr(stdout.Find("event")+8);
var event = stdout.Substr(0, stdout.Find(",")-1);
!Vorabinformationen sind auch zu filtern
if(event.Find("VORABINFORMATION")>=0) {
found = false;
} else {
!------------------------------------------------------------------------------------------------------------
! Auswertung
!------------------------------------------------------------------------------------------------------------
integer time = system.Date("%F %X").ToTime().ToInteger();
var diff1 = time - start.ToInteger();
var diff2 = time - end.ToInteger();
if(diff1 >= 0 && diff2 <= 0) {
dom.GetObject(wetterwarnungAktiv).State(true);
}
else {
dom.GetObject(wetterwarnungAktiv).State(false);
}
stdout = start.ToInteger().ToTime().ToString() + " - " + end.ToInteger().ToTime().ToString() + ": " + event;
dom.GetObject(wetterwarnungText).State(stdout.ToLatin());
dom.GetObject(wetterwarnungTyp).State(type.ToInteger()+1);
}
}
!------------------------------------------------------------------------------------------------------------
! Allgemeiner Fallback
!------------------------------------------------------------------------------------------------------------
if(!found) {
dom.GetObject(wetterwarnungAktiv).State(false);
dom.GetObject(wetterwarnungText).State("Keine Warnungen");
dom.GetObject(wetterwarnungTyp).State(0);
}
Eine Alternativ-Version gibt es vom User klana hier:
viewtopic.php?p=389713#p389713
Changelog:
- 15.12.2017: Bei Problemen bitte folgende Version nutzen: viewtopic.php?f=31&t=38161&p=406043#p406043
11.09.2017 Ausgabe in Systemvarialbe korrigiert, siehe Post: viewtopic.php?f=31&t=38161&start=10#p375768 (eine einzige Änderung im Script; suche nach ".ToLatin()", CCU2 Version 2.29.22+ muss verwendet werden)
03.08.2017 Neue Systemvariable "Wetterwarnung_Typ" (Werteliste) eingeführt, Vorwarnungen werden nun ausgefiltert
01.08.2017: Initiale Version