Cтримим и кaстим youtube и не только.. через Raspberry pi c Gotubecast и KODI TubeCast

Насколько сложно передавать youtube музыку или видео через телефон или другие портативные, мобильные устройства на вашу Raspberry pi? А если не портативные? А просто управлять медиа контентом через Windows или Linux PC?

Оказывается, что не сложно. Я хочу рассмотреть установку и настройку нескольких приложений на вашу малинку с помощью которых мы можем это сделать.

Как это работает!

Будем предполагать, что стриминг в данной ситуации — это процесс передачи какого-либо медиа контента, который находится где-то на сайтах в интернете. Или, допустим, на локальном сервере с нашей медиа библиотекой для проигрывания оного на Raspberry pi. А кастинг, в свою очередь, от слова “cast”, когда мы “перекидываем управление” медиа контентом какого-либо внешнего устройства на наш телевизор. А точнее, — на нашу Raspberry pi. Ее подключаем к телевизору или музыкальному центру. В данной ситуации, через мобильный, запустив ваше youtube приложение, мы перенаправляем вывод видео или музыки через нашу малинку на телевизор. Не забудьте подключить вашу Raspberry pi к телевизору через HDMI.

Есть два варианта рассмотреть  эти приложения. Первый вариант: мы все настроили в нашем проекте ViaMyBox. Вы можете не утруждать себя различными нюансами настройки linux в данном варианте raspbian buster и скачать дистрибутив https://viamybox.com/downloadpage/ или напрямую с Raspberry pi из репозитория:

cd /home/pi
git clone https://github.com/viatc/viamybox.git

и запустить скрипт -> Home Theatre -> Cast youtube :

sudo /home/pi/viamybox/scripts/via-setup.sh

Ну или настройте все сами так, как нравится только вам, следуя примерам ниже. Я не буду сравнивать и описывать подробно функционал в данной статье данных приложений, а просто поделюсь опытом настройки и установки и нюансами, с которыми я столкнулся.

Встречаем! Gotubecast

Страница проекта:

https://github.com/CBiX/gotubecast

Gotubecast представляет собой небольшую программу, чтобы сделать свой собственный ТВ-плеер на YouTube. Другими словами, запустив на Rasberry pi gotubecast , мы сможем через youtube приложение телефона или других устройств подключиться к Raspberry pi и запустить youtube ролик на телевизоре.

Но для того чтобы это произошло, потребуется сделать несколько действий для этого.
Данная программа написана на Go. Поэтому надо его установить:

cd /home/pi
#скачаем версию
wget https://dl.google.com/go/go1.13.7.linux-armv6l.tar.gz
#разархивируем ее
sudo tar -C /usr/local/ -xvzf go1.13.7.linux-armv6l.tar.gz
#создадим папку для нашего проекта
mkdir -p projects/{src,pkg,bin}
#отредактируем наш
nano /home/pi/.profile

И запишем в него наши переменные окружения:

export PATH=$PATH:/usr/local/go/bin
export GOBIN="$HOME/projects/bin"
export GOPATH="$HOME/projects/src"
export GOROOT="/usr/local/go"

…..
Проверяем этот пакет:

go version

Затем установим наш gotubecast:

cd /home/pi
go get github.com/CBiX/gotubecast

В проекте, который находится в нашей созданной папке /home/pi/projects/src/src/github.com/CBiX/gotubecast/examples автор предусмотрительно написал скипт raspi.sh для raspberry, упрощающий запуск gotubecast.
Запускаем его и вот уже магия близко..

cd /home/pi/projects/src/src/github.com/CBiX/gotubecast/examples
./raspi.sh

После запуска скрипта мы увидим строку, что-то типа
Your pairing code: 901-900-123-183
Она позволит нам найти наш телевизор через телефон. Затем, идем в приложение youtube application в телефоне и далее через иконку аккаунта в настройки -> просмотр телевизора и вбиваем наш код. После этого появляется иконка, через которую и будет доступен просмотр youtube через нашу Raspberry pi.


Но телевизор может теряться в случае отсутствия связки Raspberry pi с google приложением длительное время и т.п. И потому, помимо pairing code, есть возможность привязать “навсегда” ваш телевизор к вашему google приложению с помощью Screen Id.
Сгенерируем его на нашей Raspberry pi:

wget https://www.youtube.com/api/lounge/pairing/generate_screen_id
cat generate_screen_id

И добавим его в файлик

nano /home/pi/projects/src/src/github.com/CBiX/gotubecast/examples/raspi.sh

в переменную на следующей строке :
export SCREEN_ID=”aauaju8Example5539vbb”

Чтобы запускать все это сразу при старте, сделайте себе маленький сервис-демон в папке:

sudo nano /lib/systemd/system/gotubecast.service

и в нем:

[Unit]
Description=Cast youtube
Wants=network-online.target
After=network.target network-online.target

[Service]
Type=simple
ExecStart=/bin/bash /home/pi/projects/src/src/github.com/CBiX/gotubecast/examples/raspi.sh
Restart=on-abort
User=pi
Group=pi

[Install]
WantedBy=multi-user.target

Далее, инициализируем его в системе :

systemctl enable gotubecast.service

И он будет запускаться при старте системы. Как выяснилось, демон, запускаясь, в случае отсутствия сети падает. Точнее, raspi.sh не находит сеть. Можно через sudo raspi-config.sh сделать настройку ожидания сервисами сети. Но вообще-то приятнее, когда загрузка raspbian происходит быстро). Поэтому, пусть скрипт сам проверяет сеть. Добавьте проверочку-ожидание в файл raspi.sh:

while ! ping -q -c 1 8.8.8.8 >/dev/null ; do sleep 1; done

скопируем gotubecast в папочку для наших исполняемых файлов

sudo cp /home/pi/projects/bin/gotubecast /usr/bin/

И все готово)

Да, если вы не линуксоид и у вас рябит в глазах от команд, я автоматизировал весь вышеописанный процесс в скрипте, и это выглядит так:



Чтобы им воспользоваться скачайте проект через сайт или через github:

git clone https://github.com/viatc/viamybox.git

и запустите скрипт /home/pi/viamybox/scripts/via-setup.sh и перейдите в меню Home theatre:

cd /home/pi
git clone https://github.com/viatc/viamybox.git
sudo /home/pi/viamybox/scripts/via-setup.sh

проверено на Raspbian Buster OS

Запускаем Youtube через KODI

Если у вас стоит KODI, то запустить youtube ролик через него гораздо проще. Собственно, для этого потребуется просто установить плагин TubeCast. Из плюсов данный плагин kodi не требует первоначальной настройки и плагин прекрасно “видит” нашу Raspberry pi и без забивания pairing code вручную.



И после установки плагина вы сразу увидите cast иконку на вашем andriod youtube application или на youtube страничке в браузере.

Из описания следует, что это — реализация Сast V1 протокола для Youtube мобильных приложений. В свою очередь, данный протокол основан на DIAL протоколе через SSDP. Данная технология позволяет подключится к вашему youtube каналу как внешнему сервису через интернет. Таким образом, это позволяет найти ваше устройство с KODI на борту. Причем, даже не будучи в одной сети с ним. Просто обновите свой pairing code на транслирующем устройстве. В результате, мы связываем два устройства и передаем управление через одно устройство к другому, но не сам медиа контент. Поэтому, и передающее и принимающее устройство  (в данном случае — наша Raspberry pi) должно быть в интернете.

Надеюсь, было интересно. Если так, пишите коменты!
В следующей части я хотел бы рассказать о том, как проигрывать youtube и другой медиа контент из консольного терминала медиакомбайнами mps-youtube и straw-viewer и raspicast.

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