Hallo in die Runde,
Ich habe mich auch mal ein bisschen mit den DWD Wetterdaten beschäftigt und wollte das Ergebnis mal hier teilen.
Weitere Anregungen zur Verbesserung sind gerne Willkommen.
Version 0.31 - FIx Variablen Profilerstellung
Version 0.33 - (voruebergehender) Fix für IPS 4.0 bei Umlautproblemen
Version 0.35 - Warnbilder an-/abschaltber
Version 0.37 - weitere Warnungen hinzugefügt
<?
# ******************************************
# Wettervorhersage / Warnungen aus den Daten des DWD
#
# nach Anregungen aus dem Forum:
# https://www.symcon.de/forum/threads/18782 /*[Objekt #18782 existiert nicht]*/-DWD-Unwetterwarnung-%28WFE-Mail-und-html%29?highlight=dwd+unwetterwarnung+wfe
# https://www.symcon.de/forum/threads/29674 /*[Objekt #29674 existiert nicht]*/-DWD-Wetterwarnungen-JSON-Daten-auswerten
#
# Username: dzvo
# Stand: v0.35 - 11.03.2016
#
# 0.31
# - Grosse Vorschaubilder des aktuellen Wetters eingefuegt (muss noch eventuell nachgearbeitet werden ;-) )
# - Fix VariablenProfil
#
# 0.33
# - Es gibt zusaetzlich Variablen fuer die externe Benutzung:
# - Warnlevel - die Zahl der hoechsten Warnstufe ueber alle Kreise
# - Warnevent - in kurzform zusammengefasste Infos zur Verarbeitung als Pushnachricht
# beide Variablen werden nur auf Aendrung aktualisiert damit nicht jedesmal bei gleichem Inhalt eine Nachricht gesente wird.
#
# 0.35
# - Ueber eine Variable ($warnbilder_anzeigen) definiert ob die Landkreis Warnbilder mit angezeigt werden sollen oder nicht.
#
# 0.36
# - Fehlerbeseitigung, wenn keine Warnmeldungen vorlagen
#
# 0.37
# - weitere Warnungen hinzugefügt
#
# Installation
# ------------
# Einfach Ausfuehren, die benoetigten Variablen werden automatisch angelegt.
#
#
# Bekannte Fehler
# ---------------
# Da ich leider keine umfassende Uebersicht der einzelnen definitonen des aktuellen Wetters gefunden habe, kommt es vor das
# bei neuen Wettervorkommnissen ab Zeile 410 / das Array weiter gefuellt werden muss. Gerne pfelge ich diese nach.
# Unter Übersicht unter http://www.dwd.de/DE/wetter/warnungen_aktuell/objekt_einbindung/objekteinbindung.htm gibt es eine Uebersicht
# der von DWD zur Verfuegung gestellen Kreise.
#
# Konfiguration
# -------------
# Hier eine beliebige Anzahl von Warnkreisen eintragen
# Die passenden Regionsnamen findet man unter der Übersichtskarte nach dem ankicken der Region
# http://wettergefahren.de/warnungen/warnsituation.html
#
$region = array ("Hansestadt Hamburg", "Ostfrisische Küste", "Nordfriesische Küste", "Kreis Prignitz");
# Anzahl der Warnbilder in einer Zeile
$warnbilder_anzeigen = true;
$warnbilder_tabellenbreite = 715;
$warnbilder_anzahl_je_reihe = 6;
# Im Debug Modus das Script einfach 2 mal hintereinader ausfuehren.
# Dadurch das dass Script nicht über dem Timer ausgeführt wird werden alle Orte / Warnungen ausgewertet, ob z.B. alle Billder geladen werden.
# Wird das Script über den Timer ausgeführt werden nur die eigenen Orte geladen.
$debug = true;
# *** Script Code *******************************
// Datenquelle
$json = file_get_contents("http://www.dwd.de/DWD/warnungen/warnapp/json/warnings.json");
// fals die Daten nicht geladen werden koennen
if( empty($json) || $json == "" ) { goto ende; }
// Erst einmal die Enden Abschneiden
$daten = json_decode(substr($json, 24, strlen($json) - 26 ),TRUE);
// Daten aufloesen
$daten_einzeln = array();
if( !empty($daten['warnings']) ) {
foreach($daten['warnings'] as $eintrag ) {
for ( $i = 0; $i < count($eintrag); $i ++ ) {
$daten_einzeln[] =
array("state" => utf8_decode($eintrag[$i]['state']),
"stateShort" => $eintrag[$i]['stateShort'],
"regionName" => utf8_decode($eintrag[$i]['regionName']),
"description" => utf8_decode($eintrag[$i]['description']),
"startTime" => date("d.m.Y H:i:s", substr($eintrag[$i]['start'], 0, 10)),
"endTime" => date("d.m.Y H:i:s", substr($eintrag[$i]['end'], 0, 10)),
"startUnix" => substr($eintrag[$i]['start'], 0, 10),
"endUnix" => substr($eintrag[$i]['end'], 0, 10),
"headline" => utf8_decode($eintrag[$i]['headline']),
"event" => utf8_decode($eintrag[$i]['event']),
"instruction" => utf8_decode($eintrag[$i]['instruction']),
"altitudeStart" => $eintrag[$i]['altitudeStart'],
"altitudeEnd" => $eintrag[$i]['altitudeEnd'],
"type" => utf8_decode($eintrag[$i]['type']),
"level" => $eintrag[$i]['level']
);
}
}
}
if ($debug && $_IPS['SENDER'] == "Execute" ) {
$region = array ("");
if ($debug && GetValue(CreateVariableByIdent($_IPS['SELF'], "Orte", "Orte", 3)) != "" ) {
$region = explode('"@"', GetValue(CreateVariableByIdent($_IPS['SELF'], "Orte", "Orte", 3)) );
}
}
// gesuchte Daten auslesen
for ($i=0; $i<count($daten_einzeln); $i++) {
// Nachschauen ob die gesuchten Kreise im JSON enthalten sind
if( in_array( $daten_einzeln[$i]["regionName"] , $region) ) {
// Region neu schreiben
$kreise[] = $daten_einzeln[$i];
}
// Debug auf alle Regionen abfragen
if ( $debug ) {
// Region neu schreiben
$orte_export[] = $daten_einzeln[$i]["regionName"];
}
}
// Debug ... alle aktuellen Orte einzeln rausschreiben
if ($debug && GetValue(CreateVariableByIdent($_IPS['SELF'], "Orte", "Orte", 3)) == "" && !empty($daten['warnings']) ) {
$export = "";
$result = array_values(array_unique($orte_export));
for ($x=0; $x< count($result) - 1; $x++) {
$export .= $result[$x] . '"@"';
}
SetValue(CreateVariableByIdent($_IPS['SELF'], "Orte", "Orte", 3), $export );
} else {
// Variable nach Import loeschen
IPS_DeleteVariable(CreateVariableByIdent($_IPS['SELF'], "Orte", "Orte", 3) );
}
// weiter gehts im Normalprogramm
// Array neu sortieren
if ( !empty($kreise) ) {
$kreise = sortArrayByFields( $kreise, array( "level" => SORT_DESC, "type" => SORT_DESC, "event" => SORT_DESC ) );
}
// Warnlevel & Warnevent definieren
$warnlevel0 = 0; $warnlevel1 = 0; $warnlevel2 = 0; $warnlevel3 = 0; $warnlevel4 = 0; $warnlevel5 = 0;
$warnevent = "";
for ($i=0; (!empty($kreise) && $i<count($kreise)); $i++) {
if ($kreise[$i]["level"] == 1 ) {
$warnlevel1++;
$warnevent .= $kreise[$i]["level"] . "." . $kreise[$i]["type"] . " - " . $kreise[$i]["event"] . " - " . $kreise[$i]["regionName"] . "
";
}
if ($kreise[$i]["level"] == 2 ) {
$warnlevel2++;
$warnevent .= $kreise[$i]["level"] . "." . $kreise[$i]["type"] . " - " . $kreise[$i]["event"] . " - " . $kreise[$i]["regionName"] . "
";
}
if ($kreise[$i]["level"] == 3 ) {
$warnlevel3++;
$warnevent .= $kreise[$i]["level"] . "." . $kreise[$i]["type"] . " - " . $kreise[$i]["event"] . " - " . $kreise[$i]["regionName"] . "
";
}
if ($kreise[$i]["level"] == 4 ) {
$warnlevel4++;
$warnevent .= $kreise[$i]["level"] . "." . $kreise[$i]["type"] . " - " . $kreise[$i]["event"] . " - " . $kreise[$i]["regionName"] . "
";
}
if ($kreise[$i]["level"] == 5 ) {
$warnlevel5++;
$warnevent .= $kreise[$i]["level"] . "." . $kreise[$i]["type"] . " - " . $kreise[$i]["event"] . " - " . $kreise[$i]["regionName"] . "
";
}
}
// Warnevent ausgeben.
if ( empty($warnevent) ) { $warnevent = "Es sind keine Warnmeldungen vorhanden."; }
// Warnlevelstufe generieren
if ( $warnlevel0 >= 0 ) { $level = 0; } if ( $warnlevel1 >= 1 ) { $level = 1; } if ( $warnlevel2 >= 1 ) { $level = 2; } if ( $warnlevel3 >= 1 ) { $level = 3; } if ( $warnlevel4 >= 1 ) { $level = 4; } if ( $warnlevel5 >= 1 ) { $level = 5; }
$inhaltkreis = "";
$hoehe = "";
$warnbilderlaender = "";
if ( $warnlevel1 + $warnlevel2 + $warnlevel3 + $warnlevel4 + $warnlevel5 > 0 ) {
for ($i=0; $i<count($kreise); $i++) {
// eigene Zeile fuer die Hoehenangaben
if ( $kreise[$i]['altitudeStart'] != "" ) {
$hoehe = "<tr><td style='padding-left: 5px;'>ab: " . $kreise[$i]['altitudeStart'] . "m Höhe</td></tr>";
}
if ( $kreise[$i]['altitudeEnd'] != "" ) {
$hoehe = "<tr><td style='padding-left: 5px;'>bis zu einer Höhe von: " . $kreise[$i]['altitudeStart'] . "m </td></tr>";
}
$inhaltkreis .= "
<table border='0' width='650px'>
<tr>
<td rowspan='5' style='width: 15px; background-" . farbe($kreise[$i]["level"]) . " '> </td>
<td style='padding-left: 5px; " . farbe($kreise[$i]["level"]) . " ' ><b>" . $kreise[$i]['headline'] . "";
if ($debug && $_IPS['SENDER'] == "Execute" ) {
$inhaltkreis .= " <br>(" . $kreise[$i]["event"] . " - " . $kreise[$i]["state"] . ")";
}
$inhaltkreis .= "</b></td>
</tr>
<tr><td style='padding-left: 5px;' >" . $kreise[$i]["level"] . "<font size='4'>Meldung für " . $kreise[$i]["regionName"] . "</font></td></tr>
<tr><td style='padding-left: 5px;'>Zeitraum von: " . $kreise[$i]['startTime'] . " bis: " . $kreise[$i]['endTime'] . "
" . $hoehe . "</td></tr>
<tr><td style='padding-left: 5px;'><font size='3'>" . $kreise[$i]['description'] . " </font></td></tr>
</table>
<div style='height: 5px;'> </div>
";
if ($warnbilder_anzeigen) {
$warnbilderlaender .= warnuebersicht($kreise[$i]["state"], $kreise[$i]["event"] );
}
}
} else {
$inhaltkreis .= "
<table border='0' width='650px' >
<tr>
<td rowspan='1' style='width: 15px; background-" . farbe(0) . " '> </td>
<td style='padding-left: 5px; " . farbe(0) . " ' >" . $warnevent . "</td>
</tr>
<tr height='450px'>
<td>
</td>
</tr>
</table>
";
}
$output = "
<script type='text/javascript' >
function applyVisibility(obj_name, new_value) {
document.getElementById(obj_name).style.zindex=new_value;
}
</script>
<style type='text/css'>
a.menue, a.menue:link, a.menue:visited, a.menue:active {
position: relative;
text-decoration: none;
padding: 0px;
margin: 0px;
}
a.menue:hover {
z-index:1000;
background: transparent;
padding: 0px;
margin: 0px;
}
a.menue span {
display: none;
text-decoration: none;
}
a.menue:hover span {
z-index:1;
display: block;
position: absolute;
width:300px; height:133px;
}
</style>
<table border='0' align='center' style='width: " . $warnbilder_tabellenbreite . "px;'>
<tr>
<td>Stand: " . date("d.m.Y", substr($json, 32, 10 )) . " um " . date("H:i:s", substr($json, 32, 10 )) . "
<span style='float: right; widht: 100%; '>Es sind " . ( $warnlevel1 + $warnlevel2 + $warnlevel3 + $warnlevel4 + $warnlevel5) . " Meldungen vorhanden.</span>
</td>
</tr>
<tr>
<td>
<table border='0' width='100%' align='center'>
<tr align='center' >
<td width=20% style='color: #000000; background-" . farbe(1) . " '><b> " . $warnlevel1 . " </b></td>
<td width=20% style='color: #000000; background-" . farbe(2) . " '><b> " . $warnlevel2 . " </b></td>
<td width=20% style='color: #000000; background-" . farbe(3) . " '><b> " . $warnlevel3 . " </b></td>
<td width=20% style='color: #000000; background-" . farbe(4) . " '><b> " . $warnlevel4 . " </b></td>
<td width=20% style='color: #000000; background-" . farbe(5) . " '><b> " . $warnlevel5 . " </b></td>
</tr>
</table>
</td>
</tr>
<tr>
<td>
<!---
<div style='background-color: #aaaaaa; height: 200px; '>
http://www.wettergefahren.de/DWD/wetter/radar/Radarfilm_WEB_DL.gif
//-->
<a href='#' class='menue'><img src='http://www.niederschlagsradar.de/image.ashx?type=loop1stunde&jaar=®io=homepage' width='216px' height='200px'>
<span style='top: -100px; left: 70px;'><img src='http://www.niederschlagsradar.de/image.ashx?type=loop1stunde&jaar=®io=homepage' id='bild' onmouseout='javascript: applyVisibility(\"bild\", \"-100\");'></span></a>
<a href='#' class='menue'><img src='http://www.dwd.de/DWD/wetter/sat/bilder/meteosat/stc/METE_STC_wwwEuropa8km_aktuell_m00s.png' width='267px' height='200px'>
<span style='top: -100px; left: -260px;'><img src='http://www.dwd.de/DWD/wetter/sat/bilder/meteosat/stc/METE_STC_wwwEuropa8km_aktuell_m00s.png'></span></a>
<a href='#' class='menue'><img src='http://www.wettergefahren.de/DWD/wetter/wv_allg/deutschland/bilder/Deutschland.jpg' width='216px' height='200px'>
<span style='top: -100px; left: -420px;'><img src='http://www.wettergefahren.de/DWD/wetter/wv_allg/deutschland/bilder/Deutschland.jpg'></span></a>
<!--
</div>
//-->
</td>
</tr>
<tr>
<td>
" . $warnbilderlaender . "
<div style='height: 5px;'> </div>
</td>
</tr>
<tr>
<td>
$inhaltkreis
</td>
</tr>
</table>
</div>
";
// Varablen anlegen und Werte schreiben
// Aktualisierung
SetValue(CreateVariableByIdent($_IPS['SELF'], "Datenbestand", "Datenbestand", 3), date("d.m.Y H:i:s", substr($json, 32, 10 )) );
// Webfront Output
SetValue(CreateVariableByIdent($_IPS['SELF'], "WFOutput", "WFOutput", 3), $output );
IPS_SetVariableCustomProfile(CreateVariableByIdent($_IPS['SELF'], "WFOutput", "WFOutput", 3), "~HTMLBox");
// Level & Varablenprofil
$id_level = CreateVariableByIdent($_IPS['SELF'], "Warnlevel", "Warnlevel", 1);
// Profil anlegen
if (IPS_VariableProfileExists("Script.WetterWarnstatus")) {
//altes Pofil loeschen und neu anlegen
IPS_DeleteVariableProfile("Script.WetterWarnstatus");
variablenprofil("Script.WetterWarnstatus");
IPS_SetVariableCustomProfile( CreateVariableByIdent($_IPS['SELF'], "Warnlevel", "Warnlevel", 1) , "Script.WetterWarnstatus");
} else {
variablenprofil("Script.WetterWarnstatus");
IPS_SetVariableCustomProfile( CreateVariableByIdent($_IPS['SELF'], "Warnlevel", "Warnlevel", 1) , "Script.WetterWarnstatus");
}
if ( GetValue($id_level) != $level ) {
SetValue(CreateVariableByIdent($_IPS['SELF'], "Warnlevel", "Warnlevel", 1), $level );
}
//Warnevent
$id_warnevent = CreateVariableByIdent($_IPS['SELF'], "Warnevent", "Warnevent", 3);
if( GetValue($id_warnevent) != $warnevent) {
SetValue(CreateVariableByIdent($_IPS['SELF'], "Warnevent", "Warnevent", 3), $warnevent );
IPS_SetVariableCustomProfile(CreateVariableByIdent($_IPS['SELF'], "Warnevent", "Warnevent", 3), "~TextBox");
}
function farbe($warnlevel) {
$warnfarbe = array("color: #C5E566; ", // Es ist keine amtliche Warnung aktiv (Grün)
"color: #E0E0E0; background-image: repeating-linear-gradient(135deg, transparent, transparent 5px, rgba(229,57,57,.8) 5px, rgba(229,57,57,.8) 8px); ", // Vorabinformation Unwetter (schraffiert)
"color: #FFFF00; ", // Amtliche Wetterwarnung (Gelb)
"color: #FA9600; ", // Amtliche Warnung vor markantem Wetter (Orange/Ocker)
"color: #E53935; ", // Amtliche Unwetterwarnung (Rot)
"color: #AF0064; ", // Amtliche Warnung vor extremem Unwetter (Dunkelrot)
"color: #FE68FE; ", // Hitze- oder UV-Warnung (Violett)
"",
"",
"",
"color: #cc99ff; ",
"",
"",
"",
"",
"",
"",
"",
"",
"",
// aus unerfindlichen Gründen ist der UV Index 20
"color: #fb66fc; ", // Hitze- oder UV-Warnung (Violett)
);
return $warnfarbe[$warnlevel];
}
function warnuebersicht($bundesland, $warnevent ) {
global $warnbilder_anzahl_je_reihe;
global $warnbilder_tabellenbreite;
$bl = array ("Baden-Württemberg" => "baw", "Bayern" => "bay", "Berlin" => "bbb", "Brandenburg" => "bbb", "Bremen" => "nib", "Hamburg" => "shh", "Hessen" => "hes", "Mecklenburg-Vorpommern" => "mvp", "Niedersachsen" => "nib", "Nordrhein-Westfalen" => "nrw", "Rheinland-Pfalz" => "rps", "Saarland" => "rps", "Sachsen" => "sac", "Sachsen-Anhalt" => "saa", "Schleswig-Holstein" => "shh", "Thüringen" => "thu",
"baden-w?rttemberg" => "baw", "bayern" => "bay", "berlin" => "bbb", "brandenburg" => "bbb", "bremen" => "nib", "hamburg" => "shh", "hessen" => "hes", "mecklenburg-vorpommern" => "mvp", "niedersachsen" => "nib", "nordrhein-westfalen" => "nrw", "rheinland-pfalz" => "rps", "saarland" => "rps", "sachsen" => "sac", "sachsen-anhalt" => "saa", "schleswig-holstein" => "shh", "th?ringen" => "thu");
$wk = array (
// Darauf achten das alles klein geschrieben ist - gegebenen Fall ist die Liste zu ergaenzen
// Übersicht unter http://www.dwd.de/DE/wetter/warnungen_aktuell/objekt_einbindung/objekteinbindung.htm
"gewitter" => "gewitter",
"starkregen" => "regen",
"dauerregen" => "regen",
"leichter schneefall" => "schnee",
"schneefall" => "schnee",
"wind" => "sturm",
"böen" => "sturm",
"b?en" => "sturm",
"windböen" => "sturm",
"windb?en" => "sturm",
"starkwind" => "sturm",
"sturm" => "sturm",
"sturmböen" => "sturm",
"sturmb?en" => "sturm",
"schwere sturmböen" => "sturm",
"schwere sturmb?en" => "sturm",
"orkanböen" => "sturm",
"orkanb?en" => "sturm",
"orkan" => "sturm",
"orkanartige böen" => "sturm",
"orkanartige b?en" => "sturm",
"starkes gewitter" => "sturm",
"starkes gewitter" => "gewitter",
"ergiebiger dauerregen" => "regen",
"STARKES GEWITTER" => "sturm",
"schweres gewitter mit extrem heftigem starkregen und hagel" => "sturm",
"schweres gewitter mit heftigem starkregen und hagel" => "sturm",
"SCHWERES GEWITTER mit HEFTIGEM STARKREGEN und HAGEL" => "sturm",
"nebel" => "nebel",
"frost" => "frost",
"glätte" => "glatteis",
"gl?tte" => "glatteis",
"glatteis" => "glatteis",
"tauwetter" => "tauwetter",
"hitze" => "hitze",
"uv-index" => "uv");
$daten ="";
#$daten .= "<div><img src='http://www.dwd.de/DWD/warnungen/warnapp/json/warning_map_" . $bl[$bundesland] . "_" . $wk[mb_strtolower($warnevent)] . ".png'></div>
";
$daten .= "<img src='http://www.dwd.de/DWD/warnungen/warnapp/json/warning_map_" . $bl[strtolower_utf8($bundesland)] . "_" . $wk[strtolower_utf8($warnevent)] . ".png' width='" . ( ($warnbilder_tabellenbreite - 3) / $warnbilder_anzahl_je_reihe) . "px' height='". ((($warnbilder_tabellenbreite - 3) / $warnbilder_anzahl_je_reihe) * 1.25) . "px' ></div>";
return $daten;
}
function strtolower_utf8($string) {
#setlocale(LC_CTYPE, 'de_DE@euro', 'de_DE', 'de', 'ge');
$result = utf8_decode($string);
$result = strtolower($result);
$result = utf8_encode($result);
return $result;
}
function toAscii($str) {
$clean = preg_replace("/[^a-zA-Z0-9\/_|+ -]/", '', $str);
$clean = strtolower(trim($clean, '-'));
$clean = preg_replace("/[\/_|+ -]+/", '-', $clean);
return $clean;
}
function CreateVariableByIdent($id, $ident, $name, $type)
{
$vid = @IPS_GetObjectIDByIdent($ident, $id);
if($vid === false)
{
$vid = IPS_CreateVariable($type);
IPS_SetParent($vid, $id);
IPS_SetName($vid, $name);
IPS_SetIdent($vid, $ident);
}
return $vid;
}
function sortArrayByFields($arr, $fields)
{
$sortFields = array();
$args = array();
foreach ($arr as $key => $row) {
foreach ($fields as $field => $order) {
$sortFields[$field][$key] = $row[$field];
}
}
foreach ($fields as $field => $order) {
$args[] = $sortFields[$field];
if (is_array($order)) {
foreach ($order as $pt) {
$args[$pt];
}
} else {
$args[] = $order;
}
}
$args[] = &$arr;
call_user_func_array('array_multisort', $args);
return $arr;
}
function variablenprofil ($profilname) {
IPS_CreateVariableProfile($profilname, 1);
IPS_SetVariableProfileValues($profilname, 0, 5, 1);
IPS_SetVariableProfileAssociation($profilname, 0, "Level 0", "", 0xC5E566);
IPS_SetVariableProfileAssociation($profilname, 1, "Level 1", "", 0xE0E0E0);
IPS_SetVariableProfileAssociation($profilname, 2, "Level 2", "", 0xFFFF00);
IPS_SetVariableProfileAssociation($profilname, 3, "Level 3", "", 0xFA9600);
IPS_SetVariableProfileAssociation($profilname, 4, "Level 4", "", 0xE53935);
IPS_SetVariableProfileAssociation($profilname, 5, "Level 5", "", 0xAF0064);
IPS_SetVariableProfileAssociation($profilname, 5, "Level 6", "", 0xFE68FE);
}
// Script Timer installieren
IPS_SetScriptTimer($IPS_SELF, 600);
ende:
?>