Forum: Mikrocontroller und Digitale Elektronik Raspberry GPIO-Port über Webpage schalten geht nicht


von Rudi H. (rubberdog)


Lesenswert?

Grüss Euch!

Habe vor 2 Jahren für meine Ente den Stall automatisiert und über eine 
Webseite u.a. auch Licht ein-/ausgeschaltet.
Jetzt will ich für eine andere Aufgabe so ein Python-Script starten, 
aber es geht nicht (mehr)??

Programm auf der Webseite des Raspberry (var/www/html ....):

-------------------------------------
TEST.PHP

<!DOCTYPE HTML>
<html>
<head>
</head>
<body>

<?php
  echo "Los geht's<br />";
  echo shell_exec('sudo python /var/www/html/carsystem/ledtest.py');
?>

</body>
</html>
-------------------------------------

startet das Python-Script:

-------------------------------------
LEDTEST.PY

#!/usr/bin/env python
import sys
import RPi.GPIO as GPIO
import time

licht_stall = 25

GPIO.setmode(GPIO.BCM)
GPIO.setup(licht_stall, GPIO.OUT)

while True:

  GPIO.output(licht_stall, 1)
  time.sleep(1)
  GPIO.output(licht_stall, 0)
  time.sleep(1)
--------------------------------------

Wenn ich das Script vom LXTerminal starte, blinken die LED's. Aus dem 
Browser gestartet tut sich nix, nur "Los geht's" wird angezeigt.

Rechtevergabe:
-rwxrwxrwx 1 www-data www-data ... (alle Dateien alle Rechte für 
www-data)

Es dürfte etwas mit den Rechten zu tun haben. Aber ich habe alles 
Standard gelassen und dem User www-data alle Rechte zugeteilt (ich weiß, 
das ist eine Sicherheitslücke).

Bin schon ganz fertig :-((

Für Eure Tipps bedanke ich mich ganz herzlich!!!

Rudi aus Wien

von Mario M. (thelonging)


Lesenswert?

Füge doch mal folgende Zeilen am Anfang des PHP-Teils ein:
1
ini_set('display_errors', 1);
2
ini_set('display_startup_errors', 1);
3
error_reporting(E_ALL);
Das zeigt alle Meldungen des PHP-Interpreters im Browser an.

von Stefan F. (Gast)


Lesenswert?

Darf der Webserver überhaupt sudo benutzen? Und wenn ja, dann 
hoffentlich nicht generell für beliebige Kommandos.

Hast du mal in dessen error logfile geschaut?

von /sys/class/gpio (Gast)


Lesenswert?

Wenn ich noch noch richtig erinnere, der einfachste Weg:
Den User unter dem dein PHP läuft zusätzlich in die Gruppe gpio packen 
und dann direkt aus dem PHP heraus in die "Dateien" unter 
/sys/class/gpio schreiben.

von M. P. (phpmysqlfreak)


Lesenswert?

/sys/class/gpio schrieb:
> Wenn ich noch noch richtig erinnere, der einfachste Weg:
> Den User unter dem dein PHP läuft zusätzlich in die Gruppe gpio packen
> und dann direkt aus dem PHP heraus in die "Dateien" unter
> /sys/class/gpio schreiben.

Das war ne ganze Zeit lang mein vorgehen bei nem Pi3 oder auch beim 
Cubieboard. - Funktionierte wunderbar.

Mit etwas Ajax hab ich mir auch den aktuellen Stand der Ein- und 
Ausgänge anzeigen lassen. Muss mal schauen, ob da noch irgendwo die µSD 
vom Cubie rumliegen habe.

von Rudi H. (rubberdog)


Lesenswert?

Mario M. schrieb:
> Füge doch mal folgende Zeilen am Anfang des PHP-Teils ein:
> [pre]ini_set('di.............

Servus Mario,
vielen Dank für Deinen Tipp!
Habe die Zeilen eingefügt, aber keine Meldungen erhalten. Nur die 
Kontrolltexte, damit ich weiß, dass die Zeilen abgearbeitet wurden.

von Rudi H. (rubberdog)


Lesenswert?

Stefanus F. schrieb:
> Darf der Webserver überhaupt sudo benutzen? Und wenn ja, dann
> hoffentlich nicht generell für beliebige Kommandos.
>
> Hast du mal in dessen error logfile geschaut?

Servus Stefanus, Danke für den Hinweis!
Bin aber ein Linux-Volldummie und weiß nicht, wo ich diesen Logfile im 
Linux-Filelabyrinth finde ...
Hast Du einen Tipp dafür?

von Rudi H. (rubberdog)


Lesenswert?

Grüß Euch, sys/class/gpio, Marcel P. und alle anderen Poster!

Danke für die Hinweise! Mein Problem ist halt, dass mir eine Anwendung 
mit der beschriebenen Technik früher gar keine Probleme bereitet hatte, 
die lief super und jetzt, bei gleicher Aufgabe, spinnt das Ding.

Das oben beschriebene LED-Programm verwende ich jetzt nur, um auf ganz 
simple Weise den Webserver-Zugriff zu testen und das Problem mit so 
wenig Codezeilen wie möglich zu beschreiben (in Wirklichkeit möchte ich 
von Adafruit das 16-Kanal PWM-Modul dazu bringen, Servos zu steuern. 
Dazu habe ich auf einem HTML-Formular Buttons, die bei Klick über 
Javascript das verbundene Servo zum laufen bringen sollen).

Aber nachdem nicht einmal eine dumme LED auf mein Programm reagiert, 
brauche ich mit dem Servo-Shield gar nicht erst anzufangen.

Wie beschrieben, ist das Vorgängerprogramm vor 2-3 Jahren auf einem 
älteren Raspberry gelaufen. Vielleicht hat sich hier in Linux oder PHP 
durch Updates etwas geändert? Es kann aber meiner Meinung nach nur mit 
den Rechten zu tun haben, denn starte ich das LED-Programm (oder das 
Servoshield-Programm) über die LX-Oberfläche 
(http://192.168.0.39:8037/carsystem/test.php), läuft es einwandfrei. 
Auch das PHP-Programm geht.
Nur beim Start des Programms im Browser macht der Python-Teil nix.
Alle Verzeichnisse und Dateien unterhalb /var/www/... haben alle Rechte 
und die Gruppe/User ist 'www-data'.

Vielleicht hat noch jemand eine Idee?

von Mario M. (thelonging)


Lesenswert?

Rufe das Script doch mal von der Kommandozeile als Benutzer www-data 
auf:
1
sudo -u www-data python /var/www/html/carsystem/ledtest.py

von Rudi H. (rubberdog)


Lesenswert?

Mario M. schrieb:
> Rufe das Script doch mal von der Kommandozeile als Benutzer www-data
> auf:
>
1
sudo -u www-data python /var/www/html/carsystem/ledtest.py

Da erhalte ich die Meldung
"Runtime Error: No access to /dev/mem. Try running as Root!"

Ich glaube, Du hast die richtige Spürnase! Aber wie soll ich jetzt die 
Rechte setzen?

von Stefan F. (Gast)


Lesenswert?

Rudi H. schrieb:
> Bin aber ein Linux-Volldummie und weiß nicht, wo ich diesen Logfile im
> Linux-Filelabyrinth finde ...
> Hast Du einen Tipp dafür?

Ja: Googeln.

cd /var/log/apache2
ls -l

von Rudi H. (rubberdog)


Lesenswert?

Stefanus F. schrieb:
> Rudi H. schrieb:
>> Bin aber ein Linux-Volldummie und weiß nicht, wo ich diesen Logfile im
>> Linux-Filelabyrinth finde ...
>> Hast Du einen Tipp dafür?
>
> Ja: Googeln.
>
> cd /var/log/apache2
> ls -l

Hab ich getan. Mit
"sudo adduser www-data gpio"
hab ich mit Mario's Befehl aus der Kommandozeile die LED zum Blinken 
gebracht.
Aber aus dem Browser geht's noch immer nicht :-( und ich hab schon viele 
Seiten gegoogelt ...
Auch rpi-update und update/upgrade haben nix gebracht.

von Mario M. (thelonging)


Lesenswert?

Als root die Datei /etc/sudoers bearbeiten und folgende Zeile anhängen:
1
www-data ALL=(ALL) NOPASSWD: /var/www/html/carsystem/ledtest.py
Quelle: https://pi-buch.info/gpio-steuerung-in-php-scripts/

von Rudi H. (rubberdog)


Angehängte Dateien:

Lesenswert?

Mario M. schrieb:
> Als root die Datei /etc/sudoers bearbeiten und folgende Zeile anhängen:
>
1
www-data ALL=(ALL) NOPASSWD: 
2
> /var/www/html/carsystem/ledtest.py
> Quelle: https://pi-buch.info/gpio-steuerung-in-php-scripts/

Mario, vielen Dank für den Link zum Buch! Da lese ich mich jetzt erstmal 
ein. Wahrscheinlich komm ich dann selbst auf meinen Fehler.
Bis jetzt hab ich keinen Erfolg. Aus dem Terminalfenster gestartet 
blinkt meine LED. Vom Chromium gestartet tut sich nix.
Den Screenshot zum Errorlog (Tipp von Stefanus) verlinke ich im Anhang.

von Walter T. (nicolas)


Lesenswert?

Ich lese etwas über eine Ente. Damit ist der Thread auf jeden Fall 
lesenswert.


Vielleicht kannst Du die LED in die Gruppe apache aufnehmen?

von Stefan F. (Gast)


Lesenswert?

Dein Sudo verlangt nach einer manuellen Bestätigung des Users, was aber 
in deinem Kontext nicht geht.

Hast du Marios Tipp umgesetzt? Es sieht nicht danach aus.

von rubberdog (Gast)


Lesenswert?

Ja, Stefanus, hab ich gemacht. Leider ohne Erfolg. Langsam weiß ich 
nicht mehr weiter. Irgendwo hab ich vielleicht etwas übersehen, aber ich 
hab nochmals alles durchgecheckt. Morgen prüfe ich nochmals und 
vielleicht setz ich das ganze Betriebssytem nochmals neu auf.

Auf jeden Fall nochmals vielen Dank für die zahlreichen Tipps! Ihr seid 
Spitze!

von rubberdog (Gast)


Lesenswert?

Walter T. schrieb:
> Ich lese etwas über eine Ente.

Richtig, hatte bis vor 2 Jahre 2 Enten und dafür einen Stall gebaut mit 
der üblichen ;-) Ausstattung (Motorisiertes Tor, 2 Kameras, 
Wasserheizung, Temperatursensoren, Beleuchtung). Dazu eine Webseite auf 
dem Raspberry mit den Kamerabildern, Sensordaten und Schaltflächen 
(Toröffnung morgens über Cronjob, abends manuell, alles Eigenbau. 
Portweiterleitung am UPC-Modem ermöglichte Kontrolle und Steuerung 
während meines Urlaubs auch aus Paraguay.
Hat alles funktioniert und dahab ich keine Probleme mit den LED's 
gehabt.
Jetzt geht das Glump aber nicht und ich hab keine Ahnung über die 
Ursache. Aber vielleicht soll ich mit über 70 schön langsam ein anderes 
Hobby suchen?

von Harry L. (mysth)


Lesenswert?

Hier wird erklärt, wie sowas geht:

https://ubuntuforums.org/showthread.php?t=639803

von M. P. (phpmysqlfreak)


Angehängte Dateien:

Lesenswert?

Ich hab mal gerade etwas gesucht und bin fündig geworden:

Habe das damals mit PHP und "Direkt"-Zugriff auf die GPIOs gelöst.

Der Webserver war Apache2 mit PHP5 Modul.
Apache2 lief unter dem Nutzer "www-data".
"www-data" als Nutzer war Mitglied der Gruppen "gpio" und "www-data".

Im Anhang ein Zip mit den entsprechenden Files, die ich verwendet habe. 
Vielleicht kannst du damit ja etwas anfangen ;)

Da nichts in den Files selbst dazu steht: Den Inhalt darf jeder frei 
verwenden.

von Mario M. (thelonging)


Lesenswert?

Rudi H. schrieb:
> Mit "sudo adduser www-data gpio"
> hab ich mit Mario's Befehl aus der Kommandozeile die LED zum Blinken
> gebracht.

Mario M. schrieb:
> Rufe das Script doch mal von der Kommandozeile als Benutzer www-data
> auf:sudo -u www-data python /var/www/html/carsystem/ledtest.py

Wenn das funktioniert, brauchst Du nur das "sudo" beim Aufruf von Python 
wegzulassen. Der "www-data"-User hat die erforderlichen Rechte und 
"sudo" scheint eh nicht richtig konfiguriert zu sein.

von Rudi H. (rubberdog)


Lesenswert?

Mario M. schrieb:
.........
>
> Wenn das funktioniert, brauchst Du nur das "sudo" beim Aufruf von Python
> wegzulassen. Der "www-data"-User hat die erforderlichen Rechte und
> "sudo" scheint eh nicht richtig konfiguriert zu sein.

Guten Morgen, Mario!

ES LÄUFT!!!
Dein Tipp mit "SUDO weglassen" war richtig. Jetzt blinkt die LED. Ich 
bin heilfroh, dass ich endlich wieder ruhig schlafen kann ;-)
Jetzt kann ich die Servos auch ausprobieren und hoffe, dass auch die 
funktionieren.

Nochmals vielen Dank für den entscheidenden Hinweis
und noch einen schönen Tag!

Rudi

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.