GPIO Status abfragen ohne zu schalten

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hallo zusammen,

    ich habe ein Problem in meinem Code festgestellt. Ich habe ein Script, welches automatisch 4 GPIOs ein und aus schaltet. Damit ich später sehen kann, wie oft und wie lange die jeweiligen Ports geschaltet waren, wollte ich ein Python Script in die Crontab legen, welches jede Minute die Statuswerte der 4 Ports abfragt und dann eine 0 oder 1 in eine DB schreibt. Das könnte ich dann grafisch darstellen - alles kein Thema! ABER:

    Mein Script in der Crontab sieht in etwa so aus (für 3 Ports, 4. noch unbenutzt):

    Leider schaltet das o.g. Script dann auch immer fleißig alle eingeschalteten Port wieder aus. Kann ich nicht den Status abfragen, ohne seinen Wert zu ändern?

    VG, Dio

    ---------------
    Aktuelles Projekt: Steuerung einer Heizungsanlage und eines Reifeschranks für Salami und Schinken mit dem Raspberry Pi, diversen Sensoren und Relais Boards.

  • Hallo Dio,

    ein GPIO-Port ist dann HIGH, wenn Du ihn auf HIGH setzt. Das gleiche gilt für LOW.

    Es ist nicht erforderlich, dass ein anderes Programm diese Ports ausliest. Und somit die Richtung ändert. Denn ein auf Eingang geschalteter Port zeigt den Wert, der aufgrund physikalischer Gegegebenheiten (Schaltung, Antennenfunktion, ...) gerade dort vorhanden ist.

    Ggf. mit verheerendem Einfluss auf Deine eigentliche Anwendung, die bislang schreibenden Einfluss ausübte.

    Das Einfachste ist, wenn Deine schreibende Anwendung den entsprechenden Status selber setzt - oder die andere Anwendung die entsprechenden sysfs-Dateien ausliest, die seitens GPIO-Vorgängen automatisch aktualisiert werden.

    Möglicherweise kannst Du aber auch durch Wahl einer anderen GPIO-Library die Dich interessierenden Informationen auslesen. Aber nur weil es geht, muss es nicht sinnvoll sein. Denn die schreibende Anwendung gibt das Ergebnis vor - die lesende Anwendung kann nichts anderes erhalten.

    Da Du nicht im Python-Subforum postest: Bist Du auf Python als Programmiersprache festgelegt? In anderen Programmiersprachen ließe sich da sicherlich was programmieren, was die üblichen Hemmnisse umgeht.

    (Das bringt mich doch auf eine Idee...).


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    3 Mal editiert, zuletzt von Andreas (6. Januar 2018 um 12:31)

  • Danke. Das leuchtet ein. Um den Verlauf (an/aus) grafisch darzustellen fiel mir nur die Lösung ein, kontinuierlich Nullen oder Einsen in die DB zu schreiben und das dann auszugeben als Plot.

    Hast Du denn einen anderen Vorschlag, wie ich das lösen könnte? Natürlich kann mein Script, welches den GPIO Port auf High oder Low setzt auch etwas in die DB schreiben, aber das lässt sich dann aufgrund zu weniger Werte (z.B. morgens LOW, abends HIGH) mit meiner Methode nicht grafisch darstellen... Daher wollte ich ja kontinuierlich, z.B. 1 x pro Minute, die Werte erfassen...

    Ich verstehe zwar deinen Post oben, aber ich kann daraus keine Lösung ableiten.

    ---------------
    Aktuelles Projekt: Steuerung einer Heizungsanlage und eines Reifeschranks für Salami und Schinken mit dem Raspberry Pi, diversen Sensoren und Relais Boards.

  • Greifen mehrere Programme auf die gleiche Ports zu?

    Port wird eingeschaltet 00:00 schreibe dann 1 in DB bei T 0 "merke zustand 1"

    3 Min später von X, Port wird ausgeschaltet also 00:03, von 00:03 - 00:00 T = 2 also trage T0 -> T2 die werte 1 ein. "Zustand ist 0"

    10 Min später von X, Port wird wieder eingeschaltet, also 00:10 (00:10 - 00:03) = T 6 - T2 also trage die letzten 4 Zeiteinheiten den wert 0 ein, "Zustand ist 1"

    So könntest du dir in ruhe deinen ganzen Datenbank mit Inhalt füllen

  • Hallo Dio,

    Ich verstehe zwar deinen Post oben, aber ich kann daraus keine Lösung ableiten.

    Mein Vorschlag: Lasse Deine Anwendung, die täglich einmal auf HIGH und auf LOW schaltet, wie sie ist.

    Eine zweite Anwendung - in Icon propgrmmiert - sähe dann so aus:

    Dieses Programm liest den Status zweier GPIO-Pins aus - ohne den GPIO-Status zu ändern und ohne eine andere Anwendung zu stören. Und zeichnet zwei Kurven. Die eine in blau für den einen GPIO-Pin und in grün für die anderen. Jede Minute wird ein neuer Messwert gezeichnet.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Hi,

    Um den Verlauf (an/aus) grafisch darzustellen fiel mir nur die Lösung ein, kontinuierlich Nullen oder Einsen in die DB zu schreiben und das dann auszugeben als Plot.

    genau das würde ich nicht machen.

    Du solltest nur "Status-Wechsel" abspeichern, entweder aus der/den Anwendung(en) die schalten (am einfachsten, weil die wissen, ob sie schalten) oder eben detektierte.

    Das wird geringfügig schwieriger, da dann vorher der letzte Status ausgelesen werden muss. Aber das ist auch per Procedure oder Trigger in MySQL/MariaDB lösbar.

    Die Auswertung ist dann ein anders Thema.

    Knut

  • Es handelt sich um ein Script, welches die GPIO Pins je nach Status eines Sensors (z.B. Luftfeuchtigkeit) ein oder ausschaltet. Im Prinzip nur ein Programm / Script.

    In PHP habe ich sowas ganz leicht umgesetzt:

    $Anzeige = exec('gpio read 5');

    Damit kann ich einfach beliebig den Status abfragen, OHNE seinen Status zu verändern. Gibt es das nicht auch in Python?

    ---------------
    Aktuelles Projekt: Steuerung einer Heizungsanlage und eines Reifeschranks für Salami und Schinken mit dem Raspberry Pi, diversen Sensoren und Relais Boards.

  • Seh ich genauso.

    Bei der auswertung könntest du dann aber die fehlende Werte ergänzen, oder so wie Andreas geschrieben hat, direkt grafisch darstellen


    Noch einen Nachtrag,

    habe grad im Internet nachrecherchiert und fand einen Beitrag bzw einen Beispiel. Wodrin auch der ausgang nochmals nachgeschaut wurde ob der eingeschaltet ist oder nicht.

    In dein Steuersoftware ist das als Ausgang deklariert der Port?? In dieser Script deklarierst du es als eingang.

    In den beispiel script wird das als ausgang deklariert und dann wird darüber die Status abgefragt.

    Code
    Status eines Ausgangs abfragen 
    
    Auf der Website: https://indibit.de/raspberry-pi-gpio-ausgaenge-schalten-eingaenge-lesen/
    
    Letzter eintrag

    Einmal editiert, zuletzt von HuskyTeufel (6. Januar 2018 um 12:58)

  • Na super. bereits 11 Beiträge und ein Icon Programm - nur gesucht hat wohl noch keiner. Natürlich geht das mit Python auch, das Problem ist nur: mit GPIO.setup setzt du den entsprechenden GPIO zurück. Du kannst den Status auch mit GPIO.input(n) auslesen, wenn der GPIO n mit GPIO.setup(n, GPIO.OUT) initialisiert wurde. Siehe https://raspberrypi.stackexchange.com/a/13655/53826

    $Anzeige = exec('gpio read 5');

    Das geht ebenfalls in Python, nur schöner als exec in PHP. Jetzt aber bitte nicht ans builtin exec oder os.system denken, schau dir einfach mal das subprocess Modul an. Oder du nimmst direkt die Datei im von Andreas angesprochenen sysfs und öffnest und liest diese aus.

  • Wenn du unbedingt PHP verwenden willst dann nimm bitte Abstand von exec(); sondern nutze angesprochenes sysfs:

    PHP
    echo pinValue('17');
    
    function pinValue($pin) {
        $Value='';
        if (file_exists('/sys/class/gpio/gpio'.$pin)) {
            $Value = trim(file_get_contents('/sys/class/gpio/gpio'.$pin.'/value'));
        }
        return $Value;
    }

    Sofern ich dein Anliegen richtig verstanden habe wärst du aber mit folgendem besser bedient: https://github.com/larsks/gpio-watch

    Damit ist es möglich bestimmte GPIO's zu überwachen und bei Flankenwechsel ein Script auszuführen...

    Installation:

    Code
    sudo apt-get update
    sudo apt-get install git-core
    cd /usr/src
    sudo git clone https://github.com/larsks/gpio-watch
    cd gpio-watch
    sudo make
    sudo make install

    Anwendung:

    Angenommen du möchtest die GPIO's 22, 23 und 24 überwachen und sofern sich der Status ändert ein Script ausführen... Dann musst du für jeden GPIO ein Script in einem bestimmten Verzeichnis anlegen:

    Code
    mkdir -p /home/pi/gpio-scripts/

    ...da du nicht unterschiedliche Aktionen durchführen willst, legen wir nur ein Script an und erzeugen für alle GPIO's nur einen Symlink (Verknüpfung):

    Code
    cd /home/pi/gpio-scripts/
    ln -s main.sh 22
    ln -s main.sh 23
    ln -s main.sh 24

    nano main.sh

    Bash
    #!/bin/bash
    PIN=$1
    VALUE=$2
    mysql -u root -pz -e "USE datenbank; INSERT INTO Tabelle (GPIO, Status) VALUES ($PIN, $VALUE);"
    exit 0

    chmod +x main.sh

    gpio-watch testweise starten: gpio-watch -v -s /home/pi/gpio-scripts -e both 22 23 24

    Wenn das wie gewünscht funktioniert die Befehlszeile am besten in /etc/rc.local wie folgt eintragen:

    Code
    gpio-watch -s /home/pi/gpio-scripts -e both 22 23 24 &
    
    exit 0

    Wichtig ist dass der gpio-watch Befehl als erstes ausgeführt wird, erst danach das Script zum initialisieren und schalten.

Jetzt mitmachen!

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