GPIO am RasPi/GUI ein-/ausschalten - bitte um Hilfe

disconnected

New member
Aufgabe :
Mein alter Raspberry Pi
Model B Rev 2 mit Raspian GNU/Linux 11 (bullseye) auf 8 GBµSD
soll im Heimnetz einen Kontakt (Relais) von "irgendwoher" ein- bzw. ausschalten. Sprich: schalten im Homenet von "draussen" übers www.

Die (Test-)LED von GPIO-17 nach GND (mit Vorschaltwiderstand 4k7) lässt sich mit Pigpio ein- und ausschalten. Pigpio wurde installiert nach https://www.elektronik-kompendium.de/sites/raspberry-pi/2202121.htm.

Mit dem RasPi im Homenet funktioniert das über ein Terminal: das RasPi-Kommandozeilen-Termimal, mit PuTTY vom heimischen Desktop (im Homenetz) und vom Mobilphone mit ConnectBot. Die Kommandos sind jeweils - ohne sonstige Erweiterung! - zum Einschalten "pigs w 17 1" und zum Ausschalten " pigs w 17 0". Die Initialisierung erfolgt schon in der Startsequenz des RasPi - muss also nach einem Kaltboot nicht mehr gemacht werden.

ABER
das eigentliche Ziel, den GPIO-Ausgang von einer Website aus zu schalten wird nicht erreicht.
Fast alle Tutorials nützen nicht, die benutzen das alte wiringPi, das aber nicht mehr online verfügbar ist.

Mein Problem.
Ich bin nicht in der Lage die Schalterei mit dem minimalistischen Webserver zu erledigen. Der sieht, rein optisch, schon recht passabel aus - aber die genannten Schaltvorgänge per Terminal sind über die Website nicht auszulösen. Den Fehler kann ich nicht finden, bitte um Hilfe

Code:

- - - - - - - - - - - - - - - - - - - - - - -
<html>
<head>
<meta name=viewport" content="width=device-width"/>
<title>GPIO (PHP) schalten</title>

</head>
<body>
<span style="font-family:'Helvetica';font-size:64">PVA II schalten</span>
<form method="get" aktion="gpio.php">
<input type="submit" style="color:red;font-size:194" value=" ( 0 ) " name="17 (0)">
<input type="submit" style="color:green;font-size:194" value=" ( I ) " name="17 (I)">
</form>

<?php
if(isset($_GET['Lichtein'])){
$modeon17 = trim(@shell_exec("/usr/local/bin/pigs w 17 1"))
echo "GPIO17 an";
}
else if(isset($_GET['Lichtaus'])){
$modeon17 = trim(@shell_exec("/usr/local/bin/pigs w 17 0"))
echo "GPIO17 aus";
}
?>
in_66-6 h.194 <!-- Versionskennung nur zu Testzwecken -->
</body>
</html>
- - - - - - - - - - - - - - - - - - - - - - -

Hätte da jemand bitte ne Erklärung was in dem Code falsch ist? Evt. auch warum?
Danke im Voraus
 

Anhänge

  • Screendump-GPIO-x01.JPG
    Screendump-GPIO-x01.JPG
    103,9 KB · Aufrufe: 7
Zuletzt bearbeitet von einem Moderator:
Was sagen denn die Webserver-Logs dazu? Da sollte ja (theoretisch) auch etwas dazu stehen.
 
@disconnected

Bitte die Ausgaben des Logs hier im Forum als Zitat oder Codeblock einfügen.
Es will nicht jeder eine externe Seite aufrufen um mögliche Hilfestellung anbieten zu können.

Vielen Dank für Dein Verständnis.
 
Unter welchem User läuft denn der Webserver? Darf dieser überhaupt den o.g. Befehl ausführen?
 
@Progof: mach ich gerne. Allerdings ist der Log etwas groß: 110 Zeilen, knapp 12000 Zeichen.

