Raspberry Pi: обнаружение движения с уведомлениями по электронной почте (Python)

В этом проекте вы узнаете, как отправлять уведомления по электронной почте с Raspberry Pi при обнаружении движения. Мы будем программировать Raspberry Pi с помощью Python, а для считывания данных с PIR-датчика движения будем использовать интерфейс gpiozero.

Raspberry Pi — обнаружение движения с уведомлениями по электронной почте на Python

Содержание руководства

На протяжении этого руководства мы рассмотрим следующие основные темы:

  1. Настройка учётной записи электронной почты отправителя

  2. Подключение схемы (:doc:`Raspberry Pi с PIR-датчиком движения </raspberry/rnt/raspberry-pi-detect-motion-pir-python/index>`_)

  3. Детектор движения с уведомлениями по email — Python-скрипт

Предварительные требования

Перед продолжением этого руководства проверьте следующие предварительные требования.

  1. Ознакомьтесь с платой Raspberry Pi — если вы не знакомы с Raspberry Pi, вы можете прочитать наше :doc:`руководство по началу работы с Raspberry Pi здесь </raspberry/rnt/getting-started-with-raspberry-pi/index>`_.

  2. Вы должны знать, как запускать и создавать файлы Python на вашем Raspberry Pi. Нам нравится программировать наш Raspberry Pi через SSH, используя расширение в VS Code. У нас есть подробное руководство по этой теме: :doc:`Программирование Raspberry Pi удалённо с помощью VS Code (Remote-SSH) </raspberry/rnt/raspberry-pi-remote-ssh-vs-code/index>`_.

  3. Знайте, как использовать GPIO Raspberry Pi, чтобы правильно собрать схему. Прочитайте следующее руководство: :doc:`Распиновка Raspberry Pi: как использовать GPIO Raspberry Pi? </raspberry/rnt/raspberry-pi-pinout-gpios/index>`_

У нас также есть руководства по отправке электронных писем и использованию PIR-датчика движения, которые вы, возможно, захотите изучить в первую очередь:

Обзор проекта

В этом проекте мы создадим детектор движения с уведомлениями по электронной почте. Проект имеет следующие функции:

Raspberry Pi — датчик движения с уведомлениями по электронной почте — схема
  • При обнаружении движения вы получите предупреждающее сообщение на свою электронную почту.

  • В схеме есть кнопка, с помощью которой вы можете включить/отключить датчик движения. Например, выключить его, когда вы в комнате, и включить, когда выходите.

  • Есть светодиод, который показывает, активен ли датчик движения (светодиод горит) или деактивирован (светодиод выключен).

Настройка учётной записи электронной почты отправителя

Мы рекомендуем создать новую учётную запись электронной почты для отправки писем на ваш основной личный email-адрес. Не используйте свою основную личную электронную почту для отправки писем через Python-скрипт. Если что-то пойдёт не так в вашем коде или если по ошибке вы сделаете слишком много запросов, вас могут заблокировать или временно отключить вашу учётную запись.

Мы будем использовать новую учётную запись Gmail.com для отправки писем, но вы можете использовать любого другого почтового провайдера. Электронная почта получателя может быть вашей личной почтой без каких-либо проблем.

Создание учётной записи отправителя

Создайте новую учётную запись электронной почты для отправки писем с помощью Python-скрипта. Если вы хотите использовать учётную запись Gmail, перейдите по этой ссылке, чтобы создать новую.

Gmail — создание новой учётной записи

Создание пароля приложения

Вам нужно создать пароль приложения, чтобы новые устройства могли отправлять электронные письма, используя вашу учётную запись Gmail. Пароль приложения — это 16-значный код, который даёт менее защищённому приложению или устройству разрешение на доступ к вашей учётной записи Google. Узнайте больше о входе с паролями приложений здесь.

Пароль приложения можно использовать только с учётными записями, у которых включена двухэтапная аутентификация (2-step verification).

  1. Откройте свою учётную запись Google.

  2. В панели навигации выберите Безопасность (Security).

  3. В разделе «Вход в Google» выберите Двухэтапная аутентификация > Начать.

  4. Следуйте инструкциям на экране.

После включения двухэтапной аутентификации вы можете создать пароль приложения.

  1. Откройте свою учётную запись Google.

  2. В панели навигации выберите Безопасность (Security).

  3. В разделе «Вход в Google» выберите Пароли приложений (App Passwords).

Если вы не находите эту опцию, используйте инструмент поиска на этой странице и найдите App passwords.

Создание пароля приложения Gmail
  1. В поле «Выберите приложение» выберите mail. Для устройства выберите Other и дайте ему имя, например Raspberry Pi. Затем нажмите Generate. Появится окно с паролем, который вы будете использовать в Python-скрипте для отправки писем. Сохраните этот пароль (даже если написано, что вам не нужно его запоминать), потому что он понадобится вам позже.

Сгенерированный пароль приложения Gmail

Теперь у вас должен быть пароль приложения, который вы можете использовать в своём Python-скрипте для отправки электронных писем.

Если вы используете другого почтового провайдера, узнайте, как создать пароль приложения. Вы сможете найти инструкции с помощью быстрого поиска в Google «ваш_почтовый_провайдер + create app password».

Raspberry Pi с PIR-датчиком движения — подключение схемы

Для этого проекта нам понадобятся следующие компоненты.

Вы можете использовать ссылки выше или перейти напрямую на MakerAdvisor.com/tools, чтобы найти все детали для ваших проектов по лучшей цене!

Мы подключим светодиод к GPIO 14, кнопку к GPIO 4 и PIR-датчик движения к GPIO 18.

Компонент

Raspberry Pi

Светодиод

GPIO 14

Кнопка

GPIO 4

PIR-датчик движения

GPIO 18

Raspberry Pi с PIR-датчиком движения — схема подключения

Детектор движения с уведомлениями по email — Python-скрипт

Создайте новый файл Python с именем motion_email_notifications.py и скопируйте следующий код.

Вам нужно вставить данные вашей электронной почты отправителя и адрес получателя.

# Complete Project Details: https://RandomNerdTutorials.com/raspberry-pi-motion-email-python/

#import necessary libraries
from gpiozero import LED, Button, MotionSensor
import smtplib
from email.message import EmailMessage
from signal import pause
from time import sleep

#create objects to refer to the LED, the button, and the PIR sensor
led_status = LED(14)
button = Button(4)
pir = MotionSensor(18)

#replace the next three lines with your credentials
from_email_addr = "REPLACE_WITH_SENDER_EMAIL_ADDRESS"
from_email_password = "REPLACE_WITH_SENDER_APP_PASSWORD"
to_email_addr = "REPLACE_WIH_RECIPIENT_EMAIL_ADDRESS"
email_subject = "[WARNING!] Intruder Alert!"
email_body = "Motion was detected in your room!"

#control variables
motion_sensor_status = False
email_sent = False

#arm or disarm the PIR sensor
def arm_motion_sensor():
    global email_sent
    global motion_sensor_status

    if motion_sensor_status == True:
       motion_sensor_status = False
       led_status.off()
       print("Motion Sensor OFF")
    else:
        motion_sensor_status = True
        email_sent = False
        led_status.on()
        print("Motion Sensor ON")

#send email when motion is detected and the PIR sensor is armed
def send_email():
    global email_sent
    global motion_sensor_status

    if(motion_sensor_status == True and email_sent == False):
        print("Motion Detected")
        #create a message object
        msg = EmailMessage()
        #set the email body
        msg.set_content(email_body)
        #set sender and recipient
        msg['From'] = from_email_addr
        msg['To'] = to_email_addr
        #set your email subject
        msg['Subject'] = email_subject
        #connect to server and send email
        #edit this line with your provider's SMTP server details
        server = smtplib.SMTP('smtp.gmail.com', 587)
        #comment out this line if your provider doesn't use TLS
        server.starttls()
        server.login(from_email_addr, from_email_password)
        server.send_message(msg)
        server.quit()
        email_sent = True
        print('Email sent')
        sleep(5)
        email_sent = False

#assign a function that runs when the button is pressed
button.when_pressed = arm_motion_sensor

#assign a function that runs when motion is detected
pir.when_motion = send_email

pause()

Посмотреть исходный код

Как работает код

Продолжайте чтение, чтобы узнать, как работает код и какие изменения вам нужно внести в скрипт, чтобы он заработал.

Импорт библиотек

Вы начинаете с импорта компонентов LED, Button и MotionSensor из библиотеки gpiozero.

from gpiozero import LED, Button, MotionSensor

Затем импортируете библиотеки для работы с SMTP и функциями электронной почты.

import smtplib
from email.message import EmailMessage

Вы также импортируете методы pause и sleep для добавления таймеров в код.

from signal import pause
from time import sleep

Создание компонентов LED, датчика движения и кнопки

После импорта необходимых библиотек мы создаём объекты gpiozero для обращения к нашим электронным компонентам. Светодиод подключён к GPIO 14, кнопка — к GPIO 4, а датчик движения — к GPIO 18. Если вы используете другие GPIO, измените код соответственно.

#create objects to refer to the LED, the button, and the PIR sensor
led_status = LED(14)
button = Button(4)
pir = MotionSensor(18)

Если вы хотите более подробно узнать, как использовать эти компоненты, ознакомьтесь с руководствами ниже:

Email отправителя и получателя

Далее вы создаёте переменные для email-адреса отправителя, пароля приложения этой почты (это ПАРОЛЬ ПРИЛОЖЕНИЯ, а не пароль от email, смотрите эти инструкции), и email-адрес получателя. Как мы уже упоминали ранее, мы рекомендуем использовать учётную запись электронной почты, которая не является вашей основной, для отправки писем.

