Zustand der GPIOs auf Website ausgeben

  • Guten Abend allerseits,


    ich stehe wieder mal an einem Punkt, an dem ich nicht weiter komme.


    Ich habe mir eine Website gebastelt (/var/www/index.html), auf der ich mittels Buttons die GPIOs schalten kann.
    Nun möchte ich, dass der Zustand der GPIOs (0 oder 1) beim Aufrufen dieser index.html ausgelesen wird und in Form eines Textes in einer Tabelle auf der Website ausgegeben wird.


    Gehen wir von einer kleinen Tabelle mit 3 Spalten und nur 1 Zeile aus, dann hätte ich in der ersten Zelle einen Button (AN), der den GPIO13 auf 0 setzt, in der zweiten Zelle einen Button "AUS", der den Wert auf 1 setzt und in der 3. Zelle soll der aktuelle Zustand des GPIOs in Textform stehen. Also "AN" oder "AUS".


    Dazu habe ich folgendes PHP-Script geschrieben und unter "/var/www/zustand.php" abgelegt:
    [code=php]<?php
    $zustand = trim(@shell_exec("cat /sys/class/gpio/gpio13/value"));
    $zustand==0 ? print "AN" :
    print "AUS";
    ?>[/php]


    Wenn ich "zustand.php" direkt über den Browser aufrufe funktioniert die Ausgabe auch einwandfrei.
    Wie aber binde ich die PHP-Datei in meine index.html ein, so dass in der 3. Zelle der Tabelle nur der Text (AN oder AUS) steht?


    Ich hoffe auch diesmal wieder auf Eure Unterstützung und sage schon mal Danke!


    MfG,
    JoPi

  • lass deine index.php als .php-Datei!
    Wenn dort drin PHP-Befehle genutzt werden (auch wenn es nur include oder require ist) sollte die Datei .php oder mindestens .phtml heißen! Du kannst deinem Webserver zwar beibringen das auch .html funktioniert, das ist aber übelster Stil! und sorgt für Verwirrung.
    Außerdem ist es ein Sicherheitsfeature, dass html-Dateien KEINE PHP-Befehle interpretieren.


    include würde funktionieren, alternativ kannst du den Code aber auch einfach ganz in die index.php schreiben, für 2 Zeilen braucht man keine extra Datei. Die 3. Zeile gehört hinter die 2.
    $zustand == 0 ? ...
    ist das gleiche wie
    $zustand ? ...


    daher kannst du das auch weglassen, übrig bleibt im Grunde nur noch;

    Code
    shell_exec("cat /sys/class/gpio/gpio13/value") ? print "AN" : print "AUS";


    oder sogar

    Code
    `cat /sys/class/gpio/gpio13/value` ? print "AN" : print "AUS";


    Dann komme ich gleich meigrafd zuvor die (zu Recht) zu sagen, dass shell_exec keine gute Idee ist, du solltest system(...) oder exec(...) verwenden.

  • hmm :denker:


    erstmal danke für die schnellen Antworten :thumbs1:


    Die index.html habe ich nun in index.php umbenannt. Ich hoffe das habe ich so richtig verstanden und dann die Varianten von Euch beiden probiert.


    bei der Variante von doing:
    ich habe folgenden Code in die 3. Zelle eingefügt:
    [code=php] <?php
    include 'zustand.php';
    echo "$zustand";
    ?>[/php]


    und die Ausgabe funktioniert fast wie gewünscht, nur dass statt "AN" und "AUS" leider "AN0" und "AUS1" ausgegeben wird.
    Wenn sich die 0 bzw. die 1 am Ende des Textes noch entfernen ließe, wäre das perfekt.


    bei der Variante von Horroreyes:
    habe ich stattdessen den Befehl direkt in die 3. Zelle geschrieben:
    [code=php]<?php
    shell_exec("cat /sys/class/gpio/gpio13/value") ? print "AN" : print "AUS";
    ?>[/php]
    bzw.
    [code=php]<?php
    `cat /sys/class/gpio/gpio13/value` ? print "AN" : print "AUS";
    ?>[/php]


    Hier wurde keine 0 oder 1 am Ende des Textes ausgegeben, allerdings in beiden Fällen nur "AN", egal ob der GPIO auf 0 oder 1 steht.


    Was habe ich falsch gemacht? Sorry, aber bin absoluter Leihe :helpnew:

  • http://www.forum-raspberrypi.d…slesen?pid=62468#pid62468
    http://www.forum-raspberrypi.d…rieren?pid=34791#pid34791


    [code=php]
    $pin = 13;


    if (file_exists("/sys/class/gpio/gpio".$pin."")) {
    $Direction = trim(file_get_contents("/sys/class/gpio/gpio".$pin."/direction"));
    $Value = trim(file_get_contents("/sys/class/gpio/gpio".$pin."/value"));
    echo "GPIO ".$pin.": ".$Value." ".$Direction."<br/>\n";
    } else {
    echo "GPIO ".$pin.": Not init!<br/>\n";
    }
    [/php]


    man sollte so viel wie irgend möglich nativ mit php machen, also auf shell befehle verzichten

  • lass bei Variante 1 das echo $zustand weg...
    print und echo ist quasi das selbe, du machst in der zustand.php schon print, gibst also den Text aus. Danach gibst du noch den Inhalt der Variable zustand aus, das ist überflüssig.


    Ich schätze mal bei meiner Variante kann man das trim doch nicht ganz weglassen oder es kommt ein String zurück, dann wäre das == 0 doch nicht sinnlos, wenn auch nicht schön gelöst.

  • Genial! Ohne "echo" passt es!


    besten Dank allen! :danke_ATDE: