InfoFrame: Digitaler Bilderrahmen (Anzeige von Anrufen, E-Mails, Termine, Wetter...)

Hallo Olli,

vielen Dank. Der Icon-Ordner, der für die Wettervorhersage von wunderground benötigt wird habe ich ja angehängt. Alle weiteren angezeigten Werte und Icons bei mir werden Dir nix bringen, da diese Werte von meinen Sensoren kommen, die ich mit fhem betreibe und hochlade.

Gruß
Hoobert
 
Hallo Hoobert,
das ist richtig das man diese Symbole fürs Wetter nicht braucht, aber du hast z.b. den Sonnenaufgang/-untergang angezeigt, diese fehlen.
Aber dennoch würde es mich interessieren, da ich z.B. bei mir auch einige Werte aus meiner UVR1611 auslese und für diese bisher nur Text verwendet habe.

Grüße Ollu
 
Super Arbeit von dir Hoobert,

Funzt mit deinen Einstellungen bestens.

Wollte aber noch gerne die aktuelle Uhrzeit (hh:mm) in "Großformat" mit ausgeben, da es sich ja um ein "Statisches Bild" handelt,müsste ich alle 60 sec. die Seite neu laden; somit werden aber die Wetterdaten ebenfalls alle 60 sec. erneuert, was wohl zu Problemen führt (Traffic auf Wunderground...).
Hat das schon mal jemand umgesetzt?
Kann mir jemand Tipps geben?

P.S. das Ganze läuft bei mir auf einem alten PC über einen TFT-Monitor.

Gruß

S_E_V_E_N
 
Zuletzt bearbeitet:
Super Arbeit Hoobert.... Jetzt funktioniert es wieder wie es soll! Möchte die Wetterdaten auf meinem Digiframe nicht mehr missen wollen.
 
Hallo olli,

hier nochmal meine Wetter-Icons bzw. die Icons die im WeatherPlugin benötigt werden:
Anhang anzeigen weather.zip

Hallo Seven,

wenn Du Punkt 1 und Punkt 4 meiner Update-Anleitung befolgt hast wird die doUpdate-Funktion und damit die wunderground-URL alle 30 Minuten bzw. im Abstand des in der config.ini eingetragenen Wertes aufgerufen. Somit sollte die Calls-Begrenzung von wunderground kein Problem sein.

Gruß
Hoobert
 
habe mich jetzt auf wunderground angemeldet. Wo ist der api key auf der Seite zu entnehmen?
 
Zuletzt bearbeitet:
Hallo Hoobert,

danke für deine Wunderground lösung. Leider funktioniert das "Aktuell:" nicht mehr. Es werden auch keine Windgeschwindigkeiten und Luftfeuchte angezeigt. Die Icons und Forecast etc. geht einwandfrei, nur das was über zwischen Begrenzungsstrich und dem ersten Icon (Heute:) kommt fehlt. Gibts da auch ne Lösung für?

Grüße Thomas
 
Kann bitte jemand drüber schauen. Ich habe jetzt den api_key und city hinzugefügt. Leider wird das Wetter dennoch nicht angezeigt

