c't 17/2017
S. 84
Praxis
Raspi kann alles: SIP-Türklingel
Aufmacherbild

Überallklingel

Die Türklingel im Heimnetz

Die Klingel überhören nervt. Mit Raspberry Pi und Fritzbox klingelts nicht nur an der Tür, sondern auch auf Telefonen und Smartphones.

Der Postbote steht unten und klingelt. Wer jetzt gerade im Garten, im Keller oder auf dem Dachboden ist und die Klingel überhört, muss das Paket später woanders abholen. Eine zusätzliche Klingelleitung oder eine zweite Funkklingel, die der Besucher auf Verdacht betätigen soll, ist auch keine schöne Lösung.

Über die GPIOs des Raspi bindet man die vorhandene Türklingel ins Heimnetz ein. Der Gast an der Haustür macht sich so nicht nur über die gute alte Türklingel bemerkbar, sondern auch per Rundruf auf den an der heimischen Fritzbox angeschlossenen Telefonen und Smartphones. Der Schlagbohrer bleibt im Schrank. Es bedarf lediglich eines Kabels von der Klingel zum Raspberry Pi und einer Steckdose in der Nähe.

Übliche Klingeltrafos liefern Wechselspannungen zwischen 8 und 24 Volt. Da die GPIO-Ports des Raspberry Pi mit 3,3 Volt Gleichspannung arbeiten, braucht es eine kleine Schaltung, um ihn vor der hohen Spannung zu schützen. Besondere Kenntnisse in der Schaltungstechnik erfordert dies nicht – auch Laien haben die Schaltung aus vier Bauelementen in wenigen Minuten auf einer Lochrasterplatine zusammengelötet und parallel zur Klingel geschaltet.

Gut (ent)koppeln

Schaltplan

Hauptbestandteil ist ein Optokoppler (PC817), der zwei Stromkreise über eine Lichtbrücke trennt. Damit die LED des PC817 die korrekte Betriebsspannung von 1,2 Volt erhält, ist ein passender Vorwiderstand von 330 Ohm (8 Volt), 560 Ohm (12 Volt) oder 1,2 Kiloohm (24 Volt) erforderlich. Bei 24 V müsste der Widerstand eigentlich 0,5 W aushalten, da in der Regel aber nur wenige Sekunden geklingelt wird, hält auch die 0,25-W-Variante stand. Hat man jedoch Dauerdrücker im Freundeskreis, sollte man vorsichtshalber die 0,5-W-Variante wählen.

Der Vorwiderstand senkt die Spannung in Durchlassrichtung der Optokoppler-LED zwar ab, jedoch ist bei Wechselspannung auch die Gegenrichtung zu berücksichtigen. Die Durchbruchspannung der LED im PC817 beträgt lediglich 6 Volt. Eine antiparallele Diode führt die gegenläufige Wechselspannung über den Widerstand ab und verhindert so, dass der Optokoppler beschädigt wird. Erfahrene Bastler werden hier schnell bemerken, dass der Ausgang des Optokopplers beim Betätigen des Klingetasters mit der Netzfrequenz pulsiert. Für den Raspberry Pi ist dies jedoch kein Problem. Mittels Polling-Schleife erkennt er die Impulse zuverlässig.

Türklingel

Zum Anschluss der Schaltung empfehlen sich Schraubklemmen. Sie lassen sich einfacher verlöten als Kabel und erlauben eine schnelle Demontage, wenn die Technik einmal umziehen muss. Schalten Sie den Trafo vor der Installation zu Ihrer eigenen Sicherheit spannungsfrei.

Telefonanbindung

Für die Anruf-Auslösung benötigt der Pi eine Verbindung zur Telefonanlage der Fritzbox über WLAN oder Netzwerkkabel. Dabei hilft die freie Telefonanlagensoftware Asterisk, mit der der Raspi zum Telefonie-Client wird. Die Installation und Konfiguration nehmen Sie über die Kommandozeile des Raspberry Pi vor:

sudo apt-get install asterisk

Sobald die Installation abgeschlossen ist, legt man in der Fritzbox ein neues VoIP-Telefon an, dessen Zugangsdaten man in der Datei sip.conf im Asterisk-Installationsverzeichnis speichert. SIP-Accounts werden in Asterisk als Channels bezeichnet. Eckige Klammern am Anfang der Konfiguration legen den Namen fest, welcher später für die automatischen Anrufe notwendig ist. Ein Beispiel für eine funktionierende Konfiguration mit zusätzlichen Hinweisen finden Sie über ct.de/yvhw.

