DWD-Wetterwarnungen

Ich habe mir eine Funktion zusammengehackt, die für eine bestimmte Region die aktuell vorhandenen Warnungen vom DWD ausliest (von der Website). Man bekommt die Warnungen dann als ein Array von Datenobjekten, so dass sie sich auf vielfältige Weise weiterverwerten bzw. anzeigen lassen.

Den Code für die eigene Region findet man so:

  1. auf diesen Link klicken.
  2. auf die eigene Region klicken bis sich das Fenster mit den Warnungen in Textform öffnet
  3. die URL jenes Fensters enthält den Code. Es sind die drei Großbuchstaben zwischen http://www.dwd.de/dyn/app/ws/html/reports/ und _warning_de.html.

Die Struktur des Rückgabeobjekts lässt sich mittels des Aufrufs print_r ausgeben. Es handelt sich um ein Array(!) von Datenobjekten. Als Hilfestellung:

[ul]
[li]‚level‘ - die Warnstufe von 1…4
[/li][li]‚title‘ - der Originaltitel der Warnung
[/li][li]‚class‘ - Textstring in Großbuchstaben, welcher der Warnstufe entsprechen sollte z.B. „UNWETTERWARNUNG“
[/li][li]‚matter‘ - Textstring in Großbuchstaben, der angibt wovor gewarnt wird, z.B. „SCHWERER STURM“
[/li][li]‚area‘ - Textstring, der die Gegen angibt für die die Warnung gilt (z.B. „Schleswig-Holstein“)
[/li][li]‚starttime‘, ‚endtime‘ - das Zeitfenster in dem die Warnung gilt. Es handelt sich um Datumsobjekte.
[/li][li]‚issuer‘ - Herausgeber der Warnung, üblicherweise „DWD“
[/li][li]‚issuetime‘ - Zeitpunkt, wann die Warnung herausgegeben wurde. Datumsobjekt.
[/li][li]‚ineffect‘ - Boolean, der angibt ob die Warnung jetzt gerade gilt.
[/li][li]‚upcoming‘ - Boolean, der angibt ob die Gültigkeit der Warnung noch bevorsteht.
[/li][li]‚text‘ - der Textinhalt der Warnung, z.B. „Es regnet Katzen und Hunde.“
[/li][li]‚datacenter‘ - unwichtiger String, der angibt welches Rechenzentrum die Daten verarbeitet hat (denke ich mal).
[/li][/ul]


print_r(dwdGetWarnings('HHX')); // HHX ist der Code für Hamburg

function dwdGetWarnings($code)
{
	$result = Array();
	
	$url = 'http://www.dwd.de/dyn/app/ws/html/reports/' . $code . '_warning_de.html';

	$content = Sys_GetURLContent($url);

	$xml = simplexml_load_string($content);

	$i = 2;
	while($xml->body->div->div[$i]->div)
	{
		$warning = Array();

		$style = $xml->body->div->div[$i]->attributes()->style;
		$color = substr($style, strpos($style, ': #') + 3);
		switch($color)
		{
			case '5FB4FF':
		      $warning['level'] = 0;
		      break;
			case 'FFFE00':
			case 'FFFF00':
		      $warning['level'] = 1;
		      break;
		   case 'FA9600':
		      $warning['level'] = 2;
		      break;
		   case 'FF0000':
		      $warning['level'] = 3;
		      break;
			case 'AE1365':
		      $warning['level'] = 4;
		      break;
			default:
		      $warning['level'] = 4;
		      break;
		}

		for($j = 0; $j < count($xml->body->div->div[$i]->div->p); $j++)
		{
			$line = utf8_decode(trim($xml->body->div->div[$i]->div->p[$j]));

			switch($j)
			{
			   case 0:
			      $warning['title'] = $line;
			      $warning['class'] = substr($line, strpos($line, ' ') + 1);
			      $warning['matter'] = substr($warning['class'], strpos($warning['class'], ' vor ') + 5);
			      $warning['class'] = substr($warning['class'], 0, strpos($warning['class'], ' vor '));
			      $warning['matter'] = str_replace('ER ', 'E ', $warning['matter']);
			      $warning['matter'] = str_replace('EM ', 'ER ', $warning['matter']);
			      $warning['matter'] = str_replace('EN ', 'E ', $warning['matter']);

			      break;
				case 1:
				   $warning['area'] = substr($line, 4);
				   break;
				case 2:
				   $warning['starttime'] = new DateTime(substr($line, strpos($line, ', ') + 2, 16));
				   break;
				case 3:
				   $warning['endtime'] = new DateTime(substr($line, strpos($line, ', ') + 2, 16));
				   $warning['ineffect'] = false;
				   $warning['upcoming'] = false;
					if
					(
						(time() >= $warning['starttime']->getTimestamp()) &&
						(time() <= $warning['endtime']->getTimestamp())
					)
					{
					   $warning['ineffect'] = true;
					}
					if
					(
						(time() < $warning['starttime']->getTimestamp()) &&
						(time() < $warning['endtime']->getTimestamp())
					)
					{
					   $warning['upcoming'] = true;
					}
				   break;
				case 4:
				   $warning['issuer'] = str_replace('en ', 'er ', substr($line, 15));
				   break;
				case 5:
				   $warning['issuetime'] = new DateTime(substr($line, strpos($line, ', ') + 2, 16));
				   break;
				default:
				   if($j < count($xml->body->div->div[$i]->div->p) - 1)
					{
					   if(array_key_exists('text', $warning))
						   $warning['text'] .= ' ' . $line;
						else
						   $warning['text'] = $line;
					}
					else
					   $warning['datacenter'] = $line;
			}
		}
		$i++;

		$result[] = $warning;
	}
	
	return $result;
}

