Датчик движения и подключение сигнализации и видеорегистрации в Home Assistant на Raspberry pi
Хочу рассказать о своем небольшом опыте работы с Home Assistant (далее – HA) на Raspberry pi и о подключении функционала видео регистрации, датчика движения и, соответственно, функции охраны дома с получением по почте снимков в случае срабатывания “охраны”.
Конечно же, одной из причин является желание понять из ваших отзывов, что же я все-таки “понаделал не так”, реализуя данный сценарий.
Есть три пути настройки вышеуказанного функционала: “без заморочек”, “короткий” и “самостоятельный”. В первом случае, вы, скачав готовый образ с сайта https://ViaMyBox.com/downloadpage для вашей Raspberry pi, можете посмотреть, как все выглядит в уже настроенном виде. Во втором случае, вы можете скачать zip с сайта или с гитхаб проекта, проинсталлировать и поставить HA docker образ через утилиту (sudovia-setup.sh), чтобы посмотреть, как все настроено. И, наконец, третий путь — настроить “все по-своему”: взять что-нибудь полезное с сайта или githab проекта, или из этого туториала. Ссылки на все в конце статьи.
Предположим, что у вас уже есть работающий Home Assistant (HA). В данной статье мы рассмотрим только аспекты формирования yaml конфигураций и описания последовательности правил и условий, приводящих к конкретному действию, в нашем случае — подключению “охраны дома” и срабатыванию скрипта, который начинает фотографировать в течение 5 секунд после срабатывания датчика движения. И в результате, Home Assistant посылает сделанные снимки по почте. Я не специалист по yaml или по созданию конфигураций для Home Assistant, но, следуя рабочим примерам, я получил рабочую конфигурацию, коей и хочу поделиться.
Все файлы, к которым мы будем обращаться, я выложу в конце статьи для более удобного рассмотрения. Я не буду здесь касаться тем работы скриптов записи видео на bash или python в данном примере. Только Home Assistant. Но если будут вопросы — Велкам!
В конечном итоге, у меня все выглядит так (красным выделил то, что мы рассмотрим в статье):
Естественно, я использую Raspberry pi в качестве платформы. И мой путь к конфигурационным файлам это /usr/share/hassio/homeassistant/ . Путь к вашим конфигурационным файлам может отличаться от моего пути. На тот момент у меня стоял Home Assistant 0.101.3. Нас будут интересовать конфигурационные файлы в этой директории: configuration.yaml и automation.yaml.
После каждого изменения данных файлов важно помнить, что надо будет проверять конфигурацию после наших изменений на наличие сделанных в ней ошибок. Это делается во вкладке Home Assistant dashboard -> Configuration -> Server Controls -> Check Config. И затем, там же делаем Reload Automations и Reload Scripts, если проверка прошла успешно. И, если есть сомнения, – Server Management restart в той же вкладке точно обновляет конфигурацию.
Подключение датчика движения HC-SR501 осуществляется к GPIO шине Raspberry pi. Необходимо правильно подключить три контактных провода к GPIO, и мы сможем использовать наш датчик в действии. Датчик имеет три контакта: питание gcc(+), ноль gnd(-), управляющий контакт (data) . Ознакомившись с описанием GPIO, я к своей малинке подключал их следующим образом. К GPIO разъему я подключил hc-sr501: pin#2 – 5.5vvcc; pin#26 (13ряд) – data контакт и pin#6 – gnd(-) датчика.
В качестве источника фото я использую либо usb камеру, либо csi камеру в связке с mjpg-streamer. Как установить и настроить mjpg-streamer на Raspberry pi, здесь мы рассматривать не будем. Примеров быстрой установки в инете много. Тем не менее, хочу сказать, что я использую данные из этого проекта https://github.com/cncjs/cncjs/wiki/Setup-Guide:-Raspberry-Pi-%7C-MJPEG-Streamer-Install-&-Setup-&-FFMpeg-Recording Там же подробно описана и инсталляция данного модуля. Или используйте любой способ, удобный вам для получения фотоснимков и видео. Ведь какой bash скрипт прикрутить к HA, в конечном счете, решать только вам.
Опишем наш датчик теперь в configuration.yaml, скажем так, через командную строку:
sudo nano /usr/share/hassio/homeassistant/configuration.yaml
хотя через notepad++ с winscp может быть и удобнее..
Опишем последовательность настроек для HC-SR501 так:
binary_sensor: - platform: rpi_gpio #name: HC-SR501 ports: 7: Sensor HC-SR501 invert_logic: false
Надо отметить, что здесь важный момент играют настройки в строках, которые описывают подключение к управляющим (data) контактам датчиков: pin#7
ports:
7: Sensor HC-SR501
В Home Assistant есть встроенный инструмент для включения функции охраны дома. Опишем его в нашем configuration.yaml, воспользовавшись описанием: https://www.home-assistant.io/integrations/manual/
alarm_control_panel: - platform: manual name: Home Alarm pending_time: 60 delay time 40 triggered: pending_time: 0 code: 1234
Данная настройка означает, что у нас есть 60 секунд для выхода из дома (по истечении этого времени включится сигнализация), и 40 секунд — для ее отключения (с паролем 1234) по возвращении домой. Почему-то уходишь всегда дольше, чем приходишь.)
Опишем теперь механизм включения и выключения фотографирования по срабатыванию датчика движения в нашем configuration.yaml (подробнее о платформе switch – command_line можно прочитать здесь https://www.home-assistant.io/integrations/switch.command_line/):
- platform: command_line switches: start_stop_motion_rec_timelapse: friendly_name: 'Record motion timelapse video' command_on: 'curl http://localhost/start_mjpgstrm.php && curl http://localhost//rec-motion-mjpg.php' command_off: 'curl http://localhost/stop_mjpgstrm.php && curl http://localhost/rec-motion-mjpg-stop.php'
Здесь мы связали команды включения command_on и выключения command_off с нашими скриптами, которые управляют записью с камеры. В данном случае, при выполнении включения command_on выполняются последовательно 2 скрипта. Это запуск mjpg-streamer и запуск записи по датчику движения. Обращение к bash скриптам идет через php файл рабочего сайта на Raspberry pi. Для этого я настроил nginx и web доступ, и при обращении через браузер в виде http://<ip адрес вашей Raspberry pi>/start_mjpgstrm.php должен выполниться наш php скрипт. Этот скрипт выполняет в данной ситуации запуск mjpg-streamer-а.
Настройку web доступа в данной статье мы здесь не рассматриваем. Однозначно, это не секьюрно, но в связи с тем, что у меня HA на docker, я столкнулся с тем, что у меня изолированная docker среда и “внешний мир” ОС я могу увидеть, обратившись через php к своему сайту. Наверное, есть куча верных решений от docker или HA гуру. Пишите, было бы интересно узнать!
Листинг данных скриптов я оставлю под статьей, не будем останавливаться на них. В этой статье я хочу проследить только формирование последовательности действий в Home Assistant.
Все это помещено в объект start_stop_motion_rec_timelapse Он и будет нашим визуальным переключателем, с помощью которого мы будем управлять записью фотографий при срабатывании датчика движения.
Визуализировать эти созданные нами объекты мы сможем в закладке Home Assistant -> Overwiew, переключив в правом верхнем углу активацию режима конфигурирования Configure UI
Предварительно перезагрузите HA в браузере во вкладке “Configuration -> Server Control” для подхватывания нашего configuration.yaml.
Далее выбираем желтый плюс внизу окна браузера, нажимаем карточку Entities и привязываем наши созданные объекты к картам.
Для нашего датчика выбираем карту sensor. Она будет выглядеть так:
Как видно на картинке, во втором поле entity вышеописанный переключатель: switch.start_stop_motion_rec_timelapse.
Он позволяет нам включать и выключать нашу запись по датчику движения, независимо от включения функции ”охраны дома”. И, в общем-то, он уже должен работать после всех вышеописанных действий.
Ну и, соответственно, alarm panel карту:
Здесь есть еще один интересный момент. Я использую Home Assistant как docker контейнер. В связи с этим, путь к нашему скрипту будет отличаться от реального пути к файлу скрипта. Ведь файловая структура внутри контейнера виртуализирована и связана с реальной файловой структурой через смонтированные docker тома. Это выглядит, например, так: Путь внутри контейнера: /config/scripts/ Путь внутри ОС: /usr/share/hassio/homeassiatnt/scripts. Так что посмотрите на настройки вашего контейнера, как настроены эти тома в поле Binds. Если HA у вас там.
sudo docker inspect homeassistant|less
При срабатывании датчика движения, в момент, когда сигнализация включена: я хочу, чтобы помимо того, что у нас начинается быстрое фотографирование (timelapse snapshots), мне приходило бы предупреждение по почте и снимок. Я распараллелил процессы. В первом фото логирование (timelapse snapshots) происходит в течение нескольких секунд после срабатывания датчика. Для этого я запускаю mjpg-streamer curl http://localhost/start_mjpgstrm.php , стартую php: сurl http://localhost/rec-motion-mjpg.php . Он, в свою очередь, запускает python script mov.py. Все описываемые файлы и связки — в конце статьи по ссылке. И еще один скрипт takeSnapshotWebcam.sh делает снимок, который я отсылаю в письме. Эти скрипты я описываю в нашем configuration.yaml так:
shell_command: #стартуем скрипт формирующий снимок для почтовой рассылки take_snapshot_webcam: '/config/scripts/takeSnapshotWebcam.sh' #стартуем наш mjpg-streamer start_mgpg_streamer: 'curl http://localhost/start_mjpgstrm.php' #останавливаем mjpg-streamer stop_mgpg_streamer: 'curl http://localhost/stop_mjpgstrm.php' #стартуем скрипт формирующий снимки в течение 5 сек start_motion_rec: 'curl http://localhost/rec-motion-mjpg.php' #останавливаем его stop_motion_rec: 'curl http://localhost/rec-motion-mjpg-stop.php'
Там же в configuration.yaml описываем наш объект для почтовой рассылки:
notify: - name: ha_sendmail platform: smtp #если почта на gmail server: smtp.gmail.com port: 587 timeout: 15 #от кого посылаем sender: user@gmail.com encryption: starttls username: user@gmail.com password: passwd #кому посылаем (можно использовать один ящик и посылать самому себе, почему бы и нет) recipient: - user@gmail.com sender_name: My Home Assistant
Важный момент! Для того чтобы наш HA смог законнектиться и посылать письма (поле sender), мы должны разрешить на gmail возможность пользоваться данным ящиком нашему HA сервису. Как это сделать — ссылка здесь: https://myaccount.google.com/lesssecureapps
И далее, описываем сам механизм автоматизации при включении сигнализации home_alarm в automation.yaml:
#первая связка действий (alias) “срабатывание по датчику, если охрана включена” - alias: 'Trigger alarm while armed away' #alias срабатывает, когда датчик в позиции “on” trigger: - platform: state entity_id: binary_sensor.sensor_hc_sr501 to: 'on' #при условии, что включен режим охраны при отсутствии людей дома “armed away” condition: - condition: state entity_id: alarm_control_panel.home_alarm state: armed_away #и после этого выполняет действие action: #Запуск mjpg-streamer (если выключен) - service: shell_command.start_mgpg_streamer #Запуск срипта, записывающего с камеры - service: shell_command.start_motion_rec #Изменение визуализации нашей карточки “Охраны дома ” на панели HA в положение “сработала сигнализация” - service: alarm_control_panel.alarm_trigger entity_id: alarm_control_panel.home_alarm
Cледующая связка условий и действий — послать консольное сообщение при выключении “охраны” и выключить наши скрипты записи по движению:
- alias: 'Send notification when alarm is Disarmed' trigger: - platform: state entity_id: alarm_control_panel.home_alarm to: 'disarmed' action: - service: shell_command.stop_mgpg_streamer - service: shell_command.stop_motion_rec - service: persistent_notification.create data: message: The alarm is Disarmed at {{ states('sensor.date_time') }}"
И, наконец, третья связка – посылаем письмо с фото:
- alias: 'Send notification when alarm triggered' trigger: - platform: state entity_id: alarm_control_panel.home_alarm to: 'triggered' action: - service: persistent_notification.create data: message: Notification when alarm triggered. Motion sensor HC-SR501 detected. - delay: seconds: 4 #запускаем наш скрипт формирования одиночного скрипта - service: script.webcam_snapshot #и обращаемся к описанному объекту в configuration.yaml: notify.ha_sendmail - service: notify.ha_sendmail data: title: 'Intruder alert' message: '{{now().strftime("%H:%M %Y-%m-%d")}}:Notification when alarm triggered. Motion sensor HC-SR501 detected.' data: images: # ссылочка на уже сделанный скриптом script.webcam_snapshot снимок - /config/camera/snapshot.jpg
Помните, что в yaml файлах важна разметка строк, и символы пробелов перед командами играют важную роль формирования блоков кода, его структуру. Проверяйте все изменения ваших yaml через Home Assistant (далее HA) Configuration -> Server Controls -> Check Config
Вроде все, и ваш Raspberry pi превращается в элегантные … если молнию не заело!)
Вот она – работающая автоматизация HA, НАстроенная своими руками! Обязательно напишите мне, что вы думаете по этому поводу!
И, если вы все-таки дочитали до конца, предлагаю обещанные ссылки:
Пойдешь направо (образ):
https://viamybox.com/downloadpage
Пойдешь прямо (zip):
https://viamybox.com/downloadpage
https://github.com/viatc/viamybox
Пойдешь налево:
https://github.com/viatc/viamybox
Конфигурационные файлы описанные здесь: configuration.yaml, automation.yaml, takeSnapshotWebcam.sh, rec-motion-mjpg.php, mov.py
Great content! Super high-quality! Keep it up! 🙂
Thanks! We will try not to disappoint)