Auch ein „Digital Native“ kann nicht immer am Rechner sitzen und auf neue E-Mails oder andere Nachrichten warten. Manchmal muss er oder sie beispielsweise auch essen oder andere körperliche Bedürfnisse befriedigen. Praktisch wäre es ja sowieso, wenn man neue Nachrichten visuell angezeigt bekäme. Manche Anrufbeantworter haben ja ein LED-Blinklicht. Das folgende Tutorial empfindet ein solches Blicklicht für E-Mails nach.

Inspiration

Ich habe mich von zwei anderen Blog-Einträgen von mir leiten lassen: 1) POP3-Konten mit Perl überprüfen und 2) USB-Gerät per libftdi in C und Python ansprechen. Beide Artikel vermitteln teilweise Vertiefungen zu den hier angeschnittenen Themen.

Ausgangssituation

Zum Checken der E-Mails wird ein Rechner, die Hardware und das unten stehende Perl-Skript benötigt. Der Rechner muss logischerweise laufen, um E-Mails zu checken. Insofern ist sinnvoll, ggf. einen Heimserver zu benutzen oder das Skript auszuführen, sobald der Rechner startet.

Die LED wird per USB gesteuert. Da USB allerdings ein recht komplexes Protokoll verwendet, wird eine serielle Schnittstelle per FTDI-Chip simuliert. Abbildung 1 zeigt die notwendigen Teile für die LED-Steuerung 220 Ω-Widerstand.Der größte Kostenfaktor ist mir etwa 12 EUR das Breakout-Board. Das hier gezeigte ist von SparkFun. In Deutschland kann man diese Boards leicht bei Watterott beziehen. Alternativ kann man auch USB-zu-RS232R-Kabel verwenden.

Abbildung 1: Benötigte Teile: FTDI-Breakout, LED, 220-Ω-Widerstand

Abbildung 1: Benötigte Teile: FTDI-Breakout, LED, 220-Ω-Widerstand

Die Verbindung zwischen Perl und USB übernimmt dabei die D2XX-Bibliothek. Da es sich hierbei, wie bei Hardware-Schnittstellen üblich, um eine C-Bibliothek handelt, benötigen wir sogenannte Bindings für Perl. Diese übersetzen die Aufrufe aus Perl in maschinensprachliche Library-Calls. Da die Bibliotheken abhängig vom Betriebssystem sind, müssen für verschiedene Betriebssysteme unterschiedliche Bibliotheken installiert werden. Die Perl-Skripts bleiben (fast) gleich.

In diesem Tutorial wird mit der Perl-Bibliothek FTDI::D2XX gearbeitet. Diese sollte unter Linux, Mac und Windows funktionieren. Für Windows kann mit etwas Anpassungsaufwand eine existierende FTDI-Schnittstelle verwendet werden, die im Perl-Archiv CPAN (Win32::FTDI) vorhanden ist. Da Mac OS X (10.3 oder höher) auch „nur” UNIX ist, ähnelt die Installation von FTDI der von Linux unten. Unter Mac müssen allerdings die xcode-Entwicklertools installiert sein, um make, gcc und anderes auszuführen.

D2XX-Treiber installieren

In diesem Tutorial wird der „klassische” Weg über den Closed-Source-Treiber von ftdi genommen. Unter Linux existiert ein alternativer Treiber namens libftdi, für den bis dato noch keine Perl-Bindings vorliegen (habe auch noch keine Übersetzung dieser mit swig probiert).

Die Treiber für den FTDI-Chip findet man unter http://www.ftdichip.com/Drivers/D2XX.htm. Unter Linux kann man die Treiber einfach folgendermaßen herunterladen und extrahieren (Versionsnummer könnten sich in der Zwischenzeit geändert haben):

Nun muss der Treiber installiert werden. Dies geschieht per Hand, indem man die folgenden Befehle eingibt:

Damit wird der Treiber in den entsprechenden Bibliotheksverzeichnissen von Linux abgelegt.

Die im letzten Artikel beschriebenen Rechte im udev-System sind im Übrigen auch bei der Verwendung von D2XX einzustellen (s. dortige Unterüberschrift „Hilfe, ich will nicht root sein!”).

Unter Windows ist es sinnvoll, dass „setup executable” herunterzuladen und auszuführen. Für Mac existiert eine Universal Binary-Datei. Kurz: Die Installation unter Windows und Mac ist leichter als die unter Linux.

Ach ja: Unter Windows muss natürlich Perl heruntergeladen werden. Am besten eignet sich ActivePerl von ActiveState. Außerdem wird laut Anleitung von FTDI-D2XX Visual C++ benötigt.

FTD2XX-Bindings für Perl installieren

