Raspberry Pi als Zahlenschloss

Aus FHEMWiki
Zur Navigation springen Zur Suche springen

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 handeslübliche 8-Euro USB-Zahlentastatur. Diese ist optional komplett in Silikon eingearbeitet und somit für den Außenbereich geeignet.

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

Hinweis (11/18): neuere Linuxe mit systemd scheinen "Console Autologin Text console" nicht mehr zu benötigen. CLI Console muss aber auf jeden Fall eingestellt sein.

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/getty@tty1.service.d/autologin.conf mit folgendem Code angelegt werden:

[Service]
ExecStart=
ExecStart=-/sbin/mingetty --autologin rpi --noclear %I 115200,38400,9600 linux


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

SUDO für rpi einstellen

Je nach USB-Nummerntastatur ist es notwendig, dass NUMLOCK eingeschaltet wird. Das erledigt user rpi über sudo

Als root:

visudo

z.B. folgendes eintragen:

rpi ALL=(ALL) NOPASSWD: /usr/bin/setleds

Einleseskript kbd2fhem.sh

/usr/local/bin/kbd2fhem.sh

#!/bin/bash
# provided by Martin Haas 3/2013
# 11/18: an moderneres Linuxe angepasst
# 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 (siehe visudo oben)
    sudo /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 -w3 $FhemIP 7072
 
    # ...aber alles loggen
    echo "`date`: $code detected" >>$LogFile
 
    # optisches Feedback
    sudo /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.

Kurtest: mit

ps -ef | grep kbd

sollte der laufende Prozess /usr/local/bin/kbd2fhem.sh sichtbar sein.

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