"Wetterbastelei" für die Schweiz

ich habe dieses Script mal angepasst an Weatherground. Dort muss man sich noch registrieren, die Api und den Wohnort im Script eintragen

ist nichts wahnsinniges. Habe ein paar Scripte zusammenkopiert, eigenes und bestehendes zu einer Wetterübersicht zusammengeschustert.

Eine String-Variable anlegen mit Profil „html“, am Ende des Scripts eintragen

Beiliegendes Verzeichnis in den Ordner „Webfront“ kopieren

<?
//******************************************************************************
  //$wetterbild = "http://www.swisswetter.ch/meteonews/swisswetter.png";
  $wetterbild = "http://www.20min.ch/news/wetter/ch.jpg";
//******************************************************************************
  //Rahmenstärke angeben
  $rahmen = '0';
  // Land eintragen
  $land = 'Switzerland';
 // Plz und Ort eintragen
  $plz = '3654';
  $ort = 'Gunten';
 // Sprache der Wetter Informationen
  $sprache = "de";
 //Position Wohnort
  $longitude = "07.69";  // Longitude (geografische Länge)
  $latitude = "46.71";   // Latitude (geografische Breite)
  //Breite des Rahmen
 $width_rahmen = "650";
  //Höhe des Rahmen
 $height_rahmen = "100";
 // eigener Fühler für aktuelle Temperatur
 $temp = GetValue(35665 /*[Temperatur\Fühler\Temperatur aussen\Aussentemperatur]*/);
 // Windvariable
 $wind = GetValue(16415 /*[Wetter\Wetter neu\Textparser\Wind\Windgeschwindigkeit]*/);
 //Api Weatherground
 $api = "hier die API von Weatherground eintragen";
 $ort = "SIGRISWIL";
// ab hier nichts mehr ändern
//******************************************************************************
$img = $wetterbild;

  $dir =  IPS_GetKernelDir()."\\webfront\\ig\\images\\weather\\";
  $bild2 =  'wetterbild_neu.gif';

  $img = imagecreatefromJPEG($img);
  imagetruecolortopalette($img, true, 256);

  $white = imagecolorat($img, 0, 0);

  ImageFilledRectangle($img,0,0,230,40,$white); //fügt den oberen Balken ein
  ImageFilledRectangle($img,500,420,350,300,$white); //fügt den unteren Balken ein

  imagecolorset($img, $white, 20, 31, 44); //macht weiss dunkelblau

  //header("Content-Type: image/gif");
  imagegif($img, $dir.$bild2);
  imagedestroy($img);


//******************************************************************************
// Sunrise und Sunset
if (date("I") == 1) $daylight = 2;       // Sommerzeit
if (date("I") == 0) $daylight = 1;       // Winterzeit
// *** Sonnenaufgang des heutigen Tages berechnen ***
$sunrise = date(date_sunrise(time(), SUNFUNCS_RET_STRING, $latitude, $longitude, 90.8333, $daylight));


// *** Sonnenuntergang des heutigen Tages berechnen ***
$sunset = date(date_sunset(time(), SUNFUNCS_RET_STRING, $latitude, $longitude, 90.8333, $daylight));

//******************************************************************************
// Mondphase berechnen
function moon_phase($year, $month, $day)
{

	$c = $e = $jd = $b = 0;
	if ($month < 3)
	{
		$year--;
		$month += 12;
	}
	++$month;
	$c = 365.25 * $year;
	$e = 30.6 * $month;
	$jd = $c + $e + $day - 694039.09;	
	$jd /= 29.5305882;					
	$b = (int) $jd;					
	$jd -= $b;							
	$b = round($jd * 8);				
	if ($b >= 8 )
	{
		$b = 0;
	}
	switch ($b)
	{
		case 0:
			return 'Neumond';
			break;
		case 1:
			return 'zunehmender Neumond';
			break;
		case 2:
			return 'Halbmond';
			break;
		case 3:
			return 'zunehmender Halbmond';
			break;
		case 4:
			return 'Vollmond';
			break;
		case 5:
			return 'abnehmender Vollmond';
			break;
		case 6:
			return 'Halbmond';
			break;
		case 7:
			return 'abnehmender Halbmond';
			break;
		default:
			return 'Error';
	}
}
$timestamp = time();
$mond = moon_phase(date('Y', $timestamp), date('n', $timestamp), date('j', $timestamp));
$mondico = str_replace(' ', '_', $mond);
//******************************************************************************
// Wetterheute
  $json_string = file_get_contents("http://api.wunderground.com/api/$api/geolookup/conditions/lang:DL/q/DL/$ort.json");
  $parsed_json = json_decode($json_string);
//  $icon0 = $parsed_json->{'current_observation'}->{'icon'};
  $temp_c = $parsed_json->{'current_observation'}->{'temp_c'};
