I'm trying to setup a concurrent photo capture and immediate email of said capture (triggered by a PIR motion sensor) in a Python script. Basically what I'm trying to accomplish is to have my Pi take a picture with the attached 8MP picamera and have it send the picture via email. I have successfully created a script that can accomplish both these tasks, but no photos are captured while the PIR sensor is triggered until the task of sending out the email with the first capture is completed. Is it possible to do both of these tasks concurrently on the Pi Zero? I have attached the relevant code below.
Many thanks in advance!
from gpiozero import MotionSensor from picamera import PiCamera from datetime import datetime #import subprocess import time import smtplib import os from email.MIMEMultipart import MIMEMultipart from email.MIMEBase import MIMEBase from email.MIMEText import MIMEText from email import Encoders gmail_user = "[email protected]" #Sender email address gmail_pwd = "xxxxxxxxx" #Sender email password to = "[email protected]" #Receiver email address subject = "foo" text = "bar" camera = PiCamera() pir = MotionSensor(4) camera.resolution = (3280,1845) camera.sharpness = 11 camera.saturation = 4 camera.brightness = 50 camera.hflip = True camera.vflip = True #camera.iso = 1600 #camera.awb_mode = 'auto' camera.exposure_mode = "night" timeInterval = 2 filepath = "/home/pi/camsecurity_stills/" try: print 'PIR Motion Triggered Photo Capture' time.sleep(10) print 'Ready' while True: pir.wait_for_motion() filename = datetime.now().strftime("%m%d%Y_%H%M%S.jpg") path = filepath + filename camera.capture(path, format='jpeg', quality=100) print "Captured %s" % filename attach = path msg = MIMEMultipart() msg['From'] = gmail_user msg['To'] = to msg['Subject'] = subject msg.attach(MIMEText(text)) part = MIMEBase('application', 'octet-stream') part.set_payload(open(attach, 'rb').read()) Encoders.encode_base64(part) part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(attach)) msg.attach(part) mailServer = smtplib.SMTP("smtp.gmail.com", 587) mailServer.ehlo() mailServer.starttls() mailServer.ehlo() mailServer.login(gmail_user, gmail_pwd) mailServer.sendmail(gmail_user, to, msg.as_string()) mailServer.close() print "Email Sent" time.sleep(timeInterval) except KeyboardInterrupt: print 'Quit'