Die Verbindung mit Perl wird die Bibliothek FTDI::D2XX genutzt. Diese kann von CPAN heruntergeladen werden, muss jedoch vor einer Benutzung installiert werden.

Unter Linux (z.B. Debian und Ubuntu) kann man folgendermaßen vorgehen:

(Eine andere Möglichkeit wäre es, mit dh-make-perl zu arbeiten. Das scheiterte allerdings bei mir mit einer Fehlermeldung.)

Unter Mac OS X funktioniert das ganze analog, wenn man XCode installiert hat (oder ein Port-System á la BSD). Unter Windows lädt man die Datei im Browser herunter (URL in der ersten Zeile oben) und entpackt diese. Dann kann man mit Hilfe des CMD-Befehls die Kommandozeile aufrufen und im entsprechenden Verzeichnis das Makefile erzeugen. Alternativ dazu kann man den Win32::FTDI-Treiber benutzen. Leider unterscheiden sich die Befehle von denen, die unten im Skript angegeben sind. Dennoch ist eine Portierung für Windows nicht allzu schwer.

Sobald man perl Makefile.PL aufruft, kann es zu Hinweisen kommen, ob und welche Module noch nachzuinstallieren sind. Hat man diese Hürde genommen, sollte die Installation klappen.

Ich verzichte auf eine Systemweite Installation, sondern verwende stattdessen die lokale im Skript unten. Dies verhindert eine „Verwässerung“ der Debian-Paketquellen. Zum Ausführen müssen lediglich die beiden Verzeichnisse lib und blib im Verzeichnis des Skripts unten verbleiben. Andere Dateien und Verzeichnisse können gelöscht werden.

Versuchsaufbau

Der Versuchsaufbau ist einfach: Man Verbindet die Anode der LED (langer Fuß) mit dem 5V (oder 3,3V)-Anschuss des Breakout-Boards, die Kathode mit der TX-Leitung. Vor oder nach dem LED muss zudem noch der Widerstand eingebaut werden. Abbildung 2 zeigt den Aufbau auf einer Steckplatine.

Abbildung 2: Versuchsaufbau für den Mail-Benachrichtiger

Abbildung 2: Versuchsaufbau für den Mail-Benachrichtiger

Test-Dämon zum Checken der E-Mails

Ich will den Test-Dämonen einfach halten – stilvoll (und sinnvoll) wäre es zwei Threads im Programm einzusetzen: Einen Blink-Thread und einen Thread zur periodischen Überwachung des Postfachs. Das unten stehende Programm ist viel einfacher gestrickt, da es nur die Zeitstempel des Systems überprüft. Dadurch „stottert” die LED während der Abfrage des Postfachs, was in den meisten Fällen jedoch verkraftbar ist, denke ich.

Ok, hier nun der Code:

Die Einstellungen in den Zeilen 13–17 müssen den entsprechenden Anforderungen angepasst werden.

In den Zeilen 25–34 wird zunächst das FTDI-Gerät initialisert. Der Einfachheit halber wird das erste gefundene Gerät verwendet. Die Aufrufe der FTDI-Schnittstelle kann man aus der D2XX-API entnehmen. Diese findet man in der FTDI Knowledge Base unter Documentation ⇒ Programming Guides ⇒ FTD2XX Programmer’s Guide ⇒ Classic Interface Functions.

Nun beginnt die eigentliche Schleife des Programms, die in zwei Phasen unterteilt werden kann: In der ersten Phase wird geprüft, ob genug Zeit vergangen ist, um die E-Mails wieder zu prüfen. Falls ja, dann wird das POP3-Postfach abgefragt und die Zahl der Mails darin gezählt.

In der zweiten Phase wird geblinkt, aber nur, falls unabgeholte Post im POP3-Konto lag. Es wird 0,5 Sekunden geblinkt, dann wird die Diode für weitere 0,5 Sekunden abgeschaltet. Falls man eine andere Leitung als TX verwendet, muss man übrigens eine andere Funktion zum Blinken verwenden (s. API).

Falls keine Mails im Postfach lagen, wird trotzdem eine Sekunde gewartet. Dadurch wird der Prozessor entlastet. Die Schleife beginnt danach wieder von neuem.

Nun kann man getrost etwas zu Essen holen, sofern man den Rechner im Blickfeld behält. Sobald E-Mails eintrudeln, beginnt die LED zu Blinken! Jetzt fehlt nur noch eine Mehrfach-Blink-Option, wenn man viele E-Mail-Postfächer unterhält. Aber  mit etwas Phantasie kann eine solche Funktion problemlos erstellt werden – wobei Multithreading in diesem Fall auf jeden Fall nützlich sein dürfte!

Viel Spaß mit dem LED-E-Mail-Benachrichtiger!