Gefällt dir dieser Artikel?

Raspberry Pi: RSS Reader für HD44780 Display

erschienen in der Kategorie Technik, am 12.10.2012
Schnatterente
English speaking people should have a look at this.


So, das ging jetzt schneller als ich selbst gedacht hätte. Ich habe eine erste Version meines RasPi RSS Readers fertiggestellt. Das Programm erlaubt die Anzeige von aktuellen RSS News Feeds auf einem HD44780 Display, das an die GPIO Pins eines Raspberry Pi angeschlossen ist.




(Video nachträglich eingefügt, am 17. Oktober 2012)

Mein Python Skript bietet bisher Folgendes:
  • Es können beliebig viele RSS Feeds angezeigt werden. Genauer gesagt werden nur die Überschriften der Feeds angezeigt. Den im Feed enthaltenen Text anzuzeigen wäre zwar technisch kein Problem, aber doch ein bisschen zu viel für das kleine Display.
  • Es funktioniert mit allen HD44780 Displays.
  • Es bringt die wichtigsten Einstellungen zur Darstellung der Feeds mit (Anzeigedauer eines Displayinhalts; maximale Anzahl der anzuzeigenden Einträge je Feed; die Möglichkeit nur Feeds des aktuellen Tages anzuzeigen; Wörter am Zeilenende trennen oder auf die nächste Zeile schieben; Zeitintervall, bis der Feed neu geladen werden soll).
  • Korrektur der wichtigsten Umlaute (mein Display kann die meisten Umlaute gar nicht darstellen und jene, die es gibt, sind an einer anderen Stelle des Zeichensatzes versteckt).


RasPi RSS Reader installieren

Wer sich auch ein Display an seinen Raspberry Pi gebastelt hat, kann das Programm benutzen. Damit es läuft müssen zuvor noch zwei Libraries installiert werden: RPi.GPIO und Feedparser. Für die Installation der Feedparser-Bibliothek werden noch die Python Setuptools benötigt. Die Installation kann wie folgt via Konsole oder SSH Zugang erfolgen (als root):
# mkdir rss
# cd rss

# wget http://raspberry-gpio-python.googlecode.com/files/python-rpi.gpio_0.3.1a-1_armhf.deb
# dpkg -i python-rpi.gpio_0.3.1a-1_armhf.deb

# wget http://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c9.tar.gz
# tar -zxvf setuptools-0.6c9.tar.gz
# cd setuptools-0.6c9/
# python setup.py build
# python setup.py install
# cd ..

# wget http://feedparser.googlecode.com/files/feedparser-5.1.2.tar.gz
# tar -zxvf feedparser-5.1.2.tar.gz
# cd feedparser-5.1.2/
# python setup.py build
# python setup.py install
# cd ..

# wget http://www.schnatterente.net/code/raspberrypi/rssreader-1.3.py
# chmod +x rssreader-1.3.py

HINWEIS: Ich halte die Versionsnummern der RPi.GPIO-Library, der Setuptools und von Feedparser hier nicht aktuell. Verwendet am besten immer die aktuellsten Versionen der Pakete (welche das sind, erfahrt ihr, wenn ihr die Links anklickt) und passt die oben aufgeführten Kommandos entsprechend an.

RasPi RSS konfigurieren

Das heruntergeladene Python Skript rssreader.py sollte noch auf die eigenen Bedürfnisse angepasst werden. Dazu kann man es z.B. mit nano bearbeiten:
# nano rssreader.py

Zuerst sollte man die Belegung der GPIO Pins anpassen. Falls der Hardwareaufbau jedoch dem gleicht, den ich in meinem letzten Beitrag vorgestellt habe, kann alles so bleiben wie es voreingestellt ist. Falls nicht, sind in dem Beitrag weitere Informationen zu finden.
# GPIO Pins Config
DISPLAY_RS = 7
DISPLAY_E = 8
DISPLAY_DATA4 = 25
DISPLAY_DATA5 = 24
DISPLAY_DATA6 = 23
DISPLAY_DATA7 = 18

Danach können die Feeds und die Anzeige konfiguriert werden. Unter der Variable FEEDURLS können beliebig viele Feeds angegeben werden. Das sieht dann z.B. so aus:
FEEDURLS = ['http://www.schnatterente.net/rss.xml', 'http://www.heise.de/newsticker/heise-atom.xml']

MAXITEMS gibt an, wie viele Einträge eines Feeds maximal angezeigt werden sollen.

