RFID-RC522 als Tastatur

  • Hallo zusammen,


    ich glaube, ich ging von etwas aus was vielleicht gar nicht geht.


    Ausgangslage: Ein Pi mit Monitor, der Chromium im Kiosk-Modus started. Jetzt war unsere Überlegung, dass man einfach unsere RFID-Karten, die wir schon für die WG-Türen haben an den RC522 hält und sein "Dashboard" angezeigt bekommt. Technisch von der Webseite her läuft alles soweit, mit einer Tastatur die UID der RFID-Karte eingeben und das "Dashboard" wird angezeigt.


    Jetzt mein Denkfehler: Ich dachte, ich kann das RC522 wie eine Tastatur benutzen, dass automatisch die UID ausliest und ausgiebt. Über die ganzen anleitungen hier, habe ich es problemlos geschafft, die UID einmalig im Terminal auszugeben (über ein Python-Script) ... aber danach muss man das Script wieder starten und das funktioniert auch nur im Terminal.


    Jetzt meine Frage: Gibt es eine Möglichkeit, die UID der RFID-Karte im Browser auszugeben?


    Vielen Dank schon mal!

    Hans

  • Hallo zusammen,


    erst einmal vielen Dank für die Infos! Leider ist das noch alles ein bischen zu hoch für mich... kenne mich nur mit javascript und php etwas besser aus.


    Das hat mich leider total überfordert und ich wusste überhaut nicht, was ich machen soll, datum habe ich mich für diese Lösung entschieden:




    Mein aktueller Stand:

    Ich habe Raspian Light mit Xserver und openbox am laufen und starte Chromium in Kiosk-Modus


    jetzt habe ich das RFID-Modul wie bereits oben beschrieben zum laufen gebracht. (python3-dev python3-pip spidev mfrc522)


    Mit der Anleitung von oben habe ich meine Python-Datei wie folgt abgeändert:

    #!/usr/bin/env python

    import RPi.GPIO as GPIOimport webbrowserfrom mfrc522 import SimpleMFRC522

    reader = SimpleMFRC522()

    try: id, text = reader.read() print(id) # webbrowser.get("chromium-browser").open("https://das.sind.wir/dash.php?wgid=01") webbrowser.open("https://das.sind.wir/dash.php?wgid=01") print(id)finally: GPIO.cleanup()


    Wenn ich den Browser beende und meine Datei wie folgt starte: python3 /home/wir/rfid.py


    wird mit zwei mal die UID ausgegeben, sobal ich die Karte an den Leser halte.

    1. Problem: das webbrowser.open() wir gar nicht beachtet.... webbrowser.get().open() bring eine fehlermeldung

    2. Problem: das Python-Script wird danach beendet und ich muss es erneut starten... genau so muss ich es Script erst beenden, damit ich Chromium wieder starten kann. Wie schaffe ich es, dass es ständig im Hintergrund läuft?


    Oder verstehe ich grundsätzlich etwas falsch an der Herangehensweise?


    Vielen Dank für euer Bemühen!

  • Wenn du willst, das etwas dauerhaft geschieht in JavaScript oder PHP, statt nur einmal - was machst du dann?


    Und das machst du auch in Python. Und jeder anderen imperativen Sprache.

  • Ich würde die Funktion einfach erneut aufrufen, wenn das Event ausgelöst wurde... leider konnte ich noch nicht finden, wie ich das Script in Python erneut ausführen kann, nachdem es die UID ausgelesen hat... das Script wird ja danach beendet.

  • while schleifen. Einfach nur eine while Schleife.

  • Ich glaube, ich stehe hier echt auf dem Schlauch... tut mir echt leid :(


    Ich weis nicht einmal welche Bedingung ich in die while schleife schreiben sollte... hab jetzt zum testen einfach mal eine Variable gesetzt und lass die hoch zählen (das hochzählen könnte ich auch auslassen, dann würde es unendlich gehen).... so kann ich zumindestens x mal die ID auslesen und im Terminal ausgeben


    Aber wie schaffe ich es jetzt, dass das im Hintergund läuft und mir die UID zum Browser übergeben wird bzw. das browser.open funktioniert?


    Tut mir echt leid... ich bin da etwas zu naiv an die Sache ran gegangen :/

  • Wenn du etwas endlos machen willst, musst du einfach nur


    while True:


    benutzen. Und nahezu jedes Beispiel zu deinem RFID Reader zeigt das auch, es ist ja nicht so, als ob das ungewöhnlich wäre, dass ein solcher Leser dauerhaft laufen soll.


    Und hier wird andauern diskutiert wie man Programme automatisch startet. Einfach mal ein bisschen stöbern.

  • So, erst einam vielen Dank für die Infos! ich bin jetzt ein gutes Stück weiter gekommen und habe es wie folgt gelöst.


    Beim Systemstart starte ich das Python-Script und den Browser. Das Paython-Script sendet jedes mal, wenn die RFID-Karte an das Lesegerät hänlt ein request an eine URL, die einen Eintrag in die DB macht.

    Der Browser frägt jede Sekunde ab, ob ein eintrag in die DB gemacht wurde, sobal dies geschehen ist, ändert er den Inhalt der Seite.


    Mit dem Ergebnis bin is soweit zufrieden.


    Meine frage ist jetzt nur noch, ist das mit dem abfragen mit 1x pro Sekunde sehr belastend für den Webserver? Bzw. hat hiefür jemand eine bessere Lösung?

  • "Sehr belastend" nicht. Technisch holperig, ja. Normalerweise wuerde man statt einer Datenbank einfach einen Websocket aufmachen. Das RFID-Skript bleibt unveraendert, aber dein Endpunkt schreibt dann eben in den Socket, und sofort weiss dein Frontend, das und was passiert ist.

  • Danke für die Info... Socket scheint nach etwas Suchen genau das zu sein, was ich brauche... bin vor allem auf socket.io gestossen... hab mich bisher noch nicht damit beschäftigt ... da muss ich mich wohl mal rein arbeiten.

    Fall jemand ein gutes Tutorial auf deutsch weis, wäre ich darüber sehr dankbar.