//  $low0 = $parsed_json->{'current_observation'}->{'dewpoint_c'};
//  $high0 = $parsed_json->{'current_observation'}->{'heat_index_c'};
  $humid = $parsed_json->{'current_observation'}->{'relative_humidity'};
  $wind_speed = $parsed_json->{'current_observation'}->{'wind_kph'};
  $wind_dir = $parsed_json->{'current_observation'}->{'wind_dir'};
  $luftdruck = $parsed_json->{'current_observation'}->{'pressure_mb'};
  $wetter = $parsed_json->{'current_observation'}->{'weather'};
  $sichtweite = $parsed_json->{'current_observation'}->{'visibility_km'};
// Vorhersage
$json_fc_string = file_get_contents("http://api.wunderground.com/api/$api/forecast/lang:DL/q/Switzerland/$ort.json");
$parsed_fc_json = json_decode($json_fc_string);

  $prognose = $parsed_fc_json->{'forecast'}->{'simpleforecast'}->{'forecastday'};
//morgen
	$tag0 = "Heute";
	$icon0 = ($prognose[0]->icon) . "
";;
	$high0 = ($prognose[0]->high->celsius) . "
";;
	$low0 = ($prognose[0]->low->celsius) . "
";;
	$conditions0 = utf8_decode($prognose[0]->conditions) . "
";;
//übermorgen
	$tag1 = ($prognose[1]->date->weekday_short);
	$icon1 = ($prognose[1]->icon) . "
";;
	$high1 = ($prognose[1]->high->celsius) . "
";;
	$low1 = ($prognose[1]->low->celsius) . "
";;
	$conditions1 = utf8_decode($prognose[1]->conditions) . "
";;
//in 3 Tagen
	$tag2 = ($prognose[2]->date->weekday_short);
	$icon2 = ($prognose[2]->icon) . "
";;
	$high2 = ($prognose[2]->high->celsius) . "
";;
	$low2 = ($prognose[2]->low->celsius) . "
";;
	$conditions2 = utf8_decode($prognose[2]->conditions) . "
";;
//in 4 Tagen
	$tag3 = ($prognose[3]->date->weekday_short);
	$icon3 = ($prognose[3]->icon) . "
";;
	$high3 = ($prognose[3]->high->celsius) . "
";;
	$low3 = ($prognose[3]->low->celsius) . "
";;
	$conditions3 = utf8_decode($prognose[2]->conditions) . "
";;


 // Ausgabe
$uebersicht = '<div align="center"><img src='.$wetterbild.' style="width: '.$width_rahmen.'; height: auto;" />';
$wetterausgabe = "<html>
<head>
</head>
<body>

<table width=\"$width_rahmen\" height=\"$height_rahmen\" border=\"$rahmen\">
  <tr>
    <td><center><img src=/ig/images/weather/wetterbild_neu.gif></center></td>
<table width=\"$width_rahmen\" height=\"$height_rahmen\" border=\"$rahmen\">
  <tr>
    <td><div style='background-color:#555555;border:none;'><center><img src=/ig/images/weather/Sonne_auf.png><br/> Sonnenaufgang um ".utf8_encode($sunrise)."</center><div style='background-color:grey;'></td>
    <td><div style='background-color:#444444;border:none;'><center><img src=/ig/images/weather/Sonne_unter.png><br/> Sonnenuntergang um ".$sunset."</center></td>
    <td><div style='background-color:#555555;border:none;'><center><img src=/ig/images/weather/$mondico.png><br/> ".$mond."</center></td>
  <tr>
    <td><div style='background-color:".$bgh.";border:none;'><center><img src=/ig/images/weather/temp_aktuell.png><br/><span style=".$font."> aktuelle Temperatur ".$temp_c."° C</center></span></td>
    <td><div style='background-color:#444444;border:none;'><center><img src=/ig/images/weather/feuchte.png><br/> Luftfeuchtigkeit ".$humid."</center></td>
    <td><div style='background-color:#555555;border:none;'><center><img src=/ig/images/weather/wind.png><br/> Wind ".$wind_speed." Km/h</center></td>
<table width=\"$width_rahmen\" height=\"$height_rahmen\" border=\"$rahmen\">
  <tr>
    <td><div style='background-color:#444444;border:none;'><center><img src='/ig/images/weather/$icon0.png'><center>Heute<br>Minimal ".$low0."°C</br><center>Maximal ".$high0." °C</center><center>".$conditions0."</center></td>
    <td><div style='background-color:#555555;border:none;'><center><img src='/ig/images/weather/$icon1.png'><center>$tag1<br>Minimal ".$low1."°C</br><center>Maximal ".$high1." °C</center><center>".$conditions1."</td>
    <td><div style='background-color:#444444;border:none;'><center><img src='/ig/images/weather/$icon2.png'><center>$tag2<br>Minimal ".$low2."°C</br><center>Maximal ".$high2." °C</center><center>".$conditions2."</td>
    <td><div style='background-color:#555555;border:none;'><center><img src='/ig/images/weather/$icon3.png'><center>$tag3<br>Minimal ".$low3."°C</br><center>Maximal ".$high3." °C</center><center>".$conditions3."</td>
  </tr>
