PHP/HTML und GPIO-Ausgabe

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 zusammen,


    ich habe einen PI3 und damit schon Kleinigkeiten gemacht. Ich habe mit Python ein kleines Webradio gebaut und auch schon mit den GPIO-Ausgängen "Gespielt" (Taste drücken > LED an/aus, LED blinken usw.) Eigentlich komme ich aber aus der Webprogrammierung mit php/html.


    Ich habe eine Art "Bedienungsanleitung" mit php erstellt. Also eigentlich eine Internetseite, die jeweils ein Foto und eine Beschreibung enthält und einen Vor- und Zurück-Button enthält.

    Jede Internetseite (1.php, 2.php, 3.php usw.) ist ein Bedien-Schritt und mit den Vor/Zurück Buttons kann man man die Schritte vor und zurück blättern.

    Diese Internetseite läuft momentan auf einem Webserver und funktioniert auch ganz gut.


    Nun würde ich gerne die Internetseite auf dem Raspberry darstellen. Das sollte ich auch hinbekommen.


    Jetzt wird es interessant: Ich würde die Anzeige der Internetseiten gerne mit den GPIO-Ausgängen koppeln.

    Sprich: Wenn sich jemand auf der Seite 5.php befindet, soll die LED 5 leuchten. Wenn dann jemand auf die Seite 4.php zurückblättert, soll die LED 5 ausgehen und die LED 4 angehen usw.


    Kann mir jemand beschreiben, wie ich das hinbekomme bzw. wie ich damit anfange?


    Über einen Tipp würde ich mich sehr freuen.


    Vielen Dank und viele Grüße

    fap


    [OT] Bitte ggfls. in den richtigen Forenteil verschieben, ich wusste nicht wo dieser Thread hingehört... [/OT]

  • Über die Webseite solches zu machen, kann man auf verschiedene Art realisieren.

    Die unsauberste aber einfachste Methode ist das direkte Aufrufen des Programms, welches die GPIO-Schaltung vornehmen soll, durch den direkten Aufruft aus dem PHP-Skript.

    Die Gefahr hier ist, dass das PHP-Skript mit den Rechten laufen muss, um dieses Programm zu starten, und wenn man Fehler gemacht hat oder es ein Loch im PHP gibt, können dann ganz andere Sachen gemacht werden.

    Ja, ich weiß, "man macht keine Fehler" ;)


    Das andere wäre, für jeden Fall eine Art Flag zu setzten, welches von einem anderen Programm ausgelesen wird und dann diese Schaltung übernimmt.

    Hier würde das PHP eben nur dieses Flag setzte, und das Skript, welches schaltet, das Flag auslesen, wenn es den passenden Wert hat, und schalten.


    Als Flag könnte man eine Datei nehmen, die eine definierten Namen hat, oder auch einen Datenbank- Eintrag mit einem bestimmten Wert (SQLite oder so reicht dafür vollkommen aus)


    Man sollte, überhaupt nicht mit dem ersten anfangen..... (meine ich) ;)

    Computer ..... grrrrrr

  • Rasp-Berlin: Vielen Dank ür deine schnelle Antwort!


    Meinst du dieses als schlechtes Beispiel?


    Das wäre ja fast zu einfach:

    Mit PHP direkt ist das IMHO nicht möglich, wobei ich mir in Verbindung mit PIGPIO nicht sicher bin. Du wirst ein Skript anschubsen müssen, z.B.:

    PHP
    <?php
    
    $output = shell_exec("/Pfad/zum/Skript.py <ggf. Argumente>");
    
    // evtl. die Ausgabe anzeigen lassen
    echo $output;
    
    ?>


    Viele Grüße

    fap

  • Meinst du dieses als schlechtes Beispiel?

    Das ist absolut schlecht, um nicht zu sagen gefährlich!


    Das wo Du mich zitiert hast kann man nehmen, aber da besteht ein gewisses kleines Restrisiko, dass Du den Webserver irgendwann mal online stellen könntest und verkonfiguriert hast.


    Eine Datei oder DB, in der mit PHP ein Flag gesetzt und von einem Skript ausgelesen wird, wäre zumindest die sicherste, wenn auch umständlichste Variante.

  • Vielen Dank hyle!


    Beim ersten schlechten Beispiel habe ich mit dem Wissen aus #2 schon beim Lesen Bauchschmerzen bekommen...


    Ich denke mit deinem Post kann ich Sache erstmal angehen.

    Online wird das nie gehen, das ganze wird fest eingebaut.


    Jetzt muss ich nur herausbekommen wie ich den Webserver und den Browser im Kiosk-Modus beim Booten automatisch mitstarte.

    Aber ich denke das werde ich mit der Forumssuche herausbekommen.


    Vielen Dank euch nochmal! :)


    Beste Grüße

    fap

    Edited 2 times, last by fap ().

  • Mit meinem Beispiel muss der Webserver, also der User www-data, in der Gruppe gpio sein, sonst funktioniert das so nicht

    Okay, Danke für den Hinweis! Das hätte wieder zu Kopfzerbrechen geführt... :)


    Wie weise ich denn den Server-User einer Gruppe zu?

  • Siehe u.a. hier: https://wiki.ubuntuusers.de/Be…iteren-Gruppe-hinzufuegen also

    Code
    sudo usermod -aG gpio www-data

    Damit darf der Webserver die GPIO verwenden. Das ist 1000mal ungefährlicher als ihm root-Rechte zu verleihen, um das ganze nochmals zu erklären und auf das erwähnte Restrisiko hinzuweisen.

  • Hallo zusammen,


    erstmal vielen Dank für eure Tipps!


    Leider funktioniert das noch nicht.


    Ich habe apache und php installiert, das funktioniert auch.


    im Ordner /var/www/html habe ich per sudo nano "led1.py" eine python-Datei mit folgendem Inhalt angelegt:

    Python: led1.py
    from gpiozero import LED
    from time import sleep
    
    led = LED(17)
    
    led.on()
    
    sleep(2)
    
    led.off()


    Dann habe ich der sudo nano "test.php" mit fogenden Inhalt angelegt:



    Dann habe ich wie beschrieben, den User mit sudo usermod -aG gpio www-data geändert.


    Ich erhalte beim Aufruf von http://raspberrypi/test.phpleider nur die Ausgabe Hallo Test.


    Beide Scripte liegen im gleichen Verzeichnis. Auch ein Backslash vor "led1py" im php-Script hat nichts gebracht.


    Ich habe auch einen apache2 Restart mit sudo systemctl restart apache2 versucht, hilft aber auch nichts.


    Ich bin als User pi angemeldet und kann im Verzeichnis /var/www/html" auch nichts über das "normale" Fenster ändern, sondern nur per sudo über die Kommandozeile. Vielleicht passt etwas mit den Benutzerrechten nicht?


    Vielen Dank und viele Grüße

    fap

  • habe ich per sudo nano "led1.py" eine python-Datei mit folgendem Inhalt angelegt

    Damit gehört das Python-Skript root und nicht www-data. sudo chown www-data:www-data /Pfad/zu/led1.py


    Im Python-Skript fehlt auch noch ein Shebang in der ersten Zeile (#!/usr/bin/env python3) und ausführbar ist es auch noch nicht... ODER aber im PHP-Skript fehlt der Interpreter vor dem Python-Skript. Im PHP-Skript macht auch der absolute Pfad zum Python-Skript sinn.

  • Hallo zusammen,

    vielen Dank für eure Antworten!


    Müsste es dann nicht heißen sudo chown root:www-data /var/www/html/led1.py?


    Shebang #!/usr/bin/env python3 habe ich in led1.py eingefügt.


    Das Script ist mit Geany ausführbar, daher dachte ich es ist auch per php ausführbar zu machen.


    Im php-Script habe ich auch den absoluten Pfad $output = shell_exec("/var/www/html/led1.py"); eingetragen.


    Aber leider funktioniert es immer noch nicht.


    Vielen Dank bisher und viele Grüße

    fap

  • Müsste es dann nicht heißen sudo chown root:www-data /var/www/html/led1.py?

    Naja, das vor dem Doppelpunkt ist der "neue" User und das nach dem Doppelpunkt die "neue" Gruppe.


    Das Script ist mit Geany ausführbar, daher dachte ich es ist auch per php ausführbar zu machen.

    Äpfel und Birnen, aber das siehst Du in der Ausgabe von ls /var/www/html/led1.py.


    Im php-Script habe ich auch den absoluten Pfad $output = shell_exec("/var/www/html/led1.py"); eingetragen.

    Ändere das mal in $output = shell_exec("python3 /var/www/html/led1.py");

  • Den hast Du offenbar selber nicht gelesen oder schon wieder vergessen. Soll ich Dich zitieren, was Du dort geschrieben hast?

    Du meinst also, eine Datei im Document-root als Root zu erstellen, ist eine 'erlaubte' Nutzung von 'sudo'

    Damit gehört das Python-Skript root und nicht www-data. sudo chown www-data:www-data /Pfad/zu/led1.py

    Wenn ich mir so deine Kommentar, mit meinem Zitat davon eins höher so betrachte, hast du genau das beschrieben, was ich in meinem gesamten Beitrag immer wieder kritisieren:

    Die Nutznug von 'sudo' ohne überhaupt zu wissen, was man damit macht


    Und lustigerweise wird es vor die auf eine Art und Weise kritisiert, die es den Leuten, die diesen Fehler machen, nicht klar macht, was sie falsch machen.

    Wie ist es, ist es dir auch nicht wirklich klar, dass man im normalen 'leben' auf einem Linux-System 'sudo' nie braucht?

    Computer ..... grrrrrr

  • Du meinst also, eine Datei im Document-root als Root zu erstellen, ist eine 'erlaubte' Nutzung von 'sudo'

    Zwar nicht so wie der TO, aber ja, das ist absolut legitim! Richtiger wäre hier z.B. sudo -u www-data nano /Pfad/zu/led1.py zu verwenden und zwar egal ob als Hauptuser oder als root selber. Wie würdest Du denn dort eine Datei erstellen?


    Auf den Rest gehe ich mal besser nicht ein.

  • Hallo hyle: Vielen Dank, es klappt!


    Für die Nachwelt:


    Ein echo auf die Variable $output bekomme ich zwar nicht, ist in meinem Fall auch nicht notwendig.



    Wenn mir jetzt noch jemand verraten könnte, wie ich mit meinem user "pi" mit dem Editor (und nicht in der Kommandozeile) im Ordner /var/www/html arbeiten kann, wäre das wirklich super.


    Vielen Dank und viele Grüße

    fap

  • Wenn mir jetzt noch jemand verraten könnte, wie ich mit meinem user "pi" mit dem Editor (und nicht in der Kommandozeile) im Ordner /var/www/html arbeiten kann, wäre das wirklich super

    Du erstellst in /var/www/html/ ein Verzeichnis, von mir aus namens hyle. ^^ Dieses Verzeichnis gibst Du per chown dem User pi. chown hatten wir ja oben in #10 schon. Darein kannst Du Deine Dateien als User pi und einem Editor Deiner Wahl erstellen.

    Wenn Du fertig bist, dann kannst Du diese Dateien entweder nach /var/www/html verschieben oder Du lässt die dort und änderst den Owner von hyle rekursiv von pi in www-data. Siehe dazu u.a. hier: https://wiki.ubuntuusers.de/chown/

  • Wenn mir jetzt noch jemand verraten könnte, wie ich mit meinem user "pi" mit dem Editor (und nicht in der Kommandozeile) im Ordner /var/www/html arbeiten kann, wäre das wirklich super.


    Du könntest den User pi in die Gruppe www-data packen. Die Hauptgruppe wird nicht verändert.


    Code
    sudo usermod -a -G www-data pi

    Dann am besten einmal neu einloggen.

    Mit dem Befehl id kannst du dann kontrollieren, ob der user pi auch in der Gruppe www-data ist.



    Nachdem du mit dem user pi Dateien in /var/www/html erstellt hast, musst du den erstellten Dateien die Gruppe und Berechtigungen zuweisen:

    Code
    # hier Absichtlich kein sudo !!!
    
    find /var/www/html -type d -user pi -print0 | xargs -0 chmod 750
    find /var/www/html -type f -user pi -print0 | xargs -0 chmod 640
    find /var/www/html -user pi -print0 | xargs -0 chgrp www-data

    Berechtigungen der Gruppe für Verzeichnisse: Ausführen, Lesen

    Berechtigungen der Gruppe für Dateien: Lesen

    Benutzer: pi

    Gruppe: www-data


    In dieser Konfiguration kann der user pi dem Webserver Dateien in /var/www/html ablegen und diese dann durch Ändern der Berechtigungen dem Webserver zur Verfügung zustellen. Der Webserver kann aufgrund der gesetzten Berechtigungen die Dateien nicht verändern, auch der PHP-Interpreter nicht.


    Wenn bereits erstellte Dateien verändert werden, so bleibt die gesetzte Gruppenzugehörigkeit und die Berechtigungen erhalten.


    Man könnte dann noch einen Schritt weitergehen und anstatt im PHP-Script Shell-Befehle abzusetzen, einen asynchronen Unix Domain Socket Server aufsetzen.



    Benötigt wird: rich gpiozero und RPi.GPIO (oder ein anderes Backend, dass durch gpiozero unterstützt wird)

  • Hallo zusammen,


    ich muss mich leider nochmal melden.


    Das script funktioniert eigentlich super. Ich rufe die php-Seite auf und das Script wird gestartet.


    Leider lädt die php-Seite so lange bis das py-Script durchgelaufen ist.

    Die Ladezeit der php-Seite ändert sich auch nicht wenn ich die Zeile $output = shell_exec("python3 /var/www/html/led1.py"); nach ganz unten setze.


    Auch habe ich noch ein Problem mit meinem python-Script. Die LED soll eingeschaltet werden, aber nicht wieder ausgeschaltet werden. Dies übernimmt ein anderes Script.


    Zur Erklärung: Ich möchte eine Art "elektronische Bedienungsanleitung" mit PHP erstellen. Die PHP-Seiten haben Vor und Zurück-Buttons.

    Wenn eine Seite aufgerufen wird, soll die dazugehörige LED eingeschaltet werden. Wenn man eine andere Seite aufruft (=vor oder zurück blättert), soll die Led ausgeschaltet werden und die LED der entsprechenden Seite eingeschaltet werden.


    Es gibt 4 PHP-Seiten 1.php, 2.php, 3.php, 4.php und 5.php.

    Die Seite 1.php startet led1.py, die Seite 2.php startet led2.py usw.


    Beim Aufruf von 1.py soll die LED1 eingeschaltet werden und die LED's 2,3 und 4 ausgeschaltet werden. Die LED 1 soll so lange eingeschaltet werden, bis sie von einem anderen Script wieder ausgeschaltet wird. Die LED 1 blitzt aber leider nur ganz kurz auf. Um die LED1 anzubehalten, habe ich das bisher stumpf mit einem ellenlagen sleep(999999) gemacht, aber dadurch läd die php-Seite natürlich ewig.



    Die Seite php2 soll nun das Script led2.py starten, die wiederum alle LEd ausschaltet und die LED 2 einschaltet und dauerhaft leuchten lässt, so lange wie sie von einem anderen Script ausgeschaltet wird.


    Meine Frage ist nun: Kann man die php-Seite und das py-Script parallel laufen lassen? Und wie schaffe ich es die LEd so lange eingeschaltet zu lassen, bis sie von einem anderen Script wieder ausgeschaltet wird?


    Vielen Dank und viele Grüße

    fap