FTP Server DWD eingestellt

Hallo
Zur allgemeinen Info die FTP-Zugaenge zum DWD sind heute Morgen um 09:00 Uhr eingestellt worden.
Dies war angekuendigt. Info zum neuen Angebot gibt es hier:
https://www.dwd.de/DE/leistungen/opendata/opendata.html

Betrifft das irgendwelche Module in IPS (z.B. die „Prognose“, die obligatorisch in IPS implementiert ist) ?

Ich hatte eine kostenlose Wetter-App vom DWD auf dem iPhone. Dann gab es ein ominöses Gerichtsurteil und DWD mußte die App kostenpflichtig machen.
Kann da auch noch was auf die IPS-User zukommen, z.B. in Form einer Lizenz-Gebühr für die „Prognose“?

Viele Grüsse
Harald

Die Anzeige vom DWD im WebFront ist von der Änderung nicht betroffen.

paresy

Hmh, ich bekomme da bei diversen Wetterkarten einen Fehler „Instance of a9“ und keine angezeigte Karte. Auf Eurer Demo Seite ebenfalls :eek:.

Hm. Magst du mal ein Bild machen? Bei mir zeigt er alle an [emoji33]

paresy

Aber gerne :slight_smile:

Das ist jetzt von Eurer Demo-Seite. Ähnlich sieht es bei mir lokal aus für die Vorhersagen morgen/übermorgen und 4. Tag.

Also bei mir funktioniert die Wetteranzeige auf der Demoseite.
Was mir auffaellt ist , dass bei mir die Tabs in Deutsch sind und
bei dir in Englisch :confused:

Guter Hinweis.

Von meinem Laptop (W10) aus geht es. Arbeite ich auf meinem Server (2008R2) geht es nicht,

Ist da irgendwie die Sprache oder Zeitzone anders? Welcher Browser?

paresy

