PiDisplay: Nachrichten, Kalender, Wetter und mehr mit dem RaspberryPi (Teil 2)

Im ersten Teil des Tutorials hatte zum PiDisplay hatte die grundsätzliche Einrichtung und die verwendete Hardware beschrieben: Ein 7 Zoll LCD-Farb-Monitor mit Compositive-Video-Eingang und ein Raspberry Pi Modell A (256 MB) mit WLAN-Dongle.

Als Browser wird der Chromium im Vollbildmodus eingesetzt, der zusammen mit der grafischen Oberfläche beim Booten startet. Mehr dazu im ersten Teil.

Wettervorhersage, Nachrichten und S-Bahn-Informationen

Wettervorhersage, Nachrichten und S-Bahn-Informationen

Die externen Webseiten werden per iframe eingebunden. Der steinalte Befehl meta-refresh leistet auch 2013 in diesem Zusammenhang noch gute Dienste.

<meta http-equiv="refresh" content="18; URL=news.html">

<iframe src="LOKALE_oder_EXTERNE_Seite.html" width="100%" height="100%">
</iframe>

Nach 18 Sekunden wird die nächste Seite aufgerufen. Auf diese Weise können in einer Dauerschleife verschiedene Webseiten, lokal oder im Internet, nacheinander aufgerufen werden. Da das Display völlig ohne Steuerung auskommen soll (und angesichts der Hardware auch auskommen muss), sind die Weiterleitungen so anzulegen, dass am Ende wieder die Ausgangsseite aufgerufen wird.

S-Bahn-Abfahrten über DB-Bahnhofstafel

S-Bahn-Abfahrten über DB-Bahnhofstafel

Auch lokale generierte Seiten werden über den iframe-Befehl eingebunden, damit etwaige Fehler in den Webseiten nicht zu einem vollständigen Ausfall führen.

Verkehrsinformationen

Die mobile Webseite der Berliner Verkehrsbetriebe bietet für die Buslinien eine Echtzeitabfrage für einzelne Bushaltestellen bzw. Abfahrtsmasten. Die Mastnummer ist an jeder Haltestelle verzeichnet.

Der Link http://mobil.bvg.de/IstAbfahrtzeiten/index/mobil;ref=3?input=101122 liefert die aktuellen Abfahrtszeiten für den Mast 101122 an der Haltestelle U Wittenau.

Für die S-Bahn sind Echtzeit-Informationen derzeit nicht über die BVG oder die S-Bahn-Berlin zu beziehen, sondern nur über die „Bahnhofstafeln“ der Deutsche Bahn direkt.

Hier bedarf es etwas Tüftelei den richtigen Link zu finden, da die Bahn die URL nicht sofort vollständig anzeigt.

http://mobile.bahn.de/bin/mobil/bhftafel.exe/dox?si=8089096&bt=dep&ti=actual&p=1111101&max=7&rt=1&use_realtime_filter=1&start=yes&

Auch hier versteckt sich der gesuchte Bahnhof hinter eine Nummer, der IBNR-Nummer. IT-affine Pufferküsser freuen sich über die Homepage von Michael Dittrich, der eine Online-Suche für diese IDs eingerichtet hat. Mein Bahnhof hat die IBNR-Nummer 8089096. Mit dem Parameter max wir die Anzahl der nächsten Abfahrten für die Anzeige bestimmt.

Nachrichten

Ich bin ein Nachrichten-Junkie. Was ist passiert, wer hat was gesagt? Der Deutschlandfunk bietet national und international den besten Überblick und hat zugleich die informativsten Überschriften und ersten Sätze bei den Nachrichten. Der Deutschlandfunk bietet seine Nachrichten per RSS-Feed an. Mit einem kleinen Python-Programm und einem Feedparser-Modul (feedparser) wird aus dem RSS-Feed eine Text-Webseite. Ich habe den Nachrichtentext jeweils auf den ersten Satz gekürzt, damit möglichst viele Nachrichten lesbar auf eine Seite passen.

Für die eher regionalen Nachrichten bietet der Rundfunk Berlin-Brandenburg (rbb) einen ähnlichen Service.

Die Kleinigkeiten hielten auch hier am längsten auf: Die Textcodierung (UTF-8 bzw. ISO-8859-1) funktioniert jetzt, irgendwie. Da ich da auf diesem Gebiet absoluter Newbie bin, habe ich da nach dem Prinzip „trial and error“ programmiert. Keine Ahnung, ob man das „so macht“. Das Ergebnis zählt!