Code:
public function doUpdate() {
        // download weather XML into local file for caching
            $city = urlencode( $this->config['city'] );
            $api_key = $this->config['fa1dfb36a712xxxx'];
            $curl = curl_init();
            $file = fopen("cache/weather.xml", "w");
            if ($file)
            {
              curl_setopt($curl, CURLOPT_URL, utf8_encode("http://api.wunderground.com/api/$api_key/geolookup/conditions/forecast/lang:DL/q/Germany/$city.xml"));
              curl_setopt($curl, CURLOPT_FILE, $file);
              curl_setopt($curl, CURLOPT_USERAGENT, utf8_encode("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"));
              curl_exec($curl);
              fclose($file);
            }
            curl_close($curl);

Wo ist der api key? Die 1. oder die 2. ???
 

Anhänge

  • Unbenannt.PNG
    Unbenannt.PNG
    73.1 KB · Aufrufe: 97
Zuletzt bearbeitet:
Hallo mosjka1,

der Key steht bei 1. Bitte lies und befolge meine Anleitung oben Schritt für Schritt (v.a. Punkt 3 und 5).

Hi Thomas,

wie schon erwähnt, habe ich die Original-Datei von PacmanII auf meine Bedürfnisse angepasst. Einige Messwerte kommen von meinen eigenen Sensoren und werden nicht aus der XML-Datei geladen. Das müsstest Du halt wieder zurückändern.

Gruß
Hoobert
 
Zuletzt bearbeitet:
Kann bitte jemand drüber schauen. Ich habe jetzt den api_key und city hinzugefügt.

Du musst, wie Hoobert in seinem Post schrieb, den API Schlüssel in die config.ini im Wetterpart hinzufügen. Ebenso die Update Zeit. Schau mal in seinem Post
steht das hier:

•der Eintrag "update_weather = 30" im Abschnitt des WeatherPlugin in der config.ini (entspricht der Aktualisierungszeit 30 Minuten)
•der Eintrag "api_key = "Euer_API_Key"" im Abschnitt des WeatherPlugin in der config.ini

hast Du das gemacht?

@ Hoobert: Wie meinst Du das genau? hat es was mit diesem [´Data´] hinter den werten zu tun?
 
@Hoobert

Super, danke. Nach einigem Umbasteln läuft es jetzt auch bei mir wieder. War ein wenig schwieriger, da ich die 1.10 von fanol.de nutze und nicht alles wieder umstricken wollte.
 
Super, Danke! Läuft jetzt.

Allerding wird die Temperatur für das "aktuelle Wetter" nicht angezeigt. Ich habe das was ich nicht benötige rausgelöscht. Kann bitte jemand die modifizierte "Weatherplugin.php" (wunderground) ohne die zusätzlichen Einträge von Hoobert hier posten? Damit halt noch das aktuelle Wetter angezeigt wird? Quasi wie hier: http://www.ip-phone-forum.de/attachment.php?attachmentid=59973&d=1315392243

Danke

Code:
<?php
/***************************************************************************
 * InfoFrame (image generator for digital picture frames)
 * Copyright (C) 2009  Tobias Kolb
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see http://www.gnu.org/licenses/
 ***************************************************************************/

class WeatherPlugin implements IPlugin
{
    private $dbconn = NULL;
  	private $config = NULL;
	
	public function __construct($dbconn, $config) {
		$this->dbconn = $dbconn;
		$this->config = $config;		
	  }
	  
  public function doUpdate() {
        // download weather XML into local file for caching
            $city = urlencode( $this->config['city'] );
            $api_key = $this->config['api_key'];
            $curl = curl_init();
            $file = fopen("cache/weather.xml", "w");
            if ($file)
            {
              curl_setopt($curl, CURLOPT_URL, utf8_encode("http://api.wunderground.com/api/$api_key/geolookup/conditions/forecast/lang:DL/q/Germany/$city.xml"));
              curl_setopt($curl, CURLOPT_FILE, $file);
              curl_setopt($curl, CURLOPT_USERAGENT, utf8_encode("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"));
              curl_exec($curl);
              fclose($file);
            }
            curl_close($curl);
   
  }

	public function doOutput($image, $style, $updateData, &$yoffset) {
		$filename = 'cache/weather.xml';
    
    //doUpdate nur ausführen, wenn die Datei cache/weather.xml älter als eine halbe Stunde
    $diff_seconds_weather = (time() - filectime($filename));
    if (!file_exists($filename) || ($diff_seconds_weather > ($this->config['update_weather']*60))){  
      $this->doUpdate();
    }
    
    // XML-Datei auslesen                   	
		if(file_exists($filename) && (filesize($filename) > 0)) {
		
			$xml = simplexml_load_file($filename);
			if($xml) {
				// parse weather data
				// ===================
				// current conditions
				$current_condition = $xml->current_observation->weather;
				$current_wind_condition = $xml->current_observation->wind_kph;
				$night = !isDaylight();
				$current_icon = $this->getLocalWeatherImage($xml->current_observation->icon, $night);
				$wicon = ImageCreateFromPNG ( $current_icon );
				ImageCopy($image, $wicon, imagesx($image)-190, 5, 0, 0, imagesx($wicon), imagesy($wicon));
				//ImageCopy($image, $wicon, 50, 5, 0, 0, imagesx($wicon), imagesy($wicon));
				ImageDestroy($wicon);
				$opt = array(
					'width' => 280,
					'align' => ALIGN_RIGHT
				); 
      }
    }  
    
    // forecast for today and next 3 days
				for ($i = 0; $i <= 3; $i++) {
					// pixel offset for placing day 0-3 in different rows from top to bottom
					if (imagesy($image) <= 500) {
						$offset = 225+(85*$i); // smaller spacing for low resolution displays (vertical=480px)
					} else {
						$offset = 255+83*$i; // normal spacing for high resolution diplays (vertical=600px)
					}
					if ($offset > (imagesy($image)-80))
						break; // offset out of range, skip output of further weather forecast days

					// format data
					$day = $xml->forecast->simpleforecast->forecastdays->forecastday[$i]->date->weekday_short;
					if ($i == 0)
						$day = 'Heute';
					if ($i == 1)
						$day = 'Morgen';
					$low = $xml->forecast->simpleforecast->forecastdays->forecastday[$i]->low->celsius;
					$high = $xml->forecast->simpleforecast->forecastdays->forecastday[$i]->high->celsius;
					$condition = $xml->forecast->simpleforecast->forecastdays->forecastday[$i]->conditions;
				  $icon = $this->getLocalWeatherImage($xml->forecast->simpleforecast->forecastdays->forecastday[$i]->icon, false);
								
					// output
					$wicon = ImageCreateFromPNG ( $icon );
					ImageCopyResampled($image, $wicon, imagesx($image)-95, $offset+5, 0, 0, imagesx($wicon)/2, imagesy($wicon)/2, imagesx($wicon), imagesy($wicon));
					ImageDestroy($wicon);
					$opt = array(
						'width' => 150,
						'align' => ALIGN_RIGHT
					);
					$text = $day."\n".$high."° | ".$low."°\n".$condition; // ."ICON:".$xml->weather->forecast_conditions[$i]->icon['data'];
					imagettftextboxopt($image, 15, 0, imagesx($image)-240, $offset, $style['textcolor'], $style['font'], $text, $opt);
        }
    //ENDE XML-Datei auslesen
    }
		
	
	private function getLocalWeatherImage($googleWeatherImage, $night) {
	  
    $localImagePath = 'resources/weather/'.$googleWeatherImage.".png";
    $localImagePathNight = 'resources/weather/'.$googleWeatherImage."_night.png";
    
		//if parameter $night is true and night image exist use it
		if ($night && file_exists($localImagePathNight))
			$localImagePath = $localImagePathNight;
		else if (!file_exists($localImagePath))
			// if daylight image doesn't exist display N/A image
			$localImagePath = 'resources/weather/na.png';
		return $localImagePath;
	}
	
}
 

Anhänge

  • 123.PNG
    123.PNG
    416.4 KB · Aufrufe: 102
Zuletzt bearbeitet:
@ht81, @mosjka1:

Hoobert hat nicht ganz so viele Informationen ausgelesen:

Am einfachsten ist es sich die heruntergeladene weather.xml (im cache-Verzeichnis) anzuschauen und die benötigten Informationen dann in den current_conditions einzulesen (ab Zeile 64 in Hooberts weatherplugin.php)

PHP:
				$current_condition = $xml->current_observation->weather;
				$current_temp = $xml->current_observation->temp_c;
				$current_humidity = $xml->current_observation->relative_humidity;
				$current_wind_condition = $xml->current_observation->wind_kph;
				$current_wind_dir = $xml->current_observation->wind_dir;
				$current_pressure = $xml->current_observation->pressure_mb;

Die Informationen kann man sich dann mit
PHP:
$text = $current_temp."°C";
				imagettftextboxopt($image, 28, 0, imagesx($image)-300, 85, $style['textcolor'], $style['fontb'], $text, $opt);
				$text = "Aktuell: $current_condition\nLuftfeuchte: $current_humidity\nWind: $current_wind_condition $current_wind_dir\nLuftdruck: $current_pressure mbar";
				imagettftextboxopt($image, 12, 0, imagesx($image)-300, 130, $style['textcolor'], $style['fontb'], $text, $opt);

anzeigen lassen.

Sieht dann so wie im Anhnag aus...

Gruss

fwalter
 

Anhänge

  • Zwischenablage01.jpg
    Zwischenablage01.jpg
    62.1 KB · Aufrufe: 122
Zuletzt bearbeitet:
fwalter, vielen Dank!!!

Jetzt schauts ordentlich aus.

Anbei Bild und Code:

Code:
<?php
/***************************************************************************
 * InfoFrame (image generator for digital picture frames)
 * Copyright (C) 2009  Tobias Kolb
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see http://www.gnu.org/licenses/
 ***************************************************************************/

class WeatherPlugin implements IPlugin
{
    private $dbconn = NULL;
  	private $config = NULL;
	
	public function __construct($dbconn, $config) {
		$this->dbconn = $dbconn;
		$this->config = $config;		
	  }
	  
  public function doUpdate() {
        // download weather XML into local file for caching
            $city = urlencode( $this->config['city'] );
            $api_key = $this->config['api_key'];
            $curl = curl_init();
            $file = fopen("cache/weather.xml", "w");
            if ($file)
            {
              curl_setopt($curl, CURLOPT_URL, utf8_encode("http://api.wunderground.com/api/$api_key/geolookup/conditions/forecast/lang:DL/q/Germany/$city.xml"));
              curl_setopt($curl, CURLOPT_FILE, $file);
              curl_setopt($curl, CURLOPT_USERAGENT, utf8_encode("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"));
              curl_exec($curl);
              fclose($file);
            }
            curl_close($curl);
   
  }

	public function doOutput($image, $style, $updateData, &$yoffset) {
		$filename = 'cache/weather.xml';
    
    //doUpdate nur ausführen, wenn die Datei cache/weather.xml älter als eine halbe Stunde
    $diff_seconds_weather = (time() - filectime($filename));
    if (!file_exists($filename) || ($diff_seconds_weather > ($this->config['update_weather']*60))){  
      $this->doUpdate();
    }
    
    // XML-Datei auslesen                   	
		if(file_exists($filename) && (filesize($filename) > 0)) {
		
			$xml = simplexml_load_file($filename);
			if($xml) {
				// parse weather data
				// ===================
				// current conditions
				$current_condition = $xml->current_observation->weather;
				$current_temp = $xml->current_observation->temp_c;
                $current_humidity = $xml->current_observation->relative_humidity;
                $current_wind_condition = $xml->current_observation->wind_kph;
                $current_wind_dir = $xml->current_observation->wind_dir;
                $current_pressure = $xml->current_observation->pressure_mb;  
				$night = !isDaylight();
				$current_icon = $this->getLocalWeatherImage($xml->current_observation->icon, $night);
				$wicon = ImageCreateFromPNG ( $current_icon );
				ImageCopy($image, $wicon, imagesx($image)-190, 5, 0, 0, imagesx($wicon), imagesy($wicon));
				//ImageCopy($image, $wicon, 50, 5, 0, 0, imagesx($wicon), imagesy($wicon));
				ImageDestroy($wicon);
				$opt = array(
					'width' => 280,
					'align' => ALIGN_RIGHT
				); 
      }
    }  
				$text = $current_temp."°C";
				imagettftextboxopt($image, 24, 0, imagesx($image)-300, 105, $style['textcolor'], $style['font'], $text, $opt);
				$text = "Aktuell: $current_condition\nLuftfeuchte: $current_humidity\nWind: $current_wind_condition $current_wind_dir\nLuftdruck: $current_pressure mbar"; 
				imagettftextboxopt($image, 15, 0, imagesx($image)-300, 145, $style['textcolor'], $style['font'], $text, $opt);
    
	// forecast for today and next 3 days
				for ($i = 0; $i <= 3; $i++) {
					// pixel offset for placing day 0-3 in different rows from top to bottom
					if (imagesy($image) <= 500) {
						$offset = 225+(85*$i); // smaller spacing for low resolution displays (vertical=480px)
					} else {
						$offset = 255+83*$i; // normal spacing for high resolution diplays (vertical=600px)
					}
					if ($offset > (imagesy($image)-80))
						break; // offset out of range, skip output of further weather forecast days

					// format data
					$day = $xml->forecast->simpleforecast->forecastdays->forecastday[$i]->date->weekday_short;
					if ($i == 0)
						$day = 'Heute';
					if ($i == 1)
						$day = 'Morgen';
					$low = $xml->forecast->simpleforecast->forecastdays->forecastday[$i]->low->celsius;
					$high = $xml->forecast->simpleforecast->forecastdays->forecastday[$i]->high->celsius;
					$condition = $xml->forecast->simpleforecast->forecastdays->forecastday[$i]->conditions;
				  $icon = $this->getLocalWeatherImage($xml->forecast->simpleforecast->forecastdays->forecastday[$i]->icon, false);
								
					// output
					$wicon = ImageCreateFromPNG ( $icon );
					ImageCopyResampled($image, $wicon, imagesx($image)-95, $offset+5, 0, 0, imagesx($wicon)/2, imagesy($wicon)/2, imagesx($wicon), imagesy($wicon));
					ImageDestroy($wicon);
					$opt = array(
						'width' => 150,
						'align' => ALIGN_RIGHT
					);
					$text = $day."\n".$high."° | ".$low."°\n".$condition; // ."ICON:".$xml->weather->forecast_conditions[$i]->icon['data'];
					imagettftextboxopt($image, 15, 0, imagesx($image)-240, $offset, $style['textcolor'], $style['font'], $text, $opt);
        }
    //ENDE XML-Datei auslesen
    }
		
	
	private function getLocalWeatherImage($googleWeatherImage, $night) {
	  
    $localImagePath = 'resources/weather/'.$googleWeatherImage.".png";
    $localImagePathNight = 'resources/weather/'.$googleWeatherImage."_night.png";
    
		//if parameter $night is true and night image exist use it
		if ($night && file_exists($localImagePathNight))
			$localImagePath = $localImagePathNight;
		else if (!file_exists($localImagePath))
			// if daylight image doesn't exist display N/A image
			$localImagePath = 'resources/weather/na.png';
		return $localImagePath;
	}
	
}
 

Anhänge

  • 324324.PNG
    324324.PNG
    419.4 KB · Aufrufe: 121
Sodele,

nun siehts endlich auch bei mir wieder wie gewohnt aus.....das beruhigt unheimlich ;)