@blurrrr
Es gibt nur einen User - der wurde schon beim Aufspielen des OS eingestellt:
Host pHost3 , Benutzer pi3 PassW ???.
Und die Berechtigungen hatte ich bei der gestrigen Sitzung (siehe Protokoll) eingestellt :
Code:
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  8.  5.  2022    12:56    PC/PuTTY> pigs w 17 1 [14:58-RET] sudo chown pi3.pi3 -R /var/www/          - 13:00
  8.  5.  2022    12:52    PC/PuTTY> sudo reboot -h 0
  8.  5.  2022    12:07    PC/PuTTY> sudo apt update && sudo apt upgrade -y                       - 12:37
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.. und hoffe dass das so richtig ist.
 
Mach mal irgendwas in Richtung "ps aux|grep apache2", da sollte irgendwas von www-data oder so stehen.
 
Danke für die Hinweise.
Nach meinem Post oben hatte ich noch versucht (sorry für meine Neigung zur experimentellen Rechnerbedienung)
Code:
pi3@pHost3:~ $ sudo chown pi3.pi3 -R /usr/bin/
sudo: /usr/bin/sudo muss dem Benutzer mit UID 0 geh¦ren und das ¦setuid¦-Bit gesetzt haben

.. und danach leider für den User UID 0 Rechte angelegt. Die Aktion kann ich nicht mehr nachvollziehen, weil der Raspi anschließend nicht mehr funktionierte. Anschließender reboot - danach wurden keine Eingaben mehr akzeptiert.

Heute Neuinstallation (ne 32GB-SDKarte, die scheint schneller zu sein) und blurrrrs Rat von Mo, 21:26 befolgt.

Code:
pi6@pHo32:~ $ ps aux|grep apache2
root       395  0.0  0.3 191444   548 ?        Ss   14:46   0:02 /usr/sbin/apache2 -k start
www-data   399  0.0  1.4 191544  2676 ?        S    14:46   0:00 /usr/sbin/apache2 -k start
www-data   400  0.0  1.5 191544  2808 ?        S    14:46   0:00 /usr/sbin/apache2 -k start
www-data   401  0.0  1.6 191544  2892 ?        S    14:46   0:00 /usr/sbin/apache2 -k start
www-data   402  0.0  1.5 191544  2880 ?        S    14:46   0:00 /usr/sbin/apache2 -k start
www-data   403  0.0  1.6 191544  2892 ?        S    14:46   0:00 /usr/sbin/apache2 -k start
www-data  1675  0.0  1.1 191476  2060 ?        S    16:10   0:00 /usr/sbin/apache2 -k start
pi6       1920  0.0  1.0   3520  1920 pts/1    S+   16:41   0:00 grep --color=auto apache2
pi6@pHo32:~ $

Den Benutzer "/usr/bin/ hatte ich aber schon verwendet - ohne Erfolg:
Code:
<html>
<head>
<meta name=viewport" content="width=device-width"/>
<title>GPIO (PHP) schalten</title>

</head>
    <body>
    <span style="font-family:'Helvetica';font-size:64">PVA II schalten</span>
    <form method="get" aktion="gpio.php">
        <input type="submit" style="color:red;font-size:194"   value="  ( 0 )  " name="17 (0)">
        <input type="submit" style="color:green;font-size:194" value="  ( I )  " name="17 (I)">
    </form>

    <?php
    if(isset($_GET['Lichtein'])){
        $modeon17 = trim(@shell_exec("/usr/bin/pigs w 17 1"))
        echo "GPIO17 an";
    }
    else if(isset($_GET['Lichtaus'])){
        $modeon17 = trim(@shell_exec("/usr/bin/pigs w 17 0"))
        echo "GPIO17 aus";
    }
    ?>
        in_66-6 h.194        <!-- Versionskennung nur zu Testzwecken  -->
    </body>
</html>

Bemerkenswert ist (für mich): in der Adresszeile des Browsers ändert sich - je nach Schalterklick auf (I) oder (0) der Text von
http://192.168.178.30/?17+(I)=++(+I+)++auf
http://192.168.178.30/?17+(0)=++(+0+)++
Danke für Eure Hilfen/Ratschläge
 
