Hallo,
ich bin fast am Verzweifeln mit einem kleinen und wie ich denke einfachem Script.
Ich habe einen Schalter, den ich überwachen möchte. In einer Schaltstellung soll EINMALIG eine E-Mail versendet werden. Konkret handelt es sich um einen Teil einer Hausautomation bzw. Überwachung. Der FI-Schutzschalter einer Pumpe bekommt einen Hilfskontakt und bei ausgelöstem FI soll ein angeschlossener Raspi eine Mail versenden mit dem Inhalt "FI-Schutzschalter Pumpe ausgelöst". Damit kann man dann hingehen und diesen wieder einschalten. So weit so gut.
Ich habe ein kleines Python-Script geschrieben, wo ich einen Mail-Client aufsetze (funktioniert einwandfrei) und den Hilfskontakt als Schalter gegen Masse an einen GPIO anschließe. Da der Schalter kein Taster ist, sondern ständig Signal gibt bei ausgelöstem Zustand, habe ich die negative Schaltflanke als Kriterium, genommen, um nicht mit Mails bombardiert zu werden. Ich möchte genau EINE Mail haben. Dazu den Internen Pull-Up gesetzt. Zum Testen der Funktion habe ich temporär noch eine LED an einen weiteren GPIO gehangen, um überprüfen zu können, ob es funktioniert.
Soweit die Theorie. Es funktioniert im Prinzip auch fast, aber leider nur fast.
Die Funktion wird wunschgemäß ausgelöst bei schalten auf Masse, also negative Flanke. Komischerweise löst die Funktion ebenfalls bei positiver Flanke aus, also beim Wiedereinschalten des FI, wenn der Hilfskontakt von L auf H geht, also von Masse getrennt über den Pull-Up an 3V3. Das soll eigentlich nicht sein. Wenn der Schalter über längere Zeit ausgelöst ist, also der GPIO auf Masse liegt, hängt sich das Script auf, die LED leuchtet dauernd und es kommt im Terminal eine SMTP-Fehlermeldung. Mail ist keine versendet worden und das Script bleibt hängen, weshalb die LED auch nicht mehr ausgeht. Es wird ja abgearbeitet in der Reihenfolge LED an, Mail senden, kurze Pause, LED aus und wenn er bei Mailsenden hängt, gehts natürlich nicht weiter. Nur warum hängt er? es gab gar kein Ereignis, was zur Auslösung führen könnte. Der GPIO liegt dauerhaft auf Masse und irgendwann plötzlich LED an, Mail hängt??? Und warum löst er bei beiden Flanken aus?
Irgendwie finde ich meinen Fehler nicht, kann mir jemand auf die Sprünge helfen? Was mach ich verkehrt?
PS: mit den letzten Zeilen und der Schleife möchte ich einfach die GPIO-Zustände löschen, wenn das Script händisch mit STRG+C abgebrochen wird. Das ist sicher nicht sehr elegant, eine bessere Lösung fiel mir leider nicht ein.
Hier mein Script (Maildaten unkenntlich gemacht):
#!/usr/bin/python
# coding: iso-8859-15
import smtplib
import RPi.GPIO as GPIO
import time
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from time import sleep
GPIO.setmode(GPIO.BCM)
GPIO.setup(21, GPIO.OUT)
GPIO.setup(20, GPIO.IN, pull_up_down = GPIO.PUD_UP)
smtpServer = "smtp.meinprovider.com"
smtpPort = 587
username = "mein-name"
password = "123456789"
sender = "absender@mailadresse1.de"
reciever = "empfaenger@mailadresse2.com"
subject = "Testmail Raspberry Pi"
body = "Hier steht ein Text."
msg = MIMEMultipart()
msg['Subject'] = subject
msg['From'] = sender
msg['To'] = reciever
part = MIMEText(body, 'plain')
msg.attach(part)
smtpObj = smtplib.SMTP(smtpServer, smtpPort)
smtpObj.starttls()
smtpObj.login(username, password)
def MailFunktion(n):
GPIO.output(21, GPIO.HIGH) # nur fuer Test: LED einschalten
smtpObj.sendmail(sender, reciever, msg.as_string()) # absenden der E-Mail
time.sleep(0.2)
GPIO.output(21, GPIO.LOW)# nur fuer Test: LED wieder ausschalten
GPIO.add_event_detect (20, GPIO.FALLING, callback = MailFunktion, bouncetime = 200)
try:
while True:
time.sleep (5)
except KeyboardInterrupt:
GPIO.cleanup()
Alles anzeigen
Hier die SMTP-Fehlermeldung (Maildaten unkenntlich gemacht), wenn sich das Script aufhängt (nur dann, sonst funktioniert das einwandfrei!):
Traceback (most recent call last):
File "/home/pi/mail1.py", line 40, in MailFunktion
smtpObj.sendmail(sender, reciever, msg.as_string()) # absenden der E-Mail
File "/usr/lib/python3.9/smtplib.py", line 871, in sendmail
raise SMTPSenderRefused(code, resp, from_addr)
smtplib.SMTPSenderRefused: (421, b'mailserver.de Service closing transmission channel - command timeout', 'absender@mailadresse1.de')
Traceback (most recent call last):
File "/home/pi/mail1.py", line 40, in MailFunktion
smtpObj.sendmail(sender, reciever, msg.as_string()) # absenden der E-Mail
File "/usr/lib/python3.9/smtplib.py", line 865, in sendmail
(code, resp) = self.mail(from_addr, esmtp_opts)
File "/usr/lib/python3.9/smtplib.py", line 538, in mail
self.putcmd("mail", "FROM:%s%s" % (quoteaddr(sender), optionlist))
File "/usr/lib/python3.9/smtplib.py", line 371, in putcmd
self.send(str)
File "/usr/lib/python3.9/smtplib.py", line 363, in send
raise SMTPServerDisconnected('please run connect() first')
smtplib.SMTPServerDisconnected: please run connect() first
Traceback (most recent call last):
File "/home/pi/mail1.py", line 40, in MailFunktion
smtpObj.sendmail(sender, reciever, msg.as_string()) # absenden der E-Mail
File "/usr/lib/python3.9/smtplib.py", line 865, in sendmail
(code, resp) = self.mail(from_addr, esmtp_opts)
File "/usr/lib/python3.9/smtplib.py", line 538, in mail
self.putcmd("mail", "FROM:%s%s" % (quoteaddr(sender), optionlist))
File "/usr/lib/python3.9/smtplib.py", line 371, in putcmd
self.send(str)
File "/usr/lib/python3.9/smtplib.py", line 363, in send
raise SMTPServerDisconnected('please run connect() first')
smtplib.SMTPServerDisconnected: please run connect() first
Traceback (most recent call last):
File "/home/pi/mail1.py", line 40, in MailFunktion
smtpObj.sendmail(sender, reciever, msg.as_string()) # absenden der E-Mail
File "/usr/lib/python3.9/smtplib.py", line 865, in sendmail
(code, resp) = self.mail(from_addr, esmtp_opts)
File "/usr/lib/python3.9/smtplib.py", line 538, in mail
self.putcmd("mail", "FROM:%s%s" % (quoteaddr(sender), optionlist))
File "/usr/lib/python3.9/smtplib.py", line 371, in putcmd
self.send(str)
File "/usr/lib/python3.9/smtplib.py", line 363, in send
raise SMTPServerDisconnected('please run connect() first')
smtplib.SMTPServerDisconnected: please run connect() first
Traceback (most recent call last):
File "/home/pi/mail1.py", line 40, in MailFunktion
smtpObj.sendmail(sender, reciever, msg.as_string()) # absenden der E-Mail
File "/usr/lib/python3.9/smtplib.py", line 865, in sendmail
(code, resp) = self.mail(from_addr, esmtp_opts)
File "/usr/lib/python3.9/smtplib.py", line 538, in mail
self.putcmd("mail", "FROM:%s%s" % (quoteaddr(sender), optionlist))
File "/usr/lib/python3.9/smtplib.py", line 371, in putcmd
self.send(str)
File "/usr/lib/python3.9/smtplib.py", line 363, in send
raise SMTPServerDisconnected('please run connect() first')
smtplib.SMTPServerDisconnected: please run connect() first
Traceback (most recent call last):
File "/home/pi/mail1.py", line 40, in MailFunktion
smtpObj.sendmail(sender, reciever, msg.as_string()) # absenden der E-Mail
File "/usr/lib/python3.9/smtplib.py", line 865, in sendmail
(code, resp) = self.mail(from_addr, esmtp_opts)
File "/usr/lib/python3.9/smtplib.py", line 538, in mail
self.putcmd("mail", "FROM:%s%s" % (quoteaddr(sender), optionlist))
File "/usr/lib/python3.9/smtplib.py", line 371, in putcmd
self.send(str)
File "/usr/lib/python3.9/smtplib.py", line 363, in send
raise SMTPServerDisconnected('please run connect() first')
smtplib.SMTPServerDisconnected: please run connect() first
Traceback (most recent call last):
File "/home/pi/mail1.py", line 40, in MailFunktion
smtpObj.sendmail(sender, reciever, msg.as_string()) # absenden der E-Mail
File "/usr/lib/python3.9/smtplib.py", line 865, in sendmail
(code, resp) = self.mail(from_addr, esmtp_opts)
File "/usr/lib/python3.9/smtplib.py", line 538, in mail
self.putcmd("mail", "FROM:%s%s" % (quoteaddr(sender), optionlist))
File "/usr/lib/python3.9/smtplib.py", line 371, in putcmd
self.send(str)
File "/usr/lib/python3.9/smtplib.py", line 363, in send
raise SMTPServerDisconnected('please run connect() first')
smtplib.SMTPServerDisconnected: please run connect() first
Traceback (most recent call last):
File "/home/pi/mail1.py", line 40, in MailFunktion
smtpObj.sendmail(sender, reciever, msg.as_string()) # absenden der E-Mail
File "/usr/lib/python3.9/smtplib.py", line 865, in sendmail
(code, resp) = self.mail(from_addr, esmtp_opts)
File "/usr/lib/python3.9/smtplib.py", line 538, in mail
self.putcmd("mail", "FROM:%s%s" % (quoteaddr(sender), optionlist))
File "/usr/lib/python3.9/smtplib.py", line 371, in putcmd
self.send(str)
File "/usr/lib/python3.9/smtplib.py", line 363, in send
raise SMTPServerDisconnected('please run connect() first')
smtplib.SMTPServerDisconnected: please run connect() first
Alles anzeigen
Vielen Dank schon mal!