Danke an Hoobert und fwalter!!
 

Anhänge

  • 192_168_178_11.jpg
    192_168_178_11.jpg
    127.5 KB · Aufrufe: 76
Zuletzt bearbeitet von einem Moderator:
Hallo ht81, mosjka1,

so wie Ihr das habt sieht das bei mir auch in etwa aus, wie macht ihr das mit der Uhrzeitanzeige??? lasse meine Seite alle 60sec. reloaden, damit die Uhrzeit aktuell bleibt.

Aber dadurch wird ja auch alle 60sec. eine Anfrage bei wunderground geschickt......somit würde ich die max. Anfrage weit überschreiten.

Habt ihr evtl mal nen Index.php Auszug betreffend der Uhrzeit für mich, oder wie habt ihr das realisiert?

Gruß

S_E_V_E_N
 
In der config.ini ist bei mir folgendes eingetragen:

Code:
[WeatherPlugin]
; updateintervall der Plugins (Mail, Kalender, Wetter...) in Minuten
updatetime = 30

; Stadt für die Google-Weather-API
city = "Ort"
api_key = "apikey"
update_weather = 30

Somit müsste sich das Wetter nur alle 30min aktualisieren.

wie bekomme ich eigentlich "km/h" hinter die Angabe der Windgeschwindigkeit rein ($current_wind_kph)?
Code:
$text = "Aktuell: $current_condition\nLuftfeuchte: $current_humidity\nWind:  $current_wind_condition $current_wind_dir $current_wind_kph \nLuftdruck: $current_pressure mbar";
 
