Raspberry Pi als Zahlenschloss: Unterschied zwischen den Versionen

Aus FHEMWiki
Keine Bearbeitungszusammenfassung
 
(21 dazwischenliegende Versionen von 4 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
= RPi mit einer Zahlentastatur schaltet FHEM-Aufgaben =
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.
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.
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.
= Ü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.
* 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)
* FHEM schaltet mit dem als dummy-Device angelegten Zahlencode über notify beliebige Anwendungen/Logiken.
* FHEM schaltet mit dem als dummy-Device angelegten Zahlencode über notify beliebige Anwendungen/Logiken.


 
== Sicherheit ==
 
= Sicherheit =
Für professionelle Aufgaben ist das nicht der Standard, den man erwarten würde.
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 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.
* 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.
* wenn man diese Lösung zum Schalten von sicherheitskritischen Dingen, wie der [[HM-SEC-KEY KeyMatic|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) '''[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):


= Benötigte Hardware =
== Betriebssystem/Shell-Skript auf RPi ==
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.
=== Zusätzliche Software ===
Bei der Bestellung darauf achten, dass es sie in grau und in schwarz gibt.
Aufbauend auf der oben genannten NFC-Variante (ohne NFC-Teil) wird nur das Paket mingetty benötigt
Natürlich kann man auch edle wetterfeste Edelstahl-Tastaturen (möglichst mit Eingabe-Taste) verbauen -- sie kosten aber auch gleich ein Vermögen.
:<code>sudo apt-get install mingetty</code>
Hinweis: auf dem alternativen Beagle Bone Black (BBB) unter Debian fehlt auch die kbd
:<code>sudo apt-get install kbd</code>


=== Neuer nicht privilegierter User ===
Es werden nicht viele Rechte benötigt. Ein einfacher User, der keinen besonderen Gruppen angehört, reicht aus.
:<code>sudo useradd -m rpi</code>


Dieser soll die Bash als Standardshell bekommen.


= Betriebssystem/Shell-Skript auf RPi =
''/etc/passwd''
== Zusätzliche Software ==
Aufbauend auf der oben genannten NFC-Variante (ohne NFC-Teil) wird nur das Paket mingetty benötigt
 
<nowiki>sudo apt-get install mingetty</nowiki>


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


== Tastaturprellschutz (optional) ==
=== Automatisches Login ===
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 vorletzter Zeile (vor exit 0)
Bei neueren Raspberrys muss eingestellt werden, dass sie nicht mit einer Desktop-Umgebung starten, sondern mit der Textconsole/CLI (tty1).


<nowiki>kbdrate -d 1000 /dev/tty1
==== Raspberry Boot mit Console einstellen ====
exit 0</nowiki>


Als root Programm "raspi-config" starten. Einstellung: ==> Boot Options ==> Desktop / CLI ==> Console Autologin Text console ==> save ==> reboot


== Neuer nicht privilegierter User ==
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.
Es werden nicht viele Rechte benötigt. Ein einfacher User, der keinen besonderen Gruppen angehört, reicht aus.


<nowiki>sudo useradd -m rpi</nowiki>
==== Automatisches Login mit Console ====


Beim Standard-Loginprogramm kann man sich nicht automatisch einloggen. Daher wird das Standard getty gegen mingetty für tty1 ausgetauscht.


== Automatisches Login ==
'''Ältere''' System V-Systeme. Datei '''/etc/inittab''':
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
:<code>1:2345:respawn:/sbin/getty --noclear 38400 tty1</code>
neu
:<code>1:2345:respawn:/sbin/mingetty --autologin rpi --noclear tty1</code>


alt


<nowiki>1:2345:respawn:/sbin/getty --noclear 38400 tty1</nowiki>
Bei '''neueren''' systemd-Systemen muss stattdessen die Datei
neu
'''/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>


<nowiki>1:2345:respawn:/sbin/mingetty --autologin rpi --noclear tty1</nowiki>




== Starten des Einlese-Skriptes ==
=== Starten des Einlese-Skriptes ===
Am einfachsten ändern wir die /home/rpi/.bashrc
Am einfachsten ändern wir die /home/rpi/.bashrc


Einfach am Ende folgende Zeilen einfügen:
Einfach am Ende folgende Zeilen einfügen:
:<code># Codeschloss fuer fhem</code>
:<code>/usr/local/bin/kbd2fhem.sh</code>


<nowiki># Codeschloss fuer fhem
=== SUDO für rpi einstellen ===
/usr/local/bin/kbd2fhem.sh</nowiki>
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 ===
/usr/local/bin/kbd2fhem.sh
/usr/local/bin/kbd2fhem.sh


  <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 89: 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 100: Zeile 113:
     echo 'Verwendeter Zahlencode: '$code
     echo 'Verwendeter Zahlencode: '$code
    
    
     # Um prellende Tastaturen auszuschliessen, wird keine Doppelzahl  
     # Um prellende/fehlbediente Tastaturen auszuschliessen, wird keine Doppelzahl  
     # akzeptiert. Beispiel: aus 3333553311 wird 3531
     # akzeptiert. Beispiel: aus 33335533113 wird 35313
     finalcode=${code:0:1}
     finalcode=${code:0:1}
   
   
Zeile 117: 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 123: 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>
Das Skript muss ausführbar sein
Das Skript muss ausführbar sein
 
:<code>sudo chmod +x /usr/local/bin/kbd2fhem.sh</code>
<nowiki>sudo chmod +x /usr/local/bin/kbd2fhem.sh</nowiki>
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 =
=== Zahlencode einem Dummy zuordnen ===
== Zahlencode einem Dummy zuordnen ==
Beispiel-Eintrag in der fhem.cfg
Beispiel Eintrag in der fhem.cfg


  <nowiki># Keyboard. Eingegebener Zahlencode: 12345 (Beispiel)
  <nowiki># Keyboard. Eingegebener Zahlencode: 12345 (Beispiel)
Zeile 141: Zeile 155:
define kbdnot01 notify kbd12345 set lampe toggle</nowiki>
define kbdnot01 notify kbd12345 set lampe toggle</nowiki>


 
=== FHEM-Zugriff von extern ===
== FHEM-Zugriff von extern ==
Sollte auf der RPi nicht auch FHEM laufen, so muss FHEM den Remote-Zugriff erlauben:
Sollte auf der RPi nicht auch FHEM laufen, so muss FHEM den Remote-Zugriff erlauben:
Eintrag in fhem.cfg
Eintrag in fhem.cfg
:<code>define telnetPort telnet 7072 '''global'''</code>


<nowiki>define telnetPort telnet 7072 '''global'''</nowiki>
== Hilfe/Support ==
 
* Fragen werden gerne im FHEM-Forum auf [http://forum.fhem.de http://forum.fhem.de] beantwortet.
 
* Für Feedback ist {{Link2Forum|Topic=11521|Message=67529|LinkText=dieser Beitrag}} im Forum vorgesehen.
= Hilfe/Support =
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?t=msg&amp;th=11521&amp;goto=67529&amp;rid=196#msg_67529 dieser Beitrag] im Forum vorgesehen.
[[Kategorie:HOWTOS]]
[[Kategorie:HOWTOS]]
[[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