Python3 auf PI 4 mit Bullseye Datenbank abfragen

Registriere dich jetzt, um exklusive Vorteile zu genießen! Als registriertes Mitglied kannst du Inhalte herunterladen und profitierst von einem werbefreien Forum.
Mach mit und werde Teil unserer Community!
  • Hallo erstmal,


    ich habe einen Pi3B mit Reader unter Python2 sehr gut am laufen, als ich nun alles erweitern wollte geht nichts mehr.

    Bekomme einfach keine Software mehr aufgespielt, egal habe ja noch ein Pi4 mit Bullseye 64 Bit


    Mein ersten Problem war das der sql connector nicht wollte, ok habe ich hinbekommen.

    Code aus Pi3

    nun aus Pi4

    Wie im Code zu sehen hänge ich an IF abfrage fest, ich weß es geht mit try: und co aber da wurde ich auch nicht schlauer draus.

    Bitte nicht zu viele Fachbegriffe nutzen damit kann ich nichts anfangen außer es sind befehle .

    Wer hat dafür eine lösung

  • Um das erste Problem zu besprechen: Gibt es eine Fehlermeldung beim Installieren oder sowas? Ansonsten hilft bestimmt das Neuinstallieren des OS.


    Dein Code ist ziemlich schwer verständlich, da alle Variablennamen (zumindest für mich) nur irgendwelche random Buchstaben sind. Gleiches für die Datenbankfelder.


    Es gibt auf jeden Fall ein paar Fehler, die mir PyCharm anzeigt, wenn ich den Code dort öffne.


    • Z. 2 bis 9: Es gibt unbenutzte Imports wie contextlib und os.
    • Der ganze Code ab Zeile 10 sollte in eine main-Funktion, die dann am Ende der Datei mit if __name__ == '__main__': main() aufgerufen wird.
    • Z. 15 - 17 und Z. 19 - 20: Konstanten sollten immer in GROSSBUCHSTABEN_MIT_UNTERSTRICHEN geschrieben werden.
    • Z. 23: continue_reading ist nicht definiert
    • Z. 24: Genau so wie LED_GREEN
    • Z. 29 - 30: id, text = reader.read() ... card = id kann ersetzt werden durch card, text = reader.read(). Der Name id ist schon ein Python-Builtin und wird somit in deinem Code überschrieben.
    • Z. 42, 62, 63 und 78: Ich gehe davon aus, dass du weißt, dass das keine richtigen Kommentare sind
    • Z. 43 - 69: Der ganze Teil ist zu weit eingerückt.
    • Z. 59: b ist nicht definiert, wahrscheinlich, weil in Z. 56 noch einmal a als Variable genommen wurde.
    • Z. 60: Da fehlt das erste Anführungszeichen in dem print.


    Ich hoffe, das hilft weiter.

    Gruß, Bennet

  • linuxnewbie: Das alte Programm ist schon falsch und zwar so das in der Datenbank kaputte Werte stehen. Denn `card` ist nicht eindeutig. Man kann nicht einfach vier Bytewerte in Zeichenketten mit der Dezimaldarstellung umwandeln und die direkt aneinander pappen und das als ID nehmen, denn das ist nicht mehr Eindeutig! Es kann mehrere Karten geben die zur gleichen ID führen, womit das keine ID mehr ist. Zudem vergleicht das Programm Zeichenketten mit Zahlen, was *immer* ungleich ist, egal wie die Werte aussehen.


    Bei "137226219179" hast Du zufällig Glück, dass diese Ziffernfolge tatsächlich nur mit einer einzigen RFID zustande kommen kann. Bei den Dummywerten gibt es jeweils 10 verschiedene RFIDs die zur gleichen Ziffernfolge führen:

    Code
       1. ["1", "111", "111", "111"]
       2. ["11", "11", "111", "111"]
       3. ["11", "111", "11", "111"]
       4. ["11", "111", "111", "11"]
       5. ["111", "1", "111", "111"]
       6. ["111", "11", "11", "111"]
       7. ["111", "11", "111", "11"]
       8. ["111", "111", "1", "111"]
       9. ["111", "111", "11", "11"]
      10. ["111", "111", "111", "1"]

    Die Signalbehandlung von SIGINT ist Unsinn. Das muss irgendein C-Programmierer verbrochen haben, das macht man so nicht. Python kümmert sich da bereits selbst drum und wandelt SIGINT in eine Ausnahme um. *Die* behandelt man, beziehungsweise benutzt ein ``finally`` für Aufräumarbeiten.


    ``global`` kannst Du bei der Gelegenheit dann auch vergessen, das verwendet man nicht in einem sauberen Programm.


    Die Namen sollten dringend überarbeitet werden. Man benutzt weder kryptische Abkürzungen noch nummerierten man Namen.


    `evsb05` und `evsb10` sollten sich nicht auf zwei verschiedene Zeitpunkte beziehen. Wenn das um Mitternacht herum passiert, dann kann es passieren, das die beiden Werte sich unterschiedliche Tage beziehen. Es gibt `datetime.datetime` für Datum *und* Zeit. Da wäre der Name `now` für das Ergebnis der `now()`-Methode auch sinnvoller.


    Es macht aber auch so gar keinen Sinn Das Datum, das Jahr, und die Zeit als Texte in drei Spalten einer Tabelle zu speichern. Das ist *ein* Zeitpunkt der in *eine* Spalte gehört. Das teilt man weder auf mehrere Spalten auf, noch speichert man die gleiche Information in unterschiedlichen Format im gleichen Datensatz. Und diese *eine* Spalte ist dann eine keine Zeichenkette sondern hat einen passenden Datentyp. DATETIME oder TIMESTAMP böten sich da an.


    Man sollte sich auch überlegen das in UTC zu speichern um beispielsweise Problemen mit Sommer- und Winterzeitumstellung aus dem Weg zu gehen.


    Hatte ich die Namen schon erwähnt? Sowohl im Programm als auch in der Datenbank gehen die *gar nicht*. Eine Tabelle die `db` heisst mit Spalten die `db01`, `db02`, `db03`, … heissen‽ Tabelle `rfid`, Spalten `tt01`, `tt02`, … oder `iss` und Spalten `vsb01` bis `vsb10`? ?


    Und dann wird an mehreren Stellen einfach der gleiche Wert an unterschiedliche Namen gebunden. Ein Wert sollte *einen* *sinnvollen* Namen haben.


    Man muss auch nicht jeden Wert überhaupt an einen Namen binden. Insbesondere nicht wenn der Name sowieso was absolut nichtssagendes, nummeriertes ist. Dann kann man nicht mal anführen, dass dadurch der Quelltext verständlicher wird.

    😡 Host Europe hat alle meine Emojis gefressen! 😭

  • Jetzt bin ich genau schlau wie zu vor, damals war ich froh das ich es unter python2 mit hilfe von vielen suchen alles hinbekam

    der namen von tabellen läßt sich noch ändern in neuen (pi4) kommt aber daher auch weil ich alles unter php abfragen wollte

    und mir erst gedanken mache was brauche ich

    ich habe mein Code rediziert auf das nötigste worauf es ankommt hier mit meinen problem, ich nutze einige GPIOs um LED anzusprechen oder einen Ton raus zu jagen andere GPIO steuern relais an habe viele sachen in eine Baustelle packen wollen was auch gut geht

    den Code wo hier nicht ist mach noch so das 4fache aus was ich hier nicht alles rein packen wollte

    ich habe einige codes erstmal übernommen und an meine gedanken angepasst ( card = id ) sowas ist nicht das problem und mit main habe ich auch schon im kopf aber das habe ich erst mal zurück gestellt weil das alles nicht mit mein problem was zu tun hat

    Ich muß diese if a = ... und if b = .... lösen

    Rot sind Abfragen von Tabellen in kombination mit Grün

    Es wird geprüft ob a oder werte hat je nach dem geht es weiter

    das muß ich umsetzen in Python3 und weiß nicht wie

  • Rot? Grün? Hä?


    Du magst denken dass das alles nicht Deine Probleme sind, aber letztlich kippst Du diesen Quelltext hier ins Forum und erwartest das andere sich darin zurecht finden.


    Ausserdem hast Du mit der ID ein Problem das Dir vielleicht nicht bewusst ist, aber es ist ja trotzdem da. Eventuell ist das auch genau das Problem an dem Du gerade hängst, denn `a` und `b` haben bei gleichen RFID-Token jetzt nicht mehr die Werte die sie im alten Programm hatten, weil die Nummer *jetzt* korrekt, nämlich eindeutig gebildet wird, aber so natürlich nicht mehr zu den kaputten Werten in der Datenbank passt.

    😡 Host Europe hat alle meine Emojis gefressen! 😭

  • Du spricht von ID meinst du id mit dem bezug zur card ?

    In der anleitung von Joy-it.net wird ist die rede von id welche ich auf die im chip versehene nr beziehe (Token ?)

    im alten code hatte ich sie card einfach genannt

    a und b war ganz oben nur a, es sind 2 verschiende tabellen wo ich mit der chip nummer daten abfrage

    a ist mal für erste tabelle und b für zweite tabelle und c nun für 3 tabelle

    tabelle a soll alle bekannten chips speichern

    tabelle b enthällt auch chip nr aber noch weitere daten wo dann später in tabelle 3 kommen

    hole daten mit chip nr aus tabelle a fals da keine ist dann schaue ob sie in b ist fals nicht dann trage sie in b ein

    wenn chip nr in b schon ist aber nicht in a dann zeige mir fehler print("fehler") sowas in der art

    wenn chip nr in a ist dann nimm info mit aus und trage info in c ein

    im alten code war die tabellen prüfung recht einfach wie zu sehen das der pi später nur auf console arbeitet habe ich zusaätze wie LEDs und Töne eingefügt

    meine print aufrufe sind nur zum arbeiten dann entfallen alle

    noch habe ich den joy-it reader es gab schon die überlegung einen neuftech reader zu nutzen aber damit hänge ich noch weiter zurück

    in meiner bastelbox habe ich auch arduinos, aber die sind für andere dinge vorgesehen laut internet würde die auch gehen könnte chip nr übergeben aber dann unter php weiter ausführen aber habe keine rückmeldung weshalb ich beim pi wieder bin

    bitte um das drum herum erst mal keine gedanken machen ich muß erst das mit den tabellen abfragen diese if if else else , wenn das steht dann kann ich weiter drum herum bauen und fehler bzw anders alles lösen

  • linuxnewbie Ich meine das was Du `card` zuweist. Im alten Code ist das was anderes als im neuen und im alten Code ist das falsch, weil so wie der Wert dort erstellt wird, können mehrere RFIDs zum gleichen `card`-Wert führen. Das heisst der Wert ist jetzt im neuen Code für das gleiche Hardware-Dings was Du an den Reader hältst ein anderer als in der Datenbank steht. Dementsprechend finden die Datenbankabfragen nichts.


    Lösung wäre Code zu schreiben der die ID auf beide Wege berechnet, jedes Hardware-Dings was verwendet wird/wurde, einmal damit auslesen, und dann in der Datenbank die kaputten alten Werte, durch die neuen korrekten Werte ersetzen.

    😡 Host Europe hat alle meine Emojis gefressen! 😭

  • Hallo,


    auch wenn der Python Quellcode sehr... na ja ist: an dem verwendeten SQL hat sich seit Jahren nichts geändert, d.h. die SQL Statement sind nach wie vor korrekt. D.h. das Problem liegt woanders.


    Das Datenbankdesign mit der A, B und C Tabelle hört sich komisch an, bzw. genau genommen: Fehler im Entwurf der Datenbankstruktur. Durch die kryptischen Namen der DB-Felder kann man da z.Zt. auch nicht wirklich sagen, was man besser machen könnte. Poste doch mal die `CREATE TABLE` Statements für die Tabellen A, B und C.


    BTW: ist deine Shift-Tasten kaputt? Im deutschen gibt es Groß- / Kleinschreibung. Ist zwar manchmal lästig, erhöht aber ungemein die Lesbarkeit von deutschen Texten. Genau so wie die Verwendung von Satzzeichen und Absätzen an sinnvollen Stellen zur Gliederung des Posts.

    Oder anders: warum sollte irgendjemand Lust haben, dir zu helfen, wenn du offensichtlich als Hilfesuchender keine Lust hast, ein bisschen Energie in die Lesbarkeit deiner Posts zu stecken?


    Gruß, noisefloor