</table>
</body>
</html>";

SetValue(50323 /*[Wetter\Wetter neu\Variablen\Vorhersage Gunten]*/, $wetterausgabe);

?>

ig.zip (129 KB)

Hi

Vielen dank für das Script. Habe das auch schon lange auf meiner Liste um so was einzubinden. Hast Du Infos, woher Google die Wetterdaten hat (resp. wie man rausfindet von welcher Station und wie zuverlässig die Daten sind)?

Möchte die Infos noch für meine Beschattung verwenden (je nach Wetterforecast soll Automatik ein- oder ausgeschaltet sein).

Danke und Gruss
Dani

super - danke! Habe auch sowas ähnliches gebastelt, allerdings als standalone html-seite (im Verzeichnis Webfront/User, daher auf IPS zugreifend). Falls interesse besteht, werde ich den Code anhängen.

(Mein Haus steht in der Mitte der roten Vierecke in der „precipitation map“).

na klar besteht Interesse. Danke schon im voraus.

Falls interesse besteht, werde ich den Code anhängen

@aag

wo bleibt denn jetzt dein Script? :confused:

Jaja, kommt schon. Bin halt derzeit im Amsterdam auf einer Tagung (dieser Post kommt von Schiphol)…

Ausserdem wollte ich den Code ein bisschen putzen bevor ich ihn veröffentliche - sonst kriege ich wieder ne Menge Prügel (meine letzte Veröffentlichung wurde quittiert als „an Ignoranz nicht zu toppen“!). Ich bin aber dran!

@aag: Auch wenn ich es nicht war, aber naja, Du lebst ja noch und sauberer Code ist immer gut :smiley:

ich lebe noch, bin nun zurück aus den Niederlanden, und perfektioniere meine Wetterfroschkünste übers Wochenende. Im Moment versuche ich, kleine Javascript-Widgets zu machen, die rot oder grün werden je nachdem, wie stark der Wind weht. Stay tuned!

Gut Ding braucht Weile! Here we go:


<?

//Einstellungen in px

$homeX = 153;
$homeY = 271;
$homeRadius = 2;
$largerhomeRadius = 5;

//Zum testen der X,Y,Radion Angaben auf true setzen und Bild hinerher angucken
 $debug = True;

/*Auf xy Minuten Takt Synchronisieren

$offset = (integer)date("s") + ((integer)date("i") % 15) * 60;
echo $offset. "   ";
if($offset != 0) {
   IPS_SetScriptTimer("UnwetterZentrale V2",600 - $offset);
} else {
    IPS_SetScriptTimer("UnwetterZentrale V2",600);
}
*/
//loops a test for the existence of the most recent PNG file

$GifNonExisting = true;
$OffsetTime = time();
while ($GifNonExisting==true)
{
	$FiveMinRoundedTime  = date ('YmdH', $OffsetTime).str_pad(floor(date("i", $OffsetTime)/5)*5,2,'0',STR_PAD_LEFT);
	echo "FiveMinRoundedTime: ".$FiveMinRoundedTime.", OffsetTime:". $OffsetTime. chr(13);
	$CurrentGif ="http://data.meteomedia.de//data/layers/zuerich1/zuerich1_radarfcst_".$FiveMinRoundedTime.".gif";
	echo $CurrentGif;
	(boolean) $GifNonExisting = is_redirect($CurrentGif);
	if ($GifNonExisting==false)
		{echo " exists". chr(13);
		$MeteoCentraleData=@Sys_GetURLContent($CurrentGif);
		}
		else echo " does not exist". chr(13);
   $OffsetTime = $OffsetTime-60;
}
//print_r ($MeteoCentraleData);


//echo $data;
//preg_match("zuerich1_radarfcst_", $data, $result);

$remoteImage = $CurrentGif;
// $localImage = IPS_GetKernelDir()."\\RadarGifs\metradar-".$MonthlyRecurrent.".gif";
// $remoteCurrentImage = IPS_GetKernelDir()."\\Media\CurrentPrecipitations.gif";
$localImage = IPS_GetKernelDir()."\\webfront\user\images\CurrentPrecipitations.gif";

//Radarbild Downloaden

$remoteFile = fopen("$remoteImage",'rb');
$localFile = fopen($localImage,'wb');