Den Benutzer "/usr/bin/ hatte ich aber schon verwendet - ohne Erfolg:

??? Das ist ein Pfad, aber kein User!
Wenn Du als Usernamen "bin" genommen hast, dann kann es nicht gehen.
Du musst dem Benutzer, den der Apache benutzt, die entprechenden Rechte geben.

Gruss

Edit: Auf meinen Pi ist der Default-User für den Indianer "www-data", zu finden in
Code:
/etc/apache2/envvars
.
 
Erstmal folgendes auf der Shell:
Damit wechselst Du zum User www-data. Unter diesem versuchst Du dann mal Deinen gewünschten Befehl auszuführen. Klappt das nicht, fehlen ihm die Rechte.... Könnte ggf. wie folgt gelöst werden (aber bitte erst obiges ausprobieren, klappt das, hat sich unteres von selbst erledigt)...:

Wieder auf der Shell:
und dann eintragen:
www-data ALL=NOPASSWD: /usr/local/bin/pigs, usr/bin/php
Danach musst Du Deinen Code noch anpassen:
$modeon17 = trim(@shell_exec("sudo /usr/local/bin/pigs w 17 1"))
 
Vielen Dank für Eure Bemühungen.

@FSC830
Danke für Deinen Ratschlag. Aus dem Listung nach Eingabe von
Code:
/etc/apache2/envvars
hatte ich
Code:
export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data
als User rausgelesen. Sicher war ich mir nicht und wollte mich nicht wieder aus dem RasPi auskoppeln ... zumal ich nicht weiß wie ich für diesen User ne Berechtigung vergebe. Ich kenne leider nur die Form "sudo chown pi6.pi6 -R /var/www/" - und wohin da das www-data kommt - ach dooof, weiß ich nicht :-/

@blurrrr
Danke für die ausführliche Beschreibung. Unter PuTTY konnte die GPIO17 mit "www-data@pHo32:/home/pi6$ pigs w 17 1" ein- und ausgeschaltet werden. Das alte Script funktionierte trotzdem nicht. Daher also doch die weitere Anleitung ausgeführt.

Beim Eintrag (nach "sudo visudo") als letzen Eintrag des vorhandenen Files
Code:
www-data ALL=NOPASSWD: /usr/local/bin/pigs, usr/bin/php
bekam ich beim Schließen ne Warnung:
Code:
pi6@pHo32:~ $ sudo visudo
/etc/sudoers:31:45: Syntax-Fehler
www-data ALL=NOPASSWD: /usr/local/bin/pigs, usr/bin/php
                                           ^~~~~~~~~~~
Ende natürlich mit "Q", war ja im Posting ohne Slash.

Anschließend das "alte" Script umgeschrieben auf
Code:
$modeon17 = trim(@shell_exec("sudo /usr/local/bin/pigs w 17 1"))
- und das Script lief noch immer nicht. Jetzt bei "sudo visudo" mit Slash anfangs "/usr/bin/php". Egal, das Script läuft noch immer nicht.

Sorry dass ich trotz Eurer ausführlichen Anleitungen keinen Erfolg hatte. Jedenfalls danke für Eure Mühe.
 
Unter PuTTY konnte die GPIO17 mit "www-data@pHo32:/home/pi6$ pigs w 17 1" ein- und ausgeschaltet werden. Das alte Script funktionierte trotzdem nicht. Daher also doch die weitere Anleitung ausgeführt.
Dann mach die visudo-Geschichte wieder rückgängig. Wenn www-data das ausführen kann, ist alles in Ordnung, da brauchst Du den sudo-Eintrag nicht.
Code:
www-data ALL=NOPASSWD: /usr/local/bin/pigs, usr/bin/php
^~~~~~~~~~~

Ende natürlich mit "Q", war ja im Posting ohne Slash.
"/usr/bin/php", sorry, aber wie gesagt, wenn es mit www-data sowieso geht, ist die Geschichte via visudo unsinnig.
 