MINTIMEPERITEM und MAXTIMEPERITEM legen (in Sekunden) fest, wie lange ein Displayinhalt angezeigt wird, bevor der nächste erscheint. Die Anzeigedauer ist von der Anzahl der Zeichen im Display abhängig. Um einen festen, also nicht variierenden, Zeitslot zu erhalten, müssen beide Variablen auf den gleichen Wert gesetzt werden.

REFETCH legt in Sekunden fest, wie lange bis zum erneuten Herunterladen eines Feeds mindestens gewartet werden soll. Ein Wert von 0 sorgt dafür, dass die Feeds bei jedem Durchlauf neu geladen werden.

In ONLYCURRENTDAY kann angegeben werden, ob nur Nachrichten des aktuellen Tages angezeigt werden sollen. Der Wert dieser und der folgenden Variablen muss "True" oder "False" sein (Groß-/Kleinschreibung beachten).

Ist SHOWFEEDTITLE auf True gesetzt, wird beim Durchschalten der Nachrichten, vor den Einträgen eines Newsfeeds, dessen Titel angezeigt, z.B. "Schnatterente.net - Technik".

BREAKWORDS erlaubt das zerreißen von Wörtern am Zeilenende. Ist es aktiviert, werden Wörter, die nicht mehr auf die aktuelle Zeile passen, nicht auf die nächste Zeile gesetzt, sondern einfach zerstückelt. Dies geschieht ansonsten nur mit Wörtern, welche mehr Zeichen enthalten, als auf eine Displayzeile passen.

Setzt man den Wert von SHOWOVERFLOW gleich False, wird von jeder Nachricht nur der Inhalt angezeigt, der auf eine Displayseite passt. Passt die Nachricht nicht komplett aufs Display, wird der Rest dann abgeschnitten und nicht angezeigt. Stattdessen erscheint nachfolgend der nächste Feed-Eintrag.

Wie geht's weiter?

Ich habe mir ein 4x20 Display bestellt, da ich ja nun weiß, dass sich der Rasperry Pi mit den Dingern verträgt. Da passt dann ein bisschen mehr drauf. Sobald ich es angeschlossen habe, werde ich hier noch mal ein paar Worte dazu verlieren.

UPDATE 17. Oktober 2012: Inzwischen habe ich das 4-zeilige Display, den Eintrag dazu gibt es hier.

Mit dem Programm zur Anzeige kommender Kalendertermine habe ich noch nicht angefangen. Ich denke das mache ich, wenn das neue Display da ist. Ich werde dann auf dem großen Display die RSS Feeds laufen lassen und auf dem kleinen meine Termine aus dem Google Kalender.

Feedback, Feature Requests und Bugmeldungen werden dankbar entgegen genommen!

UPDATE 19.01.2013: Es kam die Frage auf, wie man den Raspberry Pi dazu kriegt, den RSS Reader beim Booten automatisch zu starten. Die Antwort findet ihr hier.
Und ich habe gerade noch zwei kleine Änderungen am Skript vorgenommen, um Probleme mit ASCII, bzw. UTF-8 zu beheben. Falls das Skript bei dir bisher immer mal abgestürzt ist: neue Version ausprobieren!

UPDATE 10.08.2014: Ich habe zwei kleine Änderungen am RSS-Reader-Skript vorgenommen. Die neue Version (1.1) ist online und oben im Tutorial verlinkt. Die alte Version (1.0) ist hier noch verfügbar.
In den alten Version wurden, wenn der Parameter ONLYCURRENTDAY auf True gesetzt war, auch Feeds angezeigt, die keine Einträge enthalten. Die neue Version macht das nicht mehr.
Danke an Marcel für den Hinweis.

UPDATE 19.05.2015: Ich habe wieder Mal ein paar Kleinigkeiten am Skript verändert, weil manche HD44780-Displays am neuen Raspberry Pi 2 nicht so richtig wollten. Das sollte nun gelöst sein. Die aktuelle Version ist jetzt die 1.2.

UPDATE 20.05.2015: Da ich mich nun schon mal wieder in den Code eingearbeitet hatte, habe ich gleich noch ein bisschen weitergebastelt und die Textausgabe optimiert. Die aktuelle Version ist jetzt also die 1.3.


Weitere Artikel in Sachen Raspberry Pi und HD44780-Display:

Geschnatter

41 Kommentare, selbst mitschnattern << < Seite 5/6 > >>
Anonym, am 05.06.2014 um 00:16 Uhr
Such a great script, thank you a lot German!
Frank, am 06.07.2014 um 10:45 Uhr
Hallo,
Super Projekt. Ich hab noch nie etwas mit dem Raspberry Pi gemacht. Wohl aber mit diesen Lcd und Atmega. Würde diese Projekt jetzt gern nachbauen und stehe jetzt vor der Frage, welchen R.Pi ich kaufen soll. Da gibt es ja die A oder B Version. Welche und wieviel Speicher sollte die Sd Karte haben. Ich würde mich sehr freuen, wenn sie mir hierzu ein paar kurze Infos geben könnten, damit ich es bestellen kann. Vielen Dank gruss Frank aus Hannover
Antwort: Hallo Frank,
der Preisunterschied ist nicht so groß, nimm die B-Variante, mit der hast du dann auch mehr Freude. Was die SD-Karte angeht: Lieber eine kleinere, aber dafür schnelle SDHC-Karte als eine Langsame, mit viel Speicher. Beachte hierbei auch, dass der RPi manche SD-Karten nicht so sehr mag [1] [2] [3].
johabu, am 24.07.2014 um 22:42 Uhr
Hallo,
wirklich ein toll umgesetztes und gut dokumentiertes (!) Projekt. Ich habe es gleich mit meinem 4x20 Display ausprobiert. Bei den Umlauten bzw. Sonderzeichen haperte es bei mir aber - es wurden immer nur japanische oder die falschen Sonderzeichen angezeigt. Nach einigem Herumprobieren habe ich endlich eine Lösung gefunden: die Zeile "message = message.encode('utf-8')" in kill_umlauts musste raus. Anschließend hats funktioniert. Da der Code war in UTF-8 verfasst war, kann ich mir dies zwar nicht erklären, aber immerhin funktionierts ;)
Marcel, am 05.08.2014 um 19:56 Uhr
Hallo Schnatterente,

dein Feed läuft ja 101% !!! Super.
Aber eine kleinigkeit die mich interessieren würde:

Bei mir soll der Feed als Torticker laufen z.B. wenn in der Bundesliga gespielt wird.
Aber natürlich soll der alle Wettbewerbe anzeigen können. Das Problem ist halt nur, dass er mir auch die Info bringt, auch wenn keine Feeds verfügbar sind. Kann man in dem Fall leere Feed nicht ausblenden lassen? Dann müsste theoretisch nur etwas angezeigt werden, wenn irgendwo der Ball rollt, ansonsten halt nichts...

Danke.
Antwort: Danke dir für deine Mails. Die neue Version ist jetzt online.
Felix, am 18.08.2014 um 17:52 Uhr
Toll! Toll!! Toll!!!
Funktioniert echt super!!

Aber was hältst du von der Idee in der ersten Zeile Datum und Uhr einzublenden und in der zweiten Zeile die RSS-Feeds durchlaufen zu lassen?
Würde es ja gerne selbst programmieren, aber dafür reichen meine Kenntnisse leider noch nicht aus...

Weiter so! :)
Benj, am 24.01.2015 um 13:57 Uhr
Wie hast du die Umlaute gefunden zum ersetzen? Suche auch nach einer kompletten Tabelle.

Gruss
Antwort: Die sind aus dem HD44780-Datenblatt. Allerdings habe ich inzwischen festgestellt, dass sich die Displays (je nach Hersteller) im verfügbaren Zeichensatz stark unterscheiden.
Christopher, am 05.02.2015 um 21:25 Uhr
Hi, SUPER SEITE!!!!!

Hab mittlerweile schon einiges nachgebaut. Leider bekomme ich bei dem rssreader keinen Proxy dazwischen, sodass ich ihn leider nicht zum laufen bekomme.

Hab schon gelesen von bspw: Proxy Handler - aber das bringt leider auch keine Besserung, d.h. die Feeds werden nicht abgeholt.

Den systemweiten Proxy will er nicht. Hast Du eine Idee?

Meine Idee war noch:
wget funktioniert durch den systemweiten Proxy (environment Variable), d.h. ich könnte die xml kontinuierlich per wget abholen, dann müsste der rssreader aber eine lokale Datei einlesen! Pfad hatte ich einfach mal im FEEDURLS eingegeben, aber nix :-(

Bekommt man das irgendwie hin?
Antwort: Hallo Christopher,
ich hab das nicht getestet, könnte so aber funktionieren:

import urllib2, feedparser
proxy = urllib2.ProxyHandler( {"http":"http://deinproxy.tld:8080/"} )
d = feedparser.parse("http://www.schnatterente.net/rss.xml", handlers = [proxy])

In meinem Python-Skript müsstest du also wie gezeigt den Proxy definieren und diese Zeile anpassen:
feed_cache[f] = feedparser.parse(f)

Sähe dann hinterher so aus:
feed_cache[f] = feedparser.parse(f, handlers = [proxy])

Ansonsten könntest du evtl. auch python über ProxyChains laufen lassen, um dein Ziel zu erreichen.