DWD Wetterwarnungen JSON Daten auswerten

Nachdem ich doch schon einige Jahre das Forum beobachte und mir Anregeungen und Code übernommen habe, habe ich nun mal selbst gebastelt.
Bisher habe ich weder mit PHP noch mit HTML eigene Erfahrungen gesammelt.
Nachdem die Unwetterwarnung von Raktenschnecke nun nicht mehr funktionierte, war mein Ziel die JSON Daten aus der Seite des DWD’s auszulesen - ohne Anmeldung, ohne FTP und ohne Suchen nach den geeigneten Dateien in DWD Verzeichnissen.
Da mittel- und langfristig der DWD hier noch einige Änderungen vornehmen wird, sind aus meiner heutigen Sicht Änderungen in den JSON Daten auch zukünftig einfacher zu handhaben - habe aber auch keine Erfahrung!

Nach einigen Tagen ‚try and error‘ mein Ergebnis:

  • Kategorie z.B. ‚Wetterwarnungen‘ anlegen
  • Skript unterhalb der Kategotie anlegen und nachfolgenden Code einfügen.
  • Region(en) bis zu 3) im Skript anpassen.
  • Skript ausführen.
  • Variablen werden autom. angelegt, aber beim ersten ‚Skript ausführen‘ noch nicht komplett gefüllt.
  • Eine ‚Vorabinformation Unwetter‘ wird in diesem Skript aus den JSON Daten nicht ausgelesen!

In diesem Skript habe ich mich nur auf das Auswerten der JSON Datein konzentriert und es wird ein HTML String für den WFE zusammengebaut.
Im Skript könnte aber auch der WFE Teil komplett, zwischen den Tags ‚#WFE zusammenstellen Anfang‘ und ‚- Ende‘, entfernt werden oder nach eigenen Wünschen aufgebaut werden - Farbe, Form und Geschmack sind doch oft individuell.
Es sind einige Hilfsroutinen (Ausgabe über Echo und print_r ) eingebaut.

Email - oder SMS senden, Jalousien einfahren, Fenster u. Türen autom. schließen etc. sind nicht integriert und sollten meines Erachtens aushalb dieses Skripts abgehandelt werden. Dazu könnte z.B. ein Event Trigger an die IPS Variable ‚DWD Wetterwarnungen Region - Anzahl‘ angehängt werden.

Das Skript wurde mit IP-Symcon 3.4 erstellt.

 <?
// Stand: 10.12.2015

// siehe DWD: http://www.dwd.de/DE/wetter/warnungen_aktuell/objekt_einbindung/objekteinbindung.html

// JavaScript Object Notation (JSON-File)

// Aktualisierung: nach Bedarf, spätestens nach 10 Minuten
// Warnkriterien:  alle, aber auch einzeln auslesbar
// Über den Pfad http://www.dwd.de/DWD/warnungen/warnapp/json/warnings.json wird eine Json-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.

// Ausblick

// Auch zukünftig werden wir das Angebot verbessern und erweitern:
//    Voraussichtlich ab Ende November werden die Bilder der Warnsituation der einzelnen Bundesländer und verschiedener Warnkriterien bereitgestellt werden.
//    Wir planen das flashbasierte Warnmodul durch ein neues Angebot einer konfigurierbaren Warndarstellung ersetzen.
//    Langfristig wird das Warnmanagement auf Gemeindewarnungen umgestellt werden.


// ####### Regionen definieren - anpassen ######
// Den exaten Namen einer Region entnimmt man der Seite http://www.dwd.de/DE/wetter/warnungen/warnWetter_node.html

$regionInput1 = "Kreis Harz - Bergland (Oberharz)"; // primäre Region
$regionInput2 = "Kreis Garmisch-Partenkirchen"; // sekundäre Region - Nachbarregion oder Finca
$regionInput3 = "Kreis Cuxhaven - Küste";    // sekundäre Region - Nachbarregion oder Datscha
$warningThreshold = 0; // Warning Level ab dem die Anzahl der Warnmeldungen für die Regionen gezählt wird
                      // 0 = alles wird gezählt, 1= nur Vorabinf. werden nicht gezählt, 2 = Vorabinf. und einfache Warnungen (gelb) werden nicht gezählt .....
// #############################################


// ####### Ausgaben auf der Management Console aktivieren bzw. deaktivieren #######
$listOverview  = false; // Auflisten einer Übersicht             - ggf. zwecks Analyse einschalten
$listDetails   = false; // Auflisten des unformatierten Inhalts  - ggf. zwecks Analyse einschalten
$listRegion    = false; // Auflisten der Regionen für die eine Warnmeldung vorhanden ist  - zwecks zur Analyse einschalten
$listRegionSel = false; // Auflisten der ausgewählten Regionen   - ggf. zwecks Analyse einschalten


// #############################################################################

    $DWDwarnings = array(); // Neues Array mit Wetterwarnungen der oben angegebenen Regionen definieren
   $currentWarnigs  = 0; // Anzahl aktuellen Warnungen

// Variablen-Definitionen
   $VarNames[0]                             = array('name'=>'DWD Wetterwarnungen letzte Aktualisierung (UNIX-Timestamp)', 'type'=>1, 'hidden'=>true, 'profil'=>'~UnixTimestamp', 'position'=> -50, 'default_value'=>0,);
   $VarNames[1]                             = array('name'=>'DWD Wetterwarnungen Region - Anzahl', 'type'=>1, 'hidden'=>true, 'profil'=>'', 'position'=> -40, 'default_value'=>0,);
   $VarNames[2]                             = array('name'=>'DWD Wetterwarnungen für Region(en) - letzte Veränderung (UNIX-Timestamp)', 'type'=>1, 'hidden'=>true, 'profil'=>'~UnixTimestamp', 'position'=> -30, 'default_value'=>0,);
   $VarNames[3]                             = array('name'=>'DWD Wetterwarnungen für Region(en) - Beschreibung der letzten Veränderung', 'type'=>3, 'hidden'=>true, 'profil'=>'', 'position'=> -20, 'default_value'=>'- bisher keine Änderung erfolgt',);
   $VarNames[4]                             = array('name'=>'DWD Wetterwarnungen WFE', 'type'=>3, 'hidden'=>false, 'profil'=>'~HTMLBox', 'position'=> -60, 'default_value'=>'',);

// übergeordnete Instanz identifizieren
    $Parent                                   = IPS_GetParent($_IPS['SELF']);
    $ParentModul                                = IPS_GetObject($Parent);

// Auto-Update (überprüft, ob alle Objekte im Baum vorhanden sind
    for($i=0;$i<count($VarNames);$i++)
    {
       if(@IPS_GetObjectIDByName($VarNames[$i]['name'], IPS_GetParent($_IPS['SELF'])) == false)
        {
            $Update                                 = true;     // Update-Status auf true setzen
            $i                                     = 9999;     // Abbruch der Schleife bei fehlendem Objekt

        }
        else
        {
            $Update                                 = false;     // alle Objekte vorhanden -> Update-Status auf false setzen
        }

    }

// DWD Warnmeldungen Auswertelogik
if(($ParentModul['ObjectType'] == 1) && ($ParentModul['ObjectName'] == 'DWD Wetterwarnungen') && ($Update == false))
  {

    // Variablen identifizieren
       $letzteAktualisierung_ID            = IPS_GetObjectIDByName($VarNames[0]['name'], IPS_GetParent($_IPS['SELF']));
       $anzahlMeldungen_ID                 = IPS_GetObjectIDByName($VarNames[1]['name'], IPS_GetParent($_IPS['SELF']));
       $letzteAenderung_ID                   = IPS_GetObjectIDByName($VarNames[2]['name'], IPS_GetParent($_IPS['SELF']));
       $letzteAenderungBeschr_ID             = IPS_GetObjectIDByName($VarNames[3]['name'], IPS_GetParent($_IPS['SELF']));
      $WFE_ID                          = IPS_GetObjectIDByName($VarNames[4]['name'], IPS_GetParent($_IPS['SELF']));

   // IPS Werte auslesen
        $letzteAktualisierung             = getValueInteger($letzteAktualisierung_ID);
       $anzahlMeldungen                   = getValueInteger($anzahlMeldungen_ID);
       $letzteAenderung                   = getValueInteger($letzteAenderung_ID);
        $letzteAenderungBeschr           = getValueString($letzteAenderungBeschr_ID);
       $WFE                              = getValueString($WFE_ID);

    }

#######################################################################################################################################

// Install-Routinen

elseif($_IPS['SENDER'] == 'Execute')
{
    if((($ParentModul['ObjectType'] != 1) && ($ParentModul['ObjectName'] != 'DWD Wetterwarnungen')) || ($Update == true))
    {
       if(($ParentModul['ObjectType'] != 1) && ($ParentModul['ObjectName'] != 'DWD Wetterwarnungen'))
       {
           // Dummy-Instanz anlegen und Script drunterhängen
          $ModulID                = IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}");
          IPS_SetName($ModulID, 'DWD Wetterwarnungen');
          IPS_SetParent($ModulID, $Parent);
          IPS_SetParent($_IPS['SELF'], $ModulID);
          IPS_SetHidden($_IPS['SELF'], true);
          IPS_ApplyChanges($ModulID);
      }
      // Variablen anlegen - wenn nicht vorhanden
      // 1. vorhandene Vars auslesen
      $ModulID                    = IPS_GetParent($_IPS['SELF']);
      for($i=0;$i<count($VarNames);$i++)
        {
           if(@IPS_GetObjectIDByName($VarNames[$i]['name'], IPS_GetParent($_IPS['SELF'])) == false)
           {
           $VarID                = IPS_CreateVariable($VarNames[$i]['type']);
           IPS_SetName($VarID, $VarNames[$i]['name']);
           IPS_SetHidden($VarID, $VarNames[$i]['hidden']);
           IPS_SetPosition($VarID, $VarNames[$i]['position']);
           IPS_SetParent($VarID, $ModulID);
           SetValue($VarID, $VarNames[$i]['default_value']);
            }
                // Profile zuweisen
        $VarID                = IPS_GetObjectIDByName($VarNames[$i]['name'], IPS_GetParent($_IPS['SELF']));
        IPS_SetVariableCustomProfile($VarID, $VarNames[$i]['profil']);
        }

    }
     echo 'Script Name #'.$_IPS['SELF'];
     echo "#9999 IPS Wetterwarnung: Install ready (neue Objekte angelegt)
";
     if(function_exists("IPSLogger_Dbg")) IPSLogger_Dbg(c_LogId, "#9999 IPS Wetterwarnung: Install ready (neue Objekte angelegt)");

}
else
{
    echo "Script #".$_IPS['SELF']." Wetterwarnung: ohne Ergebnis gelaufen (keine Objekte gefunden/Objekte fehlerhaft
";
    if(function_exists("IPSLogger_Err")) IPSLogger_Err(c_LogId, "Script #".$_IPS['SELF']." Wetterwarnung: ohne Ergebnis gelaufen (keine Objekte gefunden/Objekte fehlerhaft)");
}

// Timer-Management
     IPS_SetScriptTimer($_IPS['SELF'], 10*60);



// ########### Warnmeldung von DWD Webseite auslesen ##########################


// JSON Objekt holen
$json = file_get_contents("http://www.wettergefahren.de/DWD/warnungen/warnapp/warnings.json");

    if( empty($json) )
       {  IPS_LogMessage( IPS_GetName($_IPS['SELF']), "can't get url content");   return;  }
     // var_dump($json);

// Warnmeldungen aus dem JSON Objekt extrahieren
$unit = extract_unit($json, 'warnWetter.loadWarnings(', ');'); // Daten aus dem JSON Objekt extrahieren
// var_dump($unit);

// $unit = utf8_encode($unit); // bringt nicht den gewünschten Effekt

$data = trans_Umlaut($unit); // Umlaute und "ß" zwecks nachfolgendem json_decode entfernen und mit "..Q" markieren

$weather_alerts = json_decode($data); // Daten formatieren

          $reg1wrncnt = 0;
          $reg2wrncnt = 0;
          $reg3wrncnt = 0;


// ************ Overview  ***********************************************

   if ( $listOverview == true )
      {
      echo  "Letzte Aktualisierung durch DWD am ".trans_d(substr($weather_alerts->time, 0, 10))." ".date('d.M Y H:i', substr($weather_alerts->time, 0, 10)). " 

";
      echo  "  Es sind für ".count((array)$weather_alerts->warnings)." Regionen Warnmeldungen vorhanden 

";
      echo  "  Es sind für ".count((array)$weather_alerts->vorabInformation)." Regionen Vorabinformationen vorhanden 



";
     }

// ************ Details  ***********************************************

   if ( $listDetails == true )
      {
      echo "======================= Warnings  ====================== 
";
      print_r($weather_alerts->warnings);

      echo "================== Vorabinformation  =================== 
";
      print_r($weather_alerts->vorabInformation);
     }

