Unwetterwarnung Script

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

Grrzzz
Beiträge: 17
Registriert: 01.08.2017, 09:34
Danksagung erhalten: 2 Mal

Unwetterwarnung Script

Beitrag von Grrzzz » 01.08.2017, 09:48

Achtung: Seit den 10.10.2017 funktioniert dieses Script NICHT mehr, da der DWD alle Kommunikationskanäle auf https umgestellt wurden, diese aber von der CCU2 nicht untersützt werden. Auf einem Raspberry läuft das Script weiterhin.

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:
2017-09-11 10_39_56-HomeMatic WebUI.png
2017-09-11 10_39_56-HomeMatic WebUI.png (20.1 KiB) 12451 mal betrachtet
Das hier gezeigte Script "installiert" man als Programm wie folgt:
Clipboard02.jpg

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
Zuletzt geändert von Grrzzz am 15.12.2017, 09:14, insgesamt 8-mal geändert.

Benutzeravatar
AndiN
Beiträge: 2621
Registriert: 10.06.2015, 08:54
Wohnort: Hennef
Hat sich bedankt: 10 Mal
Danksagung erhalten: 28 Mal

Re: Unwetterwarnung Script

Beitrag von AndiN » 01.08.2017, 12:16

Interessanterweise gab es kein Unwetterscript, welches zuverlässig funktioniert hat und gleichzeitig die Möglichkeit bietet, auf eine aktive Unwetterwarnung zu reagieren.
Hallo, für mich Doofen. Wieso das nicht? Das Unwetterskript von Blackhole läuft doch zuverlässig und gibt aktive Unwetterwarnungen raus. Wo ist der Unterschied zu dessen Skript?
- Einfachste Konfiguration, nur 2 Systemvariablen und 2 Anpassungen im Script
- Aktionen basierend auf Unwetterwarnungen möglich:
Das sind vermutlich die Unterschiede. Kannst du mir das mal genauer erklären? Meinst Du damit, dass einfach über das Skript nur "Unwetterwarnung JA / NEIN" ausgewertet wird anstelle. Von wann bis wann und was für eine Unwetterwarnung überhaupt?

Danke Dir

Andi
Andi (Greenhorn)

Letzter Reboot: 17.03.24 => FW Update (Uptime:Rekord:153 Tage)
Systeminfos: Raspberry Pi3 Firmware: 3.75.6.20240316 142 Geräte
System angebunden: 3 Roomba 650 - Sprachausgabe via Home24 Media - Pocket Control
- Zentrale: Asus TF103 mit Home24 Tablet
Addons: Drucken 2.5 - HQ WebUI 2.5.9 - XML-API 1.22 - CUx-Daemon 2.9.3 - E-Mail 1.7.4 - hm_pdetect 1.11 - VPN cloudmatic
Diverse Links

Benutzeravatar
blackhole
Beiträge: 3718
Registriert: 21.07.2015, 14:03
System: CCU
Hat sich bedankt: 184 Mal
Danksagung erhalten: 586 Mal

Re: Unwetterwarnung Script

Beitrag von blackhole » 01.08.2017, 13:00

Ich finde es richtig gut, dass jemand das Thema frisch neu aufbereitet. :D

Nun kann ich das von mir angebotene Skript endlich in die wohlverdiente virtuelle Rente schicken.

MartinBr
Beiträge: 393
Registriert: 25.01.2017, 10:51
Wohnort: Bei Berlin
Hat sich bedankt: 3 Mal
Danksagung erhalten: 8 Mal

Re: Unwetterwarnung Script

Beitrag von MartinBr » 01.08.2017, 13:55

Hallo,

das Script zieht nur die Daten aus einem Kreis an. Besteht auch die Möglichkeit, Unwetterwarnungen aus einer Gemeinde zu bekommen???

Gruß

MartinBr
RaspberryMatic-3.59.6 auf Tinkerboard S, CUxD 2.6, XML-1.20, ioBroker (HM,HMIP, Zigbee, Zwave und Shelly) und Alexa in einer VM unter Proxmox, VitoComfort 200

Grrzzz
Beiträge: 17
Registriert: 01.08.2017, 09:34
Danksagung erhalten: 2 Mal

Re: Unwetterwarnung Script

Beitrag von Grrzzz » 01.08.2017, 14:11

AndiN hat geschrieben:
Interessanterweise gab es kein Unwetterscript, welches zuverlässig funktioniert hat und gleichzeitig die Möglichkeit bietet, auf eine aktive Unwetterwarnung zu reagieren.
Hallo, für mich Doofen. Wieso das nicht? Das Unwetterskript von Blackhole läuft doch zuverlässig und gibt aktive Unwetterwarnungen raus. Wo ist der Unterschied zu dessen Skript?
Nein, Blackholes Script läuft nicht zuverlässig, weil die Datenquelle unvollständig ist. Vergleiche einfach mal den Inhalt beider URLs:
http://www.dwd.de/DWD/warnungen/warnapp ... nings.html (Blackhole)
http://www.dwd.de/DWD/warnungen/warnapp ... nings.json (meins)
AndiN hat geschrieben:
- Einfachste Konfiguration, nur 2 Systemvariablen und 2 Anpassungen im Script
- Aktionen basierend auf Unwetterwarnungen möglich:
Das sind vermutlich die Unterschiede. Kannst du mir das mal genauer erklären? Meinst Du damit, dass einfach über das Skript nur "Unwetterwarnung JA / NEIN" ausgewertet wird anstelle. Von wann bis wann und was für eine Unwetterwarnung überhaupt?
Danke Dir
Andi
Anhand der angegebenen Uhrzeit bei der Unwetterwarnung selbst. Klassifiziert wird bisher nicht, könnte aber erweitert werden (z.B. GEWITTER, HITZE, STURM, etc...).
MartinBr hat geschrieben:Hallo,

das Script zieht nur die Daten aus einem Kreis an. Besteht auch die Möglichkeit, Unwetterwarnungen aus einer Gemeinde zu bekommen???

Gruß

MartinBr
Gemeindedaten sind bei dieser Quelle leider kostenpflichtig: http://www.dwd.de/DE/wetter/warnungen_a ... ndung.html
Aktualisierung: nach Bedarf, spätestens nach 10 Minuten
Warndetaillierung: Landkreisebene, Gemeindeebene (DWD-Geoserver)
Warnkriterien: alle, aber auch einzeln auslesbar
Über den Pfad http://www.dwd.de/DWD/warnungen/warnapp ... nings.json wird eine JSONP-Datei zur Verfügung gestellt, in der der Warnstatus für Deutschland dargestellt wird.
Die einzelnen Kreise und Kriterien können über selbst erstellte Scripte ausgelesen und als Text oder Grafik umgesetzt werden.

JSONP wird anstelle von reinem JSON-Code zur Vermeidung von Domainabhängigkeiten verwendet. Im Unterschied gibt es vor dem eigentlich JSON-Code zusätzlich den Präfix "warnWetter.loadWarnings(" und am Ende noch ein " );". Werden die Anfangs- und Endzeichen entfernt (z.B. durch Nutzung einer "Substring"-Funktion) erhält man den reinen JSON-Code, der entsprechend verarbeitet werden kann.

++NEU++Ein JSONP-File auf Gemeindeebene (sowie Landkreisebene) wird über den DWD-GEOSERVER als WebFeatureService(WFS) angeboten.
Der DWD-Geoserver ist über die Adresse https/maps.dwd.de erreichbar

Benutzeravatar
Murmelbaerchen69
Beiträge: 274
Registriert: 01.12.2013, 22:55
Wohnort: @home

Re: Unwetterwarnung Script

Beitrag von Murmelbaerchen69 » 01.08.2017, 17:52

Hallo,

schade, das Skript von Blackhole gefiel mir besser. Hier hatte ich mehr Auswahlmöglichkeiten was ich mir per Pushover zusenden lassen möchte. Solange das Script läuft stelle ich nicht um.

Gruß Ralf

Gesendet von meinem SM-N910F mit Tapatalk
Das soll ein neuer Computer sein ? Warum steht den auf der Tastatur "ALT" ?

Benutzeravatar
AndiN
Beiträge: 2621
Registriert: 10.06.2015, 08:54
Wohnort: Hennef
Hat sich bedankt: 10 Mal
Danksagung erhalten: 28 Mal

Re: Unwetterwarnung Script

Beitrag von AndiN » 01.08.2017, 19:32

keine Ahnung, warum blackhole das Skript entfernt hat. Das hier ist doch kein richtiger Nachfolger. So kann man selber einen Erben benennen, und der Erbe kann nicht mal ablehnen.
Andi (Greenhorn)

Letzter Reboot: 17.03.24 => FW Update (Uptime:Rekord:153 Tage)
Systeminfos: Raspberry Pi3 Firmware: 3.75.6.20240316 142 Geräte
System angebunden: 3 Roomba 650 - Sprachausgabe via Home24 Media - Pocket Control
- Zentrale: Asus TF103 mit Home24 Tablet
Addons: Drucken 2.5 - HQ WebUI 2.5.9 - XML-API 1.22 - CUx-Daemon 2.9.3 - E-Mail 1.7.4 - hm_pdetect 1.11 - VPN cloudmatic
Diverse Links

Karlinho
Beiträge: 42
Registriert: 13.12.2016, 17:45

Re: Unwetterwarnung Script

Beitrag von Karlinho » 01.08.2017, 19:37

Hallo zusammen,

ich habe auch das Script von Blackhole genutzt und mir per Pushover (zPNP von dtp) eine Nachricht zukommen lassen. Dies würde ich mit dem neuen Script auch gerne wieder realisieren. Leider reichen meine Scriptkenntnisse dafür nicht aus.

Ich habe versucht das Script um den Wert "description" zu erweitern. Leider werden am Ende immer die Zeilenumbrüche (\n) in Pushover dargestellt.
Ausserdem komme ich mit der Zeichenfolge nicht so ganz zurecht, weil die Unwetterwarnung (description) ja nicht immer die gleiche Länge hat. Teilweise fehlen am Anfang Buchstaben, dann mal wieder am Ende :?

Code: Alles auswählen

    !------------------------------------------------------------------------------------------------------------
    ! Unwetterwarnungsscript von Grrzzz
    ! Version vom 01.08.2017
    ! https://homematic-forum.de/forum/viewtopic.php?f=31&t=38161
    !------------------------------------------------------------------------------------------------------------


    !------------------------------------------------------------------------------------------------------------
    ! Konfiguration
    !------------------------------------------------------------------------------------------------------------
    !Virtuelles CUxD-Exec-Device hier angeben
    string execdevice = "CUxD.CUX2801001:5";

    !Die Region-ID aus folgender JSON Datei
    !http://www.dwd.de/DWD/warnungen/warnapp/json/warnings.json
    !Für Berlin z.B. 111000000
    string cut1 = "111000000";

    !Nötige CCU-Systemvariablen
    !In der CCU anzulegende Systemvariablen stehen nachfolgend in Anführungszeichen
    !"SV_Wetterwarnung_aktiv"; !Logikwert
    !"SV_Wetterwarnung_Text"; !Zeichenketten

    !------------------------------------------------------------------------------------------------------------
    ! 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(cut1);

    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(cut1);
       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(cut1)>=0) {
      found = true;
    }
    !------------------------------------------------------------------------------------------------------------
    ! Relevanter Bereich ausschneiden und zuweisen
    !------------------------------------------------------------------------------------------------------------
    if(found) {
          stdout = stdout.Substr(stdout.Find(cut1));
          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);
                 
          stdout = stdout.Substr(stdout.Find("event")+8);
          var event = stdout.Substr(0, stdout.Find(",")-1);
		  
          stdout = stdout.Substr(stdout.Find("description")+14);
          var description = stdout.Substr(0, stdout.Find(",")-1);
        
         
          !------------------------------------------------------------------------------------------------------------
          ! 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("SV_Wetterwarnung_aktiv").State(true);
          }
          else {
             dom.GetObject("SV_Wetterwarnung_aktiv").State(false);
          }
          stdout = start.ToInteger().ToTime().ToString() + " - " + end.ToInteger().ToTime().ToString() + ": " + event ": " + description;
         
          dom.GetObject("SV_Wetterwarnung_Text").State(stdout);
    }
    else {
       dom.GetObject("SV_Wetterwarnung_aktiv").State(false);
       dom.GetObject("SV_Wetterwarnung_Text").State("Keine Warnungen");
    }
	
	! +++++ Programm "CCU PRG Push-Nachrichten" ausführen +++++
	dom.GetObject("CCU SV Push Dienst").State("2");
        dom.GetObject("CCU SV Push Prio").State("1");
        dom.GetObject("CCU SV Push Text").State(stdout);
        dom.GetObject("CCU PRG Push-Nachrichten").ProgramExecute(); }
