Raspberry Pi als Zahlenschloss: Unterschied zwischen den Versionen

Aus FHEMWiki
KKeine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
Zeile 50: Zeile 50:


Als root Programm "raspi-config" starten. Einstellung: ==> Boot Options ==> Desktop / CLI ==> Console Autologin Text console ==> save ==> reboot
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 ====
==== Automatisches Login mit Console ====
Zeile 64: Zeile 66:


Bei '''neueren''' systemd-Systemen muss stattdessen die Datei  
Bei '''neueren''' systemd-Systemen muss stattdessen die Datei  
'''/etc/systemd/system/autologin@.service'''
'''/etc/systemd/system/getty@tty1.service.d/autologin.conf'''
geändert werden:
mit folgendem Code angelegt werden:
:<code>[Service]</code>
:<code>ExecStart=</code>
:<code>ExecStart=-/sbin/mingetty --autologin rpi --noclear %I 115200,38400,9600 linux</code>
 


alt
:<code>ExecStart=-/sbin/agetty --autologin xx --noclear %I $TERM</code>
neu
:<code>ExecStart=-/sbin/mingetty --autologin rpi --noclear %I $TERM</code>


=== Starten des Einlese-Skriptes ===
=== Starten des Einlese-Skriptes ===
Zeile 78: Zeile 80:
:<code># Codeschloss fuer fhem</code>
:<code># Codeschloss fuer fhem</code>
:<code>/usr/local/bin/kbd2fhem.sh</code>
:<code>/usr/local/bin/kbd2fhem.sh</code>
=== SUDO für rpi einstellen ===
Je nach USB-Nummerntastatur ist es notwendig, dass NUMLOCK eingeschaltet wird.
Das erledigt user rpi über sudo
Als root:
:<code>visudo</code>
z.B. folgendes eintragen:
:<code>rpi    ALL=(ALL) NOPASSWD: /usr/bin/setleds</code>


=== Einleseskript kbd2fhem.sh ===
=== Einleseskript kbd2fhem.sh ===
Zeile 84: Zeile 95:
  <nowiki>#!/bin/bash
  <nowiki>#!/bin/bash
# provided by Martin Haas 3/2013
# provided by Martin Haas 3/2013
# 11/18: an moderneres Linuxe angepasst
# Skript, um Zahleneingaben von Tastatur an FHEM zu schicken
# Skript, um Zahleneingaben von Tastatur an FHEM zu schicken
FhemIP="192.168.0.x"
FhemIP="192.168.0.x"
Zeile 90: Zeile 102:
while true
while true
do
do
     # NumLock vorsorglich aktivieren
     # NumLock vorsorglich aktivieren (siehe visudo oben)
     /usr/bin/setleds -D +num &lt; /dev/tty1
     sudo /usr/bin/setleds -D +num &lt; /dev/tty1
     # Zahlencode einlesen
     # Zahlencode einlesen
     printf "Zahlencode: "
     printf "Zahlencode: "
Zeile 118: Zeile 130:
     # nur bei erkanntem Zahlencode verschicken
     # nur bei erkanntem Zahlencode verschicken
     [[ $finalcode != '' ]] &amp;&amp;
     [[ $finalcode != '' ]] &amp;&amp;
     echo &quot;set $code irgendwas&quot; | nc -w5 $FhemIP 7072
     echo &quot;set $code irgendwas&quot; | nc -w3 $FhemIP 7072
   
   
     # ...aber alles loggen
     # ...aber alles loggen
Zeile 124: Zeile 136:
   
   
     # optisches Feedback
     # optisches Feedback
     /usr/bin/setleds -D -num &lt; /dev/tty1 #NumLock-LED kurz ausschalten
     sudo /usr/bin/setleds -D -num &lt; /dev/tty1 #NumLock-LED kurz ausschalten
     sleep 1
     sleep 1
  done</nowiki>
  done</nowiki>
Zeile 130: Zeile 142:
:<code>sudo chmod +x /usr/local/bin/kbd2fhem.sh</code>
:<code>sudo chmod +x /usr/local/bin/kbd2fhem.sh</code>
Nach dem nächsten Booten ist die RPi bereit Zahlencodes an FHEM zu schicken.
Nach dem nächsten Booten ist die RPi bereit Zahlencodes an FHEM zu schicken.
Kurtest: mit
:<code>ps -ef | grep kbd</code>
sollte der laufende Prozess /usr/local/bin/kbd2fhem.sh sichtbar sein.


== FHEM vorbereiten ==
== FHEM vorbereiten ==

Aktuelle Version vom 24. November 2018, 16:29 Uhr

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