Raspberry Pi als Zahlenschloss: Unterschied zwischen den Versionen

Aus FHEMWiki
Keine Bearbeitungszusammenfassung
 
(7 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
So 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.
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.
Diese Zahlentastatur kann man nicht nur als Schloss, sondern auch zum beliebigen Schalten von Aufgaben verwenden.


== Überblick über die Vorgehensweise ==
== Überblick über die Vorgehensweise ==
* Eine RPi unter Debian Wheezy wird ohne Monitor z.B. an der Haustüre montiert.
* 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.
* 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.
* 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.
* 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)
* 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)
Zeile 19: Zeile 19:


== Benötigte Hardware ==
== 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 ([http://keysonic.de/de/products/details.php?we_objectID=8300])'''. 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.  
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 [http://www.va-tastatur.de/download/tastaturen/Viscotech-Datenblatt-EKM-15.pdf] ''' kostet inkl. Mwst- und Versand 119.-EUR (Stand März 2014):
Ganz edel: die vandalensichere und wetterfeste (IP65) '''[http://www.va-tastatur.de/download/tastaturen/Viscotech-Datenblatt-EKM-15.pdf Edelstahltastatur EKM-15]''' kostet inkl. Mwst- und Versand 119.-EUR (Stand März 2014):


== Betriebssystem/Shell-Skript auf RPi ==
== Betriebssystem/Shell-Skript auf RPi ==
Zeile 27: Zeile 27:
Aufbauend auf der oben genannten NFC-Variante (ohne NFC-Teil) wird nur das Paket mingetty benötigt
Aufbauend auf der oben genannten NFC-Variante (ohne NFC-Teil) wird nur das Paket mingetty benötigt
:<code>sudo apt-get install mingetty</code>
:<code>sudo apt-get install mingetty</code>
Hinweis: auf der alternativen Beagle Bone Black (BBB) unter Debian fehlt auch die kbd
Hinweis: auf dem alternativen Beagle Bone Black (BBB) unter Debian fehlt auch die kbd
:<code>sudo apt-get install kbd</code>
:<code>sudo apt-get install kbd</code>
=== 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.local'' in der vorletzten Zeile (vor exit 0)
:<code>kbdrate -d 1000 /dev/tty1</code>
:<code>exit 0</code>


=== Neuer nicht privilegierter User ===
=== Neuer nicht privilegierter User ===
Zeile 46: Zeile 39:


alt
alt
:<code>rpi:x:1002:1003::/home/rpi:/bin/sh</code>
:<code>rpi:x:100x:100x::/home/rpi:/bin/sh</code>
neu
neu
:<code>rpi:x:1002:1003::/home/rpi:/bin/bash</code>
:<code>rpi:x:100x:100x::/home/rpi:/bin/bash</code>


=== Automatisches Login ===
=== 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.
 
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
alt
Zeile 57: Zeile 63:
neu
neu
:<code>1:2345:respawn:/sbin/mingetty --autologin rpi --noclear tty1</code>
:<code>1:2345:respawn:/sbin/mingetty --autologin rpi --noclear tty1</code>
Bei '''neueren''' systemd-Systemen muss stattdessen die Datei
'''/etc/systemd/system/getty@tty1.service.d/autologin.conf'''
mit folgendem Code angelegt werden:
:<code>[Service]</code>
:<code>ExecStart=</code>
:<code>ExecStart=-/sbin/mingetty --autologin rpi --noclear %I 115200,38400,9600 linux</code>


=== Starten des Einlese-Skriptes ===
=== Starten des Einlese-Skriptes ===
Zeile 64: 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 70: 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 76: 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 104: 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 110: 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 116: 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 ==
Zeile 132: Zeile 162:
== Hilfe/Support ==
== Hilfe/Support ==
* Fragen werden gerne im FHEM-Forum auf [http://forum.fhem.de http://forum.fhem.de] beantwortet.
* Fragen werden gerne im FHEM-Forum auf [http://forum.fhem.de http://forum.fhem.de] beantwortet.
* Für Feedback ist [http://forum.fhem.de/index.php/topic,11521.msg67529.html#msg67529 dieser Beitrag] im Forum vorgesehen.
* Für Feedback ist {{Link2Forum|Topic=11521|Message=67529|LinkText=dieser Beitrag}} im Forum vorgesehen.


[[Kategorie:HOWTOS]]
[[Kategorie:HOWTOS]]
[[Kategorie:Raspberry Pi]]
[[Kategorie:Raspberry Pi]]

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