Einbindung eines Fingerabdrucklesers des Typs ZFM-20 (auch bekannt als "Arduino fingerprint sensor") zur Öffnung der Türe

  • Ich habe meinen Fingarabdruckleser des Typs ZFM-20 (auch bekannt als "Arduino fingerprint sensor") an mein DoorPi geklemmt. da es dafür (noch) kein Keyboard gibt, habe ich mir das "virtuelle Keyboard" zu Nutze gemacht um die Freigabe des Fingerabdrucklesers zu implementieren.


    Was es Braucht:

    • Funktionierendes DoorPi, vorkonfiguriert auf Raspberry Pi B+ oder 3 (bei mir ist der 3-er im Einsatz)
    • Fingerabdruckleser des Typs ZFM-20 (ebay, AliExpress...)
    • USB-TTL-Konverter (z.B. mit dem CP2102-Chip) oder einen Arduino Nano mit gebrücktem GND-Rst, so kann dieser als USB-TTL fungieren.
    • wahlweise zwei LED's (grün / rot oder Dual-LED)
    • Kabel, Lötkolben, Widerstände...


    Vorbereitung der Hardware:

    • Fingerabdruckleser in entsprechend sinnvolles Gehäuse packen
    • Ich habe für die initialisierung des Lesevorganges einen Taster auf das Gehäuse gepackt. (zukünftig will ich den Leser anderweitig einbauen und die Auslösung dann über eine Lichtschranke realisieren.)
    • ebenfalls fanden die beiden LED's darauf platz (diese signalisieren den Lesvorgang erfolgreich / fehlerhaft)
    • PiFace Board ist von Vorteil, würde aber auch über GPIO mit entsprechenden Widerständen und Relais-Board funktionieren (war mir aber zu Umständlich)
    • Wie man den Fingerabdruckleser genau anschliesst und wie die Library dafür installiert wird, könnt ihr Bastian Raschke's Webseite entnehmen, da spare ich mir das Wiederkäuen.
    • Anschliessend Fingerleser gemäss Bastian's Anleitung testen.



    Vorbereitung der Software:

    • Die Python-Library für den Fingerabdruckleser hat ebenfalls einige Beispiele mitgeliefert:
    • Mit dem Beispiel "example_enroll.py" können die Finger entsprechend eingelesen werden
    • Das "example_search.py" habe ich entsprechend erweitert, damit das erfolgreiche Lesen eine Aktion in DoorPi auslöst
    • Ich habe das Script abgeändert und in "finger.py" umbenannt. Anschliessend habe ich es unter "/usr/local/etc/DoorPi/scripts/" abgelegt (ausführbar machen nicht vergessen, aber das wisst ihr sicher)

    Der CODE muss an diversen Stellen noch am jeweiligen System angepasst werden. Dies habe ich im Code kommentiert:


    Damit die Events von DoorPi verarbeitet werden können habe ich das "virtuelle Keyboard" aktiviert und mir folgende virtuelle Inputs erstellt (Kommentare mit "//" bitte bei allen folgenden Code's rauslöschen):



    Die virtuellen Inputs lösen die folgenden Events aus:




    EVENT_OnKeyPressed_onboardpins.3:

    • Dieser Event wird vom Input 3 getriggert. Hier hängt der Taster zum starten des Fingerlesevorgangs dran


    EVENT_OnKeyPressed_onboardpins.4

    • Minimale Sicherheit: Wenn jemand das Lesergehäuse vor der Haustür öffnet, werde ich über das Script "sabotage.sh" via Telegram informiert, anschliessend stoppt DoorPi und nichts geht mehr (Vorsicht, In diesem Fall braucht's noch einen Schlüssel oder einen ssh-Zugang auf die DoorPi um neu zu starten).


    EVENT_OnKeyPressed_webservice.dooropen:

    • Dieser Event wird von "finger.py" angestossen, wenn der Lesevorgang erfolgreich war
    • Zugleich wird die grüne LED für 3s. eingeschaltet (zeigt den erfolgreichen Lesevorgang an)


    EVENT_OnKeyPressed_webservice.redled:

    • Dieser Event schaltet die rote LED, wenn der Lesevorgang zu lange kein Ergebnis bringt (der Vorgang bricht nach 10s ab), oder der vorgehaltene Finger nicht verzeichnet ist.


    Wenn dann alles aufgebaut ist, kann mittels Knopfdruck der Lesevorgang gestartet werden: Ist der Finger korrekt, wird die Türe freigegeben.



    Das System hat noch einige leaks, so sind teilweise Wartezeiten zwischen Knopfdruck und Lesevorgang (der Leser wird zuerst initialisiert) sowie nach Abschluss des Lesevorgangs bis zum öffnen der Tür in Kauf zu nehmen.

    • Das hat mit dem Verarbeiten der Events zu tun. Je nach dem was DoorPi sonst noch treibt, geht's schneller.
    • Dieser Tatsache könnte mit einem DoorPi-Keyboard sicher abgeholfen werden - Leider reichen meine Python-Kenntnisse dafür (noch) nicht aus


    Zum Thema Sicherheit ist vorweg zu nehmen, dies ist ein Experimental aufbau! Bitte nicht bei der nächsten Sparkasse verbauen :)

    • Tauscht jemand den Leser mit einem baugleichen Modell mit vorgespeicherten Fingern, kann die Tür problemlos geöffnet werden. Deshalb habe ich den Sabotagekontakt vorgesehen.
    • Hier würde das Speichern und Abgleichen des Hash's, welcher die Library anbietet, entgegenwirken. Da hänge ich mich dann mal dran.


    Kritik und Verbesserungsvorschläge sind willkommen. :)

  • Hi,
    dein Projekt klingt interessant. Hast du schon weitere Fortschritte machen können?
    Ich überlege mir damit meine Garagentür öffnen zu lassen. Eine Codeeingabe finde ich hierfür zu aufwendig, wenn jedesmal die Türe zufliegt

  • Hallo,


    konnte das Projekt soweit umsetzten.
    Was mir nur nicht so recht gefällt das man das script finger.py immer mit einem Befehl starten muss.
    Gibt es keine Möglichkeit das der Fingerprint die ganze zeit aktiv ist?


    Gruß Bernd

  • Hallo,


    konnte das Projekt soweit umsetzten.
    Was mir nur nicht so recht gefällt das man das script finger.py immer mit einem Befehl starten muss.
    Gibt es keine Möglichkeit das der Fingerprint die ganze zeit aktiv ist?


    Gruß Bernd

    Hallo Bernd,
    ich aktiviere den Sensor mit einen Bewegungsmelder. Funktioniert im derzeitigem Testaufbau auch gut

  • Hallo,


    konnte das Projekt soweit umsetzten.
    Was mir nur nicht so recht gefällt das man das script finger.py immer mit einem Befehl starten muss.
    Gibt es keine Möglichkeit das der Fingerprint die ganze zeit aktiv ist?


    Gruß Bernd

    Hallo Bernd.


    Ja, du kannst den Leser die ganze Zeit an lassen, sofern dich das ständige Geflacker des Lesers nicht stört.


    Starte das Sceipt bwim Start von Doorpi oder bau' dir einen Service,
    Packe den gesamten Code des Scripts “finger.pi“ ab
    “## Tries to search the finger and calculate hash“
    in eine “while True:“ Schleife und entferne die While-Schleife “while time.time() > t_end and“ und lass den Rest stehen. Schon macht der Leser was du willst.


    Ich bastle noch immer am entsprechenden Keyboard, doch bin ich noch nicht so weit, wie ich sein möchte...
    Gruss Sven


    Gesendet von meinem BAH-W09 mit Tapatalk

  • Hallo Gonzo.
    Wie gewünscht, das Script mit while True- Schleife

    Ungetestet, aber sollte klappen.


    Habe auf Zeile 66 noch die Sicherheit etwas erhöht. Nun muss ein Finger einen Übereinstimmungs-Score von 70 haben, dass die Türe auf geht. Kann natürlich auch wieder angepasst werden. :)


    Gruss
    Sven