Wäre super wenn mir jemand dabei helfen kann.

Vielen Dank und beste Grüße.
Karl
Dateianhänge
WhatsApp Image 2017-08-01 at 18.23.00.jpeg

Grrzzz
Beiträge: 17
Registriert: 01.08.2017, 09:34
Danksagung erhalten: 2 Mal

Re: Unwetterwarnung Script

Beitrag von Grrzzz » 03.08.2017, 19:24

Karlinho hat geschrieben:Hallo zusammen,

ich habe auch das Script von Blackhole genutzt und mir per Pushover (zPNP von dtp) eine Nachricht zukommen lassen. Dies würde ich mit dem neuen Script auch gerne wieder realisieren. Leider reichen meine Scriptkenntnisse dafür nicht aus.

Ich habe versucht das Script um den Wert "description" zu erweitern. Leider werden am Ende immer die Zeilenumbrüche (\n) in Pushover dargestellt.
Ausserdem komme ich mit der Zeichenfolge nicht so ganz zurecht, weil die Unwetterwarnung (description) ja nicht immer die gleiche Länge hat. Teilweise fehlen am Anfang Buchstaben, dann mal wieder am Ende :?

Code: Alles auswählen

    !------------------------------------------------------------------------------------------------------------
    ! Unwetterwarnungsscript von Grrzzz
    ! Version vom 01.08.2017
    ! https://homematic-forum.de/forum/viewtopic.php?f=31&t=38161
    !------------------------------------------------------------------------------------------------------------


    !------------------------------------------------------------------------------------------------------------
    ! Konfiguration
    !------------------------------------------------------------------------------------------------------------
    !Virtuelles CUxD-Exec-Device hier angeben
    string execdevice = "CUxD.CUX2801001:5";

    !Die Region-ID aus folgender JSON Datei
    !http://www.dwd.de/DWD/warnungen/warnapp/json/warnings.json
    !Für Berlin z.B. 111000000
    string cut1 = "111000000";

    !Nötige CCU-Systemvariablen
    !In der CCU anzulegende Systemvariablen stehen nachfolgend in Anführungszeichen
    !"SV_Wetterwarnung_aktiv"; !Logikwert
    !"SV_Wetterwarnung_Text"; !Zeichenketten

    !------------------------------------------------------------------------------------------------------------
    ! 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(cut1);

    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(cut1);
       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(cut1)>=0) {
      found = true;
    }
    !------------------------------------------------------------------------------------------------------------
    ! Relevanter Bereich ausschneiden und zuweisen
    !------------------------------------------------------------------------------------------------------------
    if(found) {
          stdout = stdout.Substr(stdout.Find(cut1));
          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);
                 
          stdout = stdout.Substr(stdout.Find("event")+8);
          var event = stdout.Substr(0, stdout.Find(",")-1);
		  
          stdout = stdout.Substr(stdout.Find("description")+14);
          var description = stdout.Substr(0, stdout.Find(",")-1);
        
         
          !------------------------------------------------------------------------------------------------------------
          ! 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("SV_Wetterwarnung_aktiv").State(true);
          }
          else {
             dom.GetObject("SV_Wetterwarnung_aktiv").State(false);
          }
          stdout = start.ToInteger().ToTime().ToString() + " - " + end.ToInteger().ToTime().ToString() + ": " + event ": " + description;
         
          dom.GetObject("SV_Wetterwarnung_Text").State(stdout);
    }
    else {
       dom.GetObject("SV_Wetterwarnung_aktiv").State(false);
       dom.GetObject("SV_Wetterwarnung_Text").State("Keine Warnungen");
    }
	
	! +++++ Programm "CCU PRG Push-Nachrichten" ausführen +++++
	dom.GetObject("CCU SV Push Dienst").State("2");
        dom.GetObject("CCU SV Push Prio").State("1");
        dom.GetObject("CCU SV Push Text").State(stdout);
        dom.GetObject("CCU PRG Push-Nachrichten").ProgramExecute(); }
Wäre super wenn mir jemand dabei helfen kann.

Vielen Dank und beste Grüße.
Karl
Hi Karl,

probier es mal an dieser Stelle:


Code: Alles auswählen

[...]
          !------------------------------------------------------------------------------------------------------------
          ! 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("SV_Wetterwarnung_aktiv").State(true);

              ! +++++ Programm "CCU PRG Push-Nachrichten" ausführen +++++
         dom.GetObject("CCU SV Push Dienst").State("2");
        dom.GetObject("CCU SV Push Prio").State("1");
        dom.GetObject("CCU SV Push Text").State(stdout);
        dom.GetObject("CCU PRG Push-Nachrichten").ProgramExecute();
          }
          else {
             dom.GetObject("SV_Wetterwarnung_aktiv").State(false);
          }
          stdout = start.ToInteger().ToTime().ToString() + " - " + end.ToInteger().ToTime().ToString() + ": " + event ": " + description;
         
          dom.GetObject("SV_Wetterwarnung_Text").State(stdout);
    }
    else {
       dom.GetObject("SV_Wetterwarnung_aktiv").State(false);
       dom.GetObject("SV_Wetterwarnung_Text").State("Keine Warnungen");
    }
   
}
Einfacher ist es jedoch, einfach ein neues Programm zu schreiben, das auf Änderungen der Systemvariable "Unwetter_aktiv" = aktiv triggert, da du dann dein Script einfach im "Dann" Teil ausführen kannst (so mache ich das auch, dann ist die Logik auch ordentlich von den Aktionen getrennt):

Code: Alles auswählen

 ! +++++ Programm "CCU PRG Push-Nachrichten" ausführen +++++
        dom.GetObject("CCU SV Push Dienst").State("2");
        dom.GetObject("CCU SV Push Prio").State("1");
        !Einfach die aktuelle Warnung aus der Systemvariable lesen
        dom.GetObject("CCU SV Push Text").State(dom.GetObject("Wetterwarnung_Text").Value());
        dom.GetObject("CCU PRG Push-Nachrichten").ProgramExecute();
Mit der aktuellen Version kannst du dann auch so etwas bauen (das untere Script fährt alle Rolläden runter). So kannst du mein Script immer ohne Sorge aktualisieren, ohne immer wieder aufs Neue deine Hacks einzupflegen.
Clipboard01.jpg

Grrzzz
Beiträge: 17
Registriert: 01.08.2017, 09:34
Danksagung erhalten: 2 Mal

Re: Unwetterwarnung Script

Beitrag von Grrzzz » 03.08.2017, 19:29

Murmelbaerchen69 hat geschrieben:Hallo,

schade, das Skript von Blackhole gefiel mir besser. Hier hatte ich mehr Auswahlmöglichkeiten was ich mir per Pushover zusenden lassen möchte. Solange das Script läuft stelle ich nicht um.

Gruß Ralf

Gesendet von meinem SM-N910F mit Tapatalk
Es zwingt dich auch keiner dazu. Es ist doch schön, wenn man eine grosse Auswahl an Optionen hat. Ohne das Script von Blackhole wäre meine Version auch nie entstanden.

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“