Я работаю над самонаводящимся растением, и я хочу, чтобы он посылал мне электронные письма, когда резервуар для воды пуст и когда он заполнен. Все работает, но мне нужно установить условие, которое запускает функцию электронной почты только один раз, когда условие выполнено. Вместо этого он идет бесконечно и отправляет электронные письма каждую секунду, пока выполняется условие.Как вызвать функцию при выполнении определенного условия в Python
Для бывших: Бак для воды заполнен в соответствии с датчиком, отправить по электронной почте «бак для воды полный»
Водяной бак пуст в соответствии с датчиком, отправить электронную почту «бак для воды пустой»
Это должно произойти только один раз если уровень воды не изменится.
И не делайте ничего, пока не будет выполнено другое условие. Таким образом, цикл продолжается вечно, не вызывая никаких условий, пока есть вода.
Как только воды больше нет, тогда условие будет срабатывать. То же самое, когда нет воды, а затем я снова наполнить его
Вот код:
import RPi.GPIO as GPIO, feedparser
from time import sleep
import smtplib, os, sys
from email.mime.text import MIMEText
from email.MIMEMultipart import MIMEMultipart
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
#Set up GPIO Inputs
# Yellow Input
GPIO.setup(2, GPIO.IN)
def send_email(msg):
USERNAME = "[email protected]"
PASSWORD = "my_email_password"
MAILTO "recipient email"
msg['From'] = USERNAME
msg['To'] = MAILTO
server = smtplib.SMTP('smtp.gmail.com:587')
server.ehlo_or_helo_if_needed()
server.starttls()
server.ehlo_or_helo_if_needed()
server.login(USERNAME, PASSWORD)
server.sendmail(USERNAME, MAILTO, msg.as_string())
server.quit()
print "Email sent to: "+ MAILTO
return
def Send_nowater_email():
print"No water"
msg = MIMEMultipart()
msg.attach(MIMEText('Water tank empty'))
msg['Subject'] = 'Plant notification'
send_email(msg)
return
def Send_watered_email():
msg = MIMEMultipart()
msg.attach(MIMEText('Water tank full'))
msg['Subject'] = 'Plant notification'
send_email(msg)
return
while True:
Input_yellow = GPIO.input(2)
print Input_yellow
if Input_yellow == False:
Send_watered_email()
if Input_yellow == True:
Send_nowater_email()
Это becuase вашей электронной почты() функции находятся внутри 'в то время как (True) 'цикл – martianwars
Если вы не отслеживать какие-то состояние, которое указывает, если сообщение электронной почты/должно быть отправлено , он, очевидно, будет продолжать отправлять, поскольку вы постоянно вызываете функцию. Вам нужно будет добавить какой-то флаг, чтобы определить, нужно ли отправлять электронное письмо, а затем решить, когда и если вы хотите его очистить, чтобы снова отправить электронное письмо. Вопрос немного широк, поскольку есть много способов сделать это, поэтому вы, вероятно, получите разные идеи, но вы должны подумать о том, что на самом деле лучше всего подходит для вашей ситуации. – Jmills