Beleuchtung, Bash-Datei ohne Auswirkung

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Hoffy1988
User
Beiträge: 1
Registriert: Sonntag 24. Juli 2016, 20:25

Hallo Ihr,

ich bin noch ganz neu in Python und mein einer Freund hat auch schon ein wenig Erfahrung mit Python.
Betonung liegt auf wenig ;)

Jetzt haben wir folgendes Problem:

Wir haben eine Terrassen-Beleuchtung mit Drucktastern, die auch leuchtLEDs als visuelles Feedback haben, gebaut.

Wir haben eine Python-Datei dafür in den Raspberry mit Raspbian Jessie in den Autostart gelegt.
Die het die Lampen als Variablen gesetzt, die ganzen GPIO-Pins sind definiert
und wir haben auch eine Abfrage, die nur den Status abfragt, wenn der Druckschalter reingedrückt wird.

Das funktioniert auch soweit.

hier eine kurzfassung der entsprechenden Datei:

Code: Alles auswählen

import time
import RPi.GPIO as GPIO

global lampe1
...
global lampe6

lampe1 = 0
...
lampe6 = 0

GPIO.setmode(GPIO.BCM)

#Pins auf output setzen
GPIO.setup(5, GPIO.OUT) #LampeTaste4
GPIO.setup(6, GPIO.OUT) #LampeTaste5
...
GPIO.setup(25, GPIO.OUT) #LampeTaste3
GPIO.setup(20, GPIO.OUT) #Lampe5

GPIO.output(5, GPIO.HIGH)
...
GPIO.output(20, GPIO.HIGH)

#Pins auf input setzen
GPIO.setup(14, GPIO.IN, pull_up_down=GPIO.PUD_UP) #Taste1
...
GPIO.setup(22, GPIO.IN, pull_up_down=GPIO.PUD_UP) #Taste6

#Program
while 1:
	if GPIO.input(14) == GPIO.LOW:
		if lampe1 == 0:
			lampe1 = 1
		else:
			lampe1 = 0
		while GPIO.input(14) == GPIO.LOW:
			time.sleep(0.1)
	if GPIO.input(17) == GPIO.LOW:
		if lampe3 == 0:
		
		...
		
		
	if GPIO.input(18) == GPIO.LOW:
		if lampe4 == 0:
			lampe4 = 1
		else:
			lampe4 = 0
		while GPIO.input(18) == GPIO.LOW:
			time.sleep(0.1)
			
#Lichter einschalten / ausschalten

	if lampe1 == 0:
		GPIO.output(13, GPIO.HIGH)
		GPIO.output(23, GPIO.HIGH)
	else:
		GPIO.output(13, GPIO.LOW)
		GPIO.output(13, GPIO.LOW)
	...
	if lampe6 == 0:
		GPIO.output(21, GPIO.HIGH)
		GPIO.output(12, GPIO.HIGH)
	else:
		GPIO.output(21, GPIO.LOW)
		GPIO.output(12, GPIO.LOW)

	time.sleep(0.1)

die Teile die ich ausgelassen habe, sehen sich sehr ähnlich, bzw ist kein anderer code.

Jetzt kam uns die Idee, dass wir das alles per Handy steuern wollen.
Dazu haben wir auf dem Raspberry einen apache2-server mit php5 installiert.

Wir haben uns aus dem Netz folgenden Code für die Site rausgesucht:

[codebox=php file=Unbenannt.php]
<?php
if (isset($_POST['Licht1'])) {shell_exec("sudo bash skript1.sh");}
...

if (isset($_POST['Licht6'])) {shell_exec("sudo bash skript6.sh");}
?>

<!DOCTYPE HTML>
<html>
...

<form action="" method="post">
<div class="style">
<br>
<button class="Button" type="submit" name="Licht1">Lampe 1 toggeln</button>
</div>

...

<div class="style">
<br>
<button class="Button" type="submit" name="Licht6">Lampe 6 toggeln</button>
</div>

...
</html>
[/code]

Die entsprechenden Skripte liegen im selben ordner wie die eben aufgezeigte index.php


Die Skripte selber enthalten jeweils folgende Zeilen:


[codebox=bash file=Unbenannt.bsh]
#!/usr/bin/python

if lampe1 == 0:
lampe1 = 1

else: lampe1 = 0
[/code]

So nun zu meinem Problem:
wie schon gesagt ich bin noch recht neu in Python.
Ich habe auch schon gegoogelt und ein bischen was rumprobiert.

Nur ich weiß nicht genau was ich falsch gemacht habe, denn wenn ich die Skripte per index.php aufrufe, tut sich nichts.
rufe ich die Skripte per Terminal auf erhalte ist folgende Meldung:
Traceback (most recent call last):
File "./skript1.sh", line 3, in <module>
if lampe1 == 0:
NameError: name 'lampe1' is nor defined
Natürlich läuft das Haupt-Program bereits, dann ich kann die Lampen per Knopfdruck einschalten und es leuchten dann auch die LEDs am Druckschalter selber.

Ich habe auch mal versucht die Skripte per <a href="..."> aufzurufen, und dann mit einer success-abfrage zurück auf die index.php zu leiten. Das funktioniert alles, nur kann ich die Lampen nicht ausschalten.

Meine Vermutung ist, dass ich die Variablen lampe1 bis lampe6 falsch definiert habe?
Mir kommen aber auch die Skripte, die die Variablen ändern sollen, recht kurz vor...

Ich wäre euch sehr dankbar wenn ihr mir da weiterhelfen könntet.


Vielen Dank bereits im voraus.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Hoffy1988: Programmierer sind faul, daher wollen sie nicht alles 6 mal kopieren, nur um immer wieder die selben drei Zahlen anzupassen. Naja, der wirkliche Grund ist, dass man nicht ständig Tippfehler macht oder mal was vergißt, wenn sich eine Zahl ändert.

Also, Dein erster Schritt wäre, zu lernen, was Listen und Schleifen sind und diese konsequent für die 6 Lampen anwenden.

Dann hast Du ein falsches Verständnis, was ein Programm ist. Nur weil es in einem Programm eine Variable lampe1 gibt, gibt es die nicht in allen Programmen, denn dann könntest Du ja in PHP direkt «lampe1=0» schreiben. Sinnvoller wäre es sowieso nur *ein* Programm zu schreiben. Z.B. kannst Du in Python mit Hilfe von flask ganz einfach einen kompletten Webserver betreiben, ohne noch apache und PHP zusätzlich lernen zu müssen.
sebastian0202
User
Beiträge: 168
Registriert: Montag 9. Mai 2016, 09:14
Wohnort: Berlin

Hallo,


du musst den Wert aller deiner Lampen in eine Datei ("lampe.json") schreiben.
Rufst du also das PHP Skript auf sollte das Skript die Datei ("lampe.json") einlesen und
den jeweiligen Wert verändern.

Dein Python Skript sollte dann alle X Sekunden schauen ob sich an der Datei etwas geändert hat.
Wenn ja, muss das Skript die Datei einlesen und die richtige Aktion triggern.
Antworten