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

... Die müsste allerdings noch jemand parsen, dazu fehlt mir der Background
... Dein Wunsch ist mir Befehl.

Ich hab mich gestern Abend schonmal drangemacht und habe das WeatherPlugin auf die Struktur der .xml-Datei von wunderground.com umgebaut. Allerdings muss man sich bei wunderground anmelden um einen API-Key zu bekommen, den man in die URL einbauen muss. Die Anmeldung ist kostenlos und damit kann man 500-mal am Tag aktualisieren, was bei einer Aktualisierungszeit von einer halben Stunde locker reicht.

Mein WeatherPlugin habe ich angehängt und folgende Schritte führen zum Erfolg:
  • ihr benötigt die Stelle von Beginn der doOutput-Funktion bis zum Kommentar "ENDE XML-Datei auslesen"
  • die Funktion getLocalWeatherImage()
  • die Funktion doUpdate()
  • 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
  • die Namen der Icons an die neuen Bezeichnungen anpassen, oder meine nehmen

In der WeatherPlugin.php habe ich im Vergleich zu der Originalversion von PacmanII einige Dinge angepasst, abgeändert und hinzugefügt, da müsstet ihr bitte schauen was ihr nicht bzw. anderst braucht.
Anhang anzeigen WeatherPluginUpdate.zip

Dann wünsch ich allen gutes Gelingen!
Gruß
Hoobert

P.S.: Falls jemand noch eine bessere Alternative zu wundergound hat, nur her damit.
 
Hi Hoobert,

hab mal eben schnell dein Plugin auf meinen Server geladen. Klasse Arbeit von dir! ;)
Du zeigst ja innerhalb des Wetter-Plugins noch einiges mehr an.
Würde es dir etwas aus machen wenn du zusätzlich nochmal deinen icon-Ordner hochladen könntest?

Grüße Olli
 
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?
 

Neueste Beiträge

Statistik des Forums

Themen
246,069
Beiträge
2,245,565
Mitglieder
373,512
Neuestes Mitglied
ah1982
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.