Raspberry Pi als Zahlenschloss
Ein Raspberry Pi (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ür montiert.
- Eine wetterfeste USB-Zahlen-Tastatur wird nach außen geführt.
- Der RPi ist so eingestellt, dass nach dem Booten keine Desktop-Umgebung (Grafik) gestartet wird, er 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ür 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-Euro 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 geeignet. Bei der Bestellung darauf achten, dass es sie in grau und in schwarz gibt.
Ganz edel: die vandalensichere und wetterfeste (IP65) Edelstahltastatur EKM-15 kostet inkl. Mwst- und Versand 119.-EUR (Stand März 2014):
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
Hinweis: auf dem alternativen Beagle Bone Black (BBB) unter Debian fehlt auch die kbd
sudo apt-get install kbd
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
Dieser soll die Bash als Standardshell bekommen.
/etc/passwd
alt
rpi:x:100x:100x::/home/rpi:/bin/sh
neu
rpi:x:100x:100x::/home/rpi:/bin/bash
Automatisches Login
Bei neueren Raspberrys muss eingestellt werden, dass sie nicht mit einer Desktop-Umgebung starten, sondern mit der Textconsole/CLI (tty1).
Raspberry Boot mit Console einstellen
Als root Programm "raspi-config" starten. Einstellung: ==> Boot Options ==> Desktop / CLI ==> Console Autologin Text console ==> save ==> reboot
Automatisches Login mit Console
Beim Standard-Loginprogramm kann man sich nicht automatisch einloggen. Daher wird das Standard getty gegen mingetty für tty1 ausgetauscht.
Ältere System V-Systeme. Datei /etc/inittab:
alt
1:2345:respawn:/sbin/getty --noclear 38400 tty1
neu
1:2345:respawn:/sbin/mingetty --autologin rpi --noclear tty1
Bei neueren systemd-Systemen muss stattdessen die Datei
/etc/systemd/system/autologin@.service
geändert werden:
alt
ExecStart=-/sbin/agetty --autologin xx --noclear %I $TERM
neu
ExecStart=-/sbin/mingetty --autologin rpi --noclear %I $TERM
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/fehlbediente Tastaturen auszuschliessen, wird keine Doppelzahl # akzeptiert. Beispiel: aus 33335533113 wird 35313 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.