Raspberry Pi als Zahlenschloss
RPi mit einer Zahlentastatur schaltet FHEM-Aufgaben
So eine RPi ist ein klasse Universalgerät. In Kombination mit diversen Dingen, wie hier einer Zahlentastatur, wird das ein fertiges FHEM-fähiges Zahlenschloss. Die Gesamtkosten sind sicherlich nicht höher als ein fertiges Gerät kosten würde -- wenn es denn zu kaufen wäre.
Diese Zahlentastatur kann man nicht nur als Schloss, sondern auch zum beliebigen Schalten von Aufgaben verwenden.
Überblick über die Vorgehensweise
- Eine RPi unter Debian Wheezy wird ohne Monitor z.B. an der Haustüre montiert.
- Eine wetterfeste USB-Zahlen-Tastatur wird nach außen geführt.
- Die RPi ist so eingestellt, dass nach dem Booten keine Desktop-Umgebung (Grafik) gestartet wird, sie daher mit der Konsole (/dev/tty1) startet.
- tty1 wird so eingestellt, dass sich automatisch ein nicht privilegierter User einloggt.
- Mit dem Einloggen startet sich ein Shell-Skript, das in einer Endlosschleife Zahlencodes einliest und das Ergebnis an FHEM schickt (FHEM muss nicht auf dem selben Rechner laufen)
- FHEM schaltet mit dem als dummy-Device angelegten Zahlencode über notify beliebige Anwendungen/Logiken.
Sicherheit
Für professionelle Aufgaben ist das nicht der Standard, den man erwarten würde.
- eine RPi ist auch nur ein Rechner und kann abstürzen
- eine USB-Tastatur vor die Haustüre zu verlegen ist auch nicht jedermanns Sache. Eine USB-Buchse sollte auf jeden Fall nicht erreichbar sein, ein USB-Keylogger wäre sonst schnell installiert.
- wenn man diese Lösung zum Schalten von sicherheitskritischen Dingen, wie der keymatic (Haustüre) oder der Alarmanlage verwendet, sollte man wissen was man tut.
Benötigte Hardware
Analog zur NFC-Variante Raspberry Pi & NFC benötigt man anstatt NFC nur eine 8.-EUR USB-Zahlentastatur. Für diesen Einsatzzweck eignet sich die Keysonic ACK-118 BK Numpad. Sie ist komplett in Silikon eingearbeitet und somit für den Außenbereich prima geeignet. Bei der Bestellung darauf achten, dass es sie in grau und in schwarz gibt. Natürlich kann man auch edle wetterfeste Edelstahl-Tastaturen (möglichst mit Eingabe-Taste) verbauen -- sie kosten aber auch gleich ein Vermögen.
Betriebssystem/Shell-Skript auf RPi
Zusätzliche Software
Aufbauend auf der oben genannten NFC-Variante (ohne NFC-Teil) wird nur das Paket mingetty benötigt
sudo apt-get install mingetty
Tastaturprellschutz (optional)
Bei der Zahleneingabe lösen Anfänger schnell ein Tastaturprellen aus. Wir setzen die Tastatur auf maximalen Delay-Wert. Da dies in der Praxis trotzdem evtl. nicht ausreicht, wird ein Tastaturprellen im Skript (s.u.) selbst abgefangen. Insofern ist diese Einstellung hier nur noch optional und für den Fall gedacht, dass man das Skript abändern möchte.
Eingabe in /etc/rc.localin vorletzter Zeile (vor exit 0)
kbdrate -d 1000 /dev/tty1 exit 0
Neuer nicht privilegierter User
Es werden nicht viele Rechte benötigt. Ein einfacher User, der keinen besonderen Gruppen angehört, reicht aus.
sudo useradd -m rpi
Automatisches Login
Beim Standard-Loginprogramm kann man sich nicht automatisch einloggen. Daher wird in der /etc/inittab das Standard getty gegen mingetty für tty1 ausgetauscht.
/etc/inittab
alt
1:2345:respawn:/sbin/getty --noclear 38400 tty1
neu
1:2345:respawn:/sbin/mingetty --autologin rpi --noclear tty1
Starten des Einlese-Skriptes
Am einfachsten ändern wir die /home/rpi/.bashrc
Einfach am Ende folgende Zeilen einfügen:
# Codeschloss fuer fhem /usr/local/bin/kbd2fhem.sh
Einleseskript kbd2fhem.sh
/usr/local/bin/kbd2fhem.sh
#!/bin/bash # provided by Martin Haas 3/2013 # Skript, um Zahleneingaben von Tastatur an FHEM zu schicken FhemIP="192.168.0.x" LogFile="/home/rpi/kbd2fhem.log" while true do # NumLock vorsorglich aktivieren /usr/bin/setleds -D +num < /dev/tty1 # Zahlencode einlesen printf "Zahlencode: " read code # Eingabe echo 'Eingabe: '$code # nur Zahlen zulassen (nicht alles wird abgefangen) code=$(echo $code | tr -d "[:alpha:][:space:][:cntrl:][:punct:]äüöß") echo 'Verwendeter Zahlencode: '$code # Um prellende Tastaturen auszuschliessen, wird keine Doppelzahl # akzeptiert. Beispiel: aus 3333553311 wird 3531 finalcode=${code:0:1} while [[ ${#code} -gt '' ]] do last=${code:0:1} code=${code/${code:0:1}} next=${code:0:1} [[ $next != $last ]] && finalcode=$finalcode${code:0:1} done # fuer FHEM vorbereiten code='kbd'$finalcode # nur bei erkanntem Zahlencode verschicken [[ $finalcode != '' ]] && echo "set $code irgendwas" | nc -w5 $FhemIP 7072 # ...aber alles loggen echo "`date`: $code detected" >>$LogFile # optisches Feedback /usr/bin/setleds -D -num < /dev/tty1 #NumLock-LED kurz ausschalten sleep 1 done
Das Skript muss ausführbar sein
sudo chmod +x /usr/local/bin/kbd2fhem.sh
Nach dem nächsten Booten ist die RPi bereit Zahlencodes an FHEM zu schicken.
FHEM vorbereiten
Zahlencode einem Dummy zuordnen
Beispiel Eintrag in der fhem.cfg
# Keyboard. Eingegebener Zahlencode: 12345 (Beispiel) define kbd12345 dummy define kbdnot01 notify kbd12345 set lampe toggle
FHEM-Zugriff von extern
Sollte auf der RPi nicht auch FHEM laufen, so muss FHEM den Remote-Zugriff erlauben: Eintrag in fhem.cfg
define telnetPort telnet 7072 '''global'''
Hilfe/Support
Fragen werden gerne im FHEM-Forum auf http://forum.fhem.de beantwortet.
Für Feedback ist dieser Beitrag im Forum vorgesehen.