Hallo,
kanntest du bereits dieses Skript?
DWD Unwetterwarnung (WFE, Mail und html)

Ja, schien mir etwas mächtig und ist auch optisch nicht so mein Fall. Ich habe dieses Skript jetzt als Alternative gedacht, die leicht in vorhandene Anzeigen etc. einzubinden ist.

Hallo,
seit es so furchtbar heiß ist wie heute ‚wirft‘ das Skript Fehler:

02.07.2015 20:00:01.343 | 49435 | ERROR   | ExecuteThreadID #2   | [Wetter\DWD\Wetterwarnungen] = 
Fatal error:  Uncaught exception 'Exception' with message 'DateTime::__construct(): Failed to parse time string (02.07.2015 um 09) at position 11 (u): The timezone could not be found in the database' in D:\IPS-\scripts\Wetterwarnungen_DWD.ips.php:433
Stack trace:
#0 D:\IPS-\scripts\Wetterwarnungen_DWD.ips.php(433): DateTime->__construct('02.07.2015 um 0...')
#1 D:\IPS-\scripts\Wetterwarnungen_DWD.ips.php(78): dwdGetWarnings('DAX')
#2 {main}
  thrown in D:\IPS-\scripts\Wetterwarnungen_DWD.ips.php on line 433

Fehler wird im Statement von case 5 ‚geworfen‘:


...
        for ($j = 0; $j < count ($xml -> body -> div -> div[$i] -> div -> p);
                    $j ++) {
            $line = utf8_decode (trim ($xml -> body -> div -> div[$i] -> div -> p[$j]));

            switch ($j) {
                case 0:
                    $warning['title'] = $line;
                    $warning['class'] = substr ($line, strpos ($line, ' ') + 1);
                    $warning['matter'] = substr ($warning['class'], strpos ($warning['class'], ' vor ') + 5);
                    $warning['class'] = substr ($warning['class'], 0, strpos ($warning['class'], ' vor '));
                    $warning['matter'] = str_replace ('ER ', 'E ', $warning['matter']);
                    $warning['matter'] = str_replace ('EM ', 'ER ', $warning['matter']);
                    $warning['matter'] = str_replace ('EN ', 'E ', $warning['matter']);
                    break;
                case 1:
                    $warning['area'] = substr ($line, 4);
                    break;
                case 2:
                    $warning['starttime'] = new DateTime (substr ($line, strpos ($line, ', ') + 2, 16));
                    break;
                case 3:
                    $warning['endtime'] = new DateTime (substr ($line, strpos ($line, ', ') + 2, 16));
                    $warning['ineffect'] = false;
                    $warning['upcoming'] = false;
                    if ((time () >= $warning['starttime'] -> getTimestamp ()) && (time () <= $warning['endtime'] -> getTimestamp ())) {
                        $warning['ineffect'] = true;
                    } if ((time () < $warning['starttime'] -> getTimestamp ()) && (time () < $warning['endtime'] -> getTimestamp ())) {
                        $warning['upcoming'] = true;
                    }
                    break;
                case 4:
                    $warning['issuer'] = str_replace ('en ', 'er ', substr ($line, 15));
                    break;
                case 5:
                    $warning['issuetime'] = new DateTime (substr ($line, strpos ($line, ', ') + 2, 16));
                    break;
                default:
                    if ($j < count ($xml -> body -> div -> div[$i] -> div -> p) - 1) {
                        if (array_key_exists ('text', $warning))
                            $warning['text'] .= ' ' . $line;
                        else
                            $warning['text'] = $line;
                    } else
                        $warning['datacenter'] = $line;
            }
        }
        $i ++;

Hatte DWD annonciert, was in den Formaten zu ändern?

Viele Grüsse
Harald