Was kriegst Du denn als Ausgabe, wenn Du erst wie "su - www-data" zum Apache-User wechselst und dann Dein Script in der Shell aufrufst (php script.php)?
 
@disconnected - wenn Du das Script genau so verwendest wie im Startpost geschrieben, dann kann das nicht funktionieren, hinter die Zeilen $modeon17 = trim(@shell_exec("/usr/local/bin/pigs w 17 1")) und $modeon17 = trim(@shell_exec("/usr/local/bin/pigs w 17 0")) muss zwingend ein Semikolon, sonst wird PHP das nicht ausführen :)

Ergänzend, wird dieses Script von einem anderen aufgerufen? Denn andernfalls sehe ich nicht, dass die PHP-Abfragen so jemals ausgelöst werden.

Sollte dieses Script auf sich selber verweisen, dann müssten die Namen der Buttons angepasst werden (oder die Abfragen, aber Namen mit Leerzeichen und Klammern... uff! ;)).

So sollte das funktionieren.
PHP:
<html>
<head>
    <meta name=viewport" content="width=device-width" />
    <title>GPIO (PHP) schalten</title>
</head>

<body>
    <span style="font-family:'Helvetica';font-size:64">PVA II schalten</span>
    <form method="get" aktion="gpio.php">
        <input type="submit" style="color:red;font-size:194" value=" ( 0 ) " name="Lichtaus">
        <input type="submit" style="color:green;font-size:194" value=" ( I ) " name="Lichtein">
    </form>

    <?php
    if (isset($_GET['Lichtein'])) {
        $modeon17 = trim(@shell_exec("/usr/local/bin/pigs w 17 1"));
        echo "GPIO17 an";
    } else if (isset($_GET['Lichtaus'])) {
        $modeon17 = trim(@shell_exec("/usr/local/bin/pigs w 17 0"));
        echo "GPIO17 aus";
    }
    ?>
  
    in_66-6 h.194
    <!-- Versionskennung nur zu Testzwecken -->
</body>

</html>
 
Zuletzt bearbeitet:
Gute Tag,
erstmal danke für intensive Eure Hilfe.
Ich werde das durchgehen - heute ist der Tag voll und abends Klettertrainer *gg*.
Dazu möchte ich auch einiges an RasPi/Linux durcharbeiten: Syntax (";"), Rechte (scheint mir ziemlich komplex zu sein) - und so. Aktuell bin ich da noch viel zu unwissend. Schulmässig : total ungenügend :-/
Bis spätestens übermorgen.
 
Also wenn das:
Bemerkenswert ist (für mich): in der Adresszeile des Browsers ändert sich - je nach Schalterklick auf (I) oder (0) der Text von
http://192.168.178.30/?17+(I)=++(+I+)++ auf
http://192.168.178.30/?17+(0)=++(+0+)++
schon geklappt hatte, dann wäre ich vorsichtig optimistisch, dass das geänderte Script direkt laufen könnte. Alles weitere konnte bislang mit Syntaxfehler / Abfrage garnicht ausgelöst werden.

Wenn das noch nicht will, dann ggf. noch mit dem sudo probieren, eventuell mal den Rückgabewert mit ausgeben (echo $modeon17." / GPIO17 an"; bzw. echo $modeon17." / GPIO17 aus";) und wenn das noch nicht informativ ist, dann mal auf https://www.php.net/manual/de/function.exec.php umschreiben um mehr Informationen zu erhalten.

Oh, und - Du weißt, dass das @ eventuelle Fehlermeldungen unterdrückt? Würde ich eigentlich auch rausnehmen, sollte an dieser Stelle ein Fehler auftauchen, dann wäre das doch nicht uninteressant.

Viel Vergnügen! :)
 

Zurzeit aktive Besucher

Letzte Anleitungen

Statistik des Forums

Themen
4.384
Beiträge
45.274
Mitglieder
3.986
Neuestes Mitglied
ruesti
Zurück
Oben