Motion Sensing Loop Error Python?

Привет, ребята. Я работал над этим кодом довольно долгое время, но как только код обнаружил движение, сделал снимок и отправил его как вложение в электронное письмо, он работает один раз, но как только состояние возвращается в готовое состояние, возникает эта ошибка, но я не могу понять почему. Я прошу прощения за включение всего кода, потому что, хотя в сообщении об ошибке указана строка 43, я не уверен, что вызвало ошибку. Любые предложения будут ценны. Я новичок в программировании на Python, поэтому я могу упустить что-то очень очевидное. Кстати, я запускаю это на Raspberry Pi для тех, кто хотел бы проверить код. Спасибо

import os, re
import sys
import smtplib
import RPi.GPIO as GPIO
import time
import picamera
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText


GPIO.setmode(GPIO.BCM)


GPIO_PIR = 4

print "PIR Module Test (CTRL-C to exit)"


GPIO.setup(GPIO_PIR,GPIO.IN)     

Current_State  = 0
Previous_State = 0
cam = picamera.PiCamera()
try:

  print "Waiting for PIR to settle ..."


  while GPIO.input(GPIO_PIR)==1:
    Current_State  = 0

  print "  Ready"


  while True :


    Current_State = GPIO.input(GPIO_PIR)

    if Current_State==1 and Previous_State==0:
      print "  Motion detected!"
      cam.capture('/home/pi/Eaglecam/surveillance.jpg')
      print('picture taken')
      cam.close()
      SMTP_SERVER = 'smtp.gmail.com'
      SMTP_PORT = 587       
      sender = '*******************'
      password = "secret!!"
      recipient = '*********************'
      subject = 'INTRUDER DETECTER!!'
      message = 'INTRUDER ALLERT!! INTRUDER ALERT!! CHECK OUT THIS PICTURE OF THE INTRUDER! SAVE THIS PICTURE AS EVIDENCE!'

      directory = "/home/pi/Eaglecam/"

      def main():
          msg = MIMEMultipart()
          msg['Subject'] = 'INTRUDER ALERT'
          msg['To'] = recipient
          msg['From'] = sender

          files = os.listdir(directory)
          jpgsearch = re.compile(".jpg", re.IGNORECASE)
          files = filter(jpgsearch.search, files)
          for filename in files:
              path = os.path.join(directory, filename)
              if not os.path.isfile(path):
                  continue

              img = MIMEImage(open(path, 'rb').read(), _subtype="jpg")
              img.add_header('Content-Disposition', 'attachment', filename=filename)
              msg.attach(img)

          part = MIMEText('text', "plain")
          part.set_payload(message)
          msg.attach(part)

          session = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)

          session.ehlo()
          session.starttls()
          session.ehlo
          session.login(sender, password)

          session.sendmail(sender, recipient, msg.as_string())
          session.quit()

      if __name__ == '__main__':   
      print('  Email Sent')
      Previous_State=1
    elif Current_State==0 and Previous_State==1:

      print "  Ready"
      Previous_State=0

    time.sleep(0.01)

except KeyboardInterrupt:
  print "  Quit"

  GPIO.cleanup()

Вот ошибка:

Traceback (most recent call last):
  File "/home/pi/Python/hi2.py", line 43, in <module>
    cam.capture('/home/pi/Eaglecam/surveillance.jpg')
  File "/usr/lib/python2.7/dist-packages/picamera/camera.py", line 1446, in capture
    camera_port, output_port = self._get_ports(use_video_port, splitter_port)
  File "/usr/lib/python2.7/dist-packages/picamera/camera.py", line 708, in _get_ports
    self._camera[0].output[self.CAMERA_CAPTURE_PORT]
TypeError: 'NoneType' object has no attribute '__getitem__'

1 ответ

Решение

Попробуй не упорствовать cam объект...picamera сбрасывает и закрывает по своему усмотрению, поэтому у вас могут возникнуть проблемы с повторным вызовом объекта с кодом, который вы используете. Кроме того, вы звоните .close() метод на вашем cam объект после if делает первый снимок. Я мог бы сделать это так:

surv_pic = open('/home/pi/Eaglecam/surveillance.jpg', 'wb')
if Current_State==1 and Previous_State==0:
    print "  Motion detected!"
    with picamera.PiCamera() as cam:
        ##if camera is not producing pictures because it is not warmed up yet uncomment the next two lines
        ##cam.start_preview()
        ##time.sleep(2)
        cam.capture(surv_pic)
    surv_pic.close()
    SMTP_SERVER = 'smtp.gmail.com'
    ## continue as is from here
Другие вопросы по тегам