// $remoteCurrentFile = fopen($remoteCurrentImage,'wb');

if(!$remoteFile || !$localFile)
	{
   exit; //throw error if localFile or remoteFile do not exist!
	}

while (!feof($remoteFile)) {

  $chunk = fread($remoteFile,1024);

  fwrite($localFile,$chunk);
}

fclose($localFile);
fclose($remoteFile);

//Radarbild auswerten

$im = ImageCreateFromGIF ($localImage);

//Stärken

$regen[1] = imagecolorresolve  ($im, 0,235,235);
$regen[2] = imagecolorresolve  ($im, 0, 178,235);
$regen[3] = imagecolorresolve  ($im, 0,104,235);
$regen[4] = imagecolorresolve  ($im, 0,0,235);
$regen[5] = imagecolorresolve  ($im, 0,255,0);
$regen[6] = imagecolorresolve  ($im, 0, 199, 0);
$regen[7] = imagecolorresolve  ($im, 0, 140, 0);



//Pixel durchgehen

$regenmenge = 0;
$pixelcounter =0;
(string)$regenstring = "";
for($x=$homeX-$homeRadius; $x<=$homeX+$homeRadius; $x++) {

   for($y=$homeY-$homeRadius; $y<=$homeY+$homeRadius; $y++) {
		if ($pixelcounter > 0) $regenstring = $regenstring . ", ";
      $pixelcounter =$pixelcounter + 1;
      $found = array_search(imagecolorat($im, $x, $y), $regen);
		$regenpixel[$pixelcounter] = $found;
			if ($found < 1) $found = 0;
		$regenstring = $regenstring . $found;
//		echo nl2br("
 x:". $x." y: ".$y." pixelcounter: ".$pixelcounter ." found:".$regenpixel[$pixelcounter]). " ". "imagecolor: ". imagecolorat($im, $x, $y);
      if(!($found === FALSE)) {

         $regenmenge+=$found;

      }
   }
}


$largerregenmenge = 0;
$largerpixelcounter =0;
$x=0;
$y=0;

(string)$largerregenstring = "";
for($x=$homeX-$largerhomeRadius; $x<=$homeX+$largerhomeRadius; $x++) {

   for($y=$homeY-$largerhomeRadius; $y<=$homeY+$largerhomeRadius; $y++) {
		if ($pixelcounter > 0) $largerregenstring = $largerregenstring . ", ";
      $pixelcounter =$pixelcounter + 1;
      $largerfound = array_search(imagecolorat($im, $x, $y), $regen);
		$largerregenpixel[$largerpixelcounter] = $largerfound;
			if ($largerfound < 1) $largerfound = 0;
		$largerregenstring = $largerregenstring . $largerfound;
//		echo nl2br("
 x:". $x." y: ".$y." pixelcounter: ".$largerpixelcounter ." found:".$largerregenpixel[$largerpixelcounter]). " ". "imagecolor: ". imagecolorat($im, $x, $y);
      if(!($found === FALSE)) {

         $largerregenmenge+=$largerfound;

      }
   }
}



//Im DebugModus Rechteck einzeichnen

if($debug) {
	$HomeRadiusPlus =$homeRadius + 1;
	$HomeRadiusArea =$homeRadius + 10;
	$HomeRadiusArea11 =$homeRadius + 11;
	$HomeRadiusArea12 =$homeRadius + 12;
	$HomeRadiusPlus2 =$homeRadius + 2;
	
   $schwarz = ImageColorAllocate ($im, 0, 0, 0);
   $rot = ImageColorAllocate ($im, 255, 0, 0);
   $weiss = ImageColorAllocate ($im, 255, 255, 255);
   
   imagerectangle($im, $homeX-$HomeRadiusPlus, $homeY-$HomeRadiusPlus, $homeX+$HomeRadiusPlus, $homeY+$HomeRadiusPlus, $rot);
   imagerectangle($im, $homeX-$HomeRadiusPlus2, $homeY-$HomeRadiusPlus2, $homeX+$HomeRadiusPlus2, $homeY+$HomeRadiusPlus2, $weiss);
   imagerectangle($im, $homeX-$HomeRadiusArea, $homeY-$HomeRadiusArea, $homeX+$HomeRadiusArea, $homeY+$HomeRadiusArea, $rot);
   imagerectangle($im, $homeX-$HomeRadiusArea11, $homeY-$HomeRadiusArea11, $homeX+$HomeRadiusArea11, $homeY+$HomeRadiusArea11, $weiss);

   //imagesetpixel($im, $homeX, $homeY, $rot);
   imagegif($im, $localImage);
//	imagegif($im, $remoteCurrentImage);

 }