Hi … da auch ich den DWD-FTP-Server zum Abholen der Wetterberichte nutzte, habe ich kurzerhand eine kleine Funktion geschrieben, die die Vorhersagetexte vom neuen HTTP-Server holt.

 function API_GetWeatherForecastText($stateCode)
 //Findet zum übergebenen DWD-StateCode entsprechende Wettervorhersagen als Texte
 //Übergabe: [STRING]$stateCode = Bundesland-Code, z.B. DEWG für Hessen
 //Rückgabe: [ARRAY] = Wettervorhersagetexte
 {
  //Fehlerbehandlung
  if(!isset($stateCode)) die("Error in Function ".__FUNCTION__." - Missing argument for \$stateCode");
  if(!is_string($stateCode)) die("Error in Function ".__FUNCTION__." - Value for parameter \$stateCode is not a string");   
//API URL
  $url = "https://opendata.dwd.de/weather/text_forecasts/html/";  
//Vergangene Zeitcodes berechnen, Mögliche Zeitcodes
  $timeCodeArray = array("td2334","td2134","td1934","td1834","td1734","td1634","td1534","td1434","td1334","td1234","td1134","td1034","td0934","td0834","td0734","td0634","td0534","td0334","td0134","yd2334","yd2134","yd1934","yd1834","yd1734","yd1634","yd1534");
  
  //Zeitcodes durchlaufen
  foreach($timeCodeArray as $key => $row)
  {
   //Zeitcode splitten
   $timeCodeSplit = str_split($row,2);
   
   //Zeitcode abhängig vom Tag in Timestamp umwandeln
   if($timeCodeSplit[0] == "td") $timestamp = mktime($timeCodeSplit[1],$timeCodeSplit[2],0);
   if($timeCodeSplit[0] == "yd") $timestamp = mktime($timeCodeSplit[1],$timeCodeSplit[2],0,date("m",strtotime("-1 day")),date("d",strtotime("-1 day")),date("Y",strtotime("-1 day")));
   
   //Zeitcode liegt unterhalb der aktuellen Zeit
   if($timestamp < time())
   {
    //Array Key merken und beenden
    $index = $key;
    break;
   }
  }
  
  //Neues Array erstellen
  $targetCodeArray = array();
  
  //Letzte 5 Zeitcodes durchlaufen
  for($i = $index; $i < $index + 5; $i++)
  {
   //Zeitcode splitten
   $targetCodeSplit = str_split($timeCodeArray[$i],2);
   
   //Zeitcode abhängig vom Tag in Zielcode umwandeln
   if($targetCodeSplit[0] == "td") $targetCode = date("d").$targetCodeSplit[1].$targetCodeSplit[2];
   if($targetCodeSplit[0] == "yd") $targetCode = date("d",strtotime("-1 day")).$targetCodeSplit[1].$targetCodeSplit[2];
   
   //Zielcode in neues Array ablegen
   array_push($targetCodeArray,$targetCode);
  }
   
  //Variablen für Vorhersagetexte initialisieren 
  for($i = 0; $i <= 3; $i++) $text[$i] = "";
  $textTimestamp = 0;
  
  //Vorhersagetage durchlaufen
  for($i = 0; $i <= 3; $i++)
  {
   //Falls noch kein Text für den Vorhersagetag gespeichert ist
   if(!$text[$i])
   {
    //Zeitcodes durchlaufen
    foreach($targetCodeArray as $row)
    {
     //Filename zusammenbauen
     $filename = strval("VHDL".(50 + $i)."_".$stateCode."_".$row."_html");
     
     //Text holen, wenn vorhanden
     $content = @file_get_contents($url.$filename);
              
     //Erfolgreich
     if($content)
     {
      //Text übernehmen
      $text[$i] = $content;
      
      //Falls noch kein Timestamp bestimmt wurde
      if(!$textTimestamp)
      {
       //Timecode splitten
       $split = str_split($row,2);
       
       //Falls Tag nicht dem aktuellen Tag entspricht
       if(intval($split[0]) != intval(date("d")))
       {
        //Timestamp von gesten benutzen
        $textTimestamp = mktime($split[1],$split[2],0,date("m",strtotime("-1 day")),date("d",strtotime("-1 day")),date("Y",strtotime("-1 day")));
       }
       //Tag entspricht aktuellem Tag
       else
       {
        //Timestamp von heute benutzen
        $textTimestamp = mktime($split[1],$split[2],0);
       }
      }
            
      //Schleife abbrechen
      break;
     }
    }
    
   }
  }
  
  //Erster Texteintrag in Kurzbericht und ausführlichen Bericht aufteilen
  $firstTextSplit = explode("</strong>",$text[0]);
  
  //Rückgabe formatieren und Array zusammenstellen
  $return["short"] = trim(strip_tags($firstTextSplit[0]));
  $return["today"] = trim(str_replace("
"," ",strip_tags($firstTextSplit[1])));
  $return["tomorrow"] = trim(strip_tags($text[1]));
  $return["secondday"] = trim(strip_tags($text[2]));
  $return["thirdday"] = trim(strip_tags($text[3]));
  $return["timestamp"] = $textTimestamp;  //Rückgabe
  return $return;
 }

Übergeben müsst Ihr den „State-Code“ von Eurem Bundesland oder des Gebietes. Beispiel für Hessen wäre:

$forecast = API_GetWeatherForecastText("DEWG");
print_r($forecast);

Viele Grüße …

Und hier noch eine für die Unwetterwarnungen in Textform …

 function API_GetWeatherWarnings($regioCode)
 //Findet zum übergebenen DWD-RegioCode entsprechende Wetterwarnungen und Vorabinformationen
 //Übergabe: [STRING]$regioCode = Regiocode, z.B. 106439000 für Rheingau-Taunus-Kreis
 //Rückgabe: [ARRAY] = Wetterwarnungen für den übergebenden RegioCode
 {
  //Fehlerbehandlung
  if(!isset($regioCode)) die("Error in Function ".__FUNCTION__." - Missing argument for \$regioCode");
  if(!is_string($regioCode)) die("Error in Function ".__FUNCTION__." - Value for parameter \$regioCode is not a string");   //API aufrufen und XML einlesen
  $url = "http://www.wettergefahren.de/DWD/warnungen/warnapp/warnings.json";  //JSON API auslesen
  $json = file_get_contents($url);
 
  //Funktion Warnungen extrahieren
  function ExtractUnit($string,$start,$end)
  {
   $pos = stripos($string,$start);
   $str = substr($string,$pos);
   $strTwo = substr($str,strlen($start));
   $secondPos = stripos($strTwo,$end);
   $strThree = substr($strTwo,0,$secondPos);
   $unit = trim($strThree);
   return $unit;
  }
  
  //Funktion zum Ersetzen von Großschreibung in normale Schreibweise
  function ReplaceCaseSensitiveWords($string)
  {
   $string = str_replace("VORABINFORMATION SCHWERES GEWITTER","Vorabinformation schweres Gewitter",$string);
   $string = str_replace("VORABINFORMATION UNWETTER vor SCHWEREM GEWITTER","Vorabinformation Unwetter vor schwerem Gewitter",$string);
   $string = str_replace("VORABINFORMATION UNWETTER vor ORKANBÖEN","Vorabinformation Unwetter vor Orkanböen",$string);
   $string = str_replace("Amtliche UNWETTERWARNUNG vor SCHWEREM GEWITTER mit HEFTIGEM STARKREGEN und HAGEL","Unwetterwarnung vor schwerem Gewitter mit heftigem Starkregen und Hagel",$string);
   $string = str_replace("Amtliche UNWETTERWARNUNG vor ORKANBÖEN","Unwetterwarnung vor Orkanböen",$string);
   $string = str_replace("Amtliche WARNUNG vor GEWITTER","Warnung vor Gewitter",$string);
   $string = str_replace("Amtliche WARNUNG vor STARKEM GEWITTER","Warnung vor starkem Gewitter",$string);
   $string = str_replace("Amtliche WARNUNG vor SCHWEREM GEWITTER","Warnung vor schwerem Gewitter",$string);
   $string = str_replace("Amtliche WARNUNG vor WINDBÖEN","Warnung vor Windböen",$string);
   $string = str_replace("Amtliche WARNUNG vor STARKEN WINDBÖEN","Warnung vor starken Windböen",$string);
   $string = str_replace("Amtliche WARNUNG vor SCHWEREN WINDBÖEN","Warnung vor schweren Windböen",$string);
   $string = str_replace("Amtliche WARNUNG vor STURMBÖEN","Warnung vor Sturmböen",$string);
   $string = str_replace("Amtliche WARNUNG vor ORKANBÖEN","Warnung vor Orkanböen",$string);
   $string = str_replace("Amtliche WARNUNG vor STARKEN STURMBÖEN","Warnung vor starken Sturmböen",$string);
   $string = str_replace("Amtliche WARNUNG vor SCHWEREN STURMBÖEN","Warnung vor schweren Sturmböen",$string);
   $string = str_replace("Amtliche WARNUNG vor DAUERREGEN","Warnung vor Dauerregen",$string);
   $string = str_replace("Amtliche WARNUNG vor NEBEL","Warnung vor Nebel",$string);
   $string = str_replace("Amtliche WARNUNG vor GLÄTTE","Warnung vor Glätte",$string);
   $string = str_replace("Amtliche WARNUNG vor GLATTEIS","Warnung vor Glatteis",$string);
   $string = str_replace("Amtliche WARNUNG vor FROST","Warnung vor Frost",$string);
   $string = str_replace("Amtliche WARNUNG vor LEICHTEM SCHNEEFALL","Warnung vor leichtem Schneefall",$string);
   $string = str_replace("Amtliche WARNUNG vor SCHNEEFALL","Warnung vor Schneefall",$string);
   $string = str_replace("Amtliche WARNUNG vor STARKEM SCHNEEFALL","Warnung vor starkem Schneefall",$string);
   $string = str_replace("Amtliche WARNUNG vor HITZE","Warnung vor extremer Hitze",$string);
   $string = str_replace("
","",$string);
   return $string;
  }    //Warnungen extrahieren und in Array kodieren
  $extract = ExtractUnit($json, 'warnWetter.loadWarnings(', ');'); 
  $array = json_decode($extract,true);
 
  //Übergabearray vorbereiten
  $returnArray = array();
  
  //Warnungen und Vorabinformationen durchgehen und wesentliche Felder in Array schreiben
  if(isset($array["vorabInformation"][$regioCode])) foreach($array["vorabInformation"][$regioCode] as $row) array_push($returnArray,array("headline" => ReplaceCaseSensitiveWords($row["headline"]), "description" => ReplaceCaseSensitiveWords($row["description"]), "start" => round($row["start"] / 1000,0), "end" => round($row["end"] / 1000,0), "region" => $row["regionName"], "time" => round($array["time"] / 1000,0)));
  if(isset($array["warnings"][$regioCode])) foreach($array["warnings"][$regioCode] as $row) array_push($returnArray,array("headline" => ReplaceCaseSensitiveWords($row["headline"]), "description" => ReplaceCaseSensitiveWords($row["description"]), "start" => round($row["start"] / 1000,0), "end" => round($row["end"] / 1000,0), "region" => $row["regionName"], "time" => round($array["time"] / 1000,0)));
  
  //Rückgabe
  return $returnArray;
 }

Aufrufen hier mit RegioCode (im Beispiel Rheingau-Taunus-Kreis). Im Rückgabearray steht natürlich nur was drin, wenn auch aktuelle Unwetterwarnungen vorhanden sind :slight_smile:

$warnings = API_GetWeatherWarnings("106439000");
 print_r($warnings);

Hi squeeezer,

super Script - Danke! Habe es gleich bei mir verbaut :smiley:

Danke & Ciao
Pitti

Gerne [emoji4]. Wenn ich irgendwann mal mehr Zeit habe, dann beschäftige ich mich mal mit PHP Modulen und dann wird das noch in ein Solches umgewandelt [emoji6]

Woher bekommt man denn den RegioCode anderer Landschaften?

Viele Grüsse
Harald

Moin Harald. Gut dass Du fragst :slight_smile: … Du kuckst Dir einfach das JSON-File aus der API an:

http://www.wettergefahren.de/DWD/warnungen/warnapp/warnings.json

… und kopierst Dir den kompletten Inhalt in einen Texteditor. In diesem suchst Du dann z.B. nach Deinem Kreis oder Dein Gebiet. Du solltest diesen dann in einem Key „regionName“ finden. Direkt davor ist dann die Region-ID zu finden, die Du brauchst.

Wenn das zu unübersichtlich ist, kann man auch einen Online-JSON-Formatter verwenden (z.B. JSON Formatter & Validator) und die URL oben eingeben. Dann sieht das JSON-File etwas lesbarer aus :slight_smile: … über die Browser-Suche kannst Du dann nach einem Landkreis suchen.

Viele Grüße …

… ergänzend hierzu noch der Hinweis, dass gerade eine Wetterwarnung vorliegen sollte, sonst findet man nix :slight_smile: … also am Besten bei Sturm, Frost, Nebel, Dauerregen, etc. suchen :wink:

Ich hatte schon mittlerweile ein

print_r($array);

eingefügt und mir diverse Codes rausgepickt. Ich dachte eben, dass es beim DWD ein Verzeichnis gibt.

Hab z.Z. nur Daten für Landkreise gefunden (weil’s da aktuelle Warnungen gibt), allerdings auch z.B. „Stadt Herne“; da frage ich mich noch, wie tief die Regionen runtergebrochen sind.

Dann sind da auch noch Daten zu [level] und [type] sichtbar, deren Definition ich nur spekulativ deuten kann.

Ist da was genaues bekannt?

Viele Grüsse
Harald

Hi. Ich hab herausbekommen, dass hier der sogenannte Amtliche Gemeindeschlüssel verwendet wird … siehe Amtlicher Gemeindeschlüssel – Wikipedia. Das Beispiel (1)06439000 ist der Kreisschlüssel des Rheingau-Taunus-Kreises. Ich weiß leider nicht, wie detailliert der DWD die Wetterwarnungen aufsplittet. Wenn man in Wikipedia eine Stadt sucht, wird in der Schnellübersicht auch der jeweilige Gemeindeschlüssel angezeigt, z.B. 06439008 für Idstein. Hier kann ich aber trotz Wetterwarnung keinen Eintrag finden. Ich vermute, dass neben Landkreisen ggf. noch größere Städte aufgelistet werden. Probiert es einfach mal aus, wenn ihr neue Erkenntnisse habt, immer her damit [emoji4]

Hallo,

wer seinen Gemeindeschlüssel sucht, kann diesen unter:

Gemeinsames Datenangebot der Statistischen Ämter des Bundes und der Länder (statistisches Bundesamt, Gemeindeverzeichnis Online)

erfahren.

Wir hier in Berlin haben z.B. einen sehr einfachen Schlüssel: 11000000 :smiley:

Viele Grüße,

Burkhard

Hi zusammen,

da gerade eine Warnung reinkam, hier mal das Ergebnis des Scripts bei mir.

Zusammen mit meiner Meldungsanzeige eine feine Sache :smiley:

Die
Die Meldungsanzeige ist bei mir auf der Einstiegs-Übersichtsseite. Diese habe ich noch etwas aufgebohrt, so dass man jetzt auf den OK Button zur Unwetter-Seite springen kann :cool:

Langsam macht’s richtig Spaß
Pitti