Zuletzt bearbeitet:
Das mit dem Updateintervall für das Wetter ist nicht das Problem; mein Problen ist wie bekomme ich immer die aktuelle hrzeit angezeigt?
 
Hallo SEVEN,

die Update-Parameter in der config.ini legen nur fest in welchen Abständen die Daten der Plugins neu geladen werden. Hier kannst Du den Parameter "update_weather" also für wunderground auf minimal 3 Minuten stellen (= 20 Aktualisierungen pro Stunde * 24 Stunden = 480 Aktualisierungen pro Tag). Beim TickerPlugin darf man 150 mal pro Stunde aktualisieren (alle Ticker zusammen), die anderen Plugins haben meines Wissens keine Beschränkung.

Die Uhr wird allerdings in der index.php angezeigt, d.h. Du musst irgendwie sicherstellen, dass Deine index.php jede Minute aufgerufen wird und somit die Uhr aktualisiert (bei mir macht das die crontab von freetz). Ist beim Aufruf der index.php die eingestellte Zeit für die Plugin-Aktualisierung noch nicht abgelaufen, so werden die Plugins auch nicht aktualisiert.

Du kannst also guten Gewissens Deine Seite alle 60 sec. reloaden lassen, ohne die Beschränkung von wunderground zu übertreffen.

Gruß
Hoobert
 
wie bekomme ich eigentlich "km/h" hinter die Angabe der Windgeschwindigkeit rein ($current_wind_kph)?
Code:
$text = "Aktuell: $current_condition\nLuftfeuchte: $current_humidity\nWind:  $current_wind_condition $current_wind_dir $current_wind_kph  [COLOR="#FF0000"]km/h [/COLOR]\nLuftdruck: $current_pressure mbar";

Einfach dahinter schreiben..... ;)
 
Kostenlos!

Statistik des Forums

Themen
248,890
Beiträge
2,304,187
Mitglieder
378,575
Neuestes Mitglied
King Manaka