imagedestroy($im);
//Regenmenge der jeweiligen Stärken im Radius aufsummiert
echo "smaller regenmenge integral: ".$regenmenge. chr(13);
echo "larger  regenmenge integral: ".$largerregenmenge. chr(13);
setvalue (29707 /*[Wetter\Unwetterzentrale V2\RegenMengenIntegral]*/,$regenmenge);
setvalue (57575 /*[Wetter\Unwetterzentrale V2\RegenMengenIntegral+5]*/ ,($largerregenmenge/4));




//-----------------------------
// Detect redirect
function is_redirect($url) {

   # 1. Prevent redirects
   $opts = array('http' =>
     array('max_redirects'=>1, 'ignore_errors'=>1)
   );
   stream_context_get_default($opts);

   # 2. Get headers (does not take context argument like file_get_contents)
   $headers = get_headers($url,true);

   # 3. Restore stream settings
   $opts = array('http' =>
     array('max_redirects'=>20, 'ignore_errors'=>0)
   );
   stream_context_get_default($opts);

   # 4. Extract http request status code
   $status = $headers[0];
   list($protocol,$code,$message) = @split(' ', $status,3);

   # 5. Detect redirect
   return ($code>=300 && $code<400);
 }

?>

hmm…

da kommst du jetzt schon ein bisschen wie die alte Fasnacht hinterher. Das hier nimmt Freund Kachelmann, was wahrscheinlich am genausten ist für die Schweiz. Die Variablen müssen von Hand gesetzt werden für den Text der Meldung und die Variable für die Ausgabe in Zeile 112 ist eine Float.

<?

$area = "bern";

/*
 Die Koordinaten könnt ihr am einfachsten herausfinden, indem ihr das Bild in Paint öffnet und mit dem Cursor auf euren Punkt geht. Dann könnt ihr in der Statuszeile von Paint die X/Y Koordinaten ablesen.
*/
$homeX = 305; // von links nach rechts
$homeY = 310; // von oben nach unten

/*
 Der Radius gibt an, wie viele Pixel um euren Ort zur Berechnung des Regenwertes genutzt werden sollen
*/
$homeRadius = 20;

//Ab hier nichts mehr ändern
$object = IPS_GetObject($IPS_SELF);
$parentID = $object['ParentID'];

//Installer
if ($IPS_SENDER == "Execute") {
   IPS_SetHidden($IPS_SELF, true);
   IPS_SetName($IPS_SELF, "Auslese-Skript");
   $parentObject = IPS_GetObject($parentID);
   if ($parentObject['ObjectType'] !== 1)
   {
       $instanceID = IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}");
       IPS_SetParent($instanceID, $parentID);
       $parentID = $instanceID;
       IPS_SetParent($IPS_SELF, $parentID);
       IPS_SetName($instanceID, "Unwetterzentrale");
   }
   IPS_SetScriptTimer($IPS_SELF, 3600);
}

//Auf 15 Minuten Takt Synchronisieren
$offset = (integer)date("s") + ((integer)date("i") % 15) * 60;
if($offset != 0) {
   IPS_SetScriptTimer($IPS_SELF,900 - $offset);
} else {
   IPS_SetScriptTimer($IPS_SELF,900);
}

//Zeit berechnen
$minute=floor(date("i") / 15) * 15;
$dateline=mktime(date("H"), $minute, 0, date("m"), date("d"), date("y"));

//Radarbild Downloaden
$opts = array(
  'http'=>array(
    'method'=>"GET",
    'max_redirects'=>1
  )
);
$context = stream_context_create($opts);

$localImage = IPS_GetKernelDir()."\\radar.gif";

$remoteImage = "http://alarm.meteocentrale.ch/images/map/".$area."_index.png";
 $data = @file_get_contents($remoteImage, false, $context);
if($data === false) {
    //Altes Bild laden
   $dateline -= 15*60;
    $remoteImage = "http://alarm.meteocentrale.ch/images/map/".$area."_index.png";
    $data = @file_get_contents($remoteImage, false, $context);
    if($data === false) {
        return;
    }
}

if((strpos($http_response_header[0], "200") === false)) {
 return;
}

file_put_contents($localImage, $data);

//Radarbild auswerten
$im = ImageCreateFromPNG ($localImage);

//Stärken
$regen[6] = imagecolorresolve  ($im, 255, 0, 255);
$regen[5] = imagecolorresolve  ($im, 252, 2, 252); // violett
$regen[4] = imagecolorresolve  ($im, 237, 2, 4);   //rot
$regen[3] = imagecolorresolve  ($im, 252, 182, 4); //orange
$regen[2] = imagecolorresolve  ($im, 252, 254, 4); //gelb
$regen[1] = imagecolorresolve  ($im, 252, 254, 4); //gelb

//Pixel durchgehen
$regenmenge = 0;
for($x=$homeX-$homeRadius; $x<=$homeX+$homeRadius; $x++) {
   for($y=$homeY-$homeRadius; $y<=$homeY+$homeRadius; $y++) {
      $found = array_search(imagecolorat($im, $x, $y), $regen);
      if(!($found === FALSE)) {
         $regenmenge+=$found;
      }
   }
}
echo $regenmenge;
// Bereich zeichnen
$schwarz = ImageColorAllocate ($im, 0, 0, 0);
$rot = ImageColorAllocate ($im, 255, 0, 0);
imagerectangle($im, $homeX-$homeRadius, $homeY-$homeRadius, $homeX+$homeRadius, $homeY+$homeRadius, $rot);
imagesetpixel($im, $homeX, $homeY, $rot);
imagegif($im, $localImage);

imagedestroy($im);

$mid = CreateImageByName($parentID, "Radarbild", "radar.gif");
IPS_SendMediaEvent($mid);

//$vid = CreateVariableByName($parentID, "Regenwert", 1);
SetValue(38176 /*[Wetter\Unwetterzentrale\Regenwert]*/, $regenmenge);

 function CreateVariableByName($id, $name, $type, $profile = "") {
  global $IPS_SELF;
  $vid = @IPS_GetVariableIDByName($name, $id);
  if($vid === false) {
   $vid = IPS_CreateVariable($type);
   IPS_SetParent($vid, $id);
   IPS_SetName($vid, $name);
   IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
   if($profile !== "") { IPS_SetVariableCustomProfile($vid, $profile); }
  }
  return $vid;
 }

 function CreateImageByName($id, $name, $filename) {
  global $IPS_SELF;
  $mid = @IPS_GetMediaIDByName($name, $id);
  if($mid === false) {
   $mid = IPS_CreateMedia(1);
   IPS_SetParent($mid, $id);
   IPS_SetName($mid, $name);
   IPS_SetInfo($mid, "this media was created by script #$IPS_SELF");
   IPS_SetMediaFile($mid, $filename, true);
  }
  return $mid;
 }

//Legende
$unwetter = $regenmenge;
if ($unwetter < 10)
SetValue(23319 /*[Wetter\Wetter neu\Variablen\Unwetter]*/, "es ist kein Unwetter in Sicht");
if (($unwetter >10) && ($unwetter < 1610))
SetValue(23319 /*[Wetter\Wetter neu\Variablen\Unwetter]*/, "die Vorwarnung ist aktiv");
if (($unwetter >1610) && ($unwetter <2900))
SetValue(23319 /*[Wetter\Wetter neu\Variablen\Unwetter]*/, "es gibt eine Warnung für mässig starkes Unwetter");

?>

danke Jürg. Meteocentrale hatte ich mir auch angeschaut - es ist prima. Meteomedia, wo ich die Daten hole, ist auch eine Kachelmann-Website.

Warum habe ich mich für Meteomedia entschieden? Ich wollte lieber die „Rohdaten“* vom Niederschlagradar holen, weil die tendentiell präziser sind, die Auflösung (pixel/km) etwas feiner ist, und die Bilder alle 5 Minuten hochgeladen werden.

(*es sind natürlich auch keine echten Rohdaten - aber sie sind etwas weniger stark vorgekaut, als die von Meteocentrale).

Es ist allerdings so, dass die Bilder nicht auf die Sekunde genau hochgeladen werden, was zu Fehlern führen kann. Deswegen habe ich ein loop hergestellt, welches das potentiell neueste Bild abfragt. Falls dieser noch garnicht existiert, wird der Offset um 5 Minuten zurückgestellt und es wird wieder gepollt. Beim Abfragen eines nicht-vorhandenen PNG wird man automatisch auf die Homepage von Meteodata weitergeleitet - deswegen habe ich eine Funktion eingebaut, welche das Redirect erkennt. Wenn is_redirect($url)==true, dann heisst es, dass das Bild noch nicht da ist.


...nicht mehr aktuell. Siehe nächste Version!

Here we go. Habe noch ein Paar zusätzliche nette Tricks implementiert…


<?php

//coordinates of epicenter, radius of area
$homeX = 153;
$homeY = 271;
$homeRadius = 2;