#replace the next three lines with your credentials
from_email_addr = "REPLACE_WITH_SENDER_EMAIL_ADDRESS"
from_email_password = "REPLACE_WITH_SENDER_APP_PASSWORD"
to_email_addr = "REPLACE_WIH_RECIPIENT_EMAIL_ADDRESS"

Тема и тело письма

Переменные email_subject и email_body, как следует из названий, сохраняют тему и тело письма. Вы можете изменить содержимое на любое сообщение, подходящее для вашего проекта.

email_subject = "[WARNING!] Intruder Alert!"
email_body = "Motion was detected in your room!"

Управляющие переменные

Мы создаём две управляющие переменные. Переменная motion_sensor_status показывает, должен ли датчик движения быть активирован или нет (мы будем менять её нажатием кнопки). По умолчанию она установлена в False.

motion_sensor_status = False

Переменная email_sent контролирует, было ли отправлено уведомление по email несколько секунд назад.

email_sent = False

Активация датчика движения (функция)

Функция arm_motion_sensor() активирует и деактивирует датчик движения при нажатии кнопки. Она также включает и выключает светодиод, чтобы у вас была визуальная индикация того, активирован датчик движения или нет.

#arm or disarm the PIR sensor
def arm_motion_sensor():
    global email_sent
    global motion_sensor_status

    if motion_sensor_status == True:
       motion_sensor_status = False
       led_status.off()
       print("Motion Sensor OFF")
    else:
        motion_sensor_status = True
        email_sent = False
        led_status.on()
        print("Motion Sensor ON")

Отправка email (функция)

Функция send_email() отправляет электронное письмо, когда датчик обнаруживает движение, при условии, что датчик активирован и переменная email_sent равна False.

#send email when motion is detected and the PIR sensor is armed
def send_email():
    global email_sent
    global motion_sensor_status

    if(motion_sensor_status == True and email_sent == False):
        print("Motion Detected")
        #create a message object
        msg = EmailMessage()
        #set the email body
        msg.set_content(email_body)
        #set sender and recipient
        msg['From'] = from_email_addr
        msg['To'] = to_email_addr
        #set your email subject
        msg['Subject'] = email_subject
        #connect to server and send email
        #edit this line with your provider's SMTP server details
        server = smtplib.SMTP('smtp.gmail.com', 587)
        #comment out this line if your provider doesn't use TLS
        server.starttls()
        server.login(from_email_addr, from_email_password)
        server.send_message(msg)
        server.quit()
        email_sent = True
        print('Email sent')
        sleep(5)
        email_sent = False

Подробнее о настройке и отправке электронных писем с помощью Python-скрипта читайте в этом руководстве:

Назначение функций событиям

Наконец, назначаем функции событиям: функция arm_motion_sensor() вызывается при нажатии кнопки, а функция send_email() вызывается при обнаружении движения.

#assign a function that runs when the button is pressed
button.when_pressed = arm_motion_sensor

#assign a function that runs when motion is detected
pir.when_motion = send_email

Функция pause() в конце кода поддерживает работу скрипта для обнаружения событий.

pause()

Демонстрация

Сохраните ваш файл Python. Затем запустите его на Raspberry Pi. Выполните следующую команду в директории вашего файла проекта (используйте имя вашего файла):

python motion_email_notifications.py

После запуска скрипта нажмите кнопку, чтобы активировать датчик движения. Светодиод загорится.

Raspberry Pi — датчик движения с уведомлениями по email — активация датчика движения

Затем вы можете протестировать датчик, помахав рукой перед ним.

Raspberry Pi — датчик движения с уведомлениями — тестирование схемы

Через несколько секунд вы должны получить новое сообщение на свою электронную почту.

Raspberry Pi — датчик движения с уведомлениями по email — получение письма

Заключение

В этом проекте вы узнали, как использовать PIR-датчик движения для отправки уведомления по электронной почте при обнаружении движения. Вы можете запускать любые другие действия при обнаружении движения, помимо отправки email, или отправлять другие типы уведомлений, такие как сообщения WhatsApp или SMS (для этого вам потребуется использовать другие сервисы).

Например, вы можете добавить пьезозуммер в вашу охранную схему, чтобы при обнаружении движения не только отправлялось email, но и срабатывала звуковая сигнализация — библиотека gpiozero поставляется с компонентом для пьезозуммера.

Вы также можете использовать реле и фоторезистор, чтобы сделать охранный ночник, который включается только при обнаружении движения в темноте — библиотека gpiozero также поставляется с компонентом для датчика света.

Мы надеемся, что это руководство оказалось для вас полезным. Если вы хотите узнать больше об управлении электроникой с помощью Raspberry Pi, ознакомьтесь со следующими руководствами: