PIR Script macht Probleme

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Philipp238
User
Beiträge: 4
Registriert: Sonntag 7. Januar 2018, 14:38

Hallo zusammen,

folgendes zum Aufbau, am Raspberry hängt ein PIR. Dieser schaltet einen Monitor über HDMI-CEC ein und aus. Dieser Monitor kann allerdings auch über eine Webschnittstelle vom Raspberry aktiviert werden. Im Script ist es so vorgesehen, dass das PHP-Script Vorrang hat und den PIR ausser Kraft setzt solange der Monitor über die Webschnittstelle aktiviert ist.

Das mit dem ausser Kraft setzten funktioniert genau so wie es soll, sobald ich allerdings den Monitor über die Webschnittstelle wieder deaktivier soll der PIR diesen wieder ein- und ausschalten. Das klappt leider nicht und ich muss das PIR-Script wieder neu starten.

Ich hoffe jemand hat eine Idee was mir noch in meinem Script fehlt, dass der PIR diese wieder von alleine macht.

Hier noch der Code:

Code: Alles auswählen

#!/usr/bin/python

# Import der Python libraries
import RPi.GPIO as GPIO
import time
import datetime
import subprocess
import os.path

# GPIO definieren
PIR_PIN = 7
Led = 11
aktiv = '/var/exis/aktiv.txt'

#Board Mode
GPIO.setmode(GPIO.BOARD)
#GPIO als Input definieren
GPIO.setup(PIR_PIN, GPIO.IN)
#Led GPIOs definieren
GPIO.setup(Led, GPIO.OUT)
GPIO.output(Led, GPIO.HIGH)

print "Displaysteuerung (CTRL-C zum Beenden)"
print "=================================="
 
print "%s: Sensor initialisieren ..." % datetime.datetime.now() 
 
 # Warten bis Sensor sich meldet
while GPIO.input(PIR_PIN) != 0:
 time.sleep(0.1)
print "%s: Fertig! Warte auf Bewegung..."  % datetime.datetime.now()
 
 # Schleife bis CTRL+C
def MOTION (PIR_PIN):
	if os.path.isfile(aktiv) == False and GPIO.input(PIR_PIN) == 1:
		print " %s: Bewegung erkannt!" % datetime.datetime.now()
		GPIO.output(Led, GPIO.LOW) #LED an
		#Standby deaktivieren
		subprocess.Popen('echo "on 0" | sudo cec-client -s -d 1', shell=True)
		time.sleep(0.5)
		subprocess.Popen('sudo chvt 6 && sudo chvt 7', shell=True)   
	if GPIO.input(PIR_PIN) == 0:
		print "%s: Fertig! Warte auf Bewegung..."  % datetime.datetime.now()
		# Standby aktivieren 
		subprocess.Popen('echo "standby 0" | sudo cec-client -s -d 1', shell=True)
		GPIO.output(Led, GPIO.HIGH)#LED aus
        
try:
	GPIO.add_event_detect(PIR_PIN, GPIO.BOTH, callback=MOTION)
	
	while True:
		time.sleep(60)

except KeyboardInterrupt:
        print "Exit!"
	GPIO.cleanup()
      


Gruß
Philipp
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist alles ziemlicher Murks. Zum einen wartest du völlig unnötig auf das erste Ereignis vom Sensor, bevor du deine Callback Routine registrierst. Damit entgeht dir mindestens mal ein event.

Sobald das gelöst es, steht das nächste Problem an: du hast die App Abfrage, ob die Steuerdatei existiert, zusammengewurschtelt mit der positiven Abfrage auf den Sensor. In dem Moment kann es aber passieren, dass die nächste Abfrage (kein Sensor) trotz existierendenr Datei zuschlägt. Darum gehört die Logik welche den Sensor behandelt komplett eingerückt, damit sie abhängig davon ist, ob die Steuerdatei existiert oder nicht.

Insgesamt wäre es natürlich eher sinnvoll eine Lösung komplett in Python zu schreiben, weil du dir dann das Gefrickel mit der Datei ersparst.
Philipp238
User
Beiträge: 4
Registriert: Sonntag 7. Januar 2018, 14:38

Danke für deine Antwort!
Das abwarten kann man ja aus dem Code nehmen, wobei es nicht ganz so dramatisch ist wenn das erste Event nicht detektiert wird.

Dann werd ich das mal trennen und die Abfrage der Datei vorher einfügen, so meintest du das doch?
Quasi erst die Datei auf Existenz prüfen und dann die Sensorabfrage?

Ich hoffe, dass das auch das Problem löst und der PIR nach Abschalten durch das PHP-Script wieder Bewegungen detektiert.

Das wäre bestimmt möglich, allerdings fehlen mir dazu leider die Kenntnisse. Da der Monitor über das PHP-Script von einem Programm gesteuert wird, welches eigentlich für Netzwerkrelais ausgelegt ist.

Gruß
Philipp
Antworten