Unwetterwarnung Script

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

Moderator: Co-Administratoren

steffi8118
Beiträge: 19
Registriert: 15.09.2018, 12:18
Hat sich bedankt: 11 Mal
Danksagung erhalten: 1 Mal

Re: Unwetterwarnung Script

Beitrag von steffi8118 » 09.01.2020, 21:21

MartinBr hat geschrieben:
08.01.2020, 13:41

Gruß
Martin
P.S.
Ja, ich weiß, es gehört eigentlich in ein anderes Forum :wink:
Exakt, eine PN wäre in dem Fall auch praktikabler gewesen.

LG
Steffi

steffi8118
Beiträge: 19
Registriert: 15.09.2018, 12:18
Hat sich bedankt: 11 Mal
Danksagung erhalten: 1 Mal

Re: Unwetterwarnung Script

Beitrag von steffi8118 » 19.01.2020, 20:51

blackhole hat geschrieben:
08.01.2020, 07:00
Tja, das scheint dann wohl irgendetwas anderes zu sein oder eben eine neue CCU2/CUxD-Überraschung. ¯\_(ツ)_/¯
Soderle, ich denke, ich bin nun einen wichtigen Schritt weitergekommen:

Ich habe im DWD Script zum Ausführen den Kanal 3 zugewiesen: string execdevice = "CUxD.CUX2801001:3";
In der Ger#teeinstellung (in CCU3 Oberfläche) hingegen steht weiterhin unter KEY|CMD_SHORT: LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl --range 199301-224300 https://www.dwd.de/DWD/warnungen/warnap ... nings.json

Könnte hier der Fehler liegen?

Eine Änderung des Library Pfades ist im Gerät selbst zwar möglich, aber wird trotz Speicherns nicht übernommen.

Hast Du evtl. eine Idee wie ich den Pfad im Gerät dauerhaft ändern kann?

LG
Steffi

etofi
Beiträge: 106
Registriert: 26.06.2016, 09:59
System: CCU
Hat sich bedankt: 3 Mal
Danksagung erhalten: 16 Mal

Re: Unwetterwarnung Script

Beitrag von etofi » 28.06.2020, 10:40

Hallo zusammen,

ich habe dieses Script gerade in meine CCU 3 eingebaut - gefällt mir sehr gut.
Grrzzz hat geschrieben:
01.08.2017, 09:48

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);
}
Jetzt habe ich allerdings noch eine Verständnisfrage.
Müsste man diesen Teil

Code: Alles auswählen

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);
nicht so umdrehen?

Code: Alles auswählen

stdout = stdout.Substr(stdout.Find("start")+7);
integer start = stdout.Substr(0, stdout.Find(",")-3);
     
stdout = stdout.Substr(stdout.Find("end")+5);
integer end = stdout.Substr(0, stdout.Find(",")-3);
Wenn ich bei folgendem Ergebnis der Selektion des Ortes zuerst das Ende Abfrage und die gleiche Variable "stdout" damit fülle wird doch das Start Datum abgeschnitten und eine Abfrage danach liefert immer keinen Wert.

Code: Alles auswählen

903455002":[{"regionName":"Kreis Friesland - Küste","start":1593316680000,"end":1593360000000,"state":"Niedersachsen","type":1,"level":2,"description":"Es treten Windböen mit Geschwindigkeiten um 60 km/h (17m/s, 33kn, Bft 7) aus südwestlicher Richtung auf.","event":"WINDBÖEN","headline":"Amtliche WARNUNG vor WINDBÖEN","instruction":"","stateShort":"NS","altitudeStart":null,"altitudeEnd":null}]
Und den Fallback habe ich jetzt so umgebaut, damit spare ich mir Schreibvorgänge in die Systemvariable und damit auch bei meinem CCU-Historian Server.

Code: Alles auswählen

!------------------------------------------------------------------------------------------------------------
! Allgemeiner Fallback
!------------------------------------------------------------------------------------------------------------
if(!found) {

	if (dom.GetObject(wetterwarnungAktiv).State() != false) {
		dom.GetObject(wetterwarnungAktiv).State(false);
	}
	if (dom.GetObject(wetterwarnungText).State() != "Keine Warnungen") {
		dom.GetObject(wetterwarnungText).State("Keine Warnungen");
	}
	if (dom.GetObject(wetterwarnungTyp).State() != 0) {
		dom.GetObject(wetterwarnungTyp).State(0);
	}
}
Grüße
Eric

Larson-SEI180LX
Beiträge: 112
Registriert: 10.12.2014, 07:24
Hat sich bedankt: 14 Mal

Re: Unwetterwarnung Script

Beitrag von Larson-SEI180LX » 01.11.2020, 16:06

Das Unwetterscript bringt leider nicht mehr in allen SysVar die gewünschten Einträge... GIbt es zwischenzeitlich wieder ein Update? Hier ist schon länger nichts mehr geschrieben worden....

Code: Alles auswählen

! ------  DWD Unwetterwarnung 07.08.2018  Vers. 1.122 -----------------------------------------------------------
! Unwetterwarnungsscript von Grrzzz / klana
! Version 1.122 vom 07.08.2018
! Korrekturen & Optimierungen von kafetzke
! - Korrekturen von Level und Typ
! - Umbau Auswertung des JSONs auf "solidere" Abfrage
! - Optimierung und Korrektur Fallback
!
! https://homematic-forum.de/forum/viewtopic.php?f=31&t=38161
!------------------------------------------------------------------------------------------------------------

!------------------------------------------------------------------------------------------------------------
! Konfiguration
!------------------------------------------------------------------------------------------------------------
! Anzulegen fuer das Script Wetterwarn_DWD sind die 
! folgenden Systemvariablen, welche besser über das Einmalsscript angelegt werden.
! Das Einmalscript unter Script testen eingefügt und einmalig ausführen.
! --------------------------------------------------------------
! Wetterwarnung_Aktiv           Boolean
! Wetterwarnung_Text            Zeichenkette (für Ausgabe)  
! --------------------------------------------------------------
! Wetterwarnung_city            Zeichenkette (Nummer zum Suchen)
! Wetterwarnung_regionName      Zeichenkette
! Wetterwarnung_start           Zeichenkette
! Wetterwarnung_end             Zeichenkette
! Wetterwarnung_startDateTime   Zeichenkette
! Wetterwarnung_endDateTime     Zeichenkette
! Wetterwarnung_level           Zahl
! Wetterwarnung_typ             Werteliste mit: unbekannt;Gewitter;Wind/Sturm/Orkan;Stark- und Dauerregen;Schneefall/Schneeverwehungen;Nebel;Frost;Glaette/Glatteis;Tauwetter;Hitzewarnungen;UV-Warnungen;Kuestenwarnungen;Binnenseewarnungen
! Wetterwarnung_state           Zeichenkette
! Wetterwarnung_description     Zeichenkette
! Wetterwarnung_event           Zeichenkette
! Wetterwarnung_headline        Zeichenkette
! Wetterwarnung_instruction     Zeichenkette
! Wetterwarnung_stateShort      Zeichenkette
! Wetterwarnung_altitudeStart   Zeichenkette
! Wetterwarnung_altitudeEnd     Zeichenkette
!
!------------------------------------------------------------------------------------------------------------

!------------------------------------------------------------------------------------------------------------
! Debugging einschalten = true oder aussschalten = false
! z.B. zum Test unter "Script testen"
!
! ShowVorabInfo = false -> es wird keine Vorabwarnung angezeigt, 
!               = true  -> es wird auch die Vorabwarnung angezeigt
!  noch nicht aktiv
!------------------------------------------------------------------------------------------------------------
boolean debug = false;
boolean ShowVorabInfo = true;

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

! --------------------------------------------------------------
! Die Region-ID aus der JSON Datei raussuchen, dazu diese Adresse
! im Browser eingeben:
!  https://www.dwd.de/DWD/warnungen/warnapp/json/warnings.json
! Für Berlin z.B. 111000000
! --------------------------------------------------------------
 string city = "105970000";   ! Kreis Hildesheim
! string city = "109763000";   ! Testort Rhein-Sieg Kreis

! --------------------------------------------------------------
! Nötige CCU-Systemvariablen zuweisen
! In der CCU anzulegende Systemvariablen stehen nachfolgend in Anführungszeichen
! Am Besten mit dem "Einmalscript" automatisch anlegen lassen!
! _Text und _Aktiv sind Anfangsbuchstabe nach Unterstrich gross und 
! alle DWD Felder sind Anfangsbuchstabe nach Unterstrich klein geschrieben
! --------------------------------------------------------------

! Eigene Felder
string wwText = "Wetterwarnung_Text";
string wwAktiv = "Wetterwarnung_Aktiv";

! DWD Felder
string wwCity = "Wetterwarnung_city";        
string wwRegionName = "Wetterwarnung_regionName";      
string wwStart = "Wetterwarnung_start";           
string wwEnd = "Wetterwarnung_end";             
string wwStartDateTime = "Wetterwarnung_startDateTime";           
string wwEndDateTime = "Wetterwarnung_endDateTime";             
string wwLevel = "Wetterwarnung_level";          
string wwTyp = "Wetterwarnung_typ";            
string wwState = "Wetterwarnung_state";           
string wwDescription = "Wetterwarnung_description";     
string wwEvent = "Wetterwarnung_event";           
string wwHeadline = "Wetterwarnung_headline";        
string wwInstruction = "Wetterwarnung_instruction";     
string wwStateShort = "Wetterwarnung_stateShort";      
string wwAltitudeStart = "Wetterwarnung_altitudeStart";      ! Wird noch nicht genutzt
string wwAltitudeEnd = "Wetterwarnung_altitudeEnd";          ! Wird noch nicht genutzt 

!------------------------------------------------------------------------------------------------------------
! Ausgabe in Systemvariable fuer Push (fuer spaetere Erweiterung)
!------------------------------------------------------------------------------------------------------------
string PushVar = "SV_PushMessage";

!------------------------------------------------------------------------------------------------------------
! Das wars an Konfiguration
! DWD-Warntabelle in 25k(+25k)-Abschnitten laden bis die Region gefunden wurde
!------------------------------------------------------------------------------------------------------------
string url = "https://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 = 0;
integer rangeto = 25000;
integer loopcounter = 1;
integer find1 = 0;
boolean found = false;
string stdout = "";
string cmd = downloader # " --range " # rangefrom # "-" # rangeto # " " # url;
string cut2 = "],";
var ret ;
string strRest = "";

!------------------------------------------------------------------------------------------------------------
! Los gehts...
!------------------------------------------------------------------------------------------------------------
if(debug){WriteLine("cmd : "#cmd);}

ret= dom.GetObject(execdevice # ".CMD_SETS").State(cmd);
!if(debug){WriteLine("ret cmd_sets : "#ret);}
ret = dom.GetObject(execdevice # ".CMD_QUERY_RET").State(1);
!if(debug){WriteLine("ret cmd_query_ret: "#ret);}
stdout = dom.GetObject(execdevice # ".CMD_RETS").State();

!if(debug) {WriteLine("stdout cmd_rets : " #stdout);}

if (stdout)
{
    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();
       }
    }
    
    
    found = false;
    if(stdout.Find(city)>=0) {
      found = true;
    }
}

if(city) {dom.GetObject(wwCity).State(city);}

!------------------------------------------------------------------------------------------------------------
! Relevanter Bereich ausschneiden und zuweisen
!------------------------------------------------------------------------------------------------------------
if(found) {

      if(debug) {WriteLine("Suche nach City :"#city);}

      ! gesuchten Bereich komplett ausschneiden und mit ToLatin() umwandeln
      stdout = stdout.Substr(stdout.Find(city));
      stdout = stdout.Substr(0, stdout.Find(cut2)+1).ToLatin();
      if(debug) {WriteLine("stdout nach Find(City): " #stdout);}

      ! Hier können jetzt mehr als 1 Meldung vorhanden sein
      ! Diese sind durch geschweifte Klammen getrennt
      ! Wie kann man diese Auswerten, da zur Zeit immer nur die erste genommen wird? 

  
      ! regionName (Klartext der gesuchten Region z.B. Rhein-Erft-Kreis)
      stdout = stdout.Substr(stdout.Find("regionName")+13);
      var regionName = stdout.Substr(0, stdout.Find(",")-1).Trim();
      if(debug) {WriteLine("regionName: "#regionName);}
      if(regionName) {dom.GetObject(wwRegionName).State(regionName);}
	  if(!regionName) {dom.GetObject(wwRegionName).State("---");}
      
      
      ! start (Uhrzeit ab der die DWD Meldung gültig ist in Sekunden)
      stdout = stdout.Substr(stdout.Find("start")+7);
  
      if(stdout.Substr(0,4) == "null") 
      { 
      var start = stdout.Substr(0, stdout.Find(",")-0).Trim();
      }
      else
      {
      var start = stdout.Substr(0, stdout.Find(",")-3).Trim();
      }

	  !--------- Originalwert -----
	  var stdout_orgn = stdout;
	  !--------- Originalwert -----
	  
	  
      if(debug) {WriteLine("Start stdout : " #stdout);}
      !Bei Inhalt null keine Anfuehrungszeichen 

  
      if(debug) {WriteLine("start : " #start);}    
      if(start) {dom.GetObject(wwStart).State(start);}
	  if(!start) {dom.GetObject(wwStart).State(0);}

  
      
      ! end (Uhrzeit bis zu der die DWD Meldung gültig ist in Sekunden)
      stdout = stdout.Substr(stdout.Find("end")+5);
  
      if(stdout.Substr(0,4) == "null") 
      { 
         var end = stdout.Substr(0, stdout.Find(",")-0).Trim();
      }
      else
      {
         var end = stdout.Substr(0, stdout.Find(",")-3).Trim();
      }
  
      if(debug) {WriteLine("end : " #end);}      
      if(end) {dom.GetObject(wwEnd).State(end);}
	  if(!end) {dom.GetObject(wwEnd).State(0);}
      
      if(debug) {WriteLine("End stdout : " #stdout);}
      !Bei Inhalt null keine Anfuehrungszeichen 
  
 
      ! Umrechnung in Date und Time neu 16.11.2017
      if(debug) {WriteLine("Start DateTime: " #start.ToInteger().ToTime().ToString());} 
      if(debug) {WriteLine("End DateTime: " #end.ToInteger().ToTime().ToString());} 
      dom.GetObject(wwStartDateTime).State(start.ToInteger().ToTime().ToString());
      dom.GetObject(wwEndDateTime).State(end.ToInteger().ToTime().ToString());
  
      !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 ?

	  
	  ! type (siehe Liste oben)
      var stdout_type = stdout_orgn.Substr(stdout_orgn.Find("type")+6);
	  var mtyp = stdout_type.Substr(0, stdout_type.Find(","));
      if(debug) {WriteLine("mtyp :"#mtyp);}
      if(mtyp) {dom.GetObject(wwTyp).State(mtyp);}
	  if(!mtyp) {dom.GetObject(wwTyp).State();}
      	  
	! state (Bundesland im Klartext z.B: Nordrhein-Westfalen)
      var stdout_state = stdout_orgn.Substr(stdout_orgn.Find("state")+8);
      var state = stdout_state.Substr(0, stdout_state.Find(",")-1);
      if(debug) {WriteLine("state :"#state);}
      if(state) {dom.GetObject(wwState).State(state);}
	        
      !Level - Vermutung 0 = Vorabwarnung, 1..10 tatsächliche Warnungen
      var stdout_lvl = stdout_orgn.Substr(stdout_orgn.Find("level")+7);
      var level = stdout_lvl.Substr(0, stdout_lvl.Find(","));
      if(debug) {WriteLine("level :"#level);}
      if(level) {dom.GetObject(wwLevel).State(level);}
	  
      ! headline (Überschrift der Meldung z.B. Amtliche WARNUNG vor WINDBÖEN)
      var stdout_head = stdout_orgn.Substr(stdout_orgn.Find("headline")+11);
      var headline = stdout_head.Substr(0, stdout_head.Find(",")-1);
      if(debug) {WriteLine("headline :"#headline);}
      if(headline) {dom.GetObject(wwHeadline).State(headline);}
	  
	  ! description (nähere Erklärung der Meldung im Klartext)
	  var stdout_desc = stdout_orgn.Substr(stdout_orgn.Find("description")+14);
	  var descript = stdout_desc.Substr(0, stdout_desc.Find(",")-1);
	  ! Überflüssige Zeilenumbrüche wegoptimieren, sofern vorhanden
	  descript = descript.UriEncode();
	  descript = descript.Replace("%5Cn", " ");
	  descript = descript.UriDecode();
	  
	  if(debug) {WriteLine("descript :"#descript);}
	  if(descript) {dom.GetObject(wwDescription).State(descript);}
	  
	  ! altitude Start
      var stdout_start = stdout_orgn.Substr(stdout_orgn.Find("altitudeStart")+15);
      var altitudeStart = stdout_start.Substr(0, stdout_start.Find(","));
      if(debug) {WriteLine("altitudeStart :"#altitudeStart);}
      if(altitudeStart) {dom.GetObject(wwAltitudeStart).State(altitudeStart);}
	        
      ! event (Kurzform der Meldungsart z.B. Winböen)
      var stdout_event = stdout_orgn.Substr(stdout_orgn.Find("event")+8);
      var event = stdout_event.Substr(0, stdout_event.Find("}")-1);
      if(debug) {WriteLine("event :"#event);}
      if(event) {dom.GetObject(wwEvent).State(event);}
	        
	  ! instruction
	  var stdout_instr = stdout_orgn.Substr(stdout_orgn.Find("instruction")+14);
	  var instruction = stdout_instr.Substr(0, stdout_instr.Find(".\",")+1);
	  if(debug) {WriteLine("instr :"#instruction);}
	  if(instruction) { dom.GetObject(wwInstruction).State(instruction)};
	  	  
      ! altitude End
      var stdout_end = stdout_orgn.Substr(stdout_orgn.Find("altitudeEnd")+13);
      var altitudeEnd = stdout_end.Substr(0, stdout_end.Find(","));
      if(debug) {WriteLine("altitudeEnd :"#altitudeEnd);}
      if(altitudeEnd) {dom.GetObject(wwAltitudeEnd).State(altitudeEnd);}
	  
      ! stateShort (Abkürzung Bundesland z.B: NRW)
      var stdout_stt_short = stdout_orgn.Substr(stdout_orgn.Find("stateShort")+13);
      var stateShort = stdout_stt_short.Substr(0, stdout_stt_short.Find(",")-1);
      if(debug) {WriteLine("stateShort :"#stateShort);}
      if(stateShort) {dom.GetObject(wwStateShort).State(stateShort);}
	  
	  

  if (debug) {WriteLine("Laenge Rest:"#stdout.Length());}


     !Vorabinformationen sind auch zu filtern
     !      if(event.Find("VORABINFORMATION")>=0) && (ShowVorabInfo == false)) {
     
     if(event.Find("vorabinformation")>=0) {
        found = false;
       if(debug) {WriteLine("if von VorabInformation found :"#found);}
     } else {

        if(debug) {WriteLine("else von VORABINFORMATION found :"#found);}
      
        !------------------------------------------------------------------------------------------------------------
        ! Auswertung
        !------------------------------------------------------------------------------------------------------------
        integer time = system.Date("%F %X").ToTime().ToInteger();
        var diff1 = time - start.ToInteger();
        var diff2 = time - end.ToInteger();
            
        if(debug) {WriteLine("diff1 :"#diff1);}
        if(debug) {WriteLine("diff2 :"#diff2);}
    
            
            
        if(diff1 >= 0 && diff2 <= 0) {
           dom.GetObject(wwAktiv).State(true);
           if(debug) {WriteLine("Wetterwarnung auf true");}
        }
        else {
           dom.GetObject(wwAktiv).State(false);
           if(debug) {WriteLine("Wetterwarnung auf false");}
        }
        stdout = start.ToInteger().ToTime().ToString() # " - " # end.ToInteger().ToTime().ToString() # ": " # event ;

        if(debug) {WriteLine("WetterwarnungText     :"#stdout);}
        if(debug) {WriteLine("WetterwarnungTyp      :"#(mtyp.ToInteger()+1).ToString());}
        if(debug) {WriteLine("WetterwarnungDescript :"#descript);}
            
        dom.GetObject(wwText).State(stdout);
        dom.GetObject(wwTyp).State(mtyp.ToInteger()+1);
        dom.GetObject(wwDescription).State(descript);
      }
	  
	  !! Interner Fallback, falls Felder leer sind
		if(!state) {dom.GetObject(wwState).State("---");}
		if(!level) {dom.GetObject(wwLevel).State(0);}
		if(!headline) {dom.GetObject(wwHeadline).State("---");}
		if(!descript) {dom.GetObject(wwDescription).State("---");}
		if(!altitudeStart) {dom.GetObject(wwAltitudeStart).State("---");}
		if(!event) {dom.GetObject(wwEvent).State("---");}
		if(!instruction) { dom.GetObject(wwInstruction).State("---")};
		if(!altitudeEnd) {dom.GetObject(wwAltitudeEnd).State("---");}
		if(!stateShort) {dom.GetObject(wwStateShort).State("---");}
}

!------------------------------------------------------------------------------------------------------------
! Allgemeiner Fallback
!------------------------------------------------------------------------------------------------------------

if(!found) {
    if(debug) {WriteLine("Fallback Keine Warnung gefunden - found :"#found);}
    
    dom.GetObject(wwAktiv).State(false);
    dom.GetObject(wwText).State("Keine Warnungen");
    dom.GetObject(wwTyp).State(0);
    dom.GetObject(wwCity).State("---");
    dom.GetObject(wwRegionName).State("---");
    dom.GetObject(wwStart).State("---");
    dom.GetObject(wwEnd).State("---");
    dom.GetObject(wwStartDateTime).State("---");
    dom.GetObject(wwEndDateTime).State("---");
    dom.GetObject(wwLevel).State(0);
    dom.GetObject(wwState).State("---");
    dom.GetObject(wwDescription).State(" ");
    dom.GetObject(wwEvent).State("---");
    dom.GetObject(wwHeadline).State("---");
    dom.GetObject(wwStateShort).State("---");
    dom.GetObject(wwAltitudeStart).State("---");
    dom.GetObject(wwAltitudeEnd).State("---");
}
liefert folgendes Ergebnis:
Dateianhänge
Unbenannt.PNG

hypnorex
Beiträge: 204
Registriert: 05.09.2007, 11:22
Hat sich bedankt: 10 Mal
Danksagung erhalten: 3 Mal

Re: Unwetterwarnung Script

Beitrag von hypnorex » 14.08.2021, 10:49

Gibt es mittlerweile eine Lösung wie ich dieses Skript auf einer CCU3 zum Laufen bekomme?
CCU3 mit mehr als 60 Homematic und HomematicIP Geräten

MichaelN
Beiträge: 9656
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 697 Mal
Danksagung erhalten: 1617 Mal

Re: Unwetterwarnung Script

Beitrag von MichaelN » 14.08.2021, 11:38

Was soll denn das Ziel sein? Willst du gewarnt werden? Dann installierst du besser eine passende App direkt auf dem Handy. Willst du etwas steuern? Dann wertest du besser lokale Messwerte aus, statt allgemeine Warnungen. Z. B. viewtopic.php?f=18&t=58934&start=30#p669539
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

Stramon
Beiträge: 46
Registriert: 29.06.2016, 20:28
Wohnort: Kiel
Hat sich bedankt: 3 Mal

Re: Unwetterwarnung Script

Beitrag von Stramon » 30.09.2021, 20:42

Hallo,
seit ungefähr einem Monat spuckt das Script bei mir, an den wichtigen Stellen, nur noch Kauderwelsch aus.
Screenshot_20210930-203010.png
Ich vermute dass der Deutsche Wetterdienst wieder etwas geändert hat und das Skript deshalb nicht mehr funktioniert.
Hat schon jemand eine Lösung?

Viele Grüße Jens

MichaelN
Beiträge: 9656
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 697 Mal
Danksagung erhalten: 1617 Mal

Re: Unwetterwarnung Script

Beitrag von MichaelN » 30.09.2021, 22:44

Das ist halt das Problem mit Lösungen, die relativ stumpf die Daten an festen Stellen suchen.

Liefert der Dienst JSON? (ja, offensichtlich) Dann kannst du das Skript aus meiner Signatur probieren.
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

Tyfys
Beiträge: 544
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 27 Mal
Danksagung erhalten: 123 Mal

Re: Unwetterwarnung Script

Beitrag von Tyfys » 01.10.2021, 10:10

MichaelN hat geschrieben:
30.09.2021, 22:44
Liefert der Dienst JSON? (ja, offensichtlich)
Nicht ganz.
Man beachte den Hinweis vom DWD :

Über den Pfad https://www.dwd.de/DWD/warnungen/warnap ... 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.
Gruß
Harry
Gruß
Harry

MichaelN
Beiträge: 9656
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 697 Mal
Danksagung erhalten: 1617 Mal

Re: Unwetterwarnung Script

Beitrag von MichaelN » 04.10.2021, 12:29

Danke für den Hinweis. Der Output ist vielleicht nicht richtig schön, aber prinzipiell geht es - siehe viewtopic.php?f=18&t=68762&start=30#p680812 und folgende
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

Antworten

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