GPIO-STATUS in MySQL-Datenbank schreiben

  • Queue.get nimmt keinen Pin als Argument! Das das so funktioniert liegt nur daran, dass es einen Timeout nimmt, und deine pin-nummer als solchen betrachtet! Ausserdem hast du dadurch einen Bug: wird nur *ein* Event in die Queue geschrieben, erwartest du aber zwei. Und du weisst auch gar nicht, welcher das ist... En kracht nicht, aber pausiert kurz (31ms zB), und macht dann weiter, und das falsch.

    Also - raus mit den Argumenten an get, und stattdessen mit 29 bzw 31 vergleichen. Bzw *noch besser ist es, nur eine queue zu verwenden, und ein dictionary zum lookup der notwendigen Werte.

    Kein Grund rumzuschlafen, die Queue blockiert alleine bis etwas ankommt.

  • Ich habe da noch mal drüber nachgedacht, und es ist nicht nur besser, eine Queue zu verwenden - es ist schlicht unabdingbar. Denn mit zwei getrennten Queues fuer Hi/Lo verlierst du die Information, wie zwei zueinander gehörige Ereignisse eines Kanals sich seitlich verhalten. Simpelstes Beispiel:

    - pin Hi
    - Programm startet
    - pin lo -> Eintrag in die lo-queue
    - pin hi -> Eintrag in die hi-queue

    -> lo-queu == [pin], hi-queue==[pin]

    - pin Lo
    - Programm startet
    - pin hi -> Eintrag in die hi-queue
    - pin lo -> Eintrag in die lo-queue

    -> lo-queu == [pin], hi-queue==[pin]

    Wie man sieht: in beiden Fällen ergibt sich aus unterschiedlichen Ereignisreihenfolgen die gleiche Belegung der Queues - daraus folgt, dass du Information verlierst, die du brauchst. Da du gleichzeitig auch nicht auf zwei Queues im selben Moment warten kannst, kannst du diese Information auch nicht dadurch gewinnen, das du dich darauf verlässt, das die Queue die als nächstes einen Eintrag erhält zuerst "antwortet". Selbst wenn das ginge, würdest du spätestens beim auftreten von weiteren Ereignissen während du im Haupthread etwas verarbeitest die Übersicht verlieren.

    Also - eine Queue, und immer ein Paar aus (<pin>, <status>) einstellen. Den Trick mit dem dictionary musst du natürlich nicht machen, aber er vereinfacht das programmieren deutlich - neue Pins sind dann zwei Zeilen im dict, und sonst kein Code angefasst.

  • Hallo deets,

    erstmal besten Dank für Deine Bemühungen :danke_ATDE: .

    Bin momentan unterwegs und kann leider bis zum Wochenende nichts probieren - würde lügen, wenn ich behaupten würde, dass ich Deinen Ausführungen im Moment folgen kann.

    Werde mich dann am WE nochmal dazu melden.

    Gruß - towi

  • Man könnte auch einen Queue Server wie zB Beanstalkd verwenden. Der wäre unabhängig vom Python Script beziehungsweise behält die Eingaben auch übergreifend wenn aber das Python Script zwischenzeitlich beendet wurde.... Weil "queue = Queue()" initialisiert ja jedes mal ein neues Queue.

    Man könnte aber auch beim Programmstart den aktuellen Status des GPIO's auslesen und sofort ins Queue einfügen. Dann muss nicht nach Programmstart erst ein Interrupt ausgelöst werden.

  • Hallo deets, hallo meigrafd,

    habe das mal in´s Script eingefügt - weis allerdings nicht, ob ich das richtig verstanden und demzufolge richtig umgesetzt habe( :s :(

    Wenn ich das Script starte erscheint leider folgende Meldung:

    Code
    pi@raspberrypi:~ $ sudo /test03.py
     File "/test03.py", line 27
       URL = "http://192.168.178.103/middleware.php/data/{}.json?value={}"
         ^
    SyntaxError: invalid syntax

    Vielleicht noch ne´n Tipp?

    Besten Dank - Gruß towi

  • Das Problem sind wiedermal fehlerhafte Einrückungen :fies:

    In der ISR Funktion steht nur die queue Zeile. Du hast aber URL und LOOKUP auch noch drin stehen, da ist zwar nur ein Leerzeichen davor aber vermutlich wertet Python das bereits aus eine ausreichende Einrückung um es der interrupt_Event zuzuordnen.
    Setz das einfach oberhalb der ISR Funktion.

    Die Module "httplib, urllib" brauchst du eigentlich auch nicht, werden ja auch nirgends verwendet.

  • Ja, du hast ja auch eine falsche Einrueckung. URL und LOOKUP duerfen nicht mit irgendwelchen Spaces davor definiert werden. Das sind absolute Python-Grundlagen, ein bisschen Tutorial kann da nicht schaden.

  • Hallo zusammen,

    habe es jetzt nochmal geändert(hatte ich leider übersehen - sorry):

    Jetzt kommt diese Meldung:

    Code
    pi@raspberrypi:~ $ sudo /test03.py
     File "/test03.py", line 30
       try:
         ^
    SyntaxError: invalid syntax

    Wollt Ihr mir vielleicht nochmal .... :danke_ATDE:

    Gruß towi

  • Du hast eine ) zu wenig in der ISR Funktion. Hat __deets__ aber auch schon fehlerhaft vorgegeben :fies:
    Evtl. war das schon die ganze Zeit das Problem - hab's auch erst gerade mit Syntax-Highlight entdeckt:

  • Hallo nochmal zusammen,

    das Script läuft - besten Dank nochmal für Eure Hilfe >>> :danke_ATDE: !!!

    Habe da noch ne´ Weile gelesen und an Hand dieser "Erkenntnisse" das jetzt so angepasst, da es noch Probleme mit dem queue(Modul) gab:

    Und so sieht´´s momentan über das VZ-Frondend aus:

    Jetzt muss ich nur noch auf PIGPIO umswitchen, da mit RPi.GPIO doch vereinzelt die Flanken nicht korrekt erkannt werden.

    ALSO - besten Dank nochmalig und Gruß - towi

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!