Problem mit Türkontrollsystem, QR-Codes Scanner und Google Sheets Tabelle

  • Guten Tag zusammen!
    ich benötige dringend Eure Expertise und Hilfe bei einem Problem mit meinem neuen Raspberry Pi5.

    Ich konnte bereits eine erfolgrieche API Verbindung zu einer Google Sheet herstellen.

    Beschreibung des Vorhabens:
    Türzutrittskontrolle über QR-Code Scanner (Usb-Anschluss) und Erfassung der Check Ins in Google Sheet.

    Jetzt habe ich das Problem, dass mein QR-Code (Beisspielcode: MTBGF07) zwar erkannt, aber nicht richtig dargestellt wird.
    Ich habe den Scanner an einem Windows PC angeschlossen und getestet. Er wird als Tastatur erkannt.
    Auch der Code wird z.B. in Word direkt so dargestellt, wie er ist, und wie er von einem QR-Code-Generator erstellt wurde.

    Im Terminal (Powershell über den PC und SSH) im Raspberry wird er aber nicht richtig angezeigt.
    Die Rohdaten im Terminal lauten:

    • KEY_M (Code: 50, Type: 1): Die Taste "M" wurde gedrückt.
    • KEY_T (Code: 20, Type: 1): Die Taste "T" wurde gedrückt.
    • KEY_B (Code: 48, Type: 1): Die Taste "B" wurde gedrückt.
    • KEY_G (Code: 34, Type: 1): Die Taste "G" wurde gedrückt.
    • KEY_F (Code: 33, Type: 1): Die Taste "F" wurde gedrückt.
    • KEY_0 (Code: 11, Type: 1): Die Taste "0" wurde gedrückt.
    • KEY_7 (Code: 8, Type: 1): Die Taste "7" wurde gedrückt.
    • KEY_ENTER (Code: 28, Type: 1):

      In der Google Sheet erscheint nur ein "*2" nach dem Scan. Es wird also etwas übertragen, jedoch keine Key-Codes, beziehungsweise der fertige Code.

      Wie schaffe ich es nun, dass der Code: MTBGF07 richtig erkannt und an Google weitergegeben wird?

      Hat vielleicht jemand eine Lösung für mein Problem?

      Zur Info:
      Ich bin neu in der Welt von Python und Raspberry :)

      Besten Dank im Voraus für Eure Hilfe und sorry für meine laienhafte Ausdrucksweise!

      Vg Tobi
  • Problem mit Türkontrollsystem, QR-Codes Scanner und Google Sheets Tabelle? Schau mal ob du hier fündig wirst!

  • Hallo, vielen Dank für die schnelle Rückmeldung.

    Hier der fehlerhafte Code:


    Edited once, last by hyle: Ein Beitrag von Tobi410 mit diesem Beitrag zusammengefügt. (January 10, 2025 at 11:44 AM).

  • Was sofort auffällt ist dies:

    Python
    # Verbinde mit dem Barcode-Scanner (ersetze '/dev/input/eventX' mit dem korrekten Event-Gerät)
    device = InputDevice('/dev/input/eventX')  # Finde das richtige Event-Gerät

    Das "X" bei eventX musst Du noch anpassen!

    Mach' mal ein

    Bash
    ls -l /dev/input 

    Dort siehst Du dann die möglichen Werte.

  • Ja, das hatte ich schon getestet. Es ist event5:

    Das kommt bei "@raspberrypi:~ $ sudo cat /dev/input/event5" raus:
    g g 2g g g 2g g& g& g& g* g* g* g= g= 0g= gkA gkA 0gkA gT
    gT "gT gX
    gX "gX gfl 'gfl gfl gKp 'gKp gKp gЃ 'gЃ gЃ g 'g g gA 'gA gA g+ 'g+ g+ g $g g g $g g g# (g# g# g (g g

  • Tobi410 So ein cat macht da wenig Sinn, denn da kommen Binärdaten die nicht sinnvoll als Text darstellbar sind. Zwichen den ASCII-Zeichen die wir sehen, kommen noch viele Bytewerte die vom Terminal verschluckt werden.

    Wenn ich beispielsweise sudo cat /dev/input/event3 | hd auf meine Tastatur mache und abc eintippe, sieht das so aus:

    Wie man sieht auch sehr viele kleine g wie bei Deiner Ausgabe, aber auch viele zusätzliche Bytes dazwischen die bei Deiner Ausgabe alle nicht angezeigt würden.

    “Politiker muss man nicht achten, man muss auf sie achten.” — Dieter Hildebrandt

  • Ich habe das Tool installiert, jedoch werden weiterhin keine Daten übertragen. Wenn den Code mit python3 qr_to_google_sheet.py ausführe, dann wird direkt etwas in die Google Sheet geschrieben, B1 = Datum und C1 gleich Uhrzeit.

    In A sollte der Code stehen der gescannt wird. Leider steht da nur 123456

    Auch ein Scan bleibt komplett ohne Funktion. Es werden weder Inhalt des QR-Codes, Datum noch Uhrzeit in der Tabelle eingetragen.
    Der python-Code muss also fehlerhaft sein richtig? Warum sendet das Raspberry die Daten nicht einfach 1:1 an das Google Sheet wenn ein Scan erfolgt?

    Kann jemand den Code für mich eventuell so umschreiben, dass das gescannte in Spalte A landet?

    Vielen Dank für Eure Bemühung und Unterstützung.

  • Auch ein Scan bleibt komplett ohne Funktion. Es werden weder Inhalt des QR-Codes, Datum noch Uhrzeit in der Tabelle eingetragen.
    Der python-Code muss also fehlerhaft sein richtig? Warum sendet das Raspberry die Daten nicht einfach 1:1 an das Google Sheet wenn ein Scan erfolgt?

    Es macht Sinn, den Teil mit Google-Sheets erst einmal zu ignorieren.

    Zu Beginn sollte der Scan ordentlich funktionieren. Wenn das dann geht, kommt der nächste Schritt...

  • Tobi410 Das ist nicht der Code der da tatsächlich läuft. Nicht nur wegen der fehlenden Anpassungen auf Dein System, sondern auch weil der ziemlich wahrscheinlich bei fast jedem Start mit einer Ausnahme abbricht bevor überhaupt das erste Ereignis vom Scanner gelesen wurde. Denn wenn gerade kein Ereignis anliegt, löst die read()-Methode eine Ausnahme aus. Und die liest auch nur die Ereignisse die gerade zu dem Zeitpunkt gepuffert sind. Was natürlich nicht alles sein muss was der Scanner sendet. Nach dem verarbeiten was genau zu dem Zeitpunkt wo man das Programm startet gepuffert ist, ist das Programm dann auch zu ende. Ich bin mir nicht so sicher ab das wirklich so gewollt ist.

    Sonstige Fehler/Anmerkungen: Um einen Zeitpunkt zu ermitteln darf man die entsprechende Funktion oder Methode nur einmal aufrufen, denn wenn man die mehr als einmal aufruft hat man unterschiedliche Zeitpunkte, denn zwischen den Aufrufen vergeht Zeit.

    Einen Zeitpunkt sollte man auch nicht auf mehrere Spalten aufteilen. Das ist ein Wert. Ich hoffe das wird in dem Tabellendokument dann auch als Zeitpunkt gespeichert und nicht als Zeichenkette.

    “Politiker muss man nicht achten, man muss auf sie achten.” — Dieter Hildebrandt

  • Guten Morgen,

    vielen Dank für die Informationen und allen einen guten Start in die neue Woche!

    Ich verstehe, was du meinst, jedoch weiß ich nicht, wie ich das umsetzen kann.

    In den letzten zehn Tagen habe ich mit der Hilfe von ChatGPT alles versucht, was ich konnte, jedoch leider ohne Erfolg. Deshalb war dieses Forum meine letzte Hoffnung, um das Problem zu lösen.

    Könntet ihr mir bitte dabei helfen, den Code so umzuschreiben, dass er funktioniert, und eventuell auch die notwendigen Systemeinstellungen vorzunehmen?

  • Ich habe das Tool installiert, jedoch werden weiterhin keine Daten übertragen.

    evtest ist kein automatisches Wundermittel, um fehlerhaften Programmcode zu reparieren!

    evtest kann manuell genutzt werden, herauszubekommen, welche Daten ein Input Device (hier der Barcode-Scanner) liefert.

    Rufe es mit sudo evtest auf und probiere aus, was angezeigt wird, wenn Du - nach Auswahl des Scanners - Barcodes scannst.

    Die Ergebnisse können dann in das Python-Programm einfließen.


    Nachtrag: Und poste mal Dein aktuelles Python-Programm. Nicht wieder das "Muster" von oben...

  • Was wären wir heute ohne KI ...

    Ich habe gerade den Code von Blackjack in meinen Chat mit ChatGPT eingefügt und die KI gebeten, die genannten Punkte im Code zu berücksichtigen.

    Daraufhin hat die KI den Code geändert – und siehe da, alles funktioniert wie gewünscht! Die Daten werden in Google erfasst, und das Datum sowie die Uhrzeit erscheinen daneben.

    Vielen Dank für eure Hilfe!

  • Tobi410 Ohne KI müsste man halt lernen und verstehen und selber programmieren. Mit dem Vorteil, dass man auch ohne KI nicht hilflos Code gegenüber steht.

    Das mit der Fehlerbehandlung ist ein bisschen Banane. Selbst den Traceback ausgeben und das Programm beenden statt einfach nichts zu machen — wo dann der Traceback automatisch ausgegeben und das Programm beendet wird, macht nicht so wirklich Sinn.

    Kommentare sollen dem Leser einen Mehrwert über den Code geben. Faustregel: Kommentare beschreiben nicht *was* der Code macht, denn das steht da bereits als Code, sondern warum er das macht. Sofern das nicht offensichtlich ist. Offensichtlich ist in aller Regel auch was in der Dokumentation von Python und den verwendeten Bibliotheken steht.

    ecodes wird importiert, im Programm dann aber mal direkt darauf zugegriffen und mal über evdev.ecodes.

    categorize() wird zwar aufgerufen, das Ergebnis an key_event gebunden, aber dann überhaupt nicht verwendet. Sollte es aber, denn dann könnte man den Test ob die Taste gedrückt wurde, so formulieren, dass man dafür keinen Kommentar zur Erklärung benötigt.

    "KEY_" in ... ist eigentlich der falsche Test, denn man möchte ja eigentlich wissen ob der Text damit anfängt nicht ob das irgendwo enthalten ist. Auch fangen eigentlich alle Tastencodes von Tastenereignisse mit KEY_ an. Was den Test fast überflüssig macht. Was der Code gar nicht berücksichtigt und was deshalb zu einem Problem führen kann, ist das Scancodes und Tastencodes nicht eindeutig sind. Einem Scancode kann mehr als ein Tastencode zugewiesen sein. In dem Fall liefert evdev eine Liste mit Zeichenketten statt einer einzelnen Zeichenkette. Ist eine blöde API, die die Verarbeitung unnötig kompliziert macht, weil man sowohl Zeichenkette als auch Liste mit Zeichenketten an der Stelle berücksichtigen muss.

    Wie schon mal gesagt: Einen Zeitpunkt muss man mit einem Aufruf ermitteln. Wenn man zwei Aufrufe macht, hat man auch zwei Zeitpunkte die nicht gleich sind.

    Das ist alles schon etwas kompliziert für einen grossen verschachtelten Klumpen Code. Ich habe da etwas gestreckt in dem ich das Filtern und Kategorisieren von Tastenereignissen in einen Generatorausdruck vorgezogen habe, aber eigentlich sollte man das Erfassen, Filtern, und umwandeln der Tastenereignisse in eine eigene Funktion herausziehen.

    Ungetestet:

    “Politiker muss man nicht achten, man muss auf sie achten.” — Dieter Hildebrandt

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!