Hallo,
Ich liebäugle damit mir diesen Fingerabdrucksensor zuzulegen.
ich habe nichts im Forum gefunden ob man diesen oder auch andere mit DoorPi nutzen kann.
Hat jemand von euch in der Richtung schon was gemacht?
Gruß DaviJones
Hallo,
Ich liebäugle damit mir diesen Fingerabdrucksensor zuzulegen.
ich habe nichts im Forum gefunden ob man diesen oder auch andere mit DoorPi nutzen kann.
Hat jemand von euch in der Richtung schon was gemacht?
Gruß DaviJones
Sowohl Hardware-Anschluss, als auch Integration in DoorPi sollten recht einfach werden.
For test purpose:
Die passende Klasse für Python ist auch gleich dort zu finden:
https://github.com/QuickGroup/pyGT511C3/blob/master/FPS.py
Ein passendes Keyboard kann ich Dir dann zusammenbauen, wenn wirklich Bedarf besteht.
Danke für die Info und das Angebot,
wenn ich das Teil habe werde ich gerne drauf zurückkommen.
Gruß DaviJones
Hallo zusammen.
Ich nutze schon eit einem Jahr erfolgreich den Fingerscanner von Adafruit um die Türe zu öffnen. Als Controller nutze ich einen Arduino, der über ein Relais meine Tür freigibt. Im zuge der Vereinfachung der Systeme würde ich gerne den Fingeleser auch auf dem Raspi betreiben. Da DoorPi meine Tür eh schon bedient, wollte ich mal anfragen, ob ws eine Möglichkeit gibt, diesen mittels Keyboard gleich zu integrieren? Für den Fingeleser hat Bastian Raschke eine Python Library geschrieben. Leider bin ich noch ein Jung-Pythoner, darum mal die Frage an euch Profis, wie ichdas am schlausten angehe.
Vielen Dank für eure Feedbacks.
Sowohl Hardware-Anschluss, als auch Integration in DoorPi sollten recht einfach werden.
Die passende Klasse für Python ist auch gleich dort zu finden:https://github.com/QuickGroup/pyGT511C3/blob/master/FPS.py
Ein passendes Keyboard kann ich Dir dann zusammenbauen, wenn wirklich Bedarf besteht.
Hallo motom001,
hast du evtl. schon an einem Keyboard für Fingerprints gearbeitet? Bei mir schlägt das Thema aktuell auch auf. Allerdings habe ich auch den von Adafruit
Hallo,
ich hätte auch Interesse an einer Umsetzung.
ich habe mir den Sensor mal kommen lassen und überlege meinen Ibutton damit zu ersetzen. Hatte zunächst an eine Arduino umsetzung gedacht aber direkt an den PI wäre natürlich die beste Lösung.
ich habe den
GT-521F32
Habs euch mal grob mit der pyFingerprint-Library zusammengesetzt. Ich habe aber selbst weder einen der unterstützten Sensoren noch hab ich es getestet. Kann also sein, dass da Syntax und/oder andere Fehler drin sind.
1. pyFingerprint - Library installieren: https://github.com/bastianrasc…fingerprint/#installation
2. Fingerabdrücke registieren: https://github.com/bastianrasc…t/#how-to-use-the-library
3. /usr/local/lib/python2.7/dist-packages/doorpi/keyboard/from_fingerprint.py anlegen und folgenden Inhalt einfügen:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import logging
logger = logging.getLogger(__name__)
logger.debug("%s loaded", __name__)
import threading
import time
from pyfingerprint.pyfingerprint import PyFingerprint
from doorpi.keyboard.AbstractBaseClass import KeyboardAbstractBaseClass, HIGH_LEVEL, LOW_LEVEL
import doorpi
def get(**kwargs): return Fingerprint(**kwargs)
class Fingerprint(KeyboardAbstractBaseClass):
name = 'Fingerprint Reader'
def readFingerprint(self):
logger.debug("readFingerprint() started")
while not self._shutdown:
try:
## Warten bis ein Finger erkannt wurde. Falls zwischendurch DoorPi beendet wird (multithreading!) - Abbruch.
while (self.__sensor.readImage() == False):
if (self._shutdown) return
pass
## Characteristics aus dem gelesenen Fingerabdruck auslesen und hinterlegen
self.__sensor.convertImage(0x01)
## Datenbank nach diesen Characteristics durchsuchen
result = self.__sensor.searchTemplate()
positionNumber = result[0]
accuracyScore = result[1]
## Input-Pin entsprechend der gefundenen Position aktivieren
self.last_key = positionNumber
self.last_key_time = time.time()
logger.debug('Found template at position #' + str(positionNumber))
logger.debug('The accuracy score is: ' + str(accuracyScore))
## Finger entweder garnicht oder nicht exakt genug erkannt.
if (positionNumber == -1) or (accuracyScore < self.__security):
## Finger unbekannt - Event auslösen
doorpi.DoorPi().event_handler('OnFingerFoundUnknown', __name__)
else:
## Finger bekannt - Event auslösen
doorpi.DoorPi().event_handler('OnFingerFoundKnown', __name__)
## Dem Finger zugeordnete Events auslösen
if (self.last_key in self._InputPins):
self._fire_OnKeyDown(self.last_key, __name__)
self._fire_OnKeyPressed(self.last_key, __name__)
self._fire_OnKeyUp(self.last_key, __name__)
except Exception as ex:
logger.exception(ex)
def __init__(self, input_pins, keyboard_name, conf_pre, conf_post, *args, **kwargs):
logger.debug("__init__ (input_pins = %s)", input_pins)
self.keyboard_name = keyboard_name
self._InputPins = map(int, input_pins)
self.last_key = ""
self.last_key_time = 0
## Spezielle Handler für (Un-)bekannte Finger registrieren
doorpi.DoorPi().event_handler.register_event('OnFingerFoundUnknown', __name__)
doorpi.DoorPi().event_handler.register_event('OnFingerFoundKnown', __name__)
## Config-Einträge lesen, falls dort vorhanden.
section_name = conf_pre + 'keyboard' + conf_post
self.__port = doorpi.DoorPi().config.get(section_name, 'port', "/dev/ttyAMA0")
self.__baudrate = doorpi.DoorPi().config.get_int(section_name, 'baudrate', 57600)
self.__sensoraddr = doorpi.DoorPi().config.get(section_name, 'address', 0xFFFFFFFF)
self.__password = doorpi.DoorPi().config.get(section_name, 'password', 0x00000000)
self.__security = doorpi.DoorPi().config.get_int(section_name, 'security', 70)
## Sensor initialisieren
self.__sensor = PyFingerprint(self.__port, self.__baudrate, self.__sensoraddr, self.__password)
if (self.__sensor.verifyPassword() == False):
logging.warning('The given fingerprint sensor password is wrong!')
logging.debug('Currently used templates: ' + str(self.__sensor.getTemplateCount()) + '/' + str(self.__sensor.getStorageCapacity()))
## Events für hinterlegte InputPins registrieren (damit diese auch ausgelöst werden)
for input_pin in self._InputPins:
self._register_EVENTS_for_pin(input_pin, __name__)
## Thread für den eigtl Lesevorgang starten
self._shutdown = False
self._thread = threading.Thread(target = self.readFingerprint)
self._thread.daemon = True
self._thread.start()
self.register_destroy_action()
def destroy(self):
if self.is_destroyed: return
self._shutdown = True
doorpi.DoorPi().event_handler.unregister_source(__name__, True)
self.__destroyed = True
def status_input(self, tag):
return (tag == self.last_key)
def set_output(self, pin, value, log_output = True):
return False
Alles anzeigen
Hi developer,
vielen Dank für deine Mühe.
Das würde ich gerne heute Abend oder Morgen testen.
Damit ich gut vorbereitet bin habe ich noch Fragen.
Die py Datei kopiere ich in /usr/local/lib/python2.7/dist-packages/doorpi/keyboard/ ?
Aber wie spreche ich das keyboard in der doorpi.ini dann richtig an?
[keyboards]
virtual = fingerprint
Stimmt das? Wenn ja, wie geht es dann weiter?
Ich hab es im Beitrag hinzugefügt.
Das Keyboard verhält sich wie das für PN532/RM6300. Es läuft in einer Endlosschleife, bis DoorPi beendet wurde. Darin wird immer wieder auf einen neuen Finger gewartet.
Wenn eine Finger gefunden wurde, wird nach diesem unter den Registrierten gesucht. Ist er dort vorhanden und eindeutig als dieser identifiziert (Variable security) wird zunächst OnFoundKnown ausgelöst und dann, falls registriert, für diesen Finger hinterlegte Events (OnKeyDown/Up/Press ) ausgelöst. Die Pin-Nummer ist hierbei jetzt die Position des Fingerabdrucks in der (auf dem Sensor) hinterlegten Datenbank. (Die in der pyFingerprint enthaltene https://github.com/bastianrasc…xamples/example_search.py kann dir die ausgeben)
Und dann in der Config
[keyboards]
fpreader = fingerprint
[fpreader_keyboard]
port = /dev/ttyUSB0
#address = 0xFFFFFFFF
#password = 0x00000000
security = 80
[fpreader_InputPins]
1 = sleep:0
2 = sleep:0
# Auf einzelnen Fingerabdruck erweitertet reagieren
[EVENT_OnKeyPressed_fpreader.1]
10 = out:Tueroeffner,1,0,3
20 = mailto:hansi@t-online.de,"Hansi ist da", "Hallo"
# Event, dass bei jedem erkannten Tag auslöst
[EVENT_OnFingerFoundKnown]
10 = out:Tueroeffner,1,0,3
Alles anzeigen
Hallo deviloper .
Danke für deine Arbeit. Du hast mir mein fehlendes Puzzleteil zugespielt.
In deinem Keyboard ist noch ein Syntaxfehler drin: In Zeile 81 hast du eine schliessende Klammer zuviel und das Shebang am Anfang fehlt, damit keine Codierungsfehler auftreten.:
Bei mir sieht die funktionierende Config-Section so aus:
[fpreader_InputPins]
1 = sleep:0
2 = sleep:0
[fpreader_keyboard]
port = /dev/ttyUSB0 # hier ist in deinem Beispiel der falsche Keyname angegeben
security = 80
[keyboards]
fpreader = fingerprint
So habe ich das Keyboard dann ans Laufen gekriegt.
Vielen Dank für deine Arbeit. Da dran habe ich über ein Jahr geknobelt und habe es nie hin gepriegt - jetzt weiss ich auch, wo mein Denkfehler lag
Ich würde vorschlagen, ich teste eine Woche und anschliessend kannst du ja einen pull request zum DoorPi Repository machen, damit Thomas es in den MASTER-Zweig aufnehmen kann.
Gruss
Sven
Danke fürs korrigieren. Python ist echt ne komische Sprache :O Komm eigtl von C++, da braucht es sowas nicht. Und diese 'undefinierten' Scopes.. (bzw. durchs einrücken... )
Klingt gut wobei ich gar nicht weiß ob motom001 pull requests noch zulässt.
M4ce1 testet das Keyboard gerade auch.
Beim Code müsste man nochmal überlegen, ob die Zuweisung des last-key evtl nur erfolgen soll, falls es ein zutreffender Finger ist und nicht generell bei jedem Finger.
Hallo ihr beiden. Meiner funktioniert mittlerweile. Vielen Dank für eure Mühe. Werde jetzt erstmal testen und die doorpi.ini anpassen wegen den Events
M4ce1 meinte jetzt, dass es ggf. schöner wäre nur bei Bedarf den Sensor zu aktivieren. Wenn ich motom001 Struktur richtig verstehe, wäre das eher eine Aktion statt ein Keyboard?
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import logging
logger = logging.getLogger(__name__)
logger.debug("%s loaded", __name__)
from pyfingerprint.pyfingerprint import PyFingerprint
import time
from doorpi.action.base import SingleAction
import doorpi
def destroy_await_fingerprint():
doorpi.DoorPi().event_handler.unregister_source(__name__, True)
def await_fingerprint(timeout):
logger.debug("awaiting fingerprint")
## Einstellungen aus config lesen. Abschnitt [Fingerprint]
section_name = 'Fingerprint'
port = doorpi.DoorPi().config.get(section_name, 'port', "/dev/ttyUSB0")
baudrate = doorpi.DoorPi().config.get_int(section_name, 'baudrate', 57600)
sensoraddr = doorpi.DoorPi().config.get(section_name, 'address', 0xFFFFFFFF)
password = doorpi.DoorPi().config.get(section_name, 'password', 0x00000000)
security = doorpi.DoorPi().config.get_int(section_name, 'security', 80)
## Sensor initialisieren
sensor = PyFingerprint(port, baudrate, sensoraddr, password)
if (sensor.verifyPassword() == False):
logging.warning('The given fingerprint sensor password is wrong!')
return
## TRACE: Ausgabe ob und wenn ja wie viele Fingerabdrucke registriert sind.
logging.debug('Currently used templates: ' + str(sensor.getTemplateCount()) + '/' + str(sensor.getStorageCapacity()))
try:
## Timeout festlegen.
endtime = time.time() + timeout
## Warten bis ein Finger erkannt wurde. Falls zwischendurch timeout erreicht wird - Abbruch
while (sensor.readImage() == False):
if (time.time() > endtime) return
pass
## Characteristics aus dem gelesenen Fingerabdruck auslesen und hinterlegen
sensor.convertImage(0x01)
## Datenbank nach diesen Characteristics durchsuchen
result = sensor.searchTemplate()
positionNumber = result[0]
accuracyScore = result[1]
## Input-Pin entsprechend der gefundenen Position aktivieren
logger.debug('Found template at position #' + str(positionNumber))
logger.debug('The accuracy score is: ' + str(accuracyScore))
## Finger entweder garnicht oder nicht exakt genug erkannt.
if (positionNumber == -1) or (accuracyScore < security):
## Finger unbekannt - Event auslösen
doorpi.DoorPi().event_handler('OnFingerFoundUnknown', __name__)
else:
## Finger bekannt - Event auslösen
doorpi.DoorPi().event_handler('OnFingerFoundKnown', __name__)
except Exception as ex:
logger.exception(ex)
def get(parameters):
parameter_list = parameters.split(',')
if len(parameter_list) is not 1: return None
## Spezielle Handler für (Un-)bekannte Finger registrieren
doorpi.DoorPi().event_handler.register_event('OnFingerFoundUnknown', __name__)
doorpi.DoorPi().event_handler.register_event('OnFingerFoundKnown', __name__)
doorpi.DoorPi().event_handler.register_action('OnShutdown', AwaitFingerprintDestroyAction(destroy_await_fingerprint))
timeout = parameter_list[0]
return AwaitFingerprintAction(await_fingerprint, timeout = timeout)
class AwaitFingerprintAction(SingleAction):
pass
class AwaitFingerprintDestroyAction(SingleAction):
pass
Alles anzeigen
So wäre eine Beispielimplementierung dann als Action. Das dann aber anstelle von dem Keyboard, da ich die Events recycled habe.
[Fingerprint]
port =
baudrate =
address =
password =
security =
[EVENT_OnFingerFoundKnown]
10 = out:Tueroffnen
[EVENT_OnFingerFoundUnknown]
10 = speak,"HEY GEH WEG!"
Alles anzeigen
Die Parameter sind alle optional, da defaults im Skript hinterlegt sind.
Ausgelöst wird das ganze z.B.: (timeout 30 Sekunden)
Klingt gut wobei ich gar nicht weiß ob motom001 pull requests noch zulässt.
Macht er bestimmt...
Hat jemand schon diesen Fingerabdrucksensor im Einsatz ?
Die Bauform sieht ideal für den Frontplatten einbau aus.
Das sieht ja ziemlich nach einem Relabel vom GROW R503 aus (https://de.aliexpress.com/item/33053655412.html). Der R503 und andere Sensoren des Herstellers, die alle ähnlich leicht in eine Frontplatte integriert werden können, sollten von der pyFingerprint unterstützt werden. Sollte, da r503 nicht explizit aufgelistet wird.
Die Implementierung fürs Keyboard sieht allerdings mittlerweile so aus: https://github.com/deviloper-l…board/from_fingerprint.py