Raspberry Pi als Zahlenschloss

Aus FHEMWiki

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.