Ich habe eine Key-Tastatur mit RFID-Leser an meiner Haustür verbaut, die mit einem Wiegand-Bus arbeitet:
Die Entscheidung für dieses Pad habe ich aus Sicherheitsgründen betroffen: das Ganze besteht aus einem Außengerät (dem Keypad), das lediglich die erkannten PINs/RFID-Seriennummern an ein Steuergerät überträgt, das im Hausinneren an sicherer Stelle installiert wird. Die Verbindung habe ich über ein 8-adriges Netzwerk-Installationskabel gelöst. Jeglicher Manipulationsversuch am Außengerät wird nie zu einer Kompromittierung der Sicherheit führen, so lange die Seriennummern aller Karten bzw. PINs geheim bleiben.
Mit einem dazu recht günstig gekaufen Wiegand-zu-USB-Converter lese ich die Aktivitäten auf dem Bus mit und lasse mir die Seriennummern der Tags/Chips/Karten bzw. die eingegebenen PINs per USB/seriell auf einen Raspberry Pi übertragen:
Auf dem Raspberry Pi läuft per crontab getriggert ein Script einmal bei Reboot und (zur Sicherheit) noch einmal täglich um 04:00 Uhr:
# m h dom mon dow command 0 4 * * * /usr/local/bin/dooropener/dooropener.sh @reboot /usr/local/bin/dooropener/dooropener.sh
Dieses Script tut nichts anderes, als einen eventuell bereits laufenden "Vorgänger" zu beenden und dann das eigentliche Bearbeiter-Script im Hintergrund zu starten:
#!/bin/sh killall readusb.sh sleep 5 /usr/local/bin/dooropener/readusb.sh&
Das Bearbeiter-Script liest in einer Endlosschleife die Seriennummern/PINs vom Kartenleser (über das USB-Device, an dem der Converter angeschlossen ist, hier: /dev/ttyUSB0). Der Converter sendet bei erkannter Seriennummer diese als 6-stellige Hex-Zahl, gefolgt von einem Line Feed. Danach
- wird versucht, die Seriennummer über die Konfigurationsdatei (CFGFILE) in einen Klarnamen zu übersetzen ("unknown_name", falls nicht dort bekannt)
- wird ein Logfile mit Timestamp, der Nummer (in hexadezimal und dezimal) und dem Klartextnamen geschrieben
- es wird per Pushover eine Push Notification mit den gleichen Daten auf mein Handy geschickt
- es wird in der Homematic-Zentrale eine Systemvariable (HOMEMATIC_VAR) geupdated (dort kann darauf reagiert werden)
- es werden Handling-Scripts aufgerufen:
- card_<Nummer>.sh, wenn vorhanden
- card_<Name>.sh, wenn vorhanden
- wenn keins der beiden vorherigen existierte, dann card_other.sh
- und immer noch einmal card_all.sh
#!/bin/bash MYPATH=/usr/local/bin/dooropener CFGFILE=$MYPATH/names.cfg LOGFILE=/var/log/dooropener.log PO_TOKEN=xxx PO_USER=xxx HOMEMATIC_IP=192.168.x.x HOMEMATIC_VAR=DOOROPENER_LAST while true; do while read CNUM; do CNUM_DEC=`printf "%d" 0x$CNUM` CNAME=`grep $CNUM <$CFGFILE | cut -d, -f2` if [ "$CNAME" == "" ]; then CNAME="unknown_name"; fi echo "`date`,$CNUM,$CNUM_DEC,$CNAME" >>$LOGFILE wget -O - --quiet --no-check-certificate --post-data "token=$PO_TOKEN&user=$PO_USER&html=1&message=Door Opener: $CNAME (0x$CNUM/$CNUM_DEC)" -O - https://api.pushover.net/1/messages.xml >/dev/null 2>&1 wget -q -O - "http://$HOMEMATIC_IP:8181/x.exe?Antwort=dom.GetObject(\"$HOMEMATIC_VAR\").State(\"`date`,$CNUM,$CNUM_DEC,$CNAME\")" >/dev/null 2>&1 CALLS=0 if [ -x $MYPATH/card_$CNUM.sh ]; then source $MYPATH/card_$CNUM.sh CALLS=$((CALLS+1)) fi if [ -x $MYPATH/card_$CNAME.sh ]; then source $MYPATH/card_$CNAME.sh CALLS=$((CALLS+1)) fi if [ "$CALLS" == "0" ]; then source $MYPATH/card_other.sh fi source $MYPATH/card_all.sh done </dev/ttyUSB0 sleep 10 done
Die Konfigurationsdatei names.cfg enthält Komma-getrennt die hexadezimalen Kartennummern (bzw. PINs), wie sie vom Leser kommen, und danach den Klartextnamen:
XXXXXX,THOMAS_PIN YYYYYY,TOKEN_RED ZZZZZZ,THOMAS_TOKEN AAAAAA,THOMAS_CARD
Die Handling-Scripts nutze ich zum Beispiel zur Zeiterfassung: wenn eine bestimmte Person ihr Token vor den Leser hält, wird die Uhrzeit vermerkt und per Email geschickt.
Charmant ist, dass das Steuergerät des Kartenlesers ganz normal programmiert werden kann auf bestimmten Karten/Tokens und somit meine Haustür autark öffnet. Auf den Bus und damit über den Converter an den Raspberry Pi werden jedoch alle eingegebenen PINs oder angehaltenen Karten/Tokens gemeldet, auch die dem Steuergerät nicht bekannten. Somit lassen sich unabhängig vom Türöffnen auch andere Anwendungen (Erfassung, Licht, Schalten anderer Verbraucher usw.) realisieren.
Hinweis: das Steuergerät muss entgegen dem Lieferzustand in einen Modus versetzt werden, in dem alle Inputs (egal, ob erkannt oder nicht) als "Seriennummer" auf den Bus geschickt werden. Dies gilt auch für eingegebene PINs, die dann ebenso in hexadezimal umgewandelt eintreffen.