Датчик движения и подключение сигнализации и видеорегистрации в 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://lurkmore.to/Гик

https://github.com/viatc/viamybox

Конфигурационные файлы описанные здесь: configuration.yaml, automation.yaml, takeSnapshotWebcam.sh, rec-motion-mjpg.php, mov.py

2 thoughts on “Датчик движения и подключение сигнализации и видеорегистрации в Home Assistant на Raspberry pi

Comments are closed.