Stern inaktivStern inaktivStern inaktivStern inaktivStern inaktiv
 

Ich habe eine Key-Tastatur mit RFID-Leser an meiner Haustür verbaut, die mit einem Wiegand-Bus arbeitet:

sebury door opener

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:

wiegand 2 usb

 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.