N’abend zusammen,
hatte ja versprochen ein Update für den abgeschalteten Server uwz.at zu liefern. Ich habe jetzt gleich noch meine Radarbilder für Temperatur, Niederschlag und Radarfilm dazugepackt.
Wie Ihr Euer WebFront aufbaut, ist jedem selbst überlassen. Ich habe es jetzt mal in 2 Tabs gepackt (siehe Anhang).
Das Script sollte eigentlich alles automatisch anlegen, d.h. zuerst das Script einmal in der Konsole ausführen. Dann werden alle Variablen erzeugt und ein Grundkonfiguration angelegt. Dannach könnt Ihr Euer Webfront basteln und die gewünschten Werte einstellen/eintragen. Ich denke nach einer Weile rumspielen versteht Ihr wie die Zusammenhänge sind 
Der Timer ist auf 15 Minuten zum zyklischen Aktualisieren eingestellt, kann man auch gern anpassen.
<?php
################################################################################
# Script: Weather.StormWarning.ips.php
# Version: 1.0
# Author: Heiko Wilknitz (@pitti)
#
# Abrufen von Radarbildern und Unwetterwarnungen
#
# ----------------------------------- ID´s -------------------------------------
#
# Bei Verwendung der Scripte 'Meldungsanzeige im WebFron' (Post #51)
# https://www.symcon.de/forum/threads/12115-Meldungsanzeige-im-WebFront
# hier die ScriptID von 'Meldungsverwaltung' eintragen, sonst 0!
$dbID = 0;
#
# ----------------------------- Konfiguration ----------------------------------
#
# Benötigte URLs für die verschiedenen Informationen
#
$urls = array(
# JSON API auslesen
'JSON' => 'https://www.dwd.de/DWD/warnungen/warnapp/json/warnings.json',
# Check Icon
'CHECK' => 'https://www.dwd.de/DWD/warnungen/warnapp_gemeinden/viewer/img/icn_check.png',
# Level Icons
'LEVEL' => 'https://www.dwd.de/DWD/warnungen/warnapp_gemeinden/viewer/img/warndreieck/<LEVEL>.png',
# Tye Icons
'TYPE' => 'https://www.dwd.de/DWD/warnungen/warnapp_gemeinden/viewer/img/warndreieck/warn_icons_<TYPE>.png',
# Temperatur Image
'TEMP' => 'https://www.dwd.de/DWD/wetter/aktuell/deutschland/bilder/wx_<STATE>_akt.jpg',
# Niederschlag Radar
'RADAR' => 'https://www.dwd.de/DWD/wetter/radar/rad_<STATE>_akt.jpg',
# Niederschlag Radarfilm
'MOVIE' => 'https://www.dwd.de/DWD/wetter/radar/radfilm_<STATE>_akt.gif',
# Karte mit allen Warnungen
'MAPS' => 'https://www.dwd.de/DWD/warnungen/warnapp_gemeinden/json/warnungen_gemeinde_map_<STATE><TYPE>.png'
);
#
# Karte
#
$maps = array(
array(0, 'Bundesland', '', 0x0000FF),
array(1, 'Deutschland', '', 0x0000FF)
);
#
# Bundesländer
#
$states = array (
array(0, 'Baden-Württemberg', '', 0x800080, 'baw'),
array(1, 'Bayern', '', 0x800080, 'bay'),
array(2, 'Berlin,Brandenburg', '', 0x800080, 'bbb'),
array(3, 'Hessen', '', 0x800080, 'hes'),
array(4, 'Mecklenburg-Vorpommer', '', 0x800080, 'mvp'),
array(5, 'Niedersachsen,Bremen', '', 0x800080, 'nib'),
array(6, 'Nordrhein-Westfalen', '', 0x800080, 'nrw'),
array(7, 'Rheinland-Pfalz,Saarland', '', 0x800080, 'rps'),
array(8, 'Sachsen', '', 0x800080, 'sac'),
array(9, 'Sachsen-Anhalt', '', 0x800080, 'saa'),
array(10,'Schleswig-Holstein,Hamburg', '', 0x800080, 'shh'),
array(11,'Thüringen', '', 0x800080, 'thu')
);
#
# Kriterien
#
$types = array(
array(-1,'Alle', '', 0xFFFF00, 'all'),
array(0, 'Gewitter', '', 0xFFFF00, 'gewitter'),
array(1, 'Wind / Sturm / Orkan', '', 0xFFFF00, 'sturm'),
array(2, 'Stark- oder Dauerregen', '', 0xFFFF00, 'regen'),
array(3, 'Schneefall', '', 0xFFFF00, 'schnee'),
array(4, 'Nebel', '', 0xFFFF00, 'nebel'),
array(5, 'Frost', '', 0xFFFF00, 'frost'),
array(6, 'Glätte, Glatteis', '', 0xFFFF00, 'glatteis'),
array(7, 'Tauwetter', '', 0xFFFF00, 'tauwetter'),
array(8, 'Hitze', '', 0xFFFF00, 'hitze'),
array(9, 'UV-Strahlung', '', 0xFFFF00, 'uv')
);
#
# Warning levels
#
$levels = array(
0 => "gelb",
1 => "gelb",
2 => "gelb",
3 => "orange",
4 => "rot",
5 => "dunkelrot",
10 => "violet_hitze",
20 => "violet_uv"
);
#
# Initial Code = Stadt Stuttgart
#
$regioCode = "108111000";
#
################################################################################
// INSTALLATION
if($_IPS['SENDER'] == "Execute") {
// Karte
$vid = CreateVariableByName($_IPS['SELF'], "Karte", 1);
CreateProfileInteger('DWD.Map', 'Image', '', '', 0, count($maps)-1, 0, 0, $maps);
IPS_SetVariableCustomProfile($vid, 'DWD.Map');
IPS_SetVariableCustomAction($vid, $_IPS['SELF']);
SetValue($vid, 0);
// Bundesland
$vid = CreateVariableByName($_IPS['SELF'], "Bundesland", 1);
CreateProfileInteger('DWD.State', 'Macro', '', '', 0, count($states)-1, 0, 0, $states);
IPS_SetVariableCustomProfile($vid, 'DWD.State');
IPS_SetVariableCustomAction($vid, $_IPS['SELF']);
SetValue($vid, 0);
// Kriterien
$vid = CreateVariableByName($_IPS['SELF'], "Kriterien", 1);
CreateProfileInteger('DWD.Types', 'Warning', '', '', 0, count($types)-1, 0, 0, $types);
IPS_SetVariableCustomProfile($vid, 'DWD.Types');
IPS_SetVariableCustomAction($vid, $_IPS['SELF']);
SetValue($vid, -1);
// Region Code
$vid = CreateVariableByName($_IPS['SELF'], "Region", 3);
IPS_SetIcon($vid, 'Edit');
IPS_SetVariableCustomProfile($vid, '~TextBox');
IPS_SetVariableCustomAction($vid, $_IPS['SELF']);
SetValue($vid, $regioCode);
// Aktuelle Temperaturen
$vid = CreateVariableByName($_IPS['SELF'], "Temperaturen aktuell", 3);
IPS_SetIcon($vid, 'Temperature');
IPS_SetVariableCustomProfile($vid, '~HTMLBox');
SetValue($vid, GetImageTag($states[0][4], $urls['TEMP']));
// Niederschlagsradar
$vid = CreateVariableByName($_IPS['SELF'], "Niederschlag Radarbild", 3);
IPS_SetIcon($vid, 'Rainfall');
IPS_SetVariableCustomProfile($vid, '~HTMLBox');
SetValue($vid, GetImageTag($states[0][4], $urls['RADAR']));
// Niederschlagsradaraufnahme
$vid = CreateVariableByName($_IPS['SELF'], "Niederschlag Radarfilm", 3);
IPS_SetIcon($vid, 'Rainfall');
IPS_SetVariableCustomProfile($vid, '~HTMLBox');
SetValue($vid, GetImageTag($states[0][4], $urls['MOVIE']));
// Unwettermeldungen
$vid = CreateVariableByName($_IPS['SELF'], "Unwettermeldungen", 3);
IPS_SetIcon($vid, 'WindSpeed');
IPS_SetVariableCustomProfile($vid, '~HTMLBox');
SetValue($vid, GetWeatherWarnings($regioCode, -1, $urls, $types, $levels, $dbID));
// Unwetterkarte
$vid = CreateVariableByName($_IPS['SELF'], "Unwetterkarte", 3);
IPS_SetIcon($vid, 'Image');
IPS_SetVariableCustomProfile($vid, '~HTMLBox');
SetValue($vid, GetWeatherMap($urls['MAPS'], 0, $states[0][4], $types[0][4]));
// Script Timer
if(IPS_GetScriptTimer($_IPS['SELF']) == 0) {
IPS_SetScriptTimer($_IPS['SELF'], 60*15);
}
}
// AKTION VIA WEBFRONT
else if($_IPS['SENDER'] == "WebFront") {
// Speichern
SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
// Karte
$vid = CreateVariableByName($_IPS['SELF'], "Karte", 1);
$map = GetValue($vid);
// Bundesland
$vid = CreateVariableByName($_IPS['SELF'], "Bundesland", 1);
$state = GetValue($vid);
// Kriterien
$vid = CreateVariableByName($_IPS['SELF'], "Kriterien", 1);
$type = GetValue($vid);
// Region Code
$vid = CreateVariableByName($_IPS['SELF'], "Region", 3);
$code = GetValue($vid);
// Aktuelle Temperaturen
$vid = CreateVariableByName($_IPS['SELF'], "Temperaturen aktuell", 3);
SetValue($vid, GetImageTag($states[$state][4], $urls['TEMP']));
// Niederschlagsradar
$vid = CreateVariableByName($_IPS['SELF'], "Niederschlag Radarbild", 3);
SetValue($vid, GetImageTag($states[$state][4], $urls['RADAR']));
// Niederschlagsradaraufnahme
$vid = CreateVariableByName($_IPS['SELF'], "Niederschlag Radarfilm", 3);
SetValue($vid, GetImageTag($states[$state][4], $urls['MOVIE']));
// Unwettermeldungen
$vid = CreateVariableByName($_IPS['SELF'], "Unwettermeldungen", 3);
SetValue($vid, GetWeatherWarnings($code, $type, $urls, $types, $levels, $dbID));
// Unwetterkarte
$vid = CreateVariableByName($_IPS['SELF'], "Unwetterkarte", 3);
SetValue($vid, GetWeatherMap($urls['MAPS'], $map, $states[$state][4], $types[$type+1][4]));
}
// TIMER EVENT
else if($_IPS['SENDER'] == "TimerEvent") {
// Kriterien
$vid = CreateVariableByName($_IPS['SELF'], "Kriterien", 1);
$type = GetValue($vid);
// Unwettermeldungen
$vid = CreateVariableByName($_IPS['SELF'], "Unwettermeldungen", 3);
SetValue($vid, GetWeatherWarnings($regioCode, $type, $urls, $types, $levels, $dbID));
}
# ------------------------------ Funktionen ------------------------------------
// Findet zum übergebenen DWD-RegioCode entsprechende Wetterwarnungen und Vorabinformationen
// Übergabe: [STRING]$code = Regiocode, z.B. 106439000 für Rheingau-Taunus-Kreis
// Rückgabe: [STRING] = Warnings als Html-Tabelle
function GetWeatherWarnings($code, $type, $urls, $types, $levels, $db)
{
//Fehlerbehandlung
if(!isset($code)) die("Error in Function ".__FUNCTION__." - Missing argument for \$regioCode");
if(!is_string($code)) die("Error in Function ".__FUNCTION__." - Value for parameter \$regioCode is not a string"); //API aufrufen und XML einlesen
# Meldungstext wenn keine Warnungen vorliegen
$check_txt = '<b>Keine Unwetter-Meldungen vorhanden!</b><br />';
$check_txt .= '<i><small>zuletzt aktualisiert am '.date("d.m.",time()).' um '.date("H:i",time()).' Uhr</i></small>';
# Daten abholen
$json = file_get_contents($urls['JSON']);
//Warnungen extrahieren und in Array kodieren
$extract = ExtractUnit($json, 'warnWetter.loadWarnings(', ');');
$array = json_decode($extract,true);
//Übergabearray vorbereiten
$warnings = array();
//Warnungen und Vorabinformationen durchgehen und wesentliche Felder in Array schreiben
if(isset($array["vorabInformation"][$code])) foreach($array["vorabInformation"][$code] as $row) array_push($warnings,array("headline" => ReplaceCaseSensitiveWords($row["headline"]), "description" => ReplaceCaseSensitiveWords($row["description"]), "start" => round($row["start"] / 1000,0), "end" => round($row["end"] / 1000,0), "region" => $row["regionName"], "state" => $row["state"], "type" => $row["type"], "level" => $row["level"], "time" => round($array["time"] / 1000,0)));
if(isset($array["warnings"][$code])) foreach($array["warnings"][$code] as $row) array_push($warnings,array("headline" => ReplaceCaseSensitiveWords($row["headline"]), "description" => ReplaceCaseSensitiveWords($row["description"]), "start" => round($row["start"] / 1000,0), "end" => round($row["end"] / 1000,0), "region" => $row["regionName"], "state" => $row["state"], "type" => $row["type"], "level" => $row["level"], "time" => round($array["time"] / 1000,0)));
// HTML zusammenbauen
$style = "";
$style = $style.'<style type="text/css">';
$style = $style.'table {width:100%;border-collapse: collapse;}';
$style = $style.'td.img {width:50px;border:0px;vertical-align: top;text-align:left;padding:10px;border-left: 1px solid rgba(255, 255, 255, 0.2);border-top: 1px solid rgba(255, 255, 255, 0.2);border-bottom: 1px solid rgba(255, 255, 255, 0.2);}';
$style = $style.'td.txt {vertical-align: top;text-align:left;padding:5px 10px 5px 10px;border-right: 1px solid rgba(255, 255, 255, 0.2);border-top: 1px solid rgba(255, 255, 255, 0.2);border-bottom: 1px solid rgba(255, 255, 255, 0.2);}';
//$style = $style.'tr:nth-child(even) {background-color: rgba(0, 0, 0, 0.3);}';
$style = $style.'.stitle { color: rgba(128, 128, 0, 1.0); }';
$style = $style.'.fwarn { height: 50px; width: 50px;}';
$style = $style.'.iwarn { margin-left: -50px; height: 50px; width: 50px; }';
$style = $style.'</style>';
$html = $style.'<table>';
$count = 0;
foreach ($warnings as $key => $value) {
//print_r($value);
if(($type == -1) OR ($type == $value['type'])) {
$turl = str_replace('<TYPE>', $types[$value['type']+1][4], $urls['TYPE']);
$lurl = str_replace('<LEVEL>', $levels[$value['level']], $urls['LEVEL']);
$time = strftime("%a, %d.%b, %H:%M - ", $value['start']).strftime("%a, %d.%b, %H:%M Uhr", $value['end']);
$html .= '<tr>';
$html .= '<td class=\'img\'><div><img class=\'fwarn\' src=\''.$lurl.'\' alt=\'Level\' /><img class=\'iwarn\' src=\''.$turl.'\' alt=\'Typ\' /></div></td>';
$html .= '<td class=\'txt\'><b>'.$value['headline'].'</b><br / ><i><small>'.$time.'</small></i><br />'.$value['description'].'</td>';
$html .= '</tr>';
$count++;
}
}
// Exist Warnings
if($count == 0) {
$html .= '<tr>';
$html .= '<td class=\'img\'><div><img class=\'fwarn\' src=\''.$urls['CHECK'].'\' alt=\'No warning\'></div></td>';
$html .= '<td class=\'txt\'>'.$check_txt.'</td>';
$html .= '</tr>';
}
// Warnungen an Dashboard melden
if($db != 0) {
IPS_RunScriptWaitEx($db, array('action' => 'add', 'text' => 'Es liegen Unwetterwarnungen vor!', 'type' => 1, 'expires' => time() + 3600,'image' => 'WindSpeed', 'page' => 'spUnwetter'));
}
$html .= '</table>';
//Rückgabe
return $html;
}
// 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;
}
// 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;
}
// Erstellt für das übergebene Bundesland und Kriterium den Html-Image-Tag
function GetWeatherMap($url, $map, $state, $type)
{
// unschön aber wirkungsvoll
if($map == 1) {
$state = 'de';
}
if($type == 'all') {
$type = '';
}
else {
$type = '_'.$type;
}
IPS_LogMessage('DWD', 'Map: '.$map.', State: '.$state.', Typ: '.$type);
$img = str_replace('<STATE>', $state, $url);
$img = str_replace('<TYPE>', $type, $img);
// An die persönlichen Vorlieben anpassen!
$html = "<img src='".$img."' style='height:100%;width:100%;'/>";
return $html;
}
// Erstellt für das übergebene Bundesland den Html-Image-Tag
function GetImageTag($state, $url)
{
$img = str_replace('<STATE>', $state, $url);
// An die persönlichen Vorlieben anpassen!
$html = "<img src='".$img."' style='height: 100%; width: 100%; object-fit: fill;' />";
return $html;
}
// Erzeugt eine Variable unterhalb {id} mit dem Namen {name} vom Typ [type}
// Existiert die Variable schon wird diese zurückgeliefert.
function CreateVariableByName($id, $name, $type)
{
$vid = @IPS_GetVariableIDByName($name, $id);
if($vid===false) {
$vid = IPS_CreateVariable($type);
IPS_SetParent($vid, $id);
IPS_SetName($vid, $name);
}
return $vid;
}
// Erzeugt ein Variablenprofil vom Typ {type} mit Name n{name}
function CreateProfile($name, $type)
{
if(!IPS_VariableProfileExists($name)) {
IPS_CreateVariableProfile($name, $type);
}
else {
$profile = IPS_GetVariableProfile($name);
if($profile['ProfileType'] != $type)
throw new Exception("Variable profile type does not match for profile ".$name);
}
}
// Erzeugt ein Integer-Variablenprofil
function CreateProfileInteger($name, $icon, $prefix, $suffix, $minvalue, $maxvalue, $step, $digits, $asso = NULL)
{
CreateProfile($name, 1);
IPS_SetVariableProfileIcon($name, $icon);
IPS_SetVariableProfileText($name, $prefix, $suffix);
IPS_SetVariableProfileDigits($name, $digits);
if(sizeof($asso) === 0){
$minvalue = 0;
$maxvalue = 0;
}
IPS_SetVariableProfileValues($name, $minvalue, $maxvalue, $step);
if(sizeof($asso) !== 0){
foreach($asso as $ass) {
IPS_SetVariableProfileAssociation($name, $ass[0], $ass[1], $ass[2], $ass[3]);
}
}
}
?>
Viel Spaß
Heiko