Danach startet man entweder Asterisk mit sudo service asterisk restart oder den gesamten Raspberry Pi neu. Da Asterisk als Dienst läuft, ist auch nach einem Neustart kein weiteres Zutun erforderlich. Die Konfigurationsänderungen übernimmt die Telefonanlage von allein.

Call-Dateien

Damit nicht nur die Haustürklingel, sondern auch die Telefone klingeln, muss der Asterisk-Client die gewünschte Telefonnummer anrufen. Dies funktioniert über sogenannte Call-Dateien. Dabei handelt es sich um Textdateien, die Befehlsparameter für einen ausgehenden Anruf enthalten. Kopiert man sie in den Spooler-Ordner /var/spool/asterisk/outgoing, führt sie die Telefonanlage automatisch aus und löscht sie anschließend. Das Anklingeln einer Rufnummer benötigt vier Zeilen:

Channel: SIP/624/**9

Application: Playback

Data: /var/lib/asterisk/nothing

WaitTime: 5

Die erste Zeile legt das Protokoll, den Channel und die Zielrufnummer fest. Weil Asterisk keine Funktion besitzt, um ein Telefon nur anzuklingeln, bietet sich die Anwendung Playback an, die auch ohne Audiodatei arbeitet. Die WaitTime ist die Zeit in Sekunden, die Asterisk auf die Annahme des Gespräches wartet, bevor der Anruf abbricht. Damit die Haustürklingel deutlich von Anrufen zu unterscheiden ist, wählt man die Wartezeit sehr kurz. Fünf Sekunden erzeugen bei AVM-Telefonen je nach Klingelton ein- bis zweimaliges Klingeln. Zur Feinabstimmung erstellt man die Dateien händisch mit einem Texteditor wie nano und kopiert sie in den Spooler-Ordner.

Magie

Damit der Raspberry Pi das Auslösen der Klingel bemerkt, bedarf es noch eines Skripts, das den entsprechenden GPIO regelmäßig abfragt. Spielraum für die einfache Integration neuer Funktionen, bietet die Programmiersprache Python.

Grundlage des Skripts ist eine Endlosschleife, die in kurzen Abständen den Zustand des GPIOs ermittelt und gegebenenfalls Vorgänge auslöst:

while True:

time.sleep(0.01)

if not gpio.input(gpio):

time.sleep(0.1)

if not gpio.input(gpio):

print(text)

voip()

time.sleep(5)

Die Abfrage muss nicht wie im obigen Code unbedingt im 10-Millisekunden-Takt erfolgen, jedoch stellt dies keine große Last für den Prozessor des Pi dar. Um Fehlauslösungen durch Störungen zu vermeiden, ist es sinnvoll, eine zweite Abfrage wenige Millisekunden nach der Auslösung durchzuführen. Um das Skript übersichtlich zu halten, empfiehlt es sich, das Kopieren der .call-Datei und weitere Vorgänge in Funktionen statt in der Schleife unterzubringen. Ein fertiges Beispiel, das auch die Erstellung der .call-Datei übernimmt, finden Sie über ct.de/yvhw.

Da der Zugriff auf den Spooler-Ordner Root-Rechte benötigt, startet man den ersten Test mit

sudo python meinskript.py

und verbindet den entsprechenden GPIO von Hand mit einem Masse-Pin. Wenn die Telefone klingeln und das Skript nicht abstürzt, ist es für den autonomen Betrieb bereit.

Autostart

Damit das Skript beim Systemstart automatisch starten kann, muss man es zunächst mit sudo chmod +x meinskript.py

als ausführbar markieren. Anschließend folgt die Eintragung in die crontab, die man mit

sudo crontab -e

öffnet. Fügen Sie die Zeile

@reboot python /pfad/zu/meinskript.py

unten an. Der Pfad zum Skript muss absolut sein, damit cron es unabhängig vom ‚PATH’ findet. Nach einem Neustart prüft man mit ps -ef | grep python, ob der Autostart erfolgreich war. Läuft das Skript, steht dem Anbau an die Haustürklingel nichts mehr im Wege. (amo@ct.de)