//loops until it finds the most recent PNG file and assigns to CurrentGif
$GifNonExisting = true;
$OffsetTime = time();
while ($GifNonExisting==true)
{
	$FiveMinRoundedTime  = date ('YmdH', $OffsetTime).str_pad(floor(date("i", $OffsetTime)/5)*5,2,'0',STR_PAD_LEFT);
	$FileTimestampFormatted = date ('d-m-Y H:', $OffsetTime).str_pad(floor(date("i", $OffsetTime)/5)*5,2,'0',STR_PAD_LEFT);
	echo "FiveMinRoundedTime: ".$FiveMinRoundedTime.", OffsetTime:". $OffsetTime. chr(13);
	$CurrentGif ="http://data.meteomedia.de//data/layers/zuerich1/zuerich1_radarfcst_".$FiveMinRoundedTime.".gif";
	echo $CurrentGif;
	(boolean) $GifNonExisting = is_redirect($CurrentGif);
	if ($GifNonExisting==false)
		 {echo " exists". chr(13);
		 $MeteoCentraleData=@Sys_GetURLContent($CurrentGif);}
		 else echo " does not exist". chr(13);
   $OffsetTime = $OffsetTime-300;
}

//downloads radar image as "\\webfront\user\images\CurrentPrecipitationsOriginal.gif"
$remoteImage = $CurrentGif;
$localImage = IPS_GetKernelDir()."\\webfront\user\images\CurrentPrecipitationsOriginal.gif";
$remoteFile = fopen("$remoteImage",'rb');
$localFile = fopen($localImage,'wb');
if(!$remoteFile || !$localFile) exit; //terminates if localFile or remoteFile do not exist!
while (!feof($remoteFile))
  {$chunk = fread($remoteFile,1024);
  fwrite($localFile,$chunk);}
fclose($localFile);
fclose($remoteFile);

// analyze radar image
// creates 3 concentric areas which will be tested for rain. Any positive outcomes will be written to variables
$im = ImageCreateFromGIF ($localImage);

$rainResultsArraySmall = AnalyzePixels($homeX, $homeY , $homeRadius, $im);
setvalue (29707 /*[Wetter\Unwetterzentrale V2\RainIntegralSmall]*/ ,$rainResultsArraySmall[0]);

$rainResultsArrayMedium = AnalyzePixels($homeX, $homeY , $homeRadius+10, $im);
setvalue (57575 /*[Wetter\Unwetterzentrale V2\RainIntegralMedium]*/ ,$rainResultsArrayMedium[0]);

$rainResultsArrayLarge = AnalyzePixels($homeX, $homeY , $homeRadius+20, $im);
setvalue (48757 /*[Wetter\Unwetterzentrale V2\RainIntegralLarge]*/ ,$rainResultsArrayLarge[0]);

//outputs integrals of rain quantity and maximal intensity for each area
echo
	"small rainQuantity integral: ".$rainResultsArraySmall[0]. "; max: ".$rainResultsArraySmall[1]. chr(13).
 	"medium rainQuantity integral: ".$rainResultsArrayMedium[0]. "; max: ".$rainResultsArrayMedium[1]. chr(13).
	"large rainQuantity integral: ".$rainResultsArrayLarge[0]. "; max: ".$rainResultsArrayLarge[1]. chr(13);

// draws boundaries of each area
DrawSquares($homeX, $homeY, $im, $homeRadius);
DrawSquares($homeX, $homeY, $im, $homeRadius+10);
DrawSquares($homeX, $homeY, $im, $homeRadius+20);

//   write text twice slightly offset, to produce a shadowing effect which makes text readable on any background
 imagettftext($im, 14,0,10,450, -$weiss, "C:\Windows\Fonts\Arial.ttf", $FileTimestampFormatted );
 imagettftext($im, 14,1,9,449,	-$rot, "C:\Windows\Fonts\Arial.ttf", $FileTimestampFormatted );

//stores processed image and frees up memory
imagegif($im, $localImage);



  //define( 'WATERMARK_OVERLAY_IMAGE', IPS_GetKernelDir()."\\webfront\user\images\CurrentPrecipitationsOriginal.gif");
  define( 'WATERMARK_OVERLAY_OPACITY', 100 );
  define( 'WATERMARK_OUTPUT_QUALITY', 100 );


create_watermark( 'http://data.meteomedia.de:80//data/maps/basemaps/zuerich1.jpg' ,IPS_GetKernelDir()."\\webfront\user\images\CurrentPrecipitations.JPEG", $im);


//------------------------------------------------------------------------------------

Function DrawSquares($homeX, $homeY, $im, $homeRadius)
{//draw squares corresponding to areas
$HomeRadiusPlus =$homeRadius + 1;

global $rot, $weiss;
$rot = ImageColorAllocate ($im, 255, 0, 0);
$weiss = ImageColorAllocate ($im, 255, 255, 255);

imagerectangle($im, $homeX-$homeRadius, $homeY-$homeRadius, $homeX+$homeRadius, $homeY+$homeRadius, $rot);
imagerectangle($im, $homeX-$HomeRadiusPlus, $homeY-$HomeRadiusPlus, $homeX+$HomeRadiusPlus, $homeY+$HomeRadiusPlus, $weiss);
}

//---------------------------------------------
// Function to Detect redirect
function is_redirect($url) {

   # 1. Prevent redirects
   $opts = array('http' =>
     array('max_redirects'=>1, 'ignore_errors'=>1)
   );
   stream_context_get_default($opts);

   # 2. Get headers (does not take context argument like file_get_contents)
   $headers = get_headers($url,true);

   # 3. Restore stream settings
   $opts = array('http' =>
     array('max_redirects'=>20, 'ignore_errors'=>0)
   );
   stream_context_get_default($opts);

   # 4. Extract http request status code
   $status = $headers[0];
   list($protocol,$code,$message) = @split(' ', $status,3);

   # 5. Detect redirect
   return ($code>=300 && $code<400);
}

//----------------------------------------------------

//Function to analyze pixels

function AnalyzePixels ($homeX, $homeY , $homeRadius, $im)
{
//(int) $rainQuantity=0; //integral of rain intensity values
(int) $pixelcounter=0;
(array) $positivePixels[0]=0;
$rain = array( // assigns integers to colors representing  rain intensities
		  1 => imagecolorresolve($im, 0,235,235),
		  2 => imagecolorresolve($im, 0, 178,235),
		  3 => imagecolorresolve($im, 0,104,235),
		  4 => imagecolorresolve($im, 0,0,235),
		  5 => imagecolorresolve($im, 0,255,0),
		  6 => imagecolorresolve($im, 0, 199, 0),
		  7 => imagecolorresolve($im, 0, 140, 0));

//echo "rain array: "; print_r ($rain);

(int) $maximalRainIntensity=0; //highest key of the rain array found within the specified area
$found = null; // key of array corresponding to rain level
(string) $rainstring = "";
for($x=$homeX-$homeRadius; $x<=$homeX+$homeRadius; $x++) {
	// go through each horizontal line
   for($y=$homeY-$homeRadius; $y<=$homeY+$homeRadius; $y++) {
   	   // go through each pixel on a horizontal line
       //print_r (imagecolorat($im, $x, $y));
       //returns the corresponding key (rain level) if successful
	   $found = array_search(imagecolorat($im, $x, $y), $rain);
	        if ($found)
				{
				echo "x".$x."y".$y.": level ".$found.chr(13);
				$pixelcounter =$pixelcounter + 1;
				// increments the counter of rain-positive pixels
				$positivePixels[$pixelcounter] = $found;
				}
	}
}
$rainResultsArray = array(array_sum($positivePixels), max($positivePixels));
return ($rainResultsArray);
}

//-----------------------------------------------------
  function create_watermark( $source_file_path, $output_file_path, $im)
  {
    list( $source_width, $source_height, $source_type ) = getimagesize( $source_file_path );
    if ( $source_type === NULL ) return false;

    switch ( $source_type )
    {
      case IMAGETYPE_GIF:
        $source_gd_image = imagecreatefromgif( $source_file_path );
        break;
     case IMAGETYPE_JPEG:
        $source_gd_image = imagecreatefromjpeg( $source_file_path );
        break;
      case IMAGETYPE_PNG:
        $source_gd_image = imagecreatefrompng( $source_file_path );
        break;
      default:
        return false;
    }

	$overlay_gd_image = $im;
    $overlay_width = imagesx( $overlay_gd_image );
    $overlay_height = imagesy( $overlay_gd_image );

    imagecopymerge(
      $source_gd_image,
      $overlay_gd_image,
      $source_width - $overlay_width,
      $source_height - $overlay_height,
      0,
      0,
      $overlay_width,
      $overlay_height,
      WATERMARK_OVERLAY_OPACITY
    );

    imagejpeg( $source_gd_image, $output_file_path, WATERMARK_OUTPUT_QUALITY );

    imagedestroy( $source_gd_image );
    imagedestroy( $overlay_gd_image );
  }


?>

ich habe die ganze Wetterseite noch mal etwas umgemodelt.
Neu- und Vollmond-Variablen hole ich die Daten mit einem Textparser von einer anderen Seite.
Die Wunderground-Api gibts unter „www.wunderground.com“.

Die Icons kommen ins Verzeichnis „/ig/images/weather/“ im Webfront-Ordner.

Die Wassertemperaturen sind unter „http://www.hydrodaten.admin.ch/lhg/SMS.xml“ aufgelistet. Diese dann wie nachfolgend eintragen.

// Messstation Thunersee
$res = $xml->xpath("//MesPar[@StrNr=‚2093‘]");

im unteren Teil noch die ausgabe-Variablen (String mit Profil HTML) definieren und ins Webfront einbinden.

Wetter_Schweiz.txt (12.7 KB)

Wetter_Icons.zip (405 KB)