Raspberry Pi: обнаружение движения с уведомлениями по электронной почте (Python)
В этом проекте вы узнаете, как отправлять уведомления по электронной почте с Raspberry Pi при обнаружении движения. Мы будем программировать Raspberry Pi с помощью Python, а для считывания данных с PIR-датчика движения будем использовать интерфейс gpiozero.
Содержание руководства
На протяжении этого руководства мы рассмотрим следующие основные темы:
Предварительные требования
Перед продолжением этого руководства проверьте следующие предварительные требования.
Ознакомьтесь с платой Raspberry Pi — если вы не знакомы с Raspberry Pi, вы можете прочитать наше :doc:`руководство по началу работы с Raspberry Pi здесь </raspberry/rnt/getting-started-with-raspberry-pi/index>`_.
Вы должны знать, как запускать и создавать файлы Python на вашем Raspberry Pi. Нам нравится программировать наш Raspberry Pi через SSH, используя расширение в VS Code. У нас есть подробное руководство по этой теме: :doc:`Программирование Raspberry Pi удалённо с помощью VS Code (Remote-SSH) </raspberry/rnt/raspberry-pi-remote-ssh-vs-code/index>`_.
Знайте, как использовать GPIO Raspberry Pi, чтобы правильно собрать схему. Прочитайте следующее руководство: :doc:`Распиновка Raspberry Pi: как использовать GPIO Raspberry Pi? </raspberry/rnt/raspberry-pi-pinout-gpios/index>`_
У нас также есть руководства по отправке электронных писем и использованию PIR-датчика движения, которые вы, возможно, захотите изучить в первую очередь:
Обзор проекта
В этом проекте мы создадим детектор движения с уведомлениями по электронной почте. Проект имеет следующие функции:
При обнаружении движения вы получите предупреждающее сообщение на свою электронную почту.
В схеме есть кнопка, с помощью которой вы можете включить/отключить датчик движения. Например, выключить его, когда вы в комнате, и включить, когда выходите.
Есть светодиод, который показывает, активен ли датчик движения (светодиод горит) или деактивирован (светодиод выключен).
Настройка учётной записи электронной почты отправителя
Мы рекомендуем создать новую учётную запись электронной почты для отправки писем на ваш основной личный email-адрес. Не используйте свою основную личную электронную почту для отправки писем через Python-скрипт. Если что-то пойдёт не так в вашем коде или если по ошибке вы сделаете слишком много запросов, вас могут заблокировать или временно отключить вашу учётную запись.
Мы будем использовать новую учётную запись Gmail.com для отправки писем, но вы можете использовать любого другого почтового провайдера. Электронная почта получателя может быть вашей личной почтой без каких-либо проблем.
Создание учётной записи отправителя
Создайте новую учётную запись электронной почты для отправки писем с помощью Python-скрипта. Если вы хотите использовать учётную запись Gmail, перейдите по этой ссылке, чтобы создать новую.
Создание пароля приложения
Вам нужно создать пароль приложения, чтобы новые устройства могли отправлять электронные письма, используя вашу учётную запись Gmail. Пароль приложения — это 16-значный код, который даёт менее защищённому приложению или устройству разрешение на доступ к вашей учётной записи Google. Узнайте больше о входе с паролями приложений здесь.
Пароль приложения можно использовать только с учётными записями, у которых включена двухэтапная аутентификация (2-step verification).
Откройте свою учётную запись Google.
В панели навигации выберите Безопасность (Security).
В разделе «Вход в Google» выберите Двухэтапная аутентификация > Начать.
Следуйте инструкциям на экране.
После включения двухэтапной аутентификации вы можете создать пароль приложения.
Откройте свою учётную запись Google.
В панели навигации выберите Безопасность (Security).
В разделе «Вход в Google» выберите Пароли приложений (App Passwords).
Если вы не находите эту опцию, используйте инструмент поиска на этой странице и найдите App passwords.
В поле «Выберите приложение» выберите mail. Для устройства выберите Other и дайте ему имя, например Raspberry Pi. Затем нажмите Generate. Появится окно с паролем, который вы будете использовать в Python-скрипте для отправки писем. Сохраните этот пароль (даже если написано, что вам не нужно его запоминать), потому что он понадобится вам позже.
Теперь у вас должен быть пароль приложения, который вы можете использовать в своём 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 |
Детектор движения с уведомлениями по 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
После запуска скрипта нажмите кнопку, чтобы активировать датчик движения. Светодиод загорится.
Затем вы можете протестировать датчик, помахав рукой перед ним.
Через несколько секунд вы должны получить новое сообщение на свою электронную почту.
Заключение
В этом проекте вы узнали, как использовать PIR-датчик движения для отправки уведомления по электронной почте при обнаружении движения. Вы можете запускать любые другие действия при обнаружении движения, помимо отправки email, или отправлять другие типы уведомлений, такие как сообщения WhatsApp или SMS (для этого вам потребуется использовать другие сервисы).
Например, вы можете добавить пьезозуммер в вашу охранную схему, чтобы при обнаружении движения не только отправлялось email, но и срабатывала звуковая сигнализация — библиотека gpiozero поставляется с компонентом для пьезозуммера.
Вы также можете использовать реле и фоторезистор, чтобы сделать охранный ночник, который включается только при обнаружении движения в темноте — библиотека gpiozero также поставляется с компонентом для датчика света.
Мы надеемся, что это руководство оказалось для вас полезным. Если вы хотите узнать больше об управлении электроникой с помощью Raspberry Pi, ознакомьтесь со следующими руководствами: