Wetteranzeige in Xibo
[ACHTUNG: Alle Xibo-Skripte befinden sich jetzt bei GitHub]
Dritter und wahrscheinlich vorerst letzter Teil der Xibo-Artikel. Heute habe ich das neue Wetter-Skript fertiggestellt, nachdem Google vor ein paar Wochen durch das Einstellen der Weather API eine Neuentwicklung nötig gemacht hatte.
Neuer Datenlieferant ist die Yahoo Weather API in der Hoffnung, dass der Dienst auch dauerhaft in dieser Form angeboten wird. Yahoos API ist inhaltlich etwas anders: Anders als Google gibt Yahoo nur Informationen über die aktuellen Wetterdaten und die Vorhersage für „heute“ und „morgen“ raus.
OK, hier nun das Skript. Dazu ist zu sagen, dass man in den Zeilen 4 und 5 Konfigurationsmöglichkeiten hat. Zum einen muss man die $ort_id an den gewünschten Ort anpassen. Das geschieht über die Yahoo-Weather-Website. Dort sucht man seinen Ort und läßt sich das Wetter anzeigen. Oben in der Adressleiste kopiert man sich dann ID aus der URL. Beispiel: das Wetter von Weener findet man unter
http://de.wetter.yahoo.com/deutschland/niedersachsen/weener-704283/
Die ID ist dem nach die 704283.
Die Variable $icon_url in Zeile 5 gibt an, woher die Wettericons kommen sollen. Wer kein eigenes Iconset hat, läßt die Variable so wie sie ist, dann werden die Standard-Icons von Yahoo geladen.
<?php header('content-type: text/html; charset=utf-8'); $ort_id = "704283"; //ID finden: http://de.wetter.yahoo.com/ $icon_url = "http://l.yimg.com/us.yimg.com/i/us/nws/weather/gr/"; $wetter = wetterdaten($ort_id, $icon_url); ?> <html> <head> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="pragma" content="no-cache"> <style type="text/css"> * { padding: 0; margin: 0; } body { font-family: Trebuchet MS, Verdana, Arial, Helvetica; background-color: #ffffff; } h1, h2 { font: bold 24px Trebuchet MS; width: 100%; border: none; background-color: #636363; color: #ffffff; text-align: center; padding: 5px 0 5px 0; } div.aktuell, div.vorhersage { border: 1px solid #636363; margin: 25px auto; text-align: center; background: #dedede; padding: 20px; } div.aktuell { background: #dedede url(<?php echo $wetter[0]['icon'];?>) no-repeat 20px 10px; } div.vorhersage#heute { background: #dedede url(<?php echo $wetter[1]['icon'];?>) no-repeat 20px 10px; } div.vorhersage#morgen { background: #dedede url(<?php echo $wetter[2]['icon'];?>) no-repeat 20px 10px; } div.aktuell span, div.vorhersage span { font-size: 16pt; display: block; text-align: right; color: #333; } div.aktuell span.temp { font-size: 64pt; font-weight: bold; color: #000; } div.aktuell span.zustand { font-size: 26pt; font-weight: normal; margin-top: -20px; color: #000; } div.vorhersage span.temp { font-size: 36pt; font-weight: normal; margin-top: 10px; color: #000; } div.vorhersage span.zustand { font-size: 18pt; font-weight: normal; margin-top: -15px; color: #000; } div#quelle { width: 100%; font-size: 10pt; text-align: center; clear: both; padding-top: 15px; } </style> </head> <body> <h1>Wetter</h1> <div class="aktuell"> <span class='tag'>Aktuell</span> <span class='temp'><?php echo $wetter[0]['temperatur']; ?>°C</span><br/> <span class='zustand'><?php echo $wetter[0]['zustand']; ?></span> </div> <div class="vorhersage" id="heute"> <span class='tag'>Heute</span> <span class='temp'><?php echo $wetter[1]['tief']; ?>°C - <?php echo $wetter[1]['hoch']; ?>°C</span><br/> <span class='zustand'><?php echo $wetter[1]['zustand']; ?></span> </div> <div class="vorhersage" id="morgen"> <span class='tag'>Morgen</span> <span class='temp'><?php echo $wetter[2]['tief']; ?>°C - <?php echo $wetter[2]['hoch']; ?>°C</span><br/> <span class='zustand'><?php echo $wetter[2]['zustand']; ?></span> </div> <div id="quelle">Quelle: Yahoo Weather API</div> </body> </html> <?php function wetterdaten($w,$imgurl) { $xmlurl = "http://weather.yahooapis.com/forecastrss?w=" . $w . "&u=c"; // Daten von API laden und in SimpleXML konvertieren $xml = file_get_contents($xmlurl); $xml = str_replace("yweather:", "yweather_", $xml); $api = simplexml_load_string(utf8_encode($xml)); $wetter = array(); // Aktuelles Wetter $wetter[0]['zustand'] = yahoo_code2text($api->channel->item->yweather_condition->attributes()->code); $wetter[0]['icon'] = $imgurl . yahoo_code2icon($api->channel->item->yweather_condition->attributes()->code); $wetter[0]['temperatur'] = $api->channel->item->yweather_condition->attributes()->temp; //Vorhersage für heute und morgen $wetter[1]['zustand'] = yahoo_code2text($api->channel->item->yweather_forecast[0]->attributes()->code); $wetter[1]['icon'] = $imgurl . yahoo_code2icon($api->channel->item->yweather_forecast[0]->attributes()->code); $wetter[1]['tief'] = $api->channel->item->yweather_forecast[0]->attributes()->low; $wetter[1]['hoch'] = $api->channel->item->yweather_forecast[0]->attributes()->high; $wetter[2]['zustand'] = yahoo_code2text($api->channel->item->yweather_forecast[1]->attributes()->code); $wetter[2]['icon'] = $imgurl . yahoo_code2icon($api->channel->item->yweather_forecast[1]->attributes()->code); $wetter[2]['tief'] = $api->channel->item->yweather_forecast[1]->attributes()->low; $wetter[2]['hoch'] = $api->channel->item->yweather_forecast[1]->attributes()->high; return $wetter; } function yahoo_code2text($code) { $text = ""; switch ($code) { case 0 : $text="Sturm"; break; //tornado case 1 : $text="Sturm"; break; //tropical storm case 2 : $text="Sturm"; break; //hurricane case 3 : $text="Schweres Gewitter"; break; //severe thunderstorms case 4 : $text="Gewitter"; break; //thunderstorms case 5 : $text="Schneeregen"; break; //mixed rain and snow case 6 : $text="Regen / Graupel"; break; //mixed rain and sleet case 7 : $text="Schnee / Graupel"; break; //mixed snow an sleet case 8 : $text="Gefrierender Nieselregen"; break; //freezing drizzle case 9 : $text="Nieselregel"; break; //drizzle case 10 : $text="Eisregen"; break; //freezing rain case 11 : $text="Schauer"; break; //showers case 12 : $text="Schauer"; break; //showers case 13 : $text="Schneeböen"; break; //snow flurries case 14 : $text="Leichter Schneefall"; break; //light snow showers case 15 : $text="Schneefall"; break; //blowing snow case 16 : $text="Schneefall"; break; //snow case 17 : $text="Hagel"; break; //hail case 18 : $text="Graupel"; break; //sleet case 19 : $text="nebelig"; break; //dust case 20 : $text="nebelig"; break; //foggy case 21 : $text="Nebel"; break; //haze case 22 : $text="nebelig"; break; //smoky case 23 : $text="stürmisch"; break; //blustery case 24 : $text="windig"; break; //windy case 25 : $text="frostig"; break; //cold case 26 : $text="bewölkt"; break; //cloudy case 27 : $text="meistens bewölkt"; break; //mostly cloudy (night) case 28 : $text="meistens bewölkt"; break; //mostly cloudy (day) case 29 : $text="teils bewölkt"; break; //partly cloudy (night) case 30 : $text="teils bewölkt"; break; //partly cloudy (day) case 31 : $text="klar"; break; //clear (night) case 32 : $text="sonnig"; break; //sunny case 33 : $text="heiter"; break; //fair (night) case 34 : $text="heiter"; break; //fair (day) case 35 : $text="Regen / Hagel"; break; //mixed rain and hail case 36 : $text="Hitze"; break; //hot case 37 : $text="vereinzelte Gewitter"; break; //isolated thunderstorms case 38 : $text="vereinzelte Gewitter"; break; //scattered thunderstorms case 39 : $text="vereinzelte Gewitter"; break; //scattered thunderstorms case 40 : $text="vereinzelte Schauer"; break; //scattered showers case 41 : $text="starker Schneefall"; break; //heavy snow case 42 : $text="vereinzelte Schneeschauer"; break; //scattered snow showers case 43 : $text="starker Schneefall"; break; //heavy snow case 44 : $text="teils bewölkt"; break; //partly cloudy case 45 : $text="Gewitter"; break; //thundershowers case 46 : $text="Schneeschauer"; break; //snow showers case 47 : $text="Gewitter"; break; //isolated thundershowers case 3200 : $text=""; break; //not available } return $text; } function yahoo_code2icon($code) { $icon = $code . "d.png"; return $icon; } ?>
Ich habe das Script als embedded HTML in eine Region eingefügt.
Leider bekomme ich nur ein Fenster mit den statischen Werten (z.B. Heute °C) angezeigt,
die Daten und Wettericons fehlen. Woran kann das liegen?
Als Embedded HTML funktioniert es nicht, weil das Skript PHP-Code enthält, den der Xibo-Client nicht interpretiert, da es sich nur um eine lokale HTML-Datei handelt.
Das Skript muss auf einen Webserver, am besten auf den Xibo-Server in ein Parallel-Verzeichnis von „xibo“. Bei mir heißt das Verzeichnis „xibodata“ und dort liegen die PHP-Dateien.
In Xibo erfolgt die Einbindung dann als „Webpage“ mit der Adresse http://ip-des-xibo-servers/xibodata/wetter.php . Dann sollte es klappen…
Hat geklappt. Vielen Dank.
Ich bin gerade dabei, erste Schritte mit Xibo zu unternehmen und dabei auf Ihren Blog gestoßen.
Ich würde auch ganz gerne das Wetter in meine Präsentation einbinden, habe die php-Datei wie oben beschrieben auf einem Webserver abgelegt, bei Aufruf bekomme ich jedoch folgende Fehlermeldung:
Fatal error: Call to a member function attributes() on a non-object … on line 133 .
Vielleicht haben Sie ja eine Idee, wie ich den Fehler beheben kann.
mfg
Jürgen
Hallo Jürgen,
evtl. klappt der Download der XML-Daten nicht. Füge mal bitte in Zeile 131 folgendes ein:
echo $xml;
Was wird dort ausgegeben?
Vielen Dank für die schnelle Antwort,
ich habe es in die Zeile 131 eingefügt, leider kommt immer noch die gleiche
Fehlermeldung 🙁
Hallo Michael,
die Fehlermeldung macht mir immer noch Kopfzerbrechen… vor allem, weil ja das selbe Skript bei Ihnen tatellos zu funktionieren scheint.
Kann es daran liegen, dass ich die .php-Datei auf einem kostenlosen Webserver gelegt habe?
mfg
Jürgen
Hallo Jürgen,
versuch mal bitte folgenden Code als „wetter_debug.php“ auf dem Server auszuführen und poste das Ergebnis hier (mit dem „<>„-Icon) oder bei pastebin.com
Wird die XML-Datei überhaupt von Yahoo geladen?
Du hast recht mit deiner Vermutung. Die XML-Daten werden gar nicht erst geladen:
Warning: file_get_contents() [function.file-get-contents]: http:// wrapper is disabled in the server configuration by allow_url_fopen=0 in …/Wetter/wetter_debug.phpon line 19
Warning: file_get_contents(http://weather.yahooapis.com/forecastrss?w=545766&u=c) [function.file-get-contents]: failed to open stream: no suitable wrapper could be found in …/Wetter/wetter_debug.php on line 19
Folgende XML-Daten wurden geladen:
Eine bei Providern weit verbreitete Konfiguration, dass man externe Datei per fopen() nicht laden darf. Die Einstellung ist auch auf öffentlichen Servern sinnvoll, da sie häufig als Sicherheitslücke ausgenutzt werden kann. Es gibt aber eine Alternative, die du mal probieren kannst:
Was im ersten Testskript in Zeile 19 einfach per „file_get_contents(..)“ gemacht wurde, wird jetzt über eine cURL-Session gemacht. Dazu ist das PHP-Modul „cURL“ von Nöten, welches aber von vielen Providern freigeschaltet ist.
Bitte probier‘ es noch einmal damit und lass mich das Ergebnis wissen…
was muss ich da beim ursprünglichen skript ändern?
sieht gleich viel, viel besser aus:
Na, Bingo!
Dann setzen wir das Puzzle mal zusammen. Bitte ersetze im „Original“-Wetterskript die Zeile 127
durch die Zeilen 17-22 des zweiten Testskripts.
Damit sollte alles laufen.
So, jetzt hat er ein Problem im der Zeile 138 (ehemals im Original 133), das hatte er vorher auch schon:
Fatal error: Call to a member function attributes() on a non-object in …Wetter/Wetter.php on line 138
OK, hatte ich am Anfang als Folgefehler eingestuft. Evtl. ist bei dir (bzw. auf dem Server deines Providers) das SimpleXML-Modul nicht freigeschaltet.
Erstell‘ mal bitte eine Datei phpinfo.php mit folgendem Inhalt:
Gibt es dort einen Abschnitt „SimpleXML“?
Ja, gibt es:
Revision: $Revision: 302715$
Schema support: enabled
Welche PHP-Version hast bzw. unter welcher URL kann ich mir die phpinfo.php mal ansehen?
http://leonding0620.funpic.de/Wetter/phpinfo.php
…ich bin auch für einen alternativen Server-Anbieter offen, falls dieser das nicht kann…
Wieso läßt du das eigentlich nicht direkt auf deinem Xibo-Server laufen? Dort hast du dann ja die „Macht“ über die PHP-Einstellungen…
Naja, ich habe keinen eigenen webserver, nutze deshalb den xibo-server von http://www.xibo-de.com
Ah, ok. Verstehe. Also, ich sehe zwei Möglichkeiten: entweder du fragst bei VI, ob du auf deren Server zusätzliche Skripte hosten darfst oder du suchst dir unabhängig einen eigenen Server bzw. Webspace. An der Stelle möchte ich dir meinen Webhoster Webhostone empfehlen, wo ich seit Jahren zufriedener Kunde bin.
Hallo Michael
Ich habe gleiche Problem wie Jürgen
Ich habe meinen eigenen Apache Server auf CentOS. Kann das an Proxy/Firewall liegen? Xibo Server wird intern benutzt und liegt nicht in DMZ
Hallo Rostom,
lade auf deinem Apache Server mal mit folgendem Befehl die eigentliche XML-Datei herunter, die verwendet werden soll.
Bitte ändere die Orts-ID 704283 in die ID, die du für deinen Ort verwendest.
Poste den Inhalt der Datei /tmp/weather.xml dann hier mal.
Hier ist inhalt von wether.xml
Das sind Fehlermeldungen aus /var/log/httpd/error_log:
[Wed Feb 26 14:50:55 2014] [error] [client 198.168.25.7] PHP Notice: Trying to get property of non-object in /var/www/html/xibo/xibo_wetter_at/wetter2.php on line 138
[Wed Feb 26 14:50:55 2014] [error] [client 198.168.25.7] PHP Notice: Trying to get property of non-object in /var/www/html/xibo/xibo_wetter_at/wetter2.php on line 138
[Wed Feb 26 14:50:55 2014] [error] [client 198.168.25.7] PHP Notice: Trying to get property of non-object in /var/www/html/xibo/xibo_wetter_at/wetter2.php on line 138
[Wed Feb 26 14:50:55 2014] [error] [client 198.168.25.7] PHP Fatal error: Call to a member function attributes() on a non-object in /var/www/html/xibo/xibo_wetter_at/wetter2.php on line 138
und das sind lines von Fehlermeldung
Danke
Also, irgendwas muss da mit der XML-Datei nicht funktionieren, auch wenn die Ausgabe deines wget’s gut aussieht.
Hast du diese Testseite schon mal ausprobiert?
Ja, das habe ich schon ausprobiert. Ich habe genau gleiche Fall wie Jürgen 🙁
Hi, Nice work,, i;m running Xibo on a Andriod device and this is the first time i get a
nice weather forecast. One thing i like to know how do i get this in English ore even better
in Dutch. My be you have eny idea..
Kind regards Frank Verdonk
Hi,
erstmal vielen Dank für die Super-Scripts, die zudem noch kostenfrei und gut dokumentiert hier vorgestellt.
Ich habe heute mal xibo auf einem Android-Device installiert und mit meiner/einer Präsentation (mit drei Regionen) „gefüttert“.
Während auf einem Linux- und Windows-Client Deine Scripts Wetter und Kurse angepasst in einer schmalen hochkantigen Region dargestellt werden, wird beim Android-Client die Breite der Region quasi als Gesamtbreite der Webpage interpretiert. Somit erscheint das Ergebnis des Scripts im Seitenverhältnis 16:9 ganz oben in der Region. Ich habe noch keine Ahnung, wie ich das anpassen soll.
Gruß
Klaus
„Sorry“. Erst einmal für die späte Antwort und für die Tatsache, dass ich leider keinerlei Erfahrungen mit dem Android-Client habe. Da kann ich dir nicht weiterhelfen 🙁
Hi, sorry ich bin ein absoluter Neuling, was PHP und MySQL angeht.
Ich habe das Problem, dass bei deinem Script die Umlaute nicht angezeigt werden, sondern nur ein Kasten mit einem Fragezeichen drin.
PHP läuft mit UTF-8
Woran könnte es noch liegen?
Sorry, wenn das eine dumme Frage ist!
Du könntest versuchen im <head></head>-Bereich folgendes einzufügen:
Hallo,
vielen Dank für deinen genialen Script. Die Anzeige ist genauso, wie ich das brauche und deshalb habe ich das jetzt schon seit über einem Jahr bei uns in der Firma im Einsatz.
Doch seit letzter Woche kommt folgender Fehler, wenn ich den Script aufrufe:
„Please provide valid credentials. OAuth oauth_problem=“OST_OAUTH_PARAMETER_ABSENT_ERROR“, realm=“yahooapis.com““
Hab schon eine Erklärung gefunden. => https://www.igorkromin.net/index.php/2016/03/27/yahoo-effectively-shut-down-its-weather-api-by-forcing-oauth-10-and-crippling-it/
Hast du eine Idee, was man da machen könnte? Welchen anderen Wetterprovider „unterstützt“ du zukünftig?
Hi, siehe hier: https://noltenet.de/2015/08/06/xibo-widgets-kuenftig-bei-github/#comment-2919
Neue Schnittstelle zu http://weather.tuxnet24.de ist in Arbeit.
OK, war alles einfacher als gedacht. Hier geht es weiter: https://noltenet.de/2016/03/30/neue-datenquelle-fuer-wetter-skript/
SUPPPPPPEEEEERRRR!!!!!!
Hi, super Arbeit!
Leider bekomme ich bei tuxnet nun auch :“Forbidden – You don’t have permission to access on this server.“
Werden wir auf eine blacklist gesetzt, weil das Abholintervall zu kurz ist?
Als URL für Marbella (Deutsche Schule) verwenden wir: http://weather.tuxnet24.de/?id=SPXX0054
Ich kann in Xibo auch keine Möglichkeit finden, für das Wetterskript ein eigenes Abholintervall (1h) einzustellen.
Danke und Gruß,
Christian
Hallo Christian. Danke für den Hinweis. Nach Rücksprache mit dem Betreiber der API dürfen pro IP-Adresse maximal 400 Abrufe pro Tag erfolgen.
Ich habe deshalb dem Skript einen Caching-Mechanismus verpasst. Standardmäßig werden die Daten nur noch alle 15 Minuten von der API geladen, egal wie oft das Wetter-Skript in Xibo aufgerufen wird. Innerhalb der 15 Minuten werden die Daten aus einer lokalen XML-Datei geladen, die beim Abruf der API auf dem Server gespeichert wird. Bitte lade die neueste Version von GitHub…
Michael 🙂
Hi, das „alte“ Script nutze ich schon seit Jahren. Immer noch vielen Dank dafür!!!
leider bekomme ich beim Aufruf des neuen Scripts folgenden Fehlerhinweis:
Die Seite exxx.mxxxx.de funktioniert nicht
exxx.mxxxx.de kann diese Anfrage momentan nicht verarbeiten.
500
Das Kurse-Script z.B. läuft einwandfrei. Ich habe Dein Script aus Github kopiert und GMXX0007 für meinen Ort eingetragen.
Hüüülfe…
Hallo Klaus. Funktioniert das Skript nicht, seit dem ich das Caching einbebaut habe oder vorher auch schon nicht? Hast du Zugriff auf die phperror.log? Was steht da drin?
Hallo Michael, danke fürs kümmern. Den Fehler gab es aber schon vorm caching. Die error.log meldet einen parse-Fehler: „PHP Parse error: syntax error, unexpected ‚[‚ in /var/www/vhosts/xxxx/wetter.php on line 156“
line 156: $wetter[0][‚temperatur‘] = split(“ „,$api->current_temp)[0];
Das scheint mir aber an der verwendeten PHP-Version zu liegen. Der „fehlerhafte“ Server hat 5.3.3, während es auf einer anderen Domain mit 5.4.45 (gerade mal ausprobiert) super läuft.
Also Entwarnung, ich lasse das Wetter-Script für Xibo eben einfach auf dem anderen Server laufen. Vielen Dank für Deine Arbeit!!!
Klaus
Schade, jetzt hat es seit mehr als einer Woche funktioniert. Jetzt bekomme ich für meinen Ort keine Wetterinformationen mehr. Ich kann auf der Seite http://weather.tuxnet24.de/?action=citycode&lang=de nicht mal mehr nach meiner Stadt suchen. Die Suchfunktion findet im Moment (weltweit) nichts mehr.
Leider muss auch ich darüber berichten, das das ganze sehr „fehleranfällig“ ist.
So kann ich zwar den Code für die Stadt Ulm finden (GMXX0131) – aber ein Aufruf im Browser mit http://weather.tuxnet24.de/?id=GMXX0131 bringt gar nichts als Ergebniss. Dann das selbe mit Stuttgart (GMXX0128) bringt zwar Daten – aber wenn ich dann noch die benötigte „&unit=c&mode=xml“ hinzufüge, dann war gestern keine Rückgabe möglich (heute geht es grad)
Gibt es einen alternativen Dienst für die Werte? Oder was kann man machen, damit die Abfrage auch zuverlässig Werte übermittelt?
Danke für die Mühe!!!
Auch hier bei mir geht nichts.
Wäre das vielleicht eine Quelle:
Weather Underground: https://www.wunderground.com/weather/api/
Ich würde gerne abwarten, ob sich die aktuelle API wieder „erholt“. Technische Probleme kann es ja immer mal geben. Ein Umstieg auf eine weitere API, z.B. Weather Underground oder OpenWeatherMap würde bedeuten, dass jeder einen API-Key dort haben muss. Das wollte ich eigentlich vermeiden, da es so schön einfach ist…
Hallo erst mal und vielen Dank für das Wetterscript!
Leider habe ich ein Problem damit, in der Vorschau werden alle Symbole schön dargestellt, jedoch am Xibo-Client fehlen diese. Ich habe die wetter.php als Webpage eingebunden, wie oben beschrieben, trotzdem klappt es leider nicht. Was mache ich noch falsch?
Hallo nochmals,
ich konnte mein Problem selbst lösen. Mir war nicht klar, dass der Client Internet-zugriff benötigt, um die Icons herunterzuladen. Ich habe die Icons nun manuell geladen und auf dem Server abgelegt. Mit dem lokalen Zugriff funktioniert es.