Hi,
vielen Dank für deine Antwort! Den Code hab ich mittlerweile so angepasst, bin aber über folgendes Punkte noch nicht glücklich:
1.Das Warten, bis der nächste Alarm ausgelöst werden darf, habe ich mit "time.sleep(xxx)" realisiert. Was natürlich dumm ist, da in dieser Zeit der Prozessor ja nicht sinnvoll andere Anfgaben übernehmen kann.
2.Das Programm kommt immer wieder ins Stoppen und "deaktiviert sich selbst" mit der Meldung:
"...login raise SMTPAuthenticationError(code, resp)
SMTPAuthenticationError: (454, '4.7.0 Too many loginattempts, please try again later. ...)
3.Könnte das Programm theoretisch so Jahre lang auf dem Raspberry laufen, oder würde die Shell vollgeschrieben und an den Printmeldungen eingehen?
Code: Alles auswählen
#!/usr/bin/env python
# coding: utf8
from __future__ import absolute_import, division, print_function
import RPi.GPIO as GPIO
import smtplib
import time
import paho.mqtt.client as mqtt
BtnPin = 13
Gpin = 12
Rpin = 11
TimeOut_Alert_sec = 90
TimeOut_Disconnected_sec = 600
fromaddr = 'Raspberry Pi Alarmsystem'
toaddrs = 'xxx@googlemail.com'
username = 'xxx@googlemail.com'
password = 'xxx'
msg1_part1 = """From: Raspberry Pi Alarmsystem
To: xxxt@googlemail.com
Subject: """
msg1_part2 = """Zone17: Lichtschranke1
"""
msg2_part1 = """From: Raspberry Pi Alarmsystem
To: xxxt@googlemail.com
Subject: """
msg2_part2 = """Zone17: Lichtschranke1 (dauerhaft)
"""
def on_connect(client,userdata,flags,rc):
print("Connected with result code "+str(rc))
client = mqtt.Client()
client.on_connect = on_connect
client.connect("localhost",1883,60)
client.loop_start()
def setup():
GPIO.setmode(GPIO.BOARD) # Numbers GPIOs by physical location
GPIO.setup(Gpin, GPIO.OUT) # Set Green Led Pin mode to output
GPIO.setup(Rpin, GPIO.OUT) # Set Red Led Pin mode to output
GPIO.setup(BtnPin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) # Set BtnPin's mode is input, and pull down to low
GPIO.add_event_detect(BtnPin, GPIO.BOTH, callback=detect, bouncetime=1000)
def Led(x):
if x == 1:
GPIO.output(Rpin, 1)
GPIO.output(Gpin, 0)
if x == 0:
GPIO.output(Rpin, 0)
GPIO.output(Gpin, 1)
def SendMail_detected(cnt): # x=Type, lastMail_time=letzte Zeit wann die Mail gesendet wurde
# Sind weniger als x Sekunden seit dem letzten Aufruf dieser Funktion vergangen?
# print("Mail wobei cnt ="+str(cnt))
server = smtplib.SMTP('smtp.gmail.com:587')
server.starttls()
server.login(username,password)
date = time.strftime("%Y%m%d")
zeit = time.strftime("%H:%M")
if cnt < 1:
WriteFile_detected()
server.sendmail(fromaddr, toaddrs, msg1_part1+" "+date+" "+zeit+" "+msg1_part2+""+date+" "+zeit+" "+msg1_part2+"("+str(TimeOut_Alert_sec)+" Seconds blocked)")
print("Lichtschranke unterbrochen > Mail gesendet")
client.publish("alarm/lichtschranke",date+" "+zeit+" Zone17: Lichtschranke1")
server.quit()
# Zeitpunkt der letzten Ausfuehrung speichern:
if cnt < 1:
return 99
else:
return 0
def WriteFile_detected():
date = time.strftime("%Y%m%d")
zeit = time.strftime("%H:%M")
fileout = open("/home/pi/Desktop/Lichtschranke.txt","a")
time.sleep(0.1)
fileout.write(date+";"+zeit+"; Die Lichtschranke wurde unterbrochen \n")
time.sleep(0.1)
fileout.close()
print("Log-File geschrieben")
def SendMail_disconnected(count): # x=Type, lastMail_time=letzte Zeit wann die Mail gesendet wurde
if count != TimeOut_Disconnected_sec/TimeOut_Alert_sec:
# print("Disconnected")
return
# Sind weniger als x Sekunden seit dem letzten Aufruf dieser Funktion vergangen?
WriteFile_disconnected()
server = smtplib.SMTP('smtp.gmail.com:587')
server.starttls()
server.login(username,password)
date = time.strftime("%Y%m%d")
zeit = time.strftime("%H:%M")
server.sendmail(fromaddr, toaddrs, msg2_part1+" "+date+" "+zeit+" "+msg2_part2+""+date+" "+zeit+" "+msg2_part2+"("+str(TimeOut_Disconnected_sec/60)+" Minutes disconnected)")
client.publish("alarm/lichtschranke",date+" "+zeit+" Zone17: Lichtschranke1 (dauerhaft)")
#print("Lichtschranke immer noch unterbrochen > erneut Mail gesendet")
server.quit()
# Zeitpunkt der letzten Ausfuehrung speichern:
def WriteFile_disconnected():
date = time.strftime("%x")
zeit = time.strftime("%X")
fileout = open("/home/pi/Desktop/Lichtschranke.txt","a")
time.sleep(0.1)
fileout.write(date+";"+zeit+"; Die Lichtschranke wurde dauerhaft unterbrochen \n")
time.sleep(0.1)
fileout.close()
#print("Log-File disconnected geschrieben")
def detect(count):
if GPIO.input(BtnPin) == GPIO.LOW: # Lichtschranke wurde unterbrochen
back= SendMail_detected(count)
SendMail_disconnected(count)
count += 1
Led(1)
if back == 99:
time.sleep(TimeOut_Alert_sec)
#print("detect count = "+str(count))
if GPIO.input(BtnPin) == GPIO.HIGH: # Lichtschranke wieder frei
count = 0
Led(0)
#print("count ="+str(count)+" >> is back")
return count
def loop():
count = 0
while True:
time.sleep(1)
#print("vor loop "+str(count))
count = detect(count)
#print("nach loop "+str(count))
def destroy():
GPIO.output(Gpin, GPIO.HIGH) # Green led off
GPIO.output(Rpin, GPIO.HIGH) # Red led off
GPIO.cleanup() # Release resource
def main(): # Program start from here
setup()
try:
loop()
except KeyboardInterrupt: # When 'Ctrl+C' is pressed, the child program destroy() will be executed.
pass
finally:
destroy()
if __name__ == '__main__': # Program start from here
main()