// ************ Region  ***********************************************
   if($listRegion == true)
      {
       echo "Warnmeldungen für folgende Regionen sind z.Zt. vorhanden: 

";
         // print_r ($weather_alerts->warnings);
         // var_dump($weather_alerts->warnings);
      }

   $i = 0;

    foreach($weather_alerts->warnings as $value)
           {
           // var_dump($value);

          for($j=0;$j<(count($value));$j++)
           {
            // print_r($value[$j]);
            // echo "next value ".$j."
";

            $data= trans_toUmlaut(($value[$j]->regionName));
            $value[$j]->regionName = $data;
            // echo "
".$value[$j]->regionName;

            $data = trans_toUmlaut($value[$j]->event);
            $value[$j]->event = $data;
            // echo "
".$value[$j]->event;

            $data = trans_toUmlaut($value[$j]->headline);
            $value[$j]->headline = $data;
            // echo "
".$value[$j]->headline;

            $data = trans_toUmlaut($value[$j]->description);
            $value[$j]->description = $data;
            // echo "
".$value[$j]->description;

            $data = trans_toUmlaut($value[$j]->instruction);
            $value[$j]->instruction = $data;
            // echo "
".$value[$j]->instruction;

            $data = trans_toUmlaut($value[$j]->state);
            $value[$j]->state = $data;
            // echo "
".$value[$j]->instruction;

              // *********************************************************************
           // echo " =================== Region : ".$i."  Warnung #: ".$j."
";
           // echo $j."
";
           // print_r($value[$j]);
           // *********************************************************************

            if (($value[$j]->regionName  == $regionInput1) or ($value[$j]->regionName  == $regionInput2) or ($value[$j]->regionName  == $regionInput3))
              {
               $DWDwarnings[$value[$j]->regionName] = $value; // Aufbau einer eigenen Tabelle mit den Angaben aus $regionInput1, -2, -3
              }
// Hier wird eingestellt ab welcher Warnstufe die aktuelle Anzahl Meldungen hochgezählt wird
                if (($value[$j]->level > $warningThreshold) and (($value[$j]->regionName  == $regionInput1) or ($value[$j]->regionName  == $regionInput2) or ($value[$j]->regionName  == $regionInput3)))
               {
                   $currentWarnigs = $currentWarnigs + 1; // Aktuelle Anzahl von Meldungen größer Level 0 zählen
                      switch ($value[$j]->regionName)
                           {
                      case $regionInput1:
                           $reg1wrncnt=$reg1wrncnt+1;
                           break;
                      case $regionInput2:
                           $reg2wrncnt=$reg2wrncnt+1;
                           break;
                      case $regionInput3:
                           $reg3wrncnt=$reg3wrncnt+1;
                           break;
                      }
                //  echo "
 Anzahl Warnmeldungen > Warnstufe 0 :  aktueller Level: ".$value[$j]->level." Anzahl Warnmeldumgen insges: ".$currentWarnigs."
";
                //  echo "
 Region 1: ".$reg1wrncnt;
                //  echo "
 Region 2: ".$reg2wrncnt;
                //  echo "
 Region 3: ".$reg3wrncnt;
                //  echo "
 ";

                  }

                if(($listRegion == true) and ($j == 0))
                  {
               echo $value[$j]->regionName."
"; // Regionsnamen für die eine Meldung vorhanden ist auflisten
                }
// ************ RegionSel  ***********************************************

            if ($listRegionSel == true)
                  {
               if (($value[$j]->regionName  == $regionInput1) or ($value[$j]->regionName  == $regionInput2) or ($value[$j]->regionName  == $regionInput3))
                     {

                  if ($j == 0)
                          {
                     echo "
 **************************************************************************";
                          echo "
  Für die Region ".$value[$j]->regionName." sind ".count($value)." Meldungen vorhanden" ;
                          echo "
 **************************************************************************";
                          }

                     // print_r($value[$j]);

                  echo "
 ** Warnmeldung #".($j+1)." **";
                  echo "
 Warnstufe............: ".$value[$j]->level;
                       // 5 = Warnungen vor extremem Unwetter
                       // 4 = Unwetterwarnungen
                       // 3 = Warnungen vor markantem Wetter
                       // 2 = Wetterwarnungen
                       // 1 = Vorabinformatio Unwetter

                  echo "
 Warntyp..............: ".$value[$j]->type;
                    // In folgender Tabelle sind Warntypen mit ? markiert, die noch nicht in der Praxis getestet werden konnten!
                       // 0 = Gewitter inklusive Begleiterscheinungen ?
                    // 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 ?

                  echo "
 Ab  ( Höhenmeter )...: ".$value[$j]->altitudeStart;
                  echo "
 Bis ( Höhenmeter )...: ".$value[$j]->altitudeEnd;

                  $timestamp = substr($value[$j]->start, 0, 10);
                  $dow = trans_d($timestamp);
                  $start = $dow.", ".date('d.M Y H:i', $timestamp)." Uhr ";
                  echo "
 Beginnzeitpunkt......: ".$start;

                  $timestamp = substr($value[$j]->end, 0, 10);
                  $dow = trans_d($timestamp);
                  $end = $dow.", ".date('d.M Y H:i', $timestamp)." Uhr ";
                  echo "
 Endzeitpunkt.........: ".$end;
                      echo "
 Ereignis.............: ".$value[$j]->event;
                      echo "
 Kopfzeile............: ".$value[$j]->headline;
                  echo "
 Beschreibung.........: ".$value[$j]->description;
                  echo "
 Anweisung............: ".$value[$j]->instruction;
                  echo "
 Bundesland...........: ".$value[$j]->state;
                  echo " 
";
                    }

                }
            // echo "
 ============================================================";
           }
            // print_r($value);
            // echo "
".$i;
            $i=$i+1;
        }

      if ($listRegionSel == true){
            echo "
 Es sind ".($i)." Meldungen durchsucht worden 
";
             }

      if (($listRegionSel == true) or ($listDetails == true)){
          echo "
 ".$weather_alerts->copyright." - siehe: http://www.dwd.de/DE/service/copyright/copyright_node.html 
";
          }



   if ( $Update == true )
         {
         echo "=====================     Installation / Erster Lauf     ===================== 
";
         echo "=== Es können noch keine IPS Variablen gesetzt oder gelesen werden ============ 
";
        }
     else
        {
            $previousWarnigs = GetValueInteger($anzahlMeldungen_ID);

            if ($previousWarnigs == $currentWarnigs) {
                 $msg=' ';
                 // echo " keine Veränderung";

              }else{
               $msg = " von bisher ".$previousWarnigs." auf ".$currentWarnigs." Meldungen";
               // echo $msg;
            SetValueInteger($letzteAenderung_ID, time());
              setValueString($letzteAenderungBeschr_ID, $msg);
                 }
            // Letzte Aktualisierung als UNIX TIMESTAMP
          // echo substr($weather_alerts->time, 0, 10);
         SetValueInteger($letzteAktualisierung_ID, intval(substr($weather_alerts->time, 0, 10)));
         SetValueInteger($anzahlMeldungen_ID, $currentWarnigs);
        }

// ***********************************************
       // Eigene Tabelle ausgeben - Beispiele:
// ***********************************************

       // Die gesamte eigenen Tabelle ausgeben
       // print_r($DWDwarnings);

         // Zugriff auf Index regionName
         //print_r($DWDwarnings[$regionInput1]);

       // Zugriff auf Index regionName und ersten Tabelleneintrag
           //Zuerst Anzahl der Einträge ermitteln
           if (array_key_exists($regionInput1 , $DWDwarnings )){
                 $warnNbr = count((array)($DWDwarnings[$regionInput1]));}
                 else{$warnNbr = 0;}
             //echo "Tabelleneinträge für Region = ".$warnNbr."
";


             //Zugriff auf erste Warnmeldung - Gezählt wird ab 0!
               if($warnNbr > 0 ){
                    // print_r($DWDwarnings[$regionInput1][0]);
               //   print_r($DWDwarnings[$regionInput1][0]->headline);
                    }

               //Zugriff auf dritte Warnmeldung - Gezählt wird ab 0!
               if($warnNbr > 2  ){
                    // print_r($DWDwarnings[$regionInput1][0]);
               // print_r($DWDwarnings[$regionInput1][2]->headline);
               }

               // print_r(($DWDwarnings[$regionInput1][1]));
               // print_r(($DWDwarnings[$regionInput1][2]));


               // print_r($DWDwarnings[$regionInput2]);
               // print_r($DWDwarnings[$regionInput3]);


// #WFE zusammenstellen - Anfang

// Definition HTML-Content
$dow = trans_d(intval(substr($weather_alerts->time, 0, 10))); // day of week ermitteln
$lastupdate = $dow.", ".date('d.m.Y H:i', intval(substr($weather_alerts->time, 0, 10)))." Uhr ";

   if ( $Update == true )
         {
         echo "=====================     Installation / Erster Lauf     ===================== 
";
         echo "=== Es können noch keine IPS Variablen gesetzt oder gelesen werden ============ 
";
         $warningsChanged =  date('d.m.Y H:i',time());
        }
     else
        {$warningsChanged =  date('d.M Y H:i',GetValueInteger($letzteAenderung_ID));}

if(isset($DWDwarnings[$regionInput1][0]->end) == false){
     Echo "
 Es ist keine Warnmeldung für $regionInput1 vorhanden";
     echo "
 Für den WFE wird der Zähler von $reg1wrncnt auf 0 gesetzt! 
";
     // $currentWarnigs  = 0;
     }



$WL_Header = '<FONT SIZE="1">DWD Meldungen von:  </FONT><b>'.$lastupdate.'</b>';
if($reg1wrncnt == 0){
   $WL_Title = ' Keine Warnmeldung für die Region '.$regionInput1.' vorhanden';
    }
   else {
         echo $reg1wrncnt.' Warnungen für Region '.$regionInput1."
";
         echo $reg2wrncnt.' Warnungen für Region '.$regionInput2."
";
         echo $reg3wrncnt.' Warnungen für Region '.$regionInput3."
";
         $w = 0;
         $WL_Title = ' ';
         for($w=0;$w < $reg1wrncnt; $w++)
          {
          switch ($DWDwarnings[$regionInput1][$w]->level)
                {
           case 0:
                // echo "
 Warnig level ist 0
";
                $WarnBoxColor = '#C5E566';    // grün:    keine Warnungen
                $WarnBoxColor = '#E2E9FD';    // blau wie der Hintergrund:    keine Warnungen
                break;
           case 1:
                // echo "
 Warnig level ist 1
";
                break;
           case 2:
                // echo "
 Warnig level ist 2
";
                $WarnBoxColor = '#FFFF00';    // gelb:    Wetterwarnungen
                break;
           case 3:
                // echo "
 Warnig level ist 3
";
                $WarnBoxColor = '#FA9600';    // orange:  Warnungen vor markantem Wetter
                break;
           case 4:
                // echo "
 Warnig level ist 4
";
                $WarnBoxColor = '#FF0000';    // rot:     Unwetterwarnungen
                break;
           case 5:
                // echo "
 Warnig level ist 5
";
                $WarnBoxColor = '#AF0064';    // violett: Warnungen vor extremen Unwetter
                break;
          }
       if (date('Yz', (substr($DWDwarnings[$regionInput1][$w]->end, 0, 10))) != date('Yz', (substr($DWDwarnings[$regionInput1][$w]->start, 0, 10))))
            {
          $dows = trans_d(substr($DWDwarnings[$regionInput1][$w]->start, 0, 10)); // day of week ermitteln
          $startTimestamp = $dows.". ".date('d.m.Y  H:i',substr($DWDwarnings[$regionInput1][0]->start, 0, 10))." Uhr ";

          $dowe = trans_d(substr($DWDwarnings[$regionInput1][$w]->end, 0, 10)); // day of week ermitteln
          $endTimestamp = $dowe.". ".date('d.m.Y  H:i',substr($DWDwarnings[$regionInput1][$w]->end, 0, 10))." Uhr ";

          $WL_Title = '<p>'.$WL_Title.'</br>'.$startTimestamp.'<FONT SIZE="1">&#160 bis </FONT><b> </br>'.$endTimestamp.' - '.$DWDwarnings[$regionInput1][$w]->headline.'</p>';
             }
             else
             {
          $dows = trans_d(substr($DWDwarnings[$regionInput1][$w]->start, 0, 10)); // day of week ermitteln
          $startTimestamp = $dows.". ".date('d.m.Y H:i',substr($DWDwarnings[$regionInput1][0]->start, 0, 10));

          $dowe = trans_d(substr($DWDwarnings[$regionInput1][$w]->end, 0, 10)); // day of week ermitteln
          $endTimestamp = date('H:i',substr($DWDwarnings[$regionInput1][$w]->end, 0, 10))." Uhr ";

          $WL_Title = '<p>'.$WL_Title.'</br>'.$startTimestamp.' - '.$endTimestamp.'  -  '.$DWDwarnings[$regionInput1][$w]->headline.'</p>';
             }
        }
    }
$WL_Body = ' ';
$WarnColor = '#C5E566';    // grün:    keine Warnungen
// UNIX-Timestamp
$unix                               = time();
$tmlnend=0; // timeline end
$tmlnstr=0; // timeline start
// echo count($DWDwarnings);
 if (count($DWDwarnings) > 0 )
if(isset($DWDwarnings[$regionInput1][0]->state)){$BL = ($DWDwarnings[$regionInput1][0]->state);} // Bundesland


$HTML_Header ='
<html>
<head>
    <style type="text/css" media="screen"> body { background-color:#efefef;}
  </style>
</head>';

if ($reg1wrncnt > 0){
$elapsed=0; // Dauer der Warnung in h
$elapsed = ((substr($DWDwarnings[$regionInput1][0]->end, 0, 10) - (substr($DWDwarnings[$regionInput1][0]->start, 0, 10)))/3600);


// Anfang ist nicht heute dann Beginn 0Uhr
// Ende ist nicht heute dann Ende 24Uhr
$heuteTag = date('Yz', time());  echo "Heute  ".$heuteTag."
";
$endeTag = date('Yz', (substr($DWDwarnings[$regionInput1][0]->end, 0, 10)));  echo "Ende   ".$endeTag."
";
$beginnTag = date('Yz', (substr($DWDwarnings[$regionInput1][0]->start, 0, 10)));  echo "Anfang ".$beginnTag."
";
if ($beginnTag != $heuteTag) {$tmlnstr=0; echo "Ende in der Anzeige auf 24Uhr gestetzt 
";}
  else{$tmlnstr = date('H',(substr($DWDwarnings[$regionInput1][0]->start, 0, 10)));}
if ($endeTag != $heuteTag) {$tmlnend=24; echo "Ende in der Anzeige auf 24Uhr gestetzt 
";}
  else{$tmlnend = date('H',(substr($DWDwarnings[$regionInput1][0]->end, 0, 10)));}



$tmlnbgn=$tmlnstr*29;
$tmlnstp=$tmlnend*29;

echo "
 Begin ".$tmlnstr."h   Stop ".$tmlnend."h   Dauer ".$elapsed."h";
echo "
 Begin ".$tmlnbgn."px  Stop ".$tmlnstp."px  
";

if ($reg1wrncnt == 0){
    $WarnColor = '#E2E9FD';    // blau wie der Hintergrund:    keine Warnungen
    }
    else {

switch ($DWDwarnings[$regionInput1][0]->level) {
    case 0:
        // echo "
 Warnig level ist 0
";
        $WarnColor = '#C5E566';    // grün:    keine Warnungen
        break;
    case 1:
        // echo "
 Warnig level ist 1
";
        break;
    case 2:
        // echo "
 Warnig level ist 2
";
        $WarnColor = '#FFFF00';    // gelb:    Wetterwarnungen
        break;
    case 3:
        // echo "
 Warnig level ist 3
";
        $WarnColor = '#FA9600';    // orange:  Warnungen vor markantem Wetter
        break;
    case 4:
        // echo "
 Warnig level ist 4
";
        $WarnColor = '#FF0000';    // rot:     Unwetterwarnungen
        break;
    case 5:
        // echo "
 Warnig level ist 5
";
        $WarnColor = '#AF0064';    // violett: Warnungen vor extremen Unwetter
        break;
    }

}


// Timeline erstellen
$timeline =
'   <div style="border:1px solid rgb(220, 220, 220); width:714px; height:40px; margin-left:auto; margin-right:auto; margin-top:auto; margin-bottom:auto; text-align:left;">
    <div style="background-color:#E2E9FD; width:696px;height:10px;" id="balken1">
       <div style="background-color:'.$WarnColor.'; width:'.$tmlnstp.'px;height:10px;" id="balken2">
     <div style="background-color:#E2E9FD; width:'.$tmlnbgn.'px;height:10px;" id="balken3">
     </div></div></div>
    <div style="line-height:30px;margin-top:0px;text-align:justify"></div>
    <font size="1" color="#A9A9A9" face="Arial">00:00 01:00 02:00 03:00 04:00 05:00 06:00 07:00 08:00 09:00 10:00 11:00 12:00 13:00 14:00 15:00 16:00 17:00 18:00 19:00 20:00 21:00 22:00 23:00 24:00</font>
     </div>

';
}
else
{$timeline =
'   <div style="border:1px solid rgb(220, 220, 220); width:714px; height:0px; margin-left:auto; margin-right:auto; margin-top:auto; margin-bottom:auto; text-align:left;">
     </div>
';}


$HTML_Table ='
<body scroll="no">
<table
 style="text-align: left; margin-left: auto; margin-right: auto; background-color: rgb(220, 220, 220); width: 720px; font-family: Arial;"
 border="0" cellpadding="2" cellspacing="2">
  <tbody>
    <tr>
      <td style="width: 20px; color: #333333; background-color: '.$WarnColor.';" colspan="1" rowspan="6"></td>
      <td style="width: 716px; color: #333333; background-color: #E2E9FD; text-align: left;" colspan="3">'.$WL_Header.'</td>
    </tr>
   <tr>
    <td style="width: 716px; color: #333333; background-color: #E2E9FD; text-align: left;" colspan="3"><FONT SIZE="1">Meldungen für Region:   </FONT><b>'.$regionInput1.'</b></td>
    </tr>
    <tr>
        <td style="width: 716px; color: #333333; background-color: #E2E9FD; text-align: center;" colspan="3">'.$timeline.'</td>
    </tr>';
 // zeile 120: <td style="width: 716px; color: #333333; background-color: #E2E9FD; text-align: center;" colspan="3">.'Hier fehlt die Darstellung des Zeitstrahls'.$unix.'"></img></td>



// Gewittererkennung (Schlagwortsuche im Warnungs-String)
$Blitzkarte                         = false;
if (array_key_exists($regionInput1 , $DWDwarnings )){
if(strpos($DWDwarnings[$regionInput1][0]->description,"GEWITTER") != false)
            {
            $Gewitter = true;
            }
            else
            {
                $Gewitter = false;
            }


$Gewitter = false; // obige Abfrage bringt anschließend keine Blizkarte

// true: tauscht bei Gewitter-Warnmeldungen das SAT24-PIC gegen die Wetteronline-Blitzkarte DE
    $Blitzkarte                         = true;           // true: tauscht bei Gewitter-Warnmeldungen das SAT24-PIC gegen die Wetteronline-Blitzkarte DE


// Definition 3. RADAR-Pic: Blitzkarte DE (Alternative)


if ($currentWarnigs == 0){$wo_Blitzkarte ='
                <a
                 href="http://www.wetteronline.de/blitze" target="_blank">
                 <img  style="width: 222px; height: 225px; alt="Blitzkarte DE"
                        src="http://www.wetteronline.de/?ireq=true&pid=p_blitze_map&src=blitze/vermarktung/p_blitze_map/www/Track/DL/green_flat/DL_Track.gif" width="222" height="225"></a></img></td>';
  }
  else {
   $BLs= trans_BL($BL); // Kürzel des Bundeslandes ermitels
    //   echo $BLs;
  //   kleine Bundesländer werden in Anzeigen größerer Länder dargestellt
   switch ($BL) {
    case "Berlin":
        $BL = "Brandenburg";
        break;
    case "Hamburg":
        $BL = "Schleswig-Holstein";
        break;
    case "Bremen":
        $BL = "Niedersachsen";
        break;
    case "Saarland":
        $BL = "Reinland-Pfalz";
        break;
      }

     $wo_Blitzkarte ='
                <a
                 href="http://www.wetteronline.de/blitze/'.$BL.'" target="_blank">
                 <img  style="width: 222px; height: 225px; alt="Blitzkarte DE"
                        src="http://www.wetteronline.de/?ireq=true&pid=p_blitze_map&src=blitze/vermarktung/p_blitze_map/www/Track/'.$BLs.'/green_flat/'.$BLs.'_Track.gif" width="222" height="225"></a></img></td>';
   }
}


// Definition 1. RADAR-Pic: Regenradar DE
$nr_Regenradar ='
                <a
                 href="http://www.niederschlagsradar.de" target="_blank">
                 <img  style="width: 222px; height: 225px; alt="Niederschlagsradar DE"
                        src="http://www.niederschlagsradar.de/image.ashx?type=blitz&lightning?'.$unix.'" width="222" height="225"></a></img></td>';



if(($Blitzkarte) && ($Gewitter))
{
$HTML_Radar ='
       <tr>
          <td style="width: 293px; color: #333333; background-color: #E2E9FD; text-align: right;">
            '.$nr_Regenradar.'
          <td style="width: 155px; color: #333333; background-color: #E2E9FD; text-align: center;">
            <a
                 href="http://www.wettergefahren.de/DWD/warnungen/warnapp/warning_map.png>
                 <img style="width: 159px; height: 225px; alt="DWD Unwetterkarte"
                 src="http://www.wetteronline.de/?ireq=true&pid=p_blitze_map&src=blitze/vermarktung/p_blitze_map/www/Track/NIE/green_flat/NIE_Track.gif" width= "159" height= "225"></a></img></td>
                 <td style="width: 305px; color: #333333; background-color: #E2E9FD; text-align: left;">
            '.$wo_Blitzkarte.'
        </tr>
';
// src="http://www.wettergefahren.de/dyn/app/ws/maps/DE_x_x_0.gif?'.$unix.'" width= "159" height= "225"></a></img></td>
        echo 'Unwetterkarte wird nicht angezeigt!';
}
else
{


$HTML_Radar ='
       <tr>
          <td style="width: 216px; color: #333333; background-color: #E2E9FD; text-align: right;">
            '.$nr_Regenradar.'
          <td style="width: 155px; color: #333333; background-color: #E2E9FD; text-align: center;">
            <a
                 href="http://www.wettergefahren.de/warnungen/warnsituation.html" target="_blank">
                 <img style="width: 180px; height: 225px; alt="DWD Unwetterkarte"
                 src="http://www.wettergefahren.de/DWD/warnungen/warnapp/warning_map.png?nocache='.$unix.'" width= "180" height= "225"></a>
                 </img>
            </td>

            <td style="width: 305px; color: #333333; background-color: #E2E9FD; text-align: left;">
            <a
                 href="http://www.sat24.com/de" target="_blank">
                 <img style="width: 230px; height: 225px; alt="Satellitenbild DE Sat24"
                 src="http://www.sat24.com/image.ashx?country=de&type=loop&sat=vis?'.$unix.'" width= "230" height= "225"></a></img></td>
        </tr>';

        echo "Unwetterkarte aktualisiert! 
 ";
}


   if ( $Update == true )
         {
         echo "=====================     Installation / Erster Lauf     ===================== 
";
         echo "=== Es können noch keine IPS Variablen gesetzt oder gelesen werden ============ 
";
         $HTML_Warnings =$warningsChanged.' - Änderung der Warnlage - unverändert nach Erstinstallation'.'</br>';
        }
     else
        {
      $HTML_Warnings =$warningsChanged.' - Änderung der Warnlage '.GetValueString($letzteAenderungBeschr_ID).'</br>';}


       $HTML_WarnLTitle = '</br> Regionen: '.$regionInput1.' - '.$regionInput2.' - '.$regionInput3.'</br>

       <tr>
          <td style="width: 716px; color: #333333; background-color: #E2E9FD ; font-family: Arial; font-weight: bold; font-size: 10pt;" colspan="3">'.$WL_Title.'</td>
        </tr>';
        $HTML_WarnLBody ='
       <tr>
          <td style="width: 716px; color: #333333; background-color: #E2E9FD; font-family: Arial;  font-size: 10pt;" colspan="3">'.$WL_Body.'<br /><br /></td>
        </tr>';
        $HTML_WarnLage = $HTML_WarnLTitle.$HTML_WarnLBody;

$HTML_Footer ='

  </tbody>
</table>
</body>
</html>
';
$WFE_Content       = ($HTML_Table.$HTML_Radar.$HTML_Warnings.$HTML_WarnLage.$HTML_Footer);

   if ( $Update == true )
         {
         echo "=====================     Installation / Erster Lauf     ===================== 
";
         echo "=== Es können noch keine IPS Variablen gesetzt oder gelesen werden ============ 
";

        }
     else
        {
          SetValueString($WFE_ID, $WFE_Content);
          }


// #WFE zusammenstellen - Ende





// *********************************************************
// *********************** Funktionen **********************
// *********************************************************

// *** JSON Daten aus JSON Stream extrahieren ***
function extract_unit($string, $start, $end)
{
$pos = stripos($string, $start);

$str = substr($string, $pos);

$str_two = substr($str, strlen($start));

$second_pos = stripos($str_two, $end);

$str_three = substr($str_two, 0, $second_pos);

$unit = trim($str_three); // remove whitespaces

return $unit;
}

// *** Umlaute als Sonderzeichen entfernen
function trans_Umlaut($unit)
{
$trans = array(
    'Ä'    => 'AeQ',
    'Ö'    => 'OeQ',
    'Ü'    => 'UeQ',
    'ä'    => 'aeQ',
    'ö'    => 'oeQ',
    'ü'    => 'ueQ',
    'ß'    => 'ssQ',
 //**
    'Ä'   => 'AeQ',
    'Ö'   => 'OeQ',
    'Ü'   => 'UeQ',
    'ä'   => 'aeQ',
    'ö'   => 'oeQ',
    'ü'   => 'ueQ',
    'ß'   => 'ssQ',

);
$data = strtr($unit, $trans);
return $data;
}
// Textformatierung
function trans_toUmlaut($unit)
{
$trans = array(
    'AeQ'   =>  'Ä',
    'OeQ'   =>  'Ö',
    'UeQ'   =>  'Ü',
    'aeQ'   =>  'ä',
    'oeQ'   =>  'ö',
    'ueQ'   =>  'ü',
    'ssQ'   =>  'ß',
    'm²'   =>  'm²',
    ' °C'   =>  '°C',
);
$data = strtr($unit, $trans);
return $data;
}

function trans_d($timestamp)
{
$transd = array(
    'Monday'    => 'Montag',
    'Tuesday'   => 'Dienstag',
    'Wednesday' => 'Mittwoch',
    'Thursday'  => 'Donnerstag',
    'Friday'    => 'Freitag',
    'Saturday'  => 'Samstag',
    'Sunday'    => 'Sonntag',
    'Mon'       => 'Mo',
    'Tue'       => 'Di',
    'Wed'       => 'Mi',
    'Thu'       => 'Do',
    'Fri'       => 'Fr',
    'Sat'       => 'Sa',
    'Sun'       => 'So',
    'January'   => 'Januar',
    'February'  => 'Februar',
    'March'     => 'März',
    'May'       => 'Mai',
    'June'      => 'Juni',
    'July'      => 'Juli',
    'October'   => 'Oktober',
    'December'  => 'Dezember'
);
$dow = strtr(date("D", $timestamp), $transd);
return $dow;
}

function trans_BL($BL)
{
$trans = array(
'Baden-Württemberg '      => 'BWB',
'Bayern'                  => 'BAY',
'Berlin'                  => 'BRA',
'Brandenburg'             => 'BRA',
'Bremen'                  => 'NIE',
'Hamburg'                 => 'SHS',
'Hessen'                  => 'HES',
'Mecklenburg-Vorpommern'  => 'MVP',
'Niedersachsen'           => 'NIE',
'Nordrhein-Westfalen'     => 'NRW',
'Reinland-Pfalz'          => 'RHP',
'Saarland'                => 'RHP',
'Sachsen'                 => 'SAC',
'Sachsen-Anhalt'          => 'SAH',
'Schleswig-Holstein'      => 'SHS',
'Thüringen'               => 'THU',
);
$BLs = strtr($BL, $trans);
return $BLs;
}
?>

Gruss Klaus

Hallo Klaus.

Herzlich willkommen im Forum.

Das nenne ich mal einen gelungen Einstieg - gleich in den ersten Beitrag etwas nützliches packen. :cool:

Zeile 612 hast du eine VariablenID (51583) hardgecoded und die Änderung von $regionInput1 auf „Kreis und Stadt Hannover“ führt zu diversen Fehler.

Ich such dann mal ;).

Die Fehler sollten behoben sein, der Code wurde aktualisiert.

Danke für den Hinweis! :slight_smile:

  1. Zeile 513 $currentWarnigs ersetzt durch $reg1wrncnt

  2. Zeile: if(strpos(GetValueString (51583 /[uWetterwarnung\DWD Wetterwarnung\DWD Wetterwarnung Beschreibung]/),„GEWITTER“) != false)
    ersetzt durch if(strpos($DWDwarnings[$regionInput1][0]->description,„GEWITTER“) != false)

  3. In den Zeilen „// Gewittererkennung (Schlagwortsuche im Warnungs-String)“ bis „// Definition 1. RADAR-Pic: Regenradar DE“ waren noch ein paar Schlaglöcher :slight_smile:

Gruss Klaus

Danke Klaus, so klappt’s :).

Erweiterte Version vom 22.01.2016
Ich hatte diesen Update nicht für heute geplant aber die Warnkarte war eingefroren. :confused:
Nicht weil es so kalt ist, sondern der DWD hat die aktuelle Karte in ein anderes Verzeichnis gestellt.:slight_smile:

Änderungen:

<?
// Stand: 23.01.2015

// siehe DWD: http://www.dwd.de/DE/wetter/warnungen_aktuell/objekt_einbindung/objekteinbindung.html

// JavaScript Object Notation (JSON-File)

// Aktualisierung: nach Bedarf, spätestens nach 10 Minuten
// Warnkriterien:  alle, aber auch einzeln auslesbar
// Über den Pfad http://www.dwd.de/DWD/warnungen/warnapp/json/warnings.json wird eine Json-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.

// Ausblick

// Auch zukünftig werden wir das Angebot verbessern und erweitern:
//    Voraussichtlich ab Ende November werden die Bilder der Warnsituation der einzelnen Bundesländer und verschiedener Warnkriterien bereitgestellt werden.
//    Wir planen das flashbasierte Warnmodul durch ein neues Angebot einer konfigurierbaren Warndarstellung ersetzen.
//    Langfristig wird das Warnmanagement auf Gemeindewarnungen umgestellt werden.


// ####### Regionen definieren - anpassen ######
// Den exaten Namen einer Region entnimmt man der Seite http://www.dwd.de/DE/wetter/warnungen/warnWetter_node.html

$regionInput1 = "Kreis Osterholz"; // primäre Region
$regionInput2 = "Kreis und Stadt Bayreuth"; // sekundäre Region - Nachbarregion oder Finca
$regionInput3 = "Kreis Nürnberger Land";    // sekundäre Region - Nachbarregion oder Datscha
$warningThreshold = 0; // Warning Level ab dem die Anzahl der Warnmeldungen für die Regionen gezählt wird
                      // 0 = alles wird gezählt, 1= nur Vorabinf. werden nicht gezählt, 2 = Vorabinf. und einfache Warnungen (gelb) werden nicht gezählt .....
// #############################################


// ####### Ausgaben auf der Management Console aktivieren bzw. deaktivieren #######
$listOverview  = false; // Auflisten einer Übersicht             - ggf. zwecks Analyse einschalten
$listDetails   = false; // Auflisten des unformatierten Inhalts  - ggf. zwecks Analyse einschalten
$listRegion    = false; // Auflisten der Regionen für die eine Warnmeldung vorhanden ist  - zwecks zur Analyse einschalten
$listRegionSel = false; // Auflisten der ausgewählten Regionen   - ggf. zwecks Analyse einschalten
$listWFdetails = false; // Auflisten des unformatierten Inhalts  - ggf. zwecks Analyse einschalten


// #############################################################################

	$DWDwarnings = array(); // Neues Array mit Wetterwarnungen der oben angegebenen Regionen definieren
	$DWDvorabInfo = array(); // Neues Array mit Vorabinformationen der oben angegebenen Regionen definieren
	$DWDmsgs = array(); // Neues Array mit Vorabinformationen & Wetterwarnungen der oben angegebenen prim. Region
   $currentWarnigs  = 0; // Anzahl aktuellen Warnungen

// Variablen-Definitionen
   $VarNames[0]         					= array('name'=>'DWD Wetterwarnungen letzte Aktualisierung (UNIX-Timestamp)', 'type'=>1, 'hidden'=>true, 'profil'=>'~UnixTimestamp', 'position'=> -50, 'default_value'=>0,);
   $VarNames[1]         					= array('name'=>'DWD Wetterwarnungen Region - Anzahl', 'type'=>1, 'hidden'=>true, 'profil'=>'', 'position'=> -40, 'default_value'=>0,);
   $VarNames[2]         					= array('name'=>'DWD Wetterwarnungen für Region(en) - letzte Veränderung (UNIX-Timestamp)', 'type'=>1, 'hidden'=>true, 'profil'=>'~UnixTimestamp', 'position'=> -30, 'default_value'=>0,);
   $VarNames[3]         					= array('name'=>'DWD Wetterwarnungen für Region(en) - Beschreibung der letzten Veränderung', 'type'=>3, 'hidden'=>true, 'profil'=>'', 'position'=> -20, 'default_value'=>'- bisher keine Änderung erfolgt',);
   $VarNames[4]         					= array('name'=>'DWD Wetterwarnungen WFE', 'type'=>3, 'hidden'=>false, 'profil'=>'~HTMLBox', 'position'=> -60, 'default_value'=>'',);

// übergeordnete Instanz identifizieren
	$Parent           						= IPS_GetParent($_IPS['SELF']);
	$ParentModul								= IPS_GetObject($Parent);

// Auto-Update (überprüft, ob alle Objekte im Baum vorhanden sind
	for($i=0;$i<count($VarNames);$i++)
	{
	   if(@IPS_GetObjectIDByName($VarNames[$i]['name'], IPS_GetParent($_IPS['SELF'])) == false)
		{
			$Update 								= true;     // Update-Status auf true setzen
			$i 									= 9999;     // Abbruch der Schleife bei fehlendem Objekt

		}
		else
		{
			$Update 								= false;     // alle Objekte vorhanden -> Update-Status auf false setzen
		}

	}

// DWD Warnmeldungen Auswertelogik
if(($ParentModul['ObjectType'] == 1) && ($ParentModul['ObjectName'] == 'DWD Wetterwarnungen') && ($Update == false))
  {

	// Variablen identifizieren
	   $letzteAktualisierung_ID        	= IPS_GetObjectIDByName($VarNames[0]['name'], IPS_GetParent($_IPS['SELF']));
	   $anzahlMeldungen_ID             	= IPS_GetObjectIDByName($VarNames[1]['name'], IPS_GetParent($_IPS['SELF']));
	   $letzteAenderung_ID 			      = IPS_GetObjectIDByName($VarNames[2]['name'], IPS_GetParent($_IPS['SELF']));
	   $letzteAenderungBeschr_ID 			= IPS_GetObjectIDByName($VarNames[3]['name'], IPS_GetParent($_IPS['SELF']));
      $WFE_ID                          = IPS_GetObjectIDByName($VarNames[4]['name'], IPS_GetParent($_IPS['SELF']));

   // IPS Werte auslesen
		$letzteAktualisierung	         = getValueInteger($letzteAktualisierung_ID);
   	$anzahlMeldungen   	            = getValueInteger($anzahlMeldungen_ID);
   	$letzteAenderung   	            = getValueInteger($letzteAenderung_ID);
		$letzteAenderungBeschr           = getValueString($letzteAenderungBeschr_ID);
   	$WFE  	                        = getValueString($WFE_ID);

	}

#######################################################################################################################################

// Install-Routinen

elseif($_IPS['SENDER'] == 'Execute')
{
	if((($ParentModul['ObjectType'] != 1) && ($ParentModul['ObjectName'] != 'DWD Wetterwarnungen')) || ($Update == true))
	{
	   if(($ParentModul['ObjectType'] != 1) && ($ParentModul['ObjectName'] != 'DWD Wetterwarnungen'))
	   {
		   // Dummy-Instanz anlegen und Script drunterhängen
	      $ModulID				= IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}");
	      IPS_SetName($ModulID, 'DWD Wetterwarnungen');
	      IPS_SetParent($ModulID, $Parent);
	      IPS_SetParent($_IPS['SELF'], $ModulID);
	      IPS_SetHidden($_IPS['SELF'], true);
	      IPS_ApplyChanges($ModulID);
      }
      // Variablen anlegen - wenn nicht vorhanden
      // 1. vorhandene Vars auslesen
      $ModulID					= IPS_GetParent($_IPS['SELF']);
      for($i=0;$i<count($VarNames);$i++)
		{
		   if(@IPS_GetObjectIDByName($VarNames[$i]['name'], IPS_GetParent($_IPS['SELF'])) == false)
		   {
		   $VarID				= IPS_CreateVariable($VarNames[$i]['type']);
		   IPS_SetName($VarID, $VarNames[$i]['name']);
		   IPS_SetHidden($VarID, $VarNames[$i]['hidden']);
		   IPS_SetPosition($VarID, $VarNames[$i]['position']);
		   IPS_SetParent($VarID, $ModulID);
		   SetValue($VarID, $VarNames[$i]['default_value']);
			}
				// Profile zuweisen
		$VarID				= IPS_GetObjectIDByName($VarNames[$i]['name'], IPS_GetParent($_IPS['SELF']));
		IPS_SetVariableCustomProfile($VarID, $VarNames[$i]['profil']);
		}

	}
	 echo 'Script Name #'.$_IPS['SELF'];
	 echo "#9999 IPS Wetterwarnung: Install ready (neue Objekte angelegt)
";
	 if(function_exists("IPSLogger_Dbg")) IPSLogger_Dbg(c_LogId, "#9999 IPS Wetterwarnung: Install ready (neue Objekte angelegt)");

}
else
{
	echo "Script #".$_IPS['SELF']." Wetterwarnung: ohne Ergebnis gelaufen (keine Objekte gefunden/Objekte fehlerhaft
";
	if(function_exists("IPSLogger_Err")) IPSLogger_Err(c_LogId, "Script #".$_IPS['SELF']." Wetterwarnung: ohne Ergebnis gelaufen (keine Objekte gefunden/Objekte fehlerhaft)");
}

// Timer-Management
	 IPS_SetScriptTimer($_IPS['SELF'], 10*60);



// ########### Warnmeldung von DWD Webseite auslesen ##########################


// JSON Objekt holen
$json = file_get_contents("http://www.wettergefahren.de/DWD/warnungen/warnapp/warnings.json");

	if( empty($json) )
	   {  IPS_LogMessage( IPS_GetName($_IPS['SELF']), "can't get url content");   return;  }
     // var_dump($json);
     
// Warnmeldungen aus dem JSON Objekt extrahieren
$unit = extract_unit($json, 'warnWetter.loadWarnings(', ');'); // Daten aus dem JSON Objekt extrahieren
// var_dump($unit);

// $unit = utf8_encode($unit); // bringt nicht den gewünschten Effekt

$data = trans_Umlaut($unit); // Umlaute und "ß" zwecks nachfolgendem json_decode entfernen und mit "..Q" markieren

$weather_alerts = json_decode($data); // Daten formatieren

          $reg1wrncnt = 0;
          $reg2wrncnt = 0;
          $reg3wrncnt = 0;
          $reg1infcnt = 0;

          
// ************ Overview  ***********************************************

   if ( $listOverview == true )
	  {
      echo  "Letzte Aktualisierung durch DWD am ".trans_d(substr($weather_alerts->time, 0, 10))." ".date('d.M Y H:i', substr($weather_alerts->time, 0, 10)). " 

";
      echo  "  Es sind für ".count((array)$weather_alerts->warnings)." Regionen Warnmeldungen vorhanden 

";
      echo  "  Es sind für ".count((array)$weather_alerts->vorabInformation)." Regionen Vorabinformationen vorhanden 



";
     }

// ************ Details  ***********************************************

   if ( $listDetails == true )
	  {
      echo "======================= Warnings  ====================== 
";
      print_r($weather_alerts->warnings);

      echo "================== Vorabinformation  =================== 
";
      print_r($weather_alerts->vorabInformation);
     }

// ************ Region  ***********************************************
   if($listRegion == true)
	  {
	   echo "Warnmeldungen für folgende Regionen sind z.Zt. vorhanden: 

";
         // print_r ($weather_alerts->warnings);
         // var_dump($weather_alerts->warnings);
	  }
	  
   $i = 0;
   
	foreach($weather_alerts->warnings as $value)
	       {
           // var_dump($value);

          for($j=0;$j<(count($value));$j++)
           {
            // print_r($value[$j]);
            // echo "next value ".$j."
";

            $data= trans_toUmlaut(($value[$j]->regionName));
            $value[$j]->regionName = $data;
            // echo "
".$value[$j]->regionName;

            $data = trans_toUmlaut($value[$j]->event);
            $value[$j]->event = $data;
            // echo "
".$value[$j]->event;

            $data = trans_toUmlaut($value[$j]->headline);
            $value[$j]->headline = $data;
            // echo "
".$value[$j]->headline;

            $data = trans_toUmlaut($value[$j]->description);
            $value[$j]->description = $data;
            // echo "
".$value[$j]->description;

            $data = trans_toUmlaut($value[$j]->instruction);
            $value[$j]->instruction = $data;
            // echo "
".$value[$j]->instruction;

            $data = trans_toUmlaut($value[$j]->state);
            $value[$j]->state = $data;
            // echo "
".$value[$j]->instruction;

			  // *********************************************************************
           // echo " =================== Region : ".$i."  Warnung #: ".$j."
";
           // echo $j."
";
           // print_r($value[$j]);
           // *********************************************************************

            if (($value[$j]->regionName  == $regionInput1) or ($value[$j]->regionName  == $regionInput2) or ($value[$j]->regionName  == $regionInput3))
              {
               $DWDwarnings[$value[$j]->regionName] = $value; // Aufbau einer eigenen Tabelle mit den Angaben aus $regionInput1, -2, -3
              }
// Hier wird eingestellt ab welcher Warnstufe die aktuelle Anzahl Meldungen hochgezählt wird
				if (($value[$j]->level > $warningThreshold) and (($value[$j]->regionName  == $regionInput1) or ($value[$j]->regionName  == $regionInput2) or ($value[$j]->regionName  == $regionInput3)))
	           {
				   $currentWarnigs = $currentWarnigs + 1; // Aktuelle Anzahl von Meldungen größer Level 0 zählen
        			  switch ($value[$j]->regionName)
					       {
                      case $regionInput1:
                           $reg1wrncnt=$reg1wrncnt+1;
                           break;
                      case $regionInput2:
                           $reg2wrncnt=$reg2wrncnt+1;
                           break;
                      case $regionInput3:
                           $reg3wrncnt=$reg3wrncnt+1;
                           break;
                      }
                //  echo "
 Anzahl Warnmeldungen > Warnstufe 0 :  aktueller Level: ".$value[$j]->level." Anzahl Warnmeldumgen insges: ".$currentWarnigs."
";
                //  echo "
 Region 1: ".$reg1wrncnt;
                //  echo "
 Region 2: ".$reg2wrncnt;
                //  echo "
 Region 3: ".$reg3wrncnt;
                //  echo "
 ";

				  }

      	  	if(($listRegion == true) and ($j == 0))
				  {
               echo $value[$j]->regionName."
"; // Regionsnamen für die eine Meldung vorhanden ist auflisten
		        }
// ************ RegionSel  ***********************************************

            if ($listRegionSel == true)
				  {
               if (($value[$j]->regionName  == $regionInput1) or ($value[$j]->regionName  == $regionInput2) or ($value[$j]->regionName  == $regionInput3))
				     {

                  if ($j == 0)
						  {
                     echo "
 **************************************************************************";
					      echo "
  Für die Region ".$value[$j]->regionName." sind ".count($value)." Warnmeldung(en) vorhanden" ;
					      echo "
 **************************************************************************";
    					  }

                     // print_r($value[$j]);

                  echo "
 ** Warnmeldung #".($j+1)." **";
                  echo "
 Warnstufe............: ".$value[$j]->level;
			           // 5 = Warnungen vor extremem Unwetter
			           // 4 = Unwetterwarnungen
			           // 3 = Warnungen vor markantem Wetter
			           // 2 = Wetterwarnungen
			           // 1 = Vorabinformatio Unwetter
			         
                  echo "
 Warntyp..............: ".$value[$j]->type;
                    // In folgender Tabelle sind Warntypen mit ? markiert, die noch nicht in der Praxis getestet werden konnten!
			           // 0 = Gewitter inklusive Begleiterscheinungen
                    // 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 ?

                  echo "
 Ab  ( Höhenmeter )...: ".$value[$j]->altitudeStart;
                  echo "
 Bis ( Höhenmeter )...: ".$value[$j]->altitudeEnd;
            
                  $timestamp = substr($value[$j]->start, 0, 10);
                  $dow = trans_d($timestamp);
                  $start = $dow.", ".date('d.M Y H:i', $timestamp)." Uhr ";
                  echo "
 Beginnzeitpunkt......: ".$start;

                  $timestamp = substr($value[$j]->end, 0, 10);
                  $dow = trans_d($timestamp);
                  $end = $dow.", ".date('d.M Y H:i', $timestamp)." Uhr ";
                  echo "
 Endzeitpunkt.........: ".$end;
   	   			echo "
 Ereignis.............: ".$value[$j]->event;
	   	   		echo "
 Kopfzeile............: ".$value[$j]->headline;
                  echo "
 Beschreibung.........: ".$value[$j]->description;
                  echo "
 Anweisung............: ".$value[$j]->instruction;
                  echo "
 Bundesland...........: ".$value[$j]->state;
                  echo " 
";
				    }
				
				}
            // echo "
 ============================================================";
           }
            // print_r($value);
            // echo "
".$i;
            $i=$i+1;
        }

      if ($listRegionSel == true){
		    echo "
 Es sind ".($i)." Warnmeldungen durchsucht worden 
";
			 }
	// Vorabinfo einfügen 20160121

// Begin vorabInformation auswerten
   if($listRegion == true)
	  {
	   echo "Vorabinformationen für folgende Regionen sind z.Zt. vorhanden: 

";
         // print_r ($weather_alerts->vorabInformation);
         // var_dump($weather_alerts->vorabInformation);
	  }

   $k=0 ; /* Zähler */
	foreach($weather_alerts->vorabInformation as $info)
	       {
            //var_dump($info);
          for($j=0;$j<(count($info));$j++)
           {
            // print_r($info[$j]);
            // echo "next value ".$j."
";

            $data= trans_toUmlaut(($info[$j]->regionName));
            $info[$j]->regionName = $data;
            // echo "
".$info[$j]->regionName;

            $data = trans_toUmlaut($info[$j]->event);
            $info[$j]->event = $data;
            // echo "
".$info[$j]->event;

            $data = trans_toUmlaut($info[$j]->headline);
            $info[$j]->headline = $data;
            // echo "
".$info[$j]->headline;

            $data = trans_toUmlaut($info[$j]->description);
            $info[$j]->description = $data;
            // echo "
".$info[$j]->description;

            $data = trans_toUmlaut($info[$j]->instruction);
            $info[$j]->instruction = $data;
            // echo "
".$info[$j]->instruction;

            $data = trans_toUmlaut($info[$j]->state);
            $info[$j]->state = $data;
            // echo "
".$info[$j]->instruction;

			  // *********************************************************************
			  if(($listRegion == true) )
			    {
              echo $k." ".$info[$j]->regionName."  - ".$info[$j]->headline;
              echo "
";
              // print_r($info[$j]);
             }
           // *********************************************************************
           
            if (($info[$j]->regionName  == $regionInput1) or ($info[$j]->regionName  == $regionInput2) or ($info[$j]->regionName  == $regionInput3))
              {
               $DWDvorabInfo[$info[$j]->regionName] = $info; // Aufbau einer eigenen Tabelle mit den Angaben aus $regionInput1, -2, -3
					// print_r($info[$j]);
					if(($listRegionSel == true))
               {
                // echo $info[$j]->regionName."  - ".$info[$j]->headline."
";
                  if ($j == 0)
						  {
                     echo "
 **************************************************************************";
					      echo "
  Für die Region ".$info[$j]->regionName." sind ".count($info)." Vorabinformation(en) vorhanden" ;
					      echo "
 **************************************************************************";
    					  }

                     // print_r($info[$j]);

                  echo "
 ** Vorabinformation # ".($j+1)." **";
                  echo "
 Warnstufe............: ".$info[$j]->level;
			           // 5 = Warnungen vor extremem Unwetter
			           // 4 = Unwetterwarnungen
			           // 3 = Warnungen vor markantem Wetter
			           // 2 = Wetterwarnungen
			           // 1 = Vorabinformatio Unwetter

                  echo "
 Warntyp..............: ".$info[$j]->type;
                    // In folgender Tabelle sind Warntypen mit ? markiert, die noch nicht in der Praxis getestet werden konnten!
			           // 0 = Gewitter inklusive Begleiterscheinungen
                    // 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 ?

                  echo "
 Ab  ( Höhenmeter )...: ".$info[$j]->altitudeStart;
                  echo "
 Bis ( Höhenmeter )...: ".$info[$j]->altitudeEnd;

                  $timestamp = substr($info[$j]->start, 0, 10);
                  $dow = trans_d($timestamp);
                  $start = $dow.", ".date('d.M Y H:i', $timestamp)." Uhr ";
                  echo "
 Beginnzeitpunkt......: ".$start;

                  $timestamp = substr($info[$j]->end, 0, 10);
                  $dow = trans_d($timestamp);
                  $end = $dow.", ".date('d.M Y H:i', $timestamp)." Uhr ";
                  echo "
 Endzeitpunkt.........: ".$end;
   	   			echo "
 Ereignis.............: ".$info[$j]->event;
	   	   		echo "
 Kopfzeile............: ".$info[$j]->headline;
                  echo "
 Beschreibung.........: ".$info[$j]->description;
                  echo "
 Anweisung............: ".$info[$j]->instruction;
                  echo "
 Bundesland...........: ".$info[$j]->state;
                  echo " 
";



               }
              }
           }
            $k=$k+1;
           }
           if($listWFdetails == true ){echo "
 Es sind ".$k." Vorabmeldungen durchsucht worden";}
         // print_r($DWDvorabInfo); /* Tabelle der Vorabinfos für di eigene(en) Regionen */

// Ende vorabInformation auswerten



      if (($listRegionSel == true) or ($listDetails == true)){
          echo "
 ".$weather_alerts->copyright." - siehe: http://www.dwd.de/DE/service/copyright/copyright_node.html 
";
          }
          
          
          
   if ( $Update == true )
	     {
         echo "=====================     Installation / Erster Lauf     ===================== 
";
         echo "=== Es können noch keine IPS Variablen gesetzt oder gelesen werden ============ 
";
        }
     else
        {
 		   $previousWarnigs = GetValueInteger($anzahlMeldungen_ID);
		  
    		if ($previousWarnigs == $currentWarnigs) {
				 $msg=' ';
				 // echo " keine Veränderung";
	   	
		      }else{
		       $msg = " von bisher ".$previousWarnigs." auf ".$currentWarnigs." Meldungen";
		       // echo $msg;
            SetValueInteger($letzteAenderung_ID, time());
      		setValueString($letzteAenderungBeschr_ID, $msg);
                 }
			// Letzte Aktualisierung als UNIX TIMESTAMP
      	// echo substr($weather_alerts->time, 0, 10);
         SetValueInteger($letzteAktualisierung_ID, intval(substr($weather_alerts->time, 0, 10)));
         SetValueInteger($anzahlMeldungen_ID, $currentWarnigs);
        }
        
     
		  // Tabelle für die prim. Region - Vorabinfo und Warnigs zusammenführen
		  if(count($DWDvorabInfo) <> 0 and count($DWDwarnings) <> 0 )
		    {if($listDetails == true ){echo " Vorabinfo und Warnings vorhanden ";}
           $DWDmsgs=array_merge($DWDvorabInfo[$regionInput1], $DWDwarnings[$regionInput1]);
		    }
		  
		  else
		    {
		     if(count($DWDvorabInfo) == 0 and array_key_exists($regionInput1 , $DWDwarnings))
		        {if($listDetails == true ){echo " Warnings für prim. Region vorhanden ";}
              $DWDmsgs = $DWDwarnings[$regionInput1];
		       }
		  		  
		     if(count($DWDvorabInfo) <> 0 and count($DWDwarnings) == 0 )
		       {if($listDetails == true ){echo " Nur Vorabinfo vorhanden ";}
              $DWDmsgs = $DWDvorabInfo[$regionInput1];
		       }
		    }
        



// ***********************************************
       // Eigene Tabelle ausgeben - Beispiele:
// ***********************************************

       // Die gesamte eigenen Tabelle ausgeben
       // print_r($DWDwarnings);

          // Sind Warnungen für die Prim-Region vorhanden?
         if (array_key_exists($regionInput1 , $DWDwarnings )){
      		 $warnNbr = count((array)($DWDwarnings[$regionInput1]));
				 }
				 else{
				 $warnNbr = 0;
				 }
				 
             if($listWFdetails == true )
				 {echo "

 Tabelleneinträge für die Primäre Region = ".$warnNbr."
";
              echo "
 Index ".$warnNbr."
";}
              
             for($d = ($warnNbr-1);$d > -1;$d--)
				 {
             if($listWFdetails == true ){echo "
 Countdown ".$d."
";}
             //print_r($DWDwarnings[$regionInput1][$d]);
             }
  
		 
		 
   		// Zugriff auf Index regionName
            // print_r($DWDwarnings[$regionInput1]);
         // Zugriff auf Index regionName und ersten Tabelleneintrag
           //Zuerst Anzahl der Einträge ermitteln
           if (array_key_exists($regionInput1 , $DWDwarnings )){
				 $warnNbr = count((array)($DWDwarnings[$regionInput1]));}
				 else{$warnNbr = 0;}
             //echo "Tabelleneinträge für Region = ".$warnNbr."
";
               
               
             //Zugriff auf erste Warnmeldung - Gezählt wird ab 0!
               if($warnNbr > 0 ){
					// print_r($DWDwarnings[$regionInput1][0]);
               //   print_r($DWDwarnings[$regionInput1][0]->headline);
					}
               
               //Zugriff auf dritte Warnmeldung - Gezählt wird ab 0!
               if($warnNbr > 2  ){
					// print_r($DWDwarnings[$regionInput1][0]);
               // print_r($DWDwarnings[$regionInput1][2]->headline);
               }
               
               // print_r(($DWDwarnings[$regionInput1][1]));
               // print_r(($DWDwarnings[$regionInput1][2]));
               
               
               // print_r($DWDwarnings[$regionInput2]);
               // print_r($DWDwarnings[$regionInput3]);
               
               
               // print_r($DWDvorabInfo); /* Tabelle der Vorabinfos für die eigene(en) Regionen */
               // print_r($DWDmsgs);      /* Tabelle der Vorabinfos plus Warnings für die eigene Regionen */


// #WFE zusammenstellen - Anfang
	if($listWFdetails == true ){echo "
 *** WFE zusammenbauen *** 
";}
   $cMax    = 22;    // max. Stunden der Vorschau in der Timeline
   $pxPh    = 29;    // px pro Stunde auf der Timenline anzeigen

// Definition HTML-Content

   // Zeitstempel des letzten Update durch DWD
   $dow = trans_d(intval(substr($weather_alerts->time, 0, 10))); // day of week ermitteln
   $lastupdate = $dow.", ".date('d.m.Y H:i', intval(substr($weather_alerts->time, 0, 10)))." Uhr "; // Zeitstempel des letzten Update vom DWD

   // Hinweis beim ersten Aufruf des Skripts
   if ( $Update == true )
	     {
         echo "=====================     Installation / Erster Lauf     ===================== 
";
         echo "=== Es können noch keine IPS Variablen gesetzt oder gelesen werden ============ 
";
         $warningsChanged =  date('d.m.Y H:i',time());
        }
     else
        {$warningsChanged =  date('d.M Y H:i',GetValueInteger($letzteAenderung_ID));}


   $WL_Header = '<FONT SIZE="1">DWD Meldungen von:  </FONT><b>'.$lastupdate.'</b>';
   if($listWFdetails == true )
	  {
      if(array_key_exists($regionInput1 , $DWDvorabInfo )){echo count($DWDvorabInfo[$regionInput1])." Vorabinformation(en) für die Region ".$regionInput1."
";}
      if(array_key_exists($regionInput2 , $DWDvorabInfo )){echo count($DWDvorabInfo[$regionInput2])." Vorabinformation(en) für die Region ".$regionInput2."
";}
      if(array_key_exists($regionInput3 , $DWDvorabInfo )){echo count($DWDvorabInfo[$regionInput3])." Vorabinformation(en) für die Region ".$regionInput3."
";}
     }
// print_r($DWDvorabInfo[$regionInput1]);

// Start - Auflisten der Warnmeldungen für $regionInput1 mit farbl. Markierung je nach Warnstufe
// echo $reg1wrncnt;
   if($reg1wrncnt == 0 and $reg2wrncnt == 0 and $reg3wrncnt == 0 )
     {
      $WL_Title = ' keine Meldungen ';
      echo " keine Meldungen 
";
     }
     else {
        if($reg1wrncnt == 0)
		     {
            $WL_Title = ' keine Warnmeldung für die Region '.$regionInput1.' ';
            echo " keine Warnmeldung für die Region - ".$regionInput1." 
";
            
        if($reg2wrncnt == 0)
		     {
            $WL_Title = $WL_Title."</br>".' keine Warnmeldung für die Region '.$regionInput2.' ';
            echo " keine Warnmeldung für die Region - ".$regionInput2." 
";
			  }
		     else
		       {
              $WL_Title = $WL_Title."</br>".$reg2wrncnt.' Warnungen für Region '.$regionInput2;
		        echo $reg2wrncnt.' Warnungen für Region '.$regionInput2."
";
			    }
        if($reg3wrncnt == 0)
		     {
            $WL_Title = $WL_Title."</br>".' keine Warnmeldung für die Region '.$regionInput3.' ';
            echo " keine Warnmeldung für die Region - ".$regionInput3." 
";
			  }
		     else
		       {
		        $WL_Title = $WL_Title."</br>".$reg3wrncnt.' Warnungen für Region '.$regionInput3;
		        echo $reg3wrncnt.' Warnungen für Region '.$regionInput3."
";
			    }
	}
   else
	{
    if($listWFdetails == true )
		{
		 echo $reg1wrncnt.' Warnungen für Region '.$regionInput1."
";
		 echo $reg2wrncnt.' Warnungen für Region '.$regionInput2."
";
		 echo $reg3wrncnt.' Warnungen für Region '.$regionInput3."
";
		}
		 $w = 0;
		 $WL_Title = ' ';
		 $WarnBoxBlue = '<font size="2" color="#E2E9FD"> ■ </font>';
		 $WL_altitudeStart = ' ';
		 $WL_altitudeEnd = ' ';

		 $level1start = time()+($cMax * 3600);
       $level1end = ' ';
       $level1duration = 0;
       
		 $level2start = time()+($cMax * 3600);
       $level2end = ' ';
       $level2duration =0;
       
		 $level3start = time()+($cMax * 3600);
       $level3end = ' ';
       $level3duration = 0;
       
		 $level4start = time()+($cMax * 3600);
       $level4end = ' ';
       $level4duration = 0;
       
		 $level5start = time()+($cMax * 3600);
       $level5end = ' ';
       $level5duration = 0;

       
       
		 for($w=0;$w < count($DWDmsgs); $w++)
	      {
          switch ($DWDmsgs[$w]->level)
			    {
           case 0:
                // echo "
 Warnig level ist 0
";
                // $WarnBoxColor = '#C5E566';    // grün:    keine Warnungen
                $WarnBoxColor = '#E2E9FD';    // blau wie der Hintergrund:    keine Warnungen
                $WarnBox = '<font size="2" color="#E2E9FD"> █ </font>';
                break;
           case 1:
                // echo "
 Warnig level ist 1
";
                $WarnBoxColor = '#F080F0';   // violett
                $WarnBox = '<font size="2" color="#F080F0"> █ </font>';
					 if(substr($DWDmsgs[$w]->start, 0, 10) < $level1start){$level1start = substr($DWDmsgs[$w]->start, 0, 10);}
					 if(substr($DWDmsgs[$w]->end, 0, 10) > $level1end){$level1end = substr($DWDmsgs[$w]->end, 0, 10);}
					 $level1duration = (($level1end-$level1start)/3600);
                break;
           case 2:
                // echo "
 Warnig level ist 2
";
                $WarnBoxColor = '#FFFF00';    // gelb:    Wetterwarnungen #FFEB3B
                $WarnBox = '<font size="2" color="#FFFF00"> █ </font>';
					 if(substr($DWDmsgs[$w]->start, 0, 10) < $level2start){$level2start = substr($DWDmsgs[$w]->start, 0, 10);}
					 if(substr($DWDmsgs[$w]->end, 0, 10) > $level2end){$level2end = substr($DWDmsgs[$w]->end, 0, 10);}
					 $level2duration = (($level2end-$level2start)/3600);
	             break;
           case 3:
                // echo "
 Warnig level ist 3
";
                $WarnBoxColor = '#FA9600';    // orange:  Warnungen vor markantem Wetter #FB8C00
                $WarnBox = '<font size="2" color="#FA9600"> █ </font>';
					 if(substr($DWDmsgs[$w]->start, 0, 10) < $level3start){$level3start = substr($DWDmsgs[$w]->start, 0, 10);}
					 if(substr($DWDmsgs[$w]->end, 0, 10) > $level3end){$level3end = substr($DWDmsgs[$w]->end, 0, 10);}
					 $level3duration = (($level3end-$level3start)/3600);
                break;
           case 4:
                // echo "
 Warnig level ist 4
";
                $WarnBoxColor = '#FF0000';    // rot:     Unwetterwarnungen #E53935
                $WarnBox = '<font size="2" color="#FF0000"> █ </font>';
					 if(substr($DWDmsgs[$w]->start, 0, 10) < $level4start){$level4start = substr($DWDmsgs[$w]->start, 0, 10);}
					 if(substr($DWDmsgs[$w]->end, 0, 10) > $level4end){$level4end = substr($DWDmsgs[$w]->end, 0, 10);}
					 $level4duration = (($level4end-$level4start)/3600);
                break;
           case 5:
                // echo "
 Warnig level ist 5
";
                $WarnBoxColor = '#AF0064';    // violett: Warnungen vor extremen Unwetter #880E4F
                $WarnBox = '<font size="2" color="#AF0064"> █ </font>';
					 if(substr($DWDmsgs[$w]->start, 0, 10) < $level5start){$level5start = substr($DWDmsgs[$w]->start, 0, 10);}
					 if(substr($DWDmsgs[$w]->end, 0, 10) > $level5end){$level5end = substr($DWDmsgs[$w]->end, 0, 10);}
					 $level5duration = (($level5end-$level5start)/3600);
                break;
             }
             // Wenn Höhenangabe ab ...  vorhanden, dann einblenden mit Symbol davor und der Angabe von 'm' danach
             if ($DWDmsgs[$w]->altitudeStart != 0) {
				 $WL_altitudeStart = '   ⇑'.$DWDmsgs[$w]->altitudeStart.'m ';
				 }
				 else {
				 $WL_altitudeStart = ' ';
				 }
				 
				 // Wenn Höhenangabe bis ...  vorhanden, dann einblenden mit Symbol davor und der Angabe von 'm' danach
             if ($DWDmsgs[$w]->altitudeEnd != 0) {
				 $WL_altitudeEnd = '   ⇓'.$DWDmsgs[$w]->altitudeEnd.'m ';
				 }
				 else {
				 $WL_altitudeEnd = ' ';
				 }

       // Tag von Ende und Beginn ungleich? Ja = für Begin und Ende werden jeweils Datum plus Uhrzeit ausgegeben. Nein = für Begin wird Datum plus Uhrzeit und für Ende nur die Uhrzeit ausgegeben
       if (date('Yz', (substr($DWDmsgs[$w]->end, 0, 10))) != date('Yz', (substr($DWDmsgs[$w]->start, 0, 10))))
		    {
          $dows = trans_d(substr($DWDmsgs[$w]->start, 0, 10)); // day of week ermitteln
          $startTimestamp = $dows.". ".date('d.m.Y  H:i',substr($DWDmsgs[$w]->start, 0, 10))." Uhr ";

          $dowe = trans_d(substr($DWDmsgs[$w]->end, 0, 10)); // day of week ermitteln
          $endTimestamp = $dowe.". ".date('d.m.Y  H:i',substr($DWDmsgs[$w]->end, 0, 10))." Uhr ";

          $WL_Title = $WL_Title.'<p>'.$WarnBox.$startTimestamp.'<FONT SIZE="1">&#160 bis </FONT><b> </br>'.$WarnBox.$endTimestamp.' - '.($DWDmsgs[$w]->headline).$WL_altitudeStart.$WL_altitudeEnd.'</p>';
			 }
			 else
			 {
          $dows = trans_d(substr($DWDmsgs[$w]->start, 0, 10)); // day of week ermitteln
          $startTimestamp = $dows.". ".date('d.m.Y H:i',substr($DWDmsgs[$w]->start, 0, 10));

          $dowe = trans_d(substr($DWDmsgs[$w]->end, 0, 10)); // day of week ermitteln
          $endTimestamp = date('H:i',substr($DWDmsgs[$w]->end, 0, 10))." Uhr ";

          $WL_Title = $WL_Title.'<p>'.$WarnBox.$startTimestamp.' - '.$endTimestamp.'  -  '.$DWDmsgs[$w]->headline.$WL_altitudeStart.$WL_altitudeEnd.'</p>';
			 }

			 // Die max Start- und Endezeit der Warnstufen abgreifen und für die Aufbereitung der Timeline merken
			 
		}
	}
}
// Ende - Auflisten der Warnmeldungen für $regionInput1 mit farbl. Markierung je nach Warnstufe
	
	
	
	
$WL_Body = ' ';
$WarnColor = '#C5E566';    // grün:    keine Warnungen
// UNIX-Timestamp
$unix = time();
$tmlnend = 0; // timeline end
$tmlnstr = 0; // timeline start
// echo count($DWDwarnings);
 if (count($DWDwarnings) > 0 )
  if(isset($DWDwarnings[$regionInput1][0]->state)){$BL = ($DWDwarnings[$regionInput1][0]->state);} // Bundesland


$HTML_Header ='
<html>
<head>
	<style type="text/css" media="screen"> body { background-color:#efefef;}
  </style>
</head>';

// Farbe für den senkrechten Balken an linken Rand definieren - Anfang
if ($currentWarnigs == 0){
    $WarnColor = '#E2E9FD';    // blau wie der Hintergrund:    keine Warnungen
    }
    else {
        $WarnColor = '#E2E9FD';    // blau wie der Hintergrund (Default)
    if (array_key_exists($regionInput1 , $DWDwarnings)){
        switch ($DWDwarnings[$regionInput1][0]->level) {
    case 0:
        // echo "
 Warnig level ist 0
";
        if($warningThreshold = 0)
		    {
  		    $WarnColor = '#C5E566';    // grün:    keine Warnungen
		    }
        break;
    case 1:
        // echo "
 Warnig level ist 1
";
        $WarnColor = '#F080F0';   // violett
        break;
    case 2:
        // echo "
 Warnig level ist 2
";
        if($warningThreshold < 2)
		    {
		    $WarnColor = '#FFFF00';    // gelb:    Wetterwarnungen
		    }
        break;
    case 3:
        // echo "
 Warnig level ist 3
";
        if($warningThreshold < 3)
		    {
          $WarnColor = '#FA9600';    // orange:  Warnungen vor markantem Wetter
		    }
        break;
    case 4:
        // echo "
 Warnig level ist 4
";
        if($warningThreshold < 4)
		    {
          $WarnColor = '#FF0000';    // rot:     Unwetterwarnungen
		    }
        break;
    case 5:
        // echo "
 Warnig level ist 5
";
        if($warningThreshold < 5)
		    {
          $WarnColor = '#AF0064';    // violett-dunkel: Warnungen vor extremen Unwetter
		    }
		  break;
    }
  }
}
// Farbe für den senkrechten Balken an linken Rand definieren - Ende

if ($reg1wrncnt > 0){
$elapsed=0; // Dauer der Warnung in h
$elapsed = ((substr($DWDwarnings[$regionInput1][0]->end, 0, 10) - (substr($DWDwarnings[$regionInput1][0]->start, 0, 10)))/3600);

	if($listWFdetails == true ){echo "Dauer: ".$elapsed."
";}

// Anfang ist nicht heute dann Beginn 0Uhr
// Ende ist nicht heute dann Ende 24Uhr
$heuteTag = date('Yz', time());
  if($listWFdetails == true ){echo "Heute  ".$heuteTag."
";}
$endeTag = date('Yz', (substr($DWDwarnings[$regionInput1][0]->end, 0, 10)));
  if($listWFdetails == true ){echo "Ende   ".$endeTag."
";}
$beginnTag = date('Yz', (substr($DWDwarnings[$regionInput1][0]->start, 0, 10)));
  if($listWFdetails == true ){echo "Anfang ".$beginnTag."
";}
if ($beginnTag < $heuteTag)
  {
   $tmlnstr=0;
   if($listWFdetails == true ){echo "Beginn in der Anzeige auf 0Uhr gestetzt 
";}
  }
  elseif ($beginnTag == $heuteTag)
    {
	  $tmlnstr = date('H',(substr($DWDwarnings[$regionInput1][0]->start, 0, 10)));
	  if($listWFdetails == true ){echo "Beginn in der Anzeige auf Begin. ".$tmlnstr." gestetzt 
";}
	 }
  elseif ($beginnTag > $heuteTag)
    {
	  $tmlnstr=24;
	  if($listWFdetails == true ){echo "Beginn in der Anzeige auf 24 Uhr gestetzt 
";}
	 }
  
if ($endeTag != $heuteTag)
  {
   $tmlnend=24;
	if($listWFdetails == true ){echo "Ende in der Anzeige auf 24 Uhr gestetzt 
";}
	}
  else{$tmlnend = date('H',(substr($DWDwarnings[$regionInput1][0]->end, 0, 10)));}


$tmlnbgn=$tmlnstr*$pxPh;
$tmlnstp=$tmlnend*$pxPh;
  if($listWFdetails == true )
    {
     echo '$tmlnstr und $tmlnend';
     echo "
 Begin ".$tmlnstr."h   Stop ".$tmlnend."h   Dauer ".$elapsed."h";
     echo "
 Begin ".$tmlnbgn."px  Stop ".$tmlnstp."px  
";
    }


// Timeline erstellen neu
$Warn0Color = '#C5E566';
$Warn1Color = '#F080F0';
$Warn2Color = '#FFFF00';
$Warn3Color = '#FA9600';
$Warn4Color = '#FF0000';
$Warn5Color = '#AF0064';

if($listWFdetails == true ){echo "
 ******** Timeline erstellen ********* 
";}
$tmln5bgn = 0;
$tmln5stp = 0;
$tmln4bgn = 0;
$tmln4stp = 0;
$tmln3bgn = 0;
$tmln3stp = 0;
$tmln2bgn = 0;
$tmln2stp = 0;
$tmln1bgn = 0;
$tmln1stp = 0;
 //?           $c       = $cMax; // max. Stunden Vorschau in Zählervar. übernehmen

if($level5end!=' ')
   {
    if($listWFdetails == true ){echo "
 Warning - Level 5 von ".date('d.M Y H:i', $level5start)." bis ".date('d.M Y H:i', $level5end)." - Dauer: ".$level5duration." Stunden";}
    $elapse5End =   ceil(($level5end   - time())/3600);
    $elapse5Start = ceil(($level5start - time())/3600);
    if ($elapse5Start<0){$elapse5Start=0;if($listWFdetails == true ){echo "
 negative Werte in 0 überführen";}} // evtl. negative Werte in 0 überführen
    if ($elapse5End >$cMax+0.5){$elapse5End=$cMax+0.5;echo "
 Länge des Balken begrenzt auf max. Stunden der Vorschau in der Timeline plus 0,5h (aus opt. Gründen";} // Balken begrenzen
    if($listWFdetails == true ){echo "
 Level 5 - Dauer der Warnung = ".$elapse5End."h / Maximale Länge des Timeline Balkens = ".$cMax."h";}
    $tmln5stp=$elapse5End*$pxPh;   // px Position End
    $tmln5bgn=$elapse5Start*$pxPh; // px Position Start
    if($listWFdetails == true ){echo "
 px Position Start = ".$tmln5bgn." 
 px Position End   = ".$tmln5stp;}
   }

if($level4end!=' ')
   {
	 if($listWFdetails == true ){echo "
 Warning - Level 4 von ".date('d.M Y H:i', $level4start)." bis ".date('d.M Y H:i', $level4end)." - Dauer: ".$level4duration." Stunden";}
    $elapse4End =   ceil(($level4end   - time())/3600);
    $elapse4Start = ceil(($level4start - time())/3600);
    if ($elapse4Start<0){$elapse4Start=0;if($listWFdetails == true ){echo "
 negative Werte in 0 überführen";}} // evtl. negative Werte in 0 überführen
    if ($elapse4End >$cMax+0.5){$elapse4End=$cMax+0.5;echo "
 Länge des Balken begrenzt auf max. Stunden der Vorschau in der Timeline plus 0,5h (aus opt. Gründen";} // Balken begrenzen
    if($listWFdetails == true ){echo "
 Level 4 - Dauer der Warnung = ".$elapse4End."h / Maximale Länge des Timeline Balkens = ".$cMax."h";}

    $tmln4stp=$elapse4End*$pxPh;   // px Position End
    $tmln4bgn=$elapse4Start*$pxPh; // px Position Start
    if($listWFdetails == true ){echo "
 px Position Start = ".$tmln4bgn." 
 px Position End   = ".$tmln4stp;}
	}

if($level3end!=' ')
   {
    if($listWFdetails == true ){echo "
 Warning - Level 3 von ".date('d.M Y H:i', $level3start)." bis ".date('d.M Y H:i', $level3end)." - Dauer: ".$level3duration." Stunden";}
    $elapse3End =   ceil(($level3end   - time())/3600);
    $elapse3Start = ceil(($level3start - time())/3600);
    if ($elapse3Start<0){$elapse3Start=0;if($listWFdetails == true ){echo "
 negative Werte in 0 überführen";}} // evtl. negative Werte in 0 überführen
    if ($elapse3End >$cMax+0.5){$elapse3End=$cMax+0.5;if($listWFdetails == true ){echo "
 Länge des Balken begrenzt auf max. Stunden der Vorschau in der Timeline plus 0,5h (aus opt. Gründen";}} // Balken begrenzen
    if($listWFdetails == true ){echo "
 Level 3 - Dauer der Warnung = ".$elapse3End."h / Maximale Länge des Timeline Balkens = ".$cMax."h";}
    $tmln3stp=$elapse3End*$pxPh;   // px Position End
    $tmln3bgn=$elapse3Start*$pxPh; // px Position Start
    if($listWFdetails == true ){echo "
 px Position Start = ".$tmln3bgn." 
 px Position End   = ".$tmln3stp;}
	}



if($level2end!=' ')
   {
    if($listWFdetails == true ){if($listWFdetails == true ){echo "

 Warning - Level 2 von ".date('d.M Y H:i', $level2start)." bis ".date('d.M Y H:i', $level2end)." - Dauer: ".$level2duration." Stunden";}}
    $elapse2End =   ceil(($level2end   - time())/3600);
    $elapse2Start = ceil(($level2start - time())/3600);
    if ($elapse2Start<0){$elapse2Start=0;if($listWFdetails == true ){echo "
 - negative Werte in 0 überführen";}} // evtl. negative Werte in 0 überführen
	 if ($elapse2End >$cMax+0.5){$elapse2End=$cMax+0.5;if($listWFdetails == true ){echo "
 Länge des Balken begrenzt auf max. Stunden der Vorschau in der Timeline plus 0,5h (aus opt. Gründen";}} // Balken begrenzen
    if($listWFdetails == true ){echo "
 Level 2 - Dauer der Warnung = ".$elapse2End."h / Maximale Länge des Timeline Balkens = ".$cMax."h";}
    $tmln2stp=$elapse2End*$pxPh;   // px Position End
    $tmln2bgn=$elapse2Start*$pxPh; // px Position Start
    if($listWFdetails == true ){echo "
 px Position Start = ".$tmln2bgn." 
 px Position End   = ".$tmln2stp;}
	}
	
if($level1end!=' ')
   {
    if($listWFdetails == true ){echo "

 Warning - Level 1 von ".date('d.M Y H:i', $level1start)." bis ".date('d.M Y H:i', $level1end)." - Dauer: ".$level1duration." Stunden";}
    $elapse1End =   ceil(($level1end   - time())/3600);
    $elapse1Start = ceil(($level1start - time())/3600);
    if ($elapse1Start<0){$elapse1Start=0;if($listWFdetails == true ){echo "
 - negative Werte in 0 überführen";}} // evtl. negative Werte in 0 überführen
    if ($elapse1End >$cMax+0.5){$elapse1End=$cMax+0.5;if($listWFdetails == true ){echo "
 Länge des Balken begrenzt auf max. Stunden der Vorschau in der Timeline plus 0,5h (aus opt. Gründen";}} // Balken begrenzen
    if($listWFdetails == true ){echo "
 Level 1 - Dauer der Warnung = ".$elapse1End."h / Maximale Länge des Timeline Balkens = ".$cMax."h";}
    $tmln1stp=$elapse1End*$pxPh;   // px Position End
    $tmln1bgn=$elapse1Start*$pxPh; // px Position Start
    if($listWFdetails == true ){echo "
 px Position Start = ".$tmln1bgn." 
 px Position End   = ".$tmln1stp;}
   } // = Vorabinfo

 // ********  Start der Definitionen Timeline ***************
              $elapsed = 0;
              $elapsed = ((substr($DWDwarnings[$regionInput1][0]->end, 0, 10) - (substr($DWDwarnings[$regionInput1][0]->start, 0, 10)))/3600);
              
              $c       = $cMax; // max. Stunden Vorschau in Zählervar. übernehmen
              $elapseEnd =   ceil((substr($DWDwarnings[$regionInput1][0]->end, 0, 10)   - time())/3600);
              $elapseStart = ceil((substr($DWDwarnings[$regionInput1][0]->start, 0, 10) - time())/3600);
              if ($elapseStart<0){$elapseStart=0;if($listWFdetails == true ){echo "
 negative Werte in 0 überführen";}} // evtl. negative Werte in 0 überführen
              if ($elapseEnd >$cMax+0.5){$elapseEnd=$cMax+0.5;echo "
 Länge des Balken begrenzt auf max. Stunden der Vorschau in der Timeline plus 0,5h (aus opt. Gründen";} // Balken begrenzen
                if($listWFdetails == true ){echo "
 Dauer der Warnung = ".$elapseEnd."h / Maximale Länge des Timeline Balkens = ".$cMax."h";}
              $tmlnstp=$elapseEnd*$pxPh;   // px Position End
              $tmlnbgn=$elapseStart*$pxPh; // px Position Start
              if($listWFdetails == true )
				    {
                 echo "
";
				     echo "
          Aktuelle Stunde: ".date('H', time());
				     echo "
                    Dauer: ".$elapsed."h";
				     echo "
Anzahl h im Vorschau Slot: ".$cMax."
";
				  
                 echo "
  Aktueller Zeitstempel..: ".time(); // Dauer der Warnung in h
                 echo "
  Warnung End ...........: ".substr($DWDwarnings[$regionInput1][0]->end, 0, 10);
                 echo "
  Warnung Start .........: ".substr($DWDwarnings[$regionInput1][0]->start, 0, 10);
                 echo "
  Dauer bis Start in h ..: ".$elapseStart;
                 echo "
  Dauer  bis  End in h ..: ".$elapseEnd;
                 echo "
  Timeline Position von..: ".$tmlnbgn."px bis ".$tmlnstp."px";
                 echo "
";
                }
 // ********  Ende der Definitionen Timeline ***************

 // ********  Start Aufbau der Stundenanzeige - Timeline ***************
              $x=''; // Inhalt ist der Aufbau der Stundenanzeige
         for($h= date('H', time());$c > -1;$h++)
				 {
				   // echo "
****";
			 	   // echo "
 Stunde ".$h;
               // echo "
 Countup ".$c."
";

               if($c == $cMax){
				     $x=':00 '; // Doppelpunkt von aktuellem Timestamp steht auf 0px
					  $c= $c-1;
					  if ($h == 23){$h=-1;}
					  }
				   else {
                 if ($h<10){$x=$x.'0';} //Stunde zweistellig ausgeben
                 $x= $x.$h.':00 '; // Minuten und Leerzeichen hinzufügen
                 $c= $c-1;
                 if ($h == 23){$h=-1;}
                          //print_r($DWDwarnings[$regionInput1][$d]);
				   }
             }
 // ********  Ende  Aufbau der Stundenanzeige - Timeline ***************
             


$lineHight = ($warnNbr+2) * 10;
$timelineBase = '<div style="border:1px solid rgb(220, 220, 220); width:714px; height:'.$lineHight.'px; margin-left:auto; margin-right:auto; margin-top:auto; margin-bottom:auto; text-align:left;">';

if($level5end!=' '){
$timelineLVL5 = '<div style="background-color:#E2E9FD; width:696px;height:10px;" id="balken0">
   	           <div style="background-color:'.$Warn5Color.'; width:'.$tmln5stp.'px;height:10px;" id="balken1">
	              <div style="background-color:#E2E9FD; width:'.$tmln5bgn.'px;height:10px;" id="balken2">
	              </div></div></div>';}else{$timelineLVL5 = ' ';}
if($level4end!=' '){
$timelineLVL4 = '<div style="background-color:#E2E9FD; width:696px;height:10px;" id="balken0">
   	           <div style="background-color:'.$Warn4Color.'; width:'.$tmln4stp.'px;height:10px;" id="balken1">
	              <div style="background-color:#E2E9FD; width:'.$tmln4bgn.'px;height:10px;" id="balken2">
	              </div></div></div>';}else{$timelineLVL4 = ' ';}
if($level3end!=' '){
$timelineLVL3 = '<div style="background-color:#E2E9FD; width:696px;height:10px;" id="balken3">
  	              <div style="background-color:'.$Warn3Color.'; width:'.$tmln3stp.'px;height:10px;" id="balken4">
	              <div style="background-color:#E2E9FD; width:'.$tmln3bgn.'px;height:10px;" id="balken5">
	              </div></div></div>';}else{$timelineLVL3 = ' ';}
if($level2end!=' '){
$timelineLVL2 = '<div style="background-color:#E2E9FD; width:696px;height:10px;" id="balken6">
  	              <div style="background-color:'.$Warn2Color.'; width:'.$tmln2stp.'px;height:10px;" id="balken7">
	              <div style="background-color:#E2E9FD; width:'.$tmln2bgn.'px;height:10px;" id="balken8">
	              </div></div></div>';}else{$timelineLVL2 = ' ';}
if($level1end!=' '){
$timelineLVL1 = '<div style="background-color:#E2E9FD; width:696px;height:10px;" id="balken0">
   	           <div style="background-color:'.$Warn1Color.'; width:'.$tmln1stp.'px;height:10px;" id="balken1">
	              <div style="background-color:#E2E9FD; width:'.$tmln1bgn.'px;height:10px;" id="balken2">
	              </div></div></div>';}else{$timelineLVL1 = ' ';}
$timelineHour = '<div style="line-height:30px;margin-top:0px;text-align:justify"></div>
                 <font size="1" color="#A9A9A9" face="Arial">'.$x.'</font>
	              </div>';

$timeline = $timelineBase.$timelineLVL5.$timelineLVL4.$timelineLVL3.$timelineLVL2.$timelineLVL1.$timelineHour;
}
else
{$timeline =
'   <div style="border:1px solid rgb(220, 220, 220); width:714px; height:0px; margin-left:auto; margin-right:auto; margin-top:auto; margin-bottom:auto; text-align:left;">
	 </div>
';}


$HTML_Table ='
<body scroll="no">
<table
 style="text-align: left; margin-left: auto; margin-right: auto; background-color: rgb(220, 220, 220); width: 720px; font-family: Arial;"
 border="0" cellpadding="2" cellspacing="2">
  <tbody>
    <tr>
      <td style="width: 20px; color: #333333; background-color: '.$WarnColor.';" colspan="1" rowspan="6"></td>
      <td style="width: 716px; color: #333333; background-color: #E2E9FD; text-align: left;" colspan="3">'.$WL_Header.'</td>
    </tr>
   <tr>
	<td style="width: 716px; color: #333333; background-color: #E2E9FD; text-align: left;" colspan="3"><FONT SIZE="1">Meldungen für Region:   </FONT><b>'.$regionInput1.'</b></td>
    </tr>
    <tr>
		<td style="width: 716px; color: #333333; background-color: #E2E9FD; text-align: center;" colspan="3">'.$timeline.'</td>
    </tr>';
 // zeile 120: <td style="width: 716px; color: #333333; background-color: #E2E9FD; text-align: center;" colspan="3">.'Hier fehlt die Darstellung des Zeitstrahls'.$unix.'"></img></td>



// Gewittererkennung (Schlagwortsuche im Warnungs-String)
$Blitzkarte                         = false;
if (array_key_exists($regionInput1 , $DWDwarnings )){
if(strpos($DWDwarnings[$regionInput1][0]->description,"GEWITTER") != false)
            {
            $Gewitter = true;
            }
            else
            {
                $Gewitter = false;
            }


$Gewitter = false; // obige Abfrage bringt anschließend keine Blizkarte

// true: tauscht bei Gewitter-Warnmeldungen das SAT24-PIC gegen die Wetteronline-Blitzkarte DE
    $Blitzkarte                         = true;           // true: tauscht bei Gewitter-Warnmeldungen das SAT24-PIC gegen die Wetteronline-Blitzkarte DE


// Definition 3. RADAR-Pic: Blitzkarte DE (Alternative)


if ($currentWarnigs == 0){$wo_Blitzkarte ='
                <a
                 href="http://www.wetteronline.de/blitze" target="_blank">
                 <img  style="width: 222px; height: 225px; alt="Blitzkarte DE"
                        src="http://www.wetteronline.de/?ireq=true&pid=p_blitze_map&src=blitze/vermarktung/p_blitze_map/www/Track/DL/green_flat/DL_Track.gif" width="222" height="225"></a></img></td>';
  }
  else {
   $BLs= trans_BL($BL); // Kürzel des Bundeslandes ermitels
    //   echo $BLs;
  //   kleine Bundesländer werden in Anzeigen größerer Länder dargestellt
   switch ($BL) {
    case "Berlin":
        $BL = "Brandenburg";
        break;
    case "Hamburg":
        $BL = "Schleswig-Holstein";
        break;
    case "Bremen":
        $BL = "Niedersachsen";
        break;
    case "Saarland":
        $BL = "Reinland-Pfalz";
        break;
      }

     $wo_Blitzkarte ='
                <a
                 href="http://www.wetteronline.de/blitze/'.$BL.'" target="_blank">
                 <img  style="width: 222px; height: 225px; alt="Blitzkarte DE"
                        src="http://www.wetteronline.de/?ireq=true&pid=p_blitze_map&src=blitze/vermarktung/p_blitze_map/www/Track/'.$BLs.'/green_flat/'.$BLs.'_Track.gif" width="222" height="225"></a></img></td>';
   }
}


// Definition 1. RADAR-Pic: Regenradar DE
$nr_Regenradar ='
				<a
				 href="http://www.niederschlagsradar.de" target="_blank">
				 <img  style="width: 222px; height: 225px; alt="Niederschlagsradar DE"
						src="http://www.niederschlagsradar.de/image.ashx?type=blitz&lightning?'.$unix.'" width="222" height="225"></a></img></td>';


//http://www.dwd.de/DWD/warnungen/warnapp/json/warning_map.png

if(($Blitzkarte) && ($Gewitter))
{
$HTML_Radar ='
   	<tr>
      	<td style="width: 293px; color: #333333; background-color: #E2E9FD; text-align: right;">
			'.$nr_Regenradar.'
      	<td style="width: 155px; color: #333333; background-color: #E2E9FD; text-align: center;">
			<a
				 href="http://www.dwd.de/DWD/warnungen/warnapp/json/warning_map.png>
				 <img style="width: 159px; height: 225px; alt="DWD Unwetterkarte"
				 src="http://www.wetteronline.de/?ireq=true&pid=p_blitze_map&src=blitze/vermarktung/p_blitze_map/www/Track/NIE/green_flat/NIE_Track.gif" width= "159" height= "225"></a></img></td>
				 <td style="width: 305px; color: #333333; background-color: #E2E9FD; text-align: left;">
			'.$wo_Blitzkarte.'
		</tr>
';
// src="http://www.wettergefahren.de/dyn/app/ws/maps/DE_x_x_0.gif?'.$unix.'" width= "159" height= "225"></a></img></td>
		echo 'Unwetterkarte wird nicht angezeigt!';
}
else
{


$HTML_Radar ='
   	<tr>
      	<td style="width: 216px; color: #333333; background-color: #E2E9FD; text-align: right;">
			'.$nr_Regenradar.'
      	<td style="width: 155px; color: #333333; background-color: #E2E9FD; text-align: center;">
			<a
				 href="http://www.wettergefahren.de/warnungen/warnsituation.html" target="_blank">
				 <img style="width: 180px; height: 225px; alt="DWD Unwetterkarte"
				 src="http://www.dwd.de/DWD/warnungen/warnapp/json/warning_map.png?nocache='.$unix.'" width= "180" height= "225"></a>
				 </img>
			</td>

			<td style="width: 305px; color: #333333; background-color: #E2E9FD; text-align: left;">
			<a
				 href="http://www.sat24.com/de" target="_blank">
				 <img style="width: 230px; height: 225px; alt="Satellitenbild DE Sat24"
				 src="http://www.sat24.com/image.ashx?country=de&type=loop&sat=vis?'.$unix.'" width= "230" height= "225"></a></img></td>
		</tr>';

		if($listWFdetails == true ){echo "
 Unwetterkarte aktualisiert! 
 ";}
}


   if ( $Update == true )
	     {
         echo "=====================     Installation / Erster Lauf     ===================== 
";
         echo "=== Es können noch keine IPS Variablen gesetzt oder gelesen werden ============ 
";
         $HTML_Warnings =$warningsChanged.' - Änderung der Warnlage - unverändert nach Erstinstallation'.'</br>';
        }
     else
		{
      $HTML_Warnings =$warningsChanged.' - Änderung der Warnlage '.GetValueString($letzteAenderungBeschr_ID).'</br>';}


	   $HTML_WarnLTitle = '</br> Regionen: '.$regionInput1.' - '.$regionInput2.' - '.$regionInput3.'</br>

	   <tr>
	      <td style="width: 716px; color: #333333; background-color: #E2E9FD ; font-family: Arial; font-weight: bold; font-size: 10pt;" colspan="3">'.$WL_Title.'</td>
		</tr>';
		$HTML_WarnLBody ='
	   <tr>
	      <td style="width: 716px; color: #333333; background-color: #E2E9FD; font-family: Arial;  font-size: 10pt;" colspan="3">'.$WL_Body.'<br /><br /></td>
		</tr>';
		$HTML_WarnLage = $HTML_WarnLTitle.$HTML_WarnLBody;

$HTML_Footer ='

  </tbody>
</table>
</body>
</html>
';
$WFE_Content   	= ($HTML_Table.$HTML_Radar.$HTML_Warnings.$HTML_WarnLage.$HTML_Footer);

   if ( $Update == true )
	     {
         echo "=====================     Installation / Erster Lauf     ===================== 
";
         echo "=== Es können noch keine IPS Variablen gesetzt oder gelesen werden ============ 
";

        }
     else
        {
		  SetValueString($WFE_ID, $WFE_Content);
		  }


// #WFE zusammenstellen - Ende





// *********************************************************
// *********************** Funktionen **********************
// *********************************************************

// *** JSON Daten aus JSON Stream extrahieren ***
function extract_unit($string, $start, $end)
{
$pos = stripos($string, $start);

$str = substr($string, $pos);

$str_two = substr($str, strlen($start));

$second_pos = stripos($str_two, $end);

$str_three = substr($str_two, 0, $second_pos);

$unit = trim($str_three); // remove whitespaces

return $unit;
}

// *** Umlaute als Sonderzeichen entfernen
function trans_Umlaut($unit)
{
$trans = array(
    'Ä'    => 'AeQ',
    'Ö'    => 'OeQ',
    'Ü'    => 'UeQ',
    'ä'    => 'aeQ',
    'ö'    => 'oeQ',
    'ü'    => 'ueQ',
    'ß'    => 'ssQ',
 //**
    'Ä'   => 'AeQ',
    'Ö'   => 'OeQ',
    'Ü'   => 'UeQ',
    'ä'   => 'aeQ',
    'ö'   => 'oeQ',
    'ü'   => 'ueQ',
    'ß'   => 'ssQ',

);
$data = strtr($unit, $trans);
return $data;
}
// Textformatierung
function trans_toUmlaut($unit)
{
$trans = array(
    'AeQ'   =>  'Ä',
    'OeQ'   =>  'Ö',
    'UeQ'   =>  'Ü',
    'aeQ'   =>  'ä',
    'oeQ'   =>  'ö',
    'ueQ'   =>  'ü',
    'ssQ'   =>  'ß',
    'm²'   =>  'm²',
    ' °C'   =>  '°C',
);
$data = strtr($unit, $trans);
return $data;
}

function trans_d($timestamp)
{
$transd = array(
    'Monday'    => 'Montag',
    'Tuesday'   => 'Dienstag',
    'Wednesday' => 'Mittwoch',
    'Thursday'  => 'Donnerstag',
    'Friday'    => 'Freitag',
    'Saturday'  => 'Samstag',
    'Sunday'    => 'Sonntag',
    'Mon'       => 'Mo',
    'Tue'       => 'Di',
    'Wed'       => 'Mi',
    'Thu'       => 'Do',
    'Fri'       => 'Fr',
    'Sat'       => 'Sa',
    'Sun'       => 'So',
    'January'   => 'Januar',
    'February'  => 'Februar',
    'March'     => 'März',
    'May'       => 'Mai',
    'June'      => 'Juni',
    'July'      => 'Juli',
    'October'   => 'Oktober',
    'December'  => 'Dezember'
);
$dow = strtr(date("D", $timestamp), $transd);
return $dow;
}

function trans_BL($BL)
{
$trans = array(
'Baden-Württemberg '      => 'BWB',
'Bayern'                  => 'BAY',
'Berlin'                  => 'BRA',
'Brandenburg'             => 'BRA',
'Bremen'                  => 'NIE',
'Hamburg'                 => 'SHS',
'Hessen'                  => 'HES',
'Mecklenburg-Vorpommern'  => 'MVP',
'Niedersachsen'           => 'NIE',
'Nordrhein-Westfalen'     => 'NRW',
'Reinland-Pfalz'          => 'RHP',
'Saarland'                => 'RHP',
'Sachsen'                 => 'SAC',
'Sachsen-Anhalt'          => 'SAH',
'Schleswig-Holstein'      => 'SHS',
'Thüringen'               => 'THU',
);
$BLs = strtr($BL, $trans);
return $BLs;
}
?>

Hallo Klaus,

ich habe das neue Script gerade mal ausprobiert, erhalte aber diese Fehlermeldungen:


 Es sind 0 Vorabmeldungen durchsucht worden
Notice:  Undefined index: Kreis Osterholz in C:\IP-Symcon_2_0\scripts\16333.ips.php on line 500

Notice:  Undefined index: Kreis Osterholz in C:\IP-Symcon_2_0\scripts\16333.ips.php on line 500

Warning:  array_merge(): Argument #1 is not an array in C:\IP-Symcon_2_0\scripts\16333.ips.php on line 500


 Tabelleneinträge für die Primäre Region = 0

 Index 0

 *** WFE zusammenbauen *** 

Notice:  Undefined index: Kreis Osterholz in C:\IP-Symcon_2_0\scripts\16333.ips.php on line 594
 keine Meldungen 

 Unwetterkarte aktualisiert! 

Kannst Du da helfen?

Hallo Horst,
hab’ den Code aktualisiert. Da war noch ein Knoten mit dem Array $DWDmsgs.
Danke für die Info!

Hallo Klaus

Jetzt gibt es den Fehler in Zeile 615 :wink:

Notice: Undefined index: Kreis Nienburg in D:\IP-Symcon\scripts\31795.ips.php on line 615
keine Meldungen

Gruß
Jens

Hi,

bei mir kommt

Parse error: syntax error, unexpected end of file in [Wetter_Daten_DWD\DWD Wetterwarnungen] on line 1378
Abort Processing during Fatal-Error: syntax error, unexpected end of file
Error in Script D:\IP-Symcon\scripts\51490.ips.php on Line 1378

1378 ist die letzte Zeile mit ?>

Bei mir auch :o

Code aktualisiert.

Fehler in Zeile 615 - sollte behoben sein.

Fehler in Zeile 1378 von WiBo kann ich nicht rekonst. - copy/paste oder ein Leerzeichen nach ?>

Danke für die Rückmeldungen :slight_smile:

Funkt jetzt auch bei mir.

Leerzeichen der Klassiker etc. hatte ich geprüft. war es nicht.

Moin,

vielen Dank erst einmal für das super geniale Script! Nutze es nun auch schon einige Tage. Mich stört nur die ganzen Meldungen im Log der HTML Seite. Kann man das irgendwie ausstellen?
Hier ein Auszug meiner Meldungen. Man sieht das alle 10 Minuten der komplette Auszug der HTML Werte eingetragen werden und die Meldungen, wenn Warnungen vorhanden sind.

Falls es diese EInstellungen sind, habe ich alles bereits auf „False“

// ####### Ausgaben auf der Management Console aktivieren bzw. deaktivieren #######
$listOverview  = false; // Auflisten einer Übersicht             - ggf. zwecks Analyse einschalten
$listDetails   = false; // Auflisten des unformatierten Inhalts  - ggf. zwecks Analyse einschalten
$listRegion    = false; // Auflisten der Regionen für die eine Warnmeldung vorhanden ist  - zwecks zur Analyse einschalten
$listRegionSel = false; // Auflisten der ausgewählten Regionen   - ggf. zwecks Analyse einschalten
$listWFdetails = false; // Auflisten des unformatierten Inhalts  - ggf. zwecks Analyse einschalten

Ich kenne das nicht, kommt m.E. nicht aus dem Script. Schau mal weiter oben im Log wer der Sender ist.
Vielleicht ist bei Dir auch das Logging der Variable „DWD Wetterwarnungen WFE“ aktiviert.

Bild02.JPGBild03.JPG

Das kommt leider doch aus deinem Script, da du zumindest in dem von mir überarbeiteten Stand, sehr häufig echo oder print_r verwendest.
Und die werden in der V4 im IPS_Log ausgegeben.

Für solche Ausgaben ist es besser mit „if ($debug)“ oder gleich mit IPS_LogMessage() zu arbeiten.

Moin,

Es ist der „Variable Manager“ und nein, der Haken ist nicht gesetzt (Siehe Screenshots). Hast du noch eine Idee?
variable.PNG

Hallo Ralf,

hast du dafür eine überarbeitete Version?

Gruß
Lars

Variablenmanager ist IPS selbst, die bekommst du über die Sonderschalter? Oder so ähnlich nur komplett weg.

Meine Änderungen sind „nur“ das Auskommentieren der echos etc.

Der Link sollte zielführend sein:
https://www.symcon.de/forum/threads/24597-In-Meldungen-die-Zeilen-des-VariableManager-unterdr%C3%BCcken?highlight=VariableManager+Meldungen