Unwetterwarnung Script

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

Moderator: Co-Administratoren

Benutzeravatar
klana
Beiträge: 1098
Registriert: 08.02.2015, 08:37
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 66 Mal
Danksagung erhalten: 27 Mal

Re: Unwetterwarnung Script

Beitrag von klana » 13.10.2017, 10:18

Hi,

ich war so frei und habe das Script von Grrzzz etwas erweitert und stelle es jetzt hier zur freien Verfügung.
In der Hoffnung das es irgendwann wieder mit dem Abruf der Warnmeldungen klappt (siehe die vorherigen Einträge hier im Thread.

Eigentlich sind es 3 Scripte.

1. Anlegen oder Löschen der Systemvariablen
2. Auslesen der DWD Warnmeldungen
3. Füllen der eigenen Pushvariable mit der vorhanden Meldung



Zu Script Nummer 1:

Fangen wir ganz vorne...damit es nicht zu Fehlern bei der Erstellung der Systemvariablen kommen kann, habe ich dafür ein Script erstellt.
Dieses Script unter "Script testen" einmalig ausführen. Vor Ausführung im Script bestimmen, ob man die Variablen anlegen oder löschen möchte.

!---------------------------------------------------------------------
! Wenn SV_Loeschen = false, dann werden die Systemvariablen angelegt
! Wenn SV_loeschen = true, dann werden die Systemvariablen geloescht!!
!---------------------------------------------------------------------
boolean SV_Loeschen = false;

Dann einmal ausführen ... es werden die entsprechenden Ausgaben angezeigt (debug steht standardmäßig auf true).

Code: Alles auswählen

! Automatische Anlage/Loeschung der Systemvariablen DWD
! fuer das Script Wetterwarn_DWD
!
! Version : 1.01 - 16.11.2017
! Erweiterung: Start- und Endedatum mit Uhrzeit in Systemvariablen ablegen
! Ausfuehrung : einmalig! unter Script testen auf der CCU2
!
! Anzulegen fuer das Script Wetterwarn_DWD sind die 
! folgenden Systemvariablen:
!
! Wetterwarnung_Aktiv           Boolean
! Wetterwarnung_Text            Zeichenkette (fuer 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;Küstenwarnungen;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
! --------------------------------------------------------------


!---------------------------------------------------------------------
! Wenn SV_Loeschen = false, dann werden die Systemvariablen angelegt
! Wenn SV_loeschen = true, dann werden die Systemvariablen geloescht!!
!---------------------------------------------------------------------
boolean SV_Loeschen = false;

!---------------------------------------------------------------------
! wenn debug = true, dann werden Meldungen per WriteLine ausgegeben
! dies ist Standardmaessig auf true
!---------------------------------------------------------------------
boolean debug = true;

if(debug) 
{
  if(SV_Loeschen) {WriteLine("Varibalen werden gelöscht!");} 
  else {WriteLine("Variablen werden angelegt...");}
}

if(!SV_Loeschen)
{
    ! ---------------------------------------
    ! Boolean - Wetterwarnung_Aktiv
    ! ---------------------------------------
    string  svName = "Wetterwarnung_Aktiv";
    object  svObj  = dom.GetObject(svName);
     
    if (!svObj){   
        object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
        svObj = dom.CreateObject(OT_VARDP);
        svObjects.Add(svObj.ID());
        svObj.Name(svName);   
        svObj.ValueType(ivtBinary);
        svObj.ValueSubType(istBool);
        svObj.ValueName0("Nein");
        svObj.ValueName1("Ja");    
        svObj.State(false);
        svObj.DPInfo("Wetterwarnung_Aktiv - Zeigt an ob es eine DWD-Meldung gibt.");
        svObj.ValueUnit("");
     
        dom.RTUpdate(false);
    }
    else
    {
      if(debug) {WriteLine("Variable Wetterwarnung_Aktiv existiert schon.");}
    }
    if (debug) {WriteLine(svObj.State().ToString());}
    if (debug) {WriteLine(svObj.ValueName());}
    
    
    ! ---------------------------------------
    ! STRING - Wetterwarnung_Text
    ! ---------------------------------------
    string  svName = "Wetterwarnung_Text";
    object  svObj  = dom.GetObject(svName);
    if (!svObj){   
        object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
        svObj = dom.CreateObject(OT_VARDP);
        svObjects.Add(svObj.ID());
        svObj.Name(svName);   
        svObj.ValueType(ivtString);
        svObj.ValueSubType(istChar8859);
        svObj.DPInfo("Wetterwarnung_Text - selbst zusammengesetzter Ausgabetext");
        svObj.ValueUnit("");
        svObj.State("Keine Warnungen");
        svObj.Internal(false);
        svObj.Visible(true);
     
        dom.RTUpdate(false);
    }
    else
    {
      if(debug) {WriteLine("Variable Wetterwarnung_Text existiert schon.");}
    }

    if (debug) {WriteLine(svObj.Value().ToString());}
    
    
    ! ---------------------------------------
    ! STRING - Wetterwarnung_city 
    ! (Nummer der Region von DWD)
    ! ---------------------------------------
    string  svName = "Wetterwarnung_city";
    object  svObj  = dom.GetObject(svName);
    if (!svObj){   
        object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
        svObj = dom.CreateObject(OT_VARDP);
        svObjects.Add(svObj.ID());
        svObj.Name(svName);   
        svObj.ValueType(ivtString);
        svObj.ValueSubType(istChar8859);
        svObj.DPInfo("Wetterwarnung_city - Nummer der Region als String");
        svObj.ValueUnit("");
        svObj.State("---");
        svObj.Internal(false);
        svObj.Visible(true);
     
        dom.RTUpdate(false);
    }
    else
    {
      if(debug) {WriteLine("Variable Wetterwarnung_city existiert schon.");}
    }
  
    if (debug) {WriteLine(svObj.Value().ToString());}
    
    
    
    ! ---------------------------------------
    ! STRING - Wetterwarnung_regionName
    ! ---------------------------------------
    string  svName = "Wetterwarnung_regionName";
    object  svObj  = dom.GetObject(svName);
    if (!svObj){   
        object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
        svObj = dom.CreateObject(OT_VARDP);
        svObjects.Add(svObj.ID());
        svObj.Name(svName);   
        svObj.ValueType(ivtString);
        svObj.ValueSubType(istChar8859);
        svObj.DPInfo("Wetterwarnung_regionName - Regionname im Klartext");
        svObj.ValueUnit("");
        svObj.State("---");
        svObj.Internal(false);
        svObj.Visible(true);
     
        dom.RTUpdate(false);
    }
    else
    {
      if(debug) {WriteLine("Variable Wetterwarnung_regionName existiert schon.");}
    }
    if (debug) {WriteLine(svObj.Value().ToString());}
    
    
    ! ---------------------------------------
    ! STRING - Wetterwarnung_start
    ! ---------------------------------------
    string  svName = "Wetterwarnung_start";
    object  svObj  = dom.GetObject(svName);
    if (!svObj){   
        object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
        svObj = dom.CreateObject(OT_VARDP);
        svObjects.Add(svObj.ID());
        svObj.Name(svName);   
        svObj.ValueType(ivtString);
        svObj.ValueSubType(istChar8859);
        svObj.DPInfo("Wetterwarnung_start - Start der Warnung in Sekunden");
        svObj.ValueUnit("");
        svObj.State("---");
        svObj.Internal(false);
        svObj.Visible(true);
     
        dom.RTUpdate(false);
    }
    else
    {
      if(debug) {WriteLine("Variable Wetterwarnung_start existiert schon.");}
    }
    if (debug) {WriteLine(svObj.Value().ToString());}
    
    
    
    ! ---------------------------------------
    ! STRING - Wetterwarnung_end
    ! ---------------------------------------
    string  svName = "Wetterwarnung_end";
    object  svObj  = dom.GetObject(svName);
    if (!svObj){   
        object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
        svObj = dom.CreateObject(OT_VARDP);
        svObjects.Add(svObj.ID());
        svObj.Name(svName);   
        svObj.ValueType(ivtString);
        svObj.ValueSubType(istChar8859);
        svObj.DPInfo("Wetterwarnung_end - Ende der Warnung in Sekunden");
        svObj.ValueUnit("");
        svObj.State("---");
        svObj.Internal(false);
        svObj.Visible(true);
     
        dom.RTUpdate(false);
    }
    else
    {
      if(debug) {WriteLine("Variable Wetterwarnung_end existiert schon.");}
    }
    if (debug) {WriteLine(svObj.Value().ToString());}
    
    
    ! ---------------------------------------
    ! STRING - Wetterwarnung_startDateTime
    ! ---------------------------------------
    string  svName = "Wetterwarnung_startDateTime";
    object  svObj  = dom.GetObject(svName);
    if (!svObj){   
        object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
        svObj = dom.CreateObject(OT_VARDP);
        svObjects.Add(svObj.ID());
        svObj.Name(svName);   
        svObj.ValueType(ivtString);
        svObj.ValueSubType(istChar8859);
        svObj.DPInfo("Wetterwarnung_start - Start der Warnung als Datum und Uhrzeit");
        svObj.ValueUnit("");
        svObj.State("---");
        svObj.Internal(false);
        svObj.Visible(true);
     
        dom.RTUpdate(false);
    }
    else
    {
      if(debug) {WriteLine("Variable Wetterwarnung_start existiert schon.");}
    }
    if (debug) {WriteLine(svObj.Value().ToString());}
    
    
    
    ! ---------------------------------------
    ! STRING - Wetterwarnung_endDateTime
    ! ---------------------------------------
    string  svName = "Wetterwarnung_endDateTime";
    object  svObj  = dom.GetObject(svName);
    if (!svObj){   
        object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
        svObj = dom.CreateObject(OT_VARDP);
        svObjects.Add(svObj.ID());
        svObj.Name(svName);   
        svObj.ValueType(ivtString);
        svObj.ValueSubType(istChar8859);
        svObj.DPInfo("Wetterwarnung_end - Ende der Warnung als Datum und Uhrzeit");
        svObj.ValueUnit("");
        svObj.State("---");
        svObj.Internal(false);
        svObj.Visible(true);
     
        dom.RTUpdate(false);
    }
    else
    {
      if(debug) {WriteLine("Variable Wetterwarnung_end existiert schon.");}
    }
    if (debug) {WriteLine(svObj.Value().ToString());}    
    
    
    
    
    ! ---------------------------------------
    ! Zahl - Wetterwarnung_level
    ! ---------------------------------------
    string  svName = "Wetterwarnung_level";
    object  svObj  = dom.GetObject(svName);
    if (!svObj){   
        object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
        svObj = dom.CreateObject(OT_VARDP);
        svObjects.Add(svObj.ID());
        svObj.Name(svName);   
        svObj.ValueType(ivtFloat);
        svObj.ValueSubType(istGeneric);
        svObj.DPInfo("Wetterwarnung_level - Level der Warnung");
        svObj.ValueUnit("");
        svObj.ValueMin(0);
        svObj.ValueMax(100);
        svObj.State(0);
        svObj.Internal(false);
        svObj.Visible(true);
     
        dom.RTUpdate(false);
    }
    else
    {
      if(debug) {WriteLine("Variable Wetterwarnung_level existiert schon.");}
    }
    
    if (debug) {WriteLine(svObj.Value().ToString());}
    
    
    ! ---------------------------------------
    ! Werteliste - Wetterwarnung_typ
    ! ---------------------------------------
    string  svName = "Wetterwarnung_typ";
    object  svObj  = dom.GetObject(svName);
     
    if (!svObj){   
        object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
        svObj = dom.CreateObject(OT_VARDP);
        svObjects.Add(svObj.ID());
        svObj.Name(svName);   
        svObj.ValueType(ivtInteger);
        svObj.ValueSubType(istEnum);
        svObj.ValueList("unbekannt;Gewitter;Wind/Sturm/Orkan;Stark- und Dauerregen;Schneefall/Schneeverwehungen;Nebel;Frost;Glaette/Glatteis;Tauwetter;Hitzewarnungen;UV-Warnungen;Kuestenwarnungen;Binnenseewarnungen");
        svObj.State(1);
        svObj.DPInfo("Wetterwarnung_typ - Typ der Warnung");
     
        dom.RTUpdate(false);
    }
    else
    {
      if(debug) {WriteLine("Variable Wetterwarnung_typ existiert schon.");}
    }
    if (debug) {var valList = svObj.ValueList();}
    if (debug) {var val = valList .StrValueByIndex(";",svObj.Value());}
    if (debug) {WriteLine(val);}
    
    
    
    ! ---------------------------------------
    ! STRING - Wetterwarnung_state
    ! ---------------------------------------
    string  svName = "Wetterwarnung_state";
    object  svObj  = dom.GetObject(svName);
    if (!svObj){   
        object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
        svObj = dom.CreateObject(OT_VARDP);
        svObjects.Add(svObj.ID());
        svObj.Name(svName);   
        svObj.ValueType(ivtString);
        svObj.ValueSubType(istChar8859);
        svObj.DPInfo("Wetterwarnung_state - Bundesland im Langtext.");
        svObj.ValueUnit("");
        svObj.State("---");
        svObj.Internal(false);
        svObj.Visible(true);
     
        dom.RTUpdate(false);
    }
    else
    {
      if(debug) {WriteLine("Variable Wetterwarnung_state existiert schon.");}
    }
    if (debug) {WriteLine(svObj.Value().ToString());}
    
    
    ! ---------------------------------------
    ! STRING - Wetterwarnung_description
    ! ---------------------------------------
    string  svName = "Wetterwarnung_description";
    object  svObj  = dom.GetObject(svName);
    if (!svObj){   
        object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
        svObj = dom.CreateObject(OT_VARDP);
        svObjects.Add(svObj.ID());
        svObj.Name(svName);   
        svObj.ValueType(ivtString);
        svObj.ValueSubType(istChar8859);
        svObj.DPInfo("Wetterwarnung_description - genauere Beschreibung der Warnung");
        svObj.ValueUnit("");
        svObj.State("---");
        svObj.Internal(false);
        svObj.Visible(true);
     
        dom.RTUpdate(false);
    }
    else
    {
      if(debug) {WriteLine("Variable Wetterwarnung_description existiert schon.");}
    }
    if (debug) {WriteLine(svObj.Value().ToString());}
    
    
    ! ---------------------------------------
    ! STRING - Wetterwarnung_event
    ! ---------------------------------------
    string  svName = "Wetterwarnung_event";
    object  svObj  = dom.GetObject(svName);
    if (!svObj){   
        object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
        svObj = dom.CreateObject(OT_VARDP);
        svObjects.Add(svObj.ID());
        svObj.Name(svName);   
        svObj.ValueType(ivtString);
        svObj.ValueSubType(istChar8859);
        svObj.DPInfo("Wetterwarnung_event");
        svObj.ValueUnit("");
        svObj.State("---");
        svObj.Internal(false);
        svObj.Visible(true);
     
        dom.RTUpdate(false);
    }
    else
    {
      if(debug) {WriteLine("Variable Wetterwarnung_event existiert schon.");}
    }
    if (debug) {WriteLine(svObj.Value().ToString());}
    
    
    ! ---------------------------------------
    ! STRING - Wetterwarnung_headline
    ! ---------------------------------------
    string  svName = "Wetterwarnung_headline";
    object  svObj  = dom.GetObject(svName);
    if (!svObj){   
        object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
        svObj = dom.CreateObject(OT_VARDP);
        svObjects.Add(svObj.ID());
        svObj.Name(svName);   
        svObj.ValueType(ivtString);
        svObj.ValueSubType(istChar8859);
        svObj.DPInfo("Wetterwarnung_headline - Schlagzeile der Warnung");
        svObj.ValueUnit("");
        svObj.State("---");
        svObj.Internal(false);
        svObj.Visible(true);
     
        dom.RTUpdate(false);
    }
    else
    {
      if(debug) {WriteLine("Variable Wetterwarnung_headline existiert schon.");}
    }
    if (debug) {WriteLine(svObj.Value().ToString());}
    
    
    
    ! ---------------------------------------
    ! STRING - Wetterwarnung_instruction
    ! ---------------------------------------
    string  svName = "Wetterwarnung_instruction";
    object  svObj  = dom.GetObject(svName);
    if (!svObj){   
        object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
        svObj = dom.CreateObject(OT_VARDP);
        svObjects.Add(svObj.ID());
        svObj.Name(svName);   
        svObj.ValueType(ivtString);
        svObj.ValueSubType(istChar8859);
        svObj.DPInfo("Wetterwarnung_instruction - Was ist im Warnungsfall zu tun?");
        svObj.ValueUnit("");
        svObj.State("---");
        svObj.Internal(false);
        svObj.Visible(true);
     
        dom.RTUpdate(false);
    }
    else
    {
      if(debug) {WriteLine("Variable Wetterwarnung_instruction existiert schon.");}
    }
    if (debug) {WriteLine(svObj.Value().ToString());}
    
    
    
    ! ---------------------------------------
    ! STRING - Wetterwarnung_stateShort
    ! ---------------------------------------
    string  svName = "Wetterwarnung_stateShort";
    object  svObj  = dom.GetObject(svName);
    if (!svObj){   
        object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
        svObj = dom.CreateObject(OT_VARDP);
        svObjects.Add(svObj.ID());
        svObj.Name(svName);   
        svObj.ValueType(ivtString);
        svObj.ValueSubType(istChar8859);
        svObj.DPInfo("Wetterwarnung_stateShort - Bundesland in Kurzform z.B.NRW");
        svObj.ValueUnit("");
        svObj.State("---");
        svObj.Internal(false);
        svObj.Visible(true);
     
        dom.RTUpdate(false);
    }
    else
    {
      if(debug) {WriteLine("Variable Wetterwarnung_stateShort existiert schon.");}
    }
    if (debug) {WriteLine(svObj.Value().ToString());}
    
    
    
    ! ---------------------------------------
    ! STRING - Wetterwarnung_altitudeStart
    ! ---------------------------------------
    string  svName = "Wetterwarnung_altitudeStart";
    object  svObj  = dom.GetObject(svName);
    if (!svObj){   
        object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
        svObj = dom.CreateObject(OT_VARDP);
        svObjects.Add(svObj.ID());
        svObj.Name(svName);   
        svObj.ValueType(ivtString);
        svObj.ValueSubType(istChar8859);
        svObj.DPInfo("Wetterwarnung_altitudeStart - Hoehe Start");
        svObj.ValueUnit("");
        svObj.State("---");
        svObj.Internal(false);
        svObj.Visible(true);
     
        dom.RTUpdate(false);
    }
    else
    {
      if(debug) {WriteLine("Variable Wetterwarnung_altitudeStart existiert schon.");}
    }
    if (debug) {WriteLine(svObj.Value().ToString());}
    
    
    ! ---------------------------------------
    ! STRING - Wetterwarnung_altitudeEnd
    ! ---------------------------------------
    string  svName = "Wetterwarnung_altitudeEnd";
    object  svObj  = dom.GetObject(svName);
    if (!svObj){   
        object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
        svObj = dom.CreateObject(OT_VARDP);
        svObjects.Add(svObj.ID());
        svObj.Name(svName);   
        svObj.ValueType(ivtString);
        svObj.ValueSubType(istChar8859);
        svObj.DPInfo("Wetterwarnung_altitudeEnd - Hoehe Ende");
        svObj.ValueUnit("");
        svObj.State("---");
        svObj.Internal(false);
        svObj.Visible(true);
     
        dom.RTUpdate(false);
    }
    else
    {
      if(debug) {WriteLine("Variable Wetterwarnung_altitudeEnd existiert schon.");}
    }
    if (debug) {WriteLine(svObj.Value().ToString());}
}
else 
{
    ! ------------------------------------------------
    ! Lˆschen Systemvariablen wenn SV_Loeschen == true
    ! ------------------------------------------------
    object  svObj  = dom.GetObject("Wetterwarnung_Aktiv");
    if(svObj) { dom.DeleteObject(svObj.ID());if(debug) {WriteLine("Wetterwarnung_Aktiv geloescht");}}
    
    object  svObj  = dom.GetObject("Wetterwarnung_Text");
    if(svObj) { dom.DeleteObject(svObj.ID());if(debug) {WriteLine("Wetterwarnung_Text geloescht");}}
    
    object  svObj  = dom.GetObject("Wetterwarnung_city");
    if(svObj) { dom.DeleteObject(svObj.ID());if(debug) {WriteLine("Wetterwarnung_city geloescht");}}
    
    object  svObj  = dom.GetObject("Wetterwarnung_regionName");
    if(svObj) { dom.DeleteObject(svObj.ID());if(debug) {WriteLine("Wetterwarnung_regionName geloescht");}}
    
    object  svObj  = dom.GetObject("Wetterwarnung_start");
    if(svObj) { dom.DeleteObject(svObj.ID());if(debug) {WriteLine("Wetterwarnung_start geloescht");}}
    
    object  svObj  = dom.GetObject("Wetterwarnung_end");
    if(svObj) { dom.DeleteObject(svObj.ID());if(debug) {WriteLine("Wetterwarnung_end geloescht");}}

    object  svObj  = dom.GetObject("Wetterwarnung_startDateTime");
    if(svObj) { dom.DeleteObject(svObj.ID());if(debug) {WriteLine("Wetterwarnung_startDateTime geloescht");}}
    
    object  svObj  = dom.GetObject("Wetterwarnung_endDateTime");
    if(svObj) { dom.DeleteObject(svObj.ID());if(debug) {WriteLine("Wetterwarnung_endDateTime geloescht");}}
    
    object  svObj  = dom.GetObject("Wetterwarnung_level");
    if(svObj) { dom.DeleteObject(svObj.ID());if(debug) {WriteLine("Wetterwarnung_level geloescht");}}
    
    object  svObj  = dom.GetObject("Wetterwarnung_typ");
    if(svObj) { dom.DeleteObject(svObj.ID());if(debug) {WriteLine("Wetterwarnung_typ geloescht");}}
    
    object  svObj  = dom.GetObject("Wetterwarnung_state");
    if(svObj) { dom.DeleteObject(svObj.ID());if(debug) {WriteLine("Wetterwarnung_state geloescht");}}
    
    object  svObj  = dom.GetObject("Wetterwarnung_description");
    if(svObj) { dom.DeleteObject(svObj.ID());if(debug) {WriteLine("Wetterwarnung_description geloescht");}}
    
    object  svObj  = dom.GetObject("Wetterwarnung_event");
    if(svObj) { dom.DeleteObject(svObj.ID());if(debug) {WriteLine("Wetterwarnung_event geloescht");}}
    
    object  svObj  = dom.GetObject("Wetterwarnung_headline");
    if(svObj) { dom.DeleteObject(svObj.ID());if(debug) {WriteLine("Wetterwarnung_headline geloescht");}}
    
    object  svObj  = dom.GetObject("Wetterwarnung_instruction");
    if(svObj) { dom.DeleteObject(svObj.ID());if(debug) {WriteLine("Wetterwarnung_instruction geloescht");}}
    
    object  svObj  = dom.GetObject("Wetterwarnung_stateShort");
    if(svObj) { dom.DeleteObject(svObj.ID());if(debug) {WriteLine("Wetterwarnung_stateShort geloescht");}}
    
    object  svObj  = dom.GetObject("Wetterwarnung_altitudeStart");
    if(svObj) { dom.DeleteObject(svObj.ID());if(debug) {WriteLine("Wetterwarnung_altitudeStart geloescht");}}
    
    object  svObj  = dom.GetObject("Wetterwarnung_altitudeEnd");
    if(svObj) { dom.DeleteObject(svObj.ID()); if(debug) {WriteLine("Wetterwarnung_altitudeEnd geloescht");}}
}

Zu Script Nummer 2:


Diese Script ist das eigentliche Auslesescript für die DWD Warnmeldungen.
Dieses wird in das folgenden WebUI Programm eingebunden bzw. aufgerufen.
Bildschirmfoto 2017-10-13 um 10.03.06.jpg
WebUI Programm WetternwarungDWD

Den Aufrufintervall habe ich für mich persönlich auf 30 Minuten gesetzt, weil ich denke das dies ausreichend ist.
Bildschirmfoto 2017-10-13 um 10.04.33.jpg
Aufrufintervall WetterwarnDWD

Und hier das zugehörige WetterwarnDWD Script (Update vom 07.11.2017 - einige Offsets beim Auslesen waren falsch)

Code: Alles auswählen

! ------  DWD Unwetterwarnung 15.12.2017  Vers. 1.02 -----------------------------------------------------------
! Unwetterwarnungsscript von Grrzzz / klana
! Version 1.02 vom 15.12.2017
! Erweitert von klana 
! - Alle Felder aus DWD Meldung auslesen
! - umfangreiches Debugging
! - korrektur Startdatum 
! - Ausgabe der Meldung jetzt mit Headline anstelle von event
! - und noch eniges mehr...
! - Erstellung Einmalscript für automatische Erstellung bzw. Loeschung der Systemvariablen 
! - Fehlerfaelle besser abfagen
! - Erweiterung um Datum und Uhrzeit für Start und End einschl. Systemvariablen
! - Boolean Variable damit auch die Vorabinformation angezeigt werden kann (s.u.)
! 
! ToDo - bekannte Fehler:
! - Auswertung der Level und Typen stimmt irgenwie noch nicht...
!
! 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 = false;

! --------------------------------------------------------------
! 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 = "105362000";   ! Rhein-Erft Kreis
! 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);}
      
      
      ! 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();
      }

      if(debug) {WriteLine("Start stdout : " #stdout);}
      !Bei Inhalt null keine Anfuehrungszeichen 

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

  
      
      ! 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(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());
       
      
      ! state (Bundesland im Klartext z.B: Nordrhein-Westfalen)
      stdout = stdout.Substr(stdout.Find("state")+8);
      var state = stdout.Substr(0, stdout.Find(",")-1);
      if(debug) {WriteLine("state :"#state);}
      if(state) {dom.GetObject(wwState).State(state);}

  
      !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)
      stdout = stdout.Substr(stdout.Find("type")+6);
      var mtyp = stdout.Substr(0, stdout.Find(","));
      if(debug) {WriteLine("mtyp :"#mtyp);}
      if(mtyp) {dom.GetObject(wwTyp).State(mtyp);}
      
      
      !Level - Vermutung 0 = Vorabwarnung, 1..10 tatsächliche Warnungen
      stdout = stdout.Substr(stdout.Find("level")+7);
      var level = stdout.Substr(0, stdout.Find(","));
      if(debug) {WriteLine("level :"#level);}
      if(level) {dom.GetObject(wwLevel).State(level);}

      ! headline (Überschrift der Meldung z.B. Amtliche WARNUNG vor WINDBÖEN)
      stdout = stdout.Substr(stdout.Find("headline")+11);
      var headline = stdout.Substr(0, stdout.Find(",")-1);
      if(debug) {WriteLine("headline :"#headline);}
      if(headline) {dom.GetObject(wwHeadline).State(headline);}
      
  
      ! description (nähere Erklärung der Meldung im Klartext)
      stdout = stdout.Substr(stdout.Find("description")+14);
      var descript = stdout.Substr(0, stdout.Find(",")-1);
      if(debug) {WriteLine("descript :"#descript);}
      if(descript) {dom.GetObject(wwDescription).State(descript);}

            
       ! altitude Start
      stdout = stdout.Substr(stdout.Find("altitudeStart")+15);
      var altitudeStart = stdout.Substr(0, stdout.Find(","));
      if(debug) {WriteLine("altitudeStart :"#altitudeStart);}
      if(altitudeStart) {dom.GetObject(wwAltitudeStart).State(altitudeStart);}
      
      
      ! event (Kurzform der Meldungsart z.B. Winböen)
      stdout = stdout.Substr(stdout.Find("event")+8);
      var event = stdout.Substr(0, stdout.Find(",")-1);
      if(debug) {WriteLine("event :"#event);}
      if(event) {dom.GetObject(wwEvent).State(event);}
      

      ! instruction (Was sollte man tun im Klartext z.B. bleibt alle Zuhause ;-)
      stdout = stdout.Substr(stdout.Find("instruction")+14);
      var instruction = stdout.Substr(0, stdout.Find(",")-1);
      if(debug) {WriteLine("instruction :"#instruction);}
      if(instruction) {dom.GetObject(wwInstruction).State(instruction);}

      
       ! altitude End
      stdout = stdout.Substr(stdout.Find("altitudeEnd")+13);
      var altitudeEnd = stdout.Substr(0, stdout.Find(","));
      if(debug) {WriteLine("altitudeEnd :"#altitudeEnd);}
      if(altitudeEnd) {dom.GetObject(wwAltitudeEnd).State(altitudeEnd);}
      

      ! stateShort (Abkürzung Bundesland z.B: NRW)
      stdout = stdout.Substr(stdout.Find("stateShort")+13);
      var stateShort = stdout.Substr(0, stdout.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 :"#diff2);}
        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);
      }
}

!------------------------------------------------------------------------------------------------------------
! 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(wwInstruction).State("---");
    dom.GetObject(wwStateShort).State("---");
    dom.GetObject(wwAltitudeStart).State("---");
    dom.GetObject(wwAltitudeEnd).State("---");
}


Zu Script Nummer 3:
Nun zum 3. Script, welches auf die Aktivierung durch das 2. Script reagiert.
Hier habe ich ein paar der Systemvariablen benutzt, um meine Pushvariable zu füllen.
Diese Füllung oder was man auch sonst noch so mit der Systemvariablen angestellt werden kann ist natürlich jedem selbst überlassen...

Erstmal das WebUI Programm in welches das Script eingebunden werden muss
Bildschirmfoto 2017-10-13 um 10.09.30.jpg
WebUi Programm WetterwarnungDWDAktiv

und hier mein Script dazu

Code: Alles auswählen

! Wetterwarnungen pushen
integer mTyp = 0;
string mText = "unbekannt";
boolean debug = false;

mTyp = dom.GetObject("Wetterwarnung_typ").Value().ToInteger();

if (debug) {WriteLine("Wetterwarnung_typ : " #mTyp);}

if (mTyp == 0) {  mText = "unbekannt";}
if (mTyp == 1) {  mText = "Gewitter";}
if (mTyp == 2) {  mText = "Wind/Sturm/Orkan";}
if (mTyp == 3) {  mText = "Stark- und Dauerregen";}
if (mTyp == 4) {  mText = "Schneefall/Schneeverwehungen";}
if (mTyp == 5) {  mText = "Nebel";}
if (mTyp == 6) {  mText = "Frost";}
if (mTyp == 7) {  mText = "Glaette/Glatteis";}
if (mTyp == 8) {  mText = "Tauwetter";}
if (mTyp == 9) {  mText = "Hitzewarnungen";}
if (mTyp == 10) {  mText = "UV-Warnungen";}
if (mTyp == 11) {  mText = "Kuestenwarnungen";}
if (mTyp == 12) {  mText = "Binnenseewarnungen";}


if(mTyp != 0)
{
  mText = "DWD Wetterwarnung für ";
  
  if (dom.GetObject("Wetterwarnung_state").Value() != "---") 
  {
     mText = mText #  dom.GetObject("Wetterwarnung_state").Value();
  }

  
  
  if (dom.GetObject("Wetterwarnung_Text").Value() != "Keine Warnungen") 
  {
     mText = mText # "%0A" # dom.GetObject("Wetterwarnung_Text").Value();
  }
  
  if (dom.GetObject("Wetterwarnung_description").Value() != "---") 
  {
    mText = mText # "%0AHinweis: " # dom.GetObject("Wetterwarnung_description").Value();
  }

  if (debug) {WriteLine("mText : " #mText);}
  dom.GetObject("SV_PushMessage").State(mText);
}
else 
{
  if(debug) {WriteLine("Keine WarnwetterDWD Pushmeldungen gefunden.");}
}
Die Programme kann natürlich jeder nennen wie er will.
Die Variable debug in den Scripten sollte nur eingeschaltet (auf true setzen) werden, wenn man die Scripte unter "Script testen" laufen läßt.


Es sei nochmal darauf hingewiesen, dass das Ganze z.Zt. auf der CCU2 NICHT läuft, da es hier wohl eine Änderung auf Seiten DWD gab (siehe vorherige Posts!)
Vielleicht hilft es ja jemandem und außerdem wollte ich auch mal was nützliches posten :D

Gruß
Klana

Nachtrag: Auf der Rasberymatic funktioniert das Script!
Zuletzt geändert von klana am 15.12.2017, 12:54, insgesamt 3-mal geändert.
Gruß Klana
Es ist nett, wichtig zu sein. Aber es ist wichtiger, nett zu sein.

Benutzeravatar
jmaus
Beiträge: 9862
Registriert: 17.02.2015, 14:45
System: Alternative CCU (auf Basis OCCU)
Wohnort: Dresden
Hat sich bedankt: 464 Mal
Danksagung erhalten: 1880 Mal
Kontaktdaten:

Re: Unwetterwarnung Script

Beitrag von jmaus » 13.10.2017, 16:39

mademyday hat geschrieben:vermute es liegt am eingebundenen openssl: OpenSSL/1.0.0j
Du vermutest richtig. Es liegt daran das OpenSSL 1.0.0 noch kein TLSv1.2 kann, was allerdings die dwd Webseiten inzwischen zwingend voraussetzen. Insofern gehen inzwischen weder "wget" noch "curl" mit den Webseiten der dwd auf einer CCU2 (mit RaspberryMatic geht es). Siehe:

Code: Alles auswählen

# wget https://www.dwd.de/DWD/warnungen/warnapp/json/warnings.json
--2017-10-13 16:34:07--  https://www.dwd.de/DWD/warnungen/warnapp/json/warnings.json
Resolving www.dwd.de... 141.38.3.62
Connecting to www.dwd.de|141.38.3.62|:443... connected.
OpenSSL: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol
Unable to establish SSL connection.

Code: Alles auswählen

# /usr/local/addons/cuxd/extra/curl https://www.dwd.de/DWD/warnungen/warnapp/json/warnings.json --verbose
*   Trying 141.38.3.62...
* Connected to www.dwd.de (141.38.3.62) port 443 (#0)
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* TLSv1.0 (OUT), TLS handshake, Client hello (1):
* error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol
* Closing connection 0
curl: (35) error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol
Wie man das ganze nun löst, ist keine so einfach Frage. für CUxD könnte man das curl mit einer aktuellen OpenSSL Version neu kompilieren. Das kompilieren von OpenSSL ist jetzt aber nicht gerade eine triviale Aufgabe und löst dann immer noch nicht das problem mit "wget".

Letztendlich wird hier eQ3 wohl nicht drumherum kommen die buildroot Umgebung der CCU2 soweit zu erneuern das diese mit aktuellen OpenSSL Versionen daherkommt.
RaspberryMatic 3.75.7.20240420 @ ProxmoxVE – ~200 Hm-RF/HmIP-RF/HmIPW Geräte + ioBroker + HomeAssistant – GitHub / Sponsors / PayPal / ☕️

dodi
Beiträge: 137
Registriert: 26.12.2016, 11:59
Hat sich bedankt: 2 Mal

Re: Unwetterwarnung Script

Beitrag von dodi » 14.10.2017, 15:05

@Jens:
Bei meiner Raspberrymatic läuft aber diese Meldung im Log auf.
viewtopic.php?f=31&t=38161&start=30#p389136
Ist die Funktion des Skriptes etwa trotzdem gegeben?

Bin ja nur über die Meldung gestolpert.
Ob das Skript funktioniert oder nicht, habe ich nicht gecheckt...

Grüße
Sascha

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 » 14.10.2017, 15:37

Hallo Sascha,

wenn Du mal das Skript hier postest (sind ja keine Kennwörter etc. drin) , kann ich es gerne mal mit der aktuellen Raspberry Version gegen testen. Mein UnwetterSkript von Blackhole läuft ohne Fehler im Log.

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

dodi
Beiträge: 137
Registriert: 26.12.2016, 11:59
Hat sich bedankt: 2 Mal

Re: Unwetterwarnung Script

Beitrag von dodi » 15.10.2017, 09:36

Hi,
habe das Skript heute nochmal getestet, und folgende Fehlermeldung wurde im Log ausgegeben:

Code: Alles auswählen

Oct 15 09:28:39 homematic-raspi local0.err ReGaHss: Error: IseXmlRpc::CallGetValue: XmlrpcTypeToIseVal failed [iseXmlRpc.cpp:1440]
Oct 15 09:28:39 homematic-raspi local0.err ReGaHss: Error: IseHssDP::ReadValue: CallGetValue failed; sVal =  [iseDOMdpHSS.cpp:130]
Hier ist das von mir verwendete Skript:

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:11";

!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 = "105162000";

!Nötige CCU-Systemvariablen
!In der CCU anzulegende Systemvariablen stehen nachfolgend in Anführungszeichen
var wetterwarnungAktiv = "SV.DWD.Wetterwarnung"; !Logikwert
var wetterwarnungText = "SV.DWD.Langtext"; !Zeichenketten
var wetterwarnungTyp = "SV.DWD.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);
}
Danach habe ich einfach mal den json-Aufruf im Browser gestartet, mir einen Ort gesucht mit aktueller Warnung, das Skript auf diesen Ort abgeändert und dann das Skript gestartet.
Dabei wurde dann keine Warnung ausgegeben. Sieht für mich so aus, als würde das Skript derzeit nicht funktionieren...

Grüße
Sascha

Benutzeravatar
klana
Beiträge: 1098
Registriert: 08.02.2015, 08:37
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 66 Mal
Danksagung erhalten: 27 Mal

Re: Unwetterwarnung Script

Beitrag von klana » 15.10.2017, 10:16

Hallo dodi,

das hatte ich am Anfang auch, hier musste im Originalscript die Reihenfolge der Abfragen angepasst werden, da mit jedem Auslesen der einzelnen Variablen
der stdout Puffer abgeschnitten wird und dann sind Felder nach denen gesucht wird nicht mehr vorhanden.

Versuche es doch mal mit meinem Script ein bisschen weiter oben hier im Thread
posting.php?mode=reply&f=31&t=38161&sid ... f#pr389713

Gruß
klana
Gruß Klana
Es ist nett, wichtig zu sein. Aber es ist wichtiger, nett zu sein.

Benutzeravatar
papi
Beiträge: 371
Registriert: 18.12.2013, 08:40
Wohnort: Willich, NRW
Hat sich bedankt: 2 Mal
Danksagung erhalten: 5 Mal

Re: Unwetterwarnung Script

Beitrag von papi » 15.10.2017, 12:35

Keine Ahnung, ob das hier hingehört, aber mir schwirrt gerade der Gedanke durch den Kopf, ob sich die DWD-Daten stattdessen aus dem DWD-ioBroker-Modul auslesen lassen.
Mangels Unwetter-Warnung weiß ich allerdings nicht, ob das Modul überhaupt noch funktioniert.
Bei mir läuft ioBroker auf der Synology und damit würde ich erwarten, dass es RasPiMatic-mäßig arbeitet bzw. funktioniert?
Gerne lasse ich mich eines Besseren belehren, ist nur eine Idee.

Edit: Auch wenn mein Beitrag bislang völlig herzlos missachtet wurde, erlaube ich mir zu ergänzen, dass das DWD-ioBroker-Modul tatsächlich noch funktioniert.
Es wäre also wirklich für ioBroker-User eine potentielle Datenquelle, sofern man diese anzuzapfen vermag. Aber wo Daten drin stehen, muss man ja auch irgendwie Daten raus bekommen?!
Zuletzt geändert von papi am 20.10.2017, 21:10, insgesamt 1-mal geändert.

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

Re: Unwetterwarnung Script

Beitrag von Grrzzz » 17.10.2017, 13:30

Vielen Dank für den regen Input. Ich habe das mal im Startpost konsolidiert.
Einen möglichen Workaround habe ich auch aufgezeigt (quasi ein eigener Reverse Proxy).

dodi
Beiträge: 137
Registriert: 26.12.2016, 11:59
Hat sich bedankt: 2 Mal

Re: Unwetterwarnung Script

Beitrag von dodi » 17.10.2017, 16:01

Hallo Grrzzz,
ich denke das dass Skript auf dem Raspy nicht läuft.
Siehe hier: viewtopic.php?f=31&t=38161&start=60#p390061

Wenn ich das richtig deute hat auch klana das schon festgestellt und in seinem Skript korrigiert.
Siehe hier: posting.php?mode=reply&f=31&t=38161#pr390062

Ich konnte es bis dato noch nicht testen...

Grüße
Sascha

Tobias78
Beiträge: 1464
Registriert: 27.06.2010, 01:01
Wohnort: Braunschweig
Hat sich bedankt: 4 Mal

Re: Unwetterwarnung Script

Beitrag von Tobias78 » 17.10.2017, 19:24

Klanas Skript funktioniert auf dem Raspi. Gestern getestet.
Gruß, Tobias.
--------------------------------------------
Im Einsatz und empfehlenswert:
RaspberryMatic,IO.Broker, Homeputer Studio; CuXD; PocketControl, HomeStatus, Robonect, Alexa, io.Broker
------------------------------------------

Antworten

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