Der Code fürs Parsen des DLF-Feeds:


#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
import feedparser
import os
# Ausgabe-html-Datei zum Schreiben oeffnen
f = open('/home/pi/rss/nachrichten.html', 'w')
#HTML-Header schreiben
h = "<html><head><meta http-equiv='content-type' content='text/html; charset='iso-8859-1'><style type='text/css'>h1 { font-family: sans-serif;font-size:14px; }h2 { font-family: sans-serif;font-size:18px; }p { font-family: sans-serif; font-size:15px; }</style><title>DRADIO Nachrichten</title></head><meta http-equiv='refresh' content='18; URL=homepage.html'><body>"
#Ende der HTML-Datei
e = "</body></html>"
#RSS-Datei mit feedparser oeffnen
nr = feedparser.parse('/home/pi/rss/nachrichten.rss')
#Ueberschrift aus dem Feed holen
h = h + '<h1>DLF-' + nr.feed.title[12:] + '</h1>'
#in Ausgabe-Datei speichern
f.write(h)
#Schleife ueber alle Meldungen laufen lassen, Meldung auf den ersten Satz verkuerzen und in HTML-Datei schreiben
for num in range(len(nr.entries)):
pp = nr.entries[num].description.find('.')
s = '<h2>' + nr.entries[num].title + '</h2><p>' + nr.entries[num].description[:pp+1] + '</p>'
f.write(s.encode('iso-8859-1'))
#Ende HTML
f.write(e)
#Datei schliessen
f.close()

Die Feeds werden per Shell-Script und wget zweimal pro Stunde abgeholt. DLF und RBB werden zu unterschiedlichen Zeiten aktualisiert, um stets aktuell zu sein.

Wetter

Das Wetter wird bei wunderground abgeholt. Die API bietet die Daten per JSON. Wieder etwas anderes. Wieder neu googlen, einlesen, testen, verwerfen, darüber nachdenken und dann doch eine Lösung finden.

Bei Weather Underground kann die API unter anderem nach den aktuellen Wetterdaten und der Vorhersage für die kommenden Tage abgefragt werden.

Das json-Modul von Python funktioniert ähnlich wie der feedparser.

Ich will hier nicht meinen kompletten Quellcode posten. Der sieht nicht schön aus, total nach Anfänger. Aber die wesentlichen Zeilen sind:


f = open('/home/pi/rss/current.json')
g = open('/home/pi/rss/txl.json')
jsonc_string = f.read()
jsonf_string = g.read()
parsed_jsonc = json.loads(jsonc_string)
parsed_jsonf = json.loads(jsonf_string)

location = parsed_jsonc['current_observation']['observation_location']['city']
temp_c = str(parsed_jsonc['current_observation']['temp_c']) + '° C'
hum = parsed_jsonc['current_observation']['relative_humidity']
con = parsed_jsonc['current_observation']['weather']
dt = parsed_jsonc['current_observation']['observation_time_rfc822']

fc = parsed_jsonf['forecast']['txt_forecast']['forecastday']

Die verschiedenen Vorhersagen hole ich dann in einer Schleife.
for i in range(8):
tit = fc[i]['title']
(...)
vh = fc[i]['fcttext_metric'].encode('utf-8')
(...)

Passe die Texte noch etwas auf meine Bedürfnisse an, korrigiere kleine Fehler in der Rechtschreibung und ergänze den nötigen HTML-Code. Am Ende schreibe ich alles in die Ausgabe-Datei – wieder mit UTF-8-Encoding nach Gutdünken.

Weitere Details sowie eine englische Kurzanleitung erwarten Euch in Teil 3 dieser kleinen Serie, der hoffentlich in der kommenden Woche erscheint.

Hinweise zu besserem Python oder Fragen bitte einfach unten in die Kommentare.

Flattr this!

5 Reaktionen auf “PiDisplay: Nachrichten, Kalender, Wetter und mehr mit dem RaspberryPi (Teil 2)

  1. Pingback: Results for week beginning 2013-08-05 | Iron Blogger Berlin

  2. Ein sehr schönes Projekt mit dem Abfahrtsmonitor, ich habe ähnliches als Abschlussprojekt (Fachinformatiker) vor. Könntest du mir den Quelltext zu senden?

    Grüße

    Tobias

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *