DIY кнопка вызова v.3 (Видеофон для Умного Дома)
В этой статье пойдет речь о организации автоматического установления видео и аудио связи используя систему домашней автоматизации «Умный дом» MajorDoMo, проект Zigbee2mqtt и SIP телефонию на базе SIP сервера FreeSWITCH.
Решение возможно использовать в различных домашних (DIY) системах контроля доступа, телефонии, домофонии и т.д., в общем, где требуется осуществление вызова на телефон по внешнему воздействию (нажатию кнопки).
Лично у меня, некоторое время назад, лет пять и больше, у была необходимость организации простой связи с человеком, который некоторое время физически не может пользоваться телефоном (после инсульта + пожилой человек). На тот момент полноценно я не смог реализовать эту задачу.
Сейчас, решил попробовать повторить и посмотреть, что поменялось за это время. Ситуация особо не изменилась: как и раньше, нет лёгких решений да и готовых устройств я особо не заметил.
Немного о постановке задачи:
В процессе работы над проектом мои требования к нему изменились, но главная задача осталась.
Есть два абонента:
абонент А (номер 1000) — находится в пределах своей локальной сети и требует организации связи;
абонент Б (номер 1019) — может находиться как в локальной сети, так и вне её.
Главная функция системы — автоматическое установление видео или аудио соединения после нажатия беспроводной кнопки абонентом А. Со стороны абонента А используется устройство терминал с видеокамерой (смартфон, планшет, ПК). При необходимости, возможность подключения громкой связи не помешает.
Со стороны абонента Б используется смартфон, подключённый к домашней сети или интернету.
Вторая функция — звонок на «Умный дом» и автоматическая организация соединения с установкой разговора или видеотрансляции из помещения без каких-либо действий со стороны вызываемого абонента.
Этот функционал может пригодиться и в других решениях, например, для самодельного контроля доступа или организации небольшого видеонаблюдения.
Решение сделано и проверено на одноплатном компьютере Raspberry Pi 3B с установленной системой домашней автоматизации MajorDoMo, SIP сервером FreeSWITCH и использованием zigbee2mqtt (в качестве координатора я использую для тестов старенький USB Zigbee стик CC2501).
Нам понадобится одноплатный или ПК компьютер (можно не самой топовой конфигурации), под операционной системой Debian, я б рекомендовал 11 или 12, USB-Zigbee стик предварительно прошитый для использования сервиса zigbee2mqtt и сама zigbee кнопка, я использовал Xiaomi WXKG01LM.
Установка и настройка SIP сервера FreeSWITCH
Первое действие после установки Операционной системы: устанавливаем и производим первоначальную настройку SIP сервера FreeSWITCH.
Подробно я описывал в публикации про «Умный Дом» и IVR меню.
Вкратце, регистрируемся на сайте разработчика signaware, получаем токен, устанавливаем из репозитория, немного правим некоторые файлы конфигурации:
Ссылка на официальную документацию по установке FreeSWITCH на Raspberry Pi
Все действия выполняются от sudo.
Файл подключаемых модулей:
sudo nano /etc/freeswitch/autoload_configs/modules.conf.xml
Настройка модуля xml_rpc.conf, задается порт, пользователь, пароль. Я изменил только порт т.к. порт по умолчанию 8080 бывает часто занят, например службой zigbee2mqtt, имя пользователя и пароль — оставил по умолчанию,
sudo nano /etc/freeswitch/autoload_configs/xml_rpc.conf.xml
Изменим файл с глобальными переменными:
sudo nano /etc/freeswitch/vars.xml
В файлах внутреннего и внешнего SIP профиля устанавливаем функцию auto-nat»: FreeSWITCH будет использовать uPNP или NAT-PMP, чтобы найти нужный публичный IP-адрес
sudo nano /etc/freeswitch/sip_profiles/internal.xml
sudo nano /etc/freeswitch/sip_profiles/external.xml
Также исправим расположение директории с голосовыми файлами
sudo nano /etc/freeswitch/lang/ru/ru.xml
После правки файлов конфигураций и перезагрузки FreeSWITCH, наш SIP сервер готов для использования в домашней сети.
Протестируем его и возможность организации видеозвонков. По умолчанию у нас есть 20 абонентов с нумерацией 1000–1019. Внутренний номер абонента А — 1000.
Для тестирования я использовал два варианта:
Первый вариант: используется два смартфона как на стороне абонента А, так и у абонента Б. На обоих смартфонах установлено приложение SIP клиент для Android Linphone.
Второй вариант: на стороне абонента А ПК (ноутбук) под ОС Windows 10/11 с установленным SIP клиентом MicroSIP (также использовал десктопный клиент Linphone, но мне он не очень понравился). У второго абонента — Linphone на смартфоне. Возможно использования ПК в качестве терминала, вполне подходящий рабочий вариант, для первоначальной цели — обеспечение связи и контроля, т.к. экран побольше, можно подключить внешнюю USB камеру и гибко регулировать разные настройки: зону охвата видео, качество видео, настройки звука и микрофона и прочее).
Настройка SIP клиентов
Замечу, самое сложное и неоднозначное в решении, оказалось настройка именно SIP клиентов. Из всех протестированных мною приложений под Android, только Linphone удовлетворял моим требованиям к решению: бесплатная ПО, поддержка видео, возможность использования видео как звонка по умолчанию и функция автоответа.
Под Windows мне более подошел MicroSIP, Linphone в качестве терминала на Windows мне не очень понравился.
Настройка SIP клиента Linphone на Android:
Запускаем помощник, выбираем использовать SIP аккаунт.
Вводим свой номер (из диапазона 1000–1019), пароль (при настройке SIP сервера установили пароль по умолчанию для всех аккаунтов 1111, домен — адрес SIP сервера и вид транспорта — UDP.
Создание и настройки SIP аккаунта в приложении MicroSIP.
В SIP клиенте на стороне Абонента А включён приём видео и автоответ с небольшой задержкой (без задержки передача видео могла и не начаться, соединение устанавливается голос и видео отсутствует, с задержкой таких проблем не было).
На стороне абонента Б автоответ не включаем, не нужен он там. После ввода номера при звонке имеется возможность выбора простой аудио звонок будет или видео.
Перейдём к следующему шагу.
Возможность внешнего управления (набора номера).
В самом начале публикации, в файле загружаемых модулей FreeSWITCH, мы подключили модуль xml.rpc и немного его настроили.
Проведя тестовые наборы, как простого звонка, так и видео. Всё должно работать и соединяться. Но цель — не просто в установке соединения, а управление без прямого физического воздействия на SIP телефон абонента А.
Наберём в адресной строке браузера следующий адрес (подставив свой IP адрес в своей локальной сети, экранируя служебные символы, в том числе и символ пробела — %20):
http:// freeswitch:works@192.168.1.115:9090/webapi/originate?user/1000%201011%20XML%20default
Или же эта же команда для консоли Linux:
curl "http://freeswitch:works@192.168.1.115:9090/webapi/originate?user/1000%201019%20XML%20default"
Получаем следующее: SIP сервер инициирует звонок первоначально на номер 1000 (Абонент А), SIP клиент настроен на передачу видео и автоответ. Следующий этап после поднятия трубки — звонок идёт на второе плечо (абонент Б с номером 1019), после ответа пользователя — устанавливается соединение.
Установка и настройка MajorDoMo и сервиса zigbee2mqtt
Самый простой и быстрой способ установки на linux устройства — установка с помощью скрипта от автора MajodDoMo, подробно я описывал в публикации Просто о сложном. MajorDoMo и контроль входного замка. Начало, за некоторое время добавились некоторые небольшие функции.
Пошагово, получается так: устанавливаем с помощью скрипта как систему MajorDoMo, так и, указав в опциях системный сервис zigbee2mqtt. После установки, подключаем zigbee стик, определяем на каком порту определился и при необходимости корректируем файл конфигурации zigbee2mqtt.
sudo nano /opt/zigbee2mqtt/data/configuration.yaml
В веб-интерфейсе zigbee2mqtt (или в файле конфигурации), доступном по адресу нашего сервера c указанием порта 8080, включаем разрешение на подключение устройств. Добавляем в систему z2m устройство — беспроводную кнопку, запустив на устройстве процесс сопряжения.
Первоначальный вид интерфейса zigbee2mqtt после установки:
Вид сервиса после добавления устройства:
Настраиваем модуль системы домашней автоматизации ZigbeeDev примеры скриншота настроек и окна модуля с устройством zigbee).
Если всё правильно сделано, в системе домашней автоматизации увидим:
Создаем простое устройство, можно из Панель Управления — Простые Устройства — Добавить, можно прямо из модуля zigbeeDev:
В типе устройства указываем Клавиша, означает — запуск действия (в отличии от выключателя) и прописываем строку с командой на выполнение вызова. Эта кнопка имеет несколько вариантов нажатия: простое, двойное удержание и т.д. Используем параметр action — при любом действии будет выполняться запрограммированная команда.
В настройке Простого Устройства во вкладке Действия — Метод Logic Achion вводим свой код команды. Для системы MajorDoMo команда будет выглядеть так:
GetURL("http://freeswitch:works@192.168.1.115:9090/webapi/originate?user/1000%201019%20XML%20default")
Сохраняем и проверяем. При любом нажатии кнопки (простом, двойном, удерживание и т.д.) у нас идёт вызов с номера 1000 на телефон абонента Б. При обратном звонке — срабатывает функция автоответа на абонента А (в этом случае установка соединения не задействует функции сервера Умного Дома).
Подключение к внешнему миру.
Для тестов, я использовал, уже ушедшего с региона РФ и РБ SIP провайдера Zadarma. Связь и старые аккаунты — работают. Через VPN или другими средствами, изменив свою локацию, можно и сейчас зарегистрироваться и выполнять бесплатные вызовы в сети оператора, но использование платных функций (звонки на другие сети, ВАТС и т.д.) затруднительно.
К сожалению, с подключением к официально работающим SIP провайдером у меня возникли некоторые организационные затруднения, впрочем, которые при желании вполне можно решить. Отмечу пару понравившихся с первого взгляда операторов: Novofon, Sipnet. Рекомендую всё таки компании легально оказывающие услуги на вашей территории.
Подключения к внешнему миру понадобится или как минимум 2 аккаунта одного SIP оператора или ВАТС (виртуальная АТС) с несколькими номерами.
На примере Zadarma рассмотрим подключение с двумя аккаунтам, один будет использоваться для SIP сервера (абонента А) в качестве внешней линии, второй для абонента Б на мобильном устройстве.
Создаем файл /etc/freeswitch/sip_profiles/external/sipoperator.xml (данные номера абонента А и адреса указываем полученные при регистрации/оформлении услуги).
sudo -u freeswitch nano /etc/freeswitch/sip_profiles/external/sipoperator.xml
Создаём файл с настройками диалплана /etc/freeswitch/dialplan/sipoperator.xml (все звонки с номера А поступают на внутренний номер 1000, все шестизначные номера отправляются в сторону sip оператора)
sudo -u freeswitch nano /etc/freeswitch/dialplan/sipoperator.xml
Создаем в Freeswitch внутренний номер 1000 к которому будет подключаться софтфон абонента А для приема входящих и совершения исходящих звонков. Корректируем файл /etc/freeswitch/directory/default/1000.xml
sudo nano /etc/freeswitch/directory/default/1000.xml
Перезапускаем в командной строке терминала сервис SIP сервера.
sudo systemctl restart freeswitch.service
Настраиваем свой SIP клиент на работу с сетью оператора, в приложении Linphone возможно одновременное использование нескольких аккаунтов.
Команда для системы автоматизации при подключении к внешней сети будет иметь следующий вид (ХХХХХХ — номер абонента Б):
GetURL("http://freeswitch:works@192.168.1.115:9090/webapi/originate?user/1000%20ХХХХХХ%20XML%20public")
Проверяем, всё должно заработать.
Отмечу, имеется возможность некорректной работы установки звонков, из-за использования в сети провайдеров передачи данных технологии NAT. Проявляться может в одностороннем соединении, здесь уже лучше обращаться в тех поддержку SIP оператора или провайдера и использовать в приложениях, настройках SIP сервера FreeSWITCH, адреса STUN/TURN серверов. Проверил на 3 разных сетях (два с симметричным NAT, у провайдера передачи данных и оператора мобильной сети, одна сеть с одинарным NAT) и только на одной возникла проблема. Решение было довольно простое — отключил в маршрутизаторе Huawei функцию SIP ALG.
Дополнение в качестве заключения:
Ну, а дальше систему можно усовершенствовать довольно много: можно прикрутить голосовое управление (например Алисой и умной колонкой), можно используя функции originate осуществлять вызов на несколько терминалов (отправлять в конференцию), производить запись звонков или на сторонах клиентов или на самом SIP сервере, оптимизировать работу как SIP сервера, так и системы домашней автоматизации и т.д.
Второе дополнение:
Понимаю, что у некоторых пользователей, может вызвать затруднение использование Linux и серверного ПО, для отладки и тестирования возможна установка основных компонентов и на Windows системы: сервер SIP телефонии FreeSWITCH, сервис Zigbee2mqtt так и системы автоматизации MajorDoMo (её я б рекомендовал бы в качестве тестовой устанавливать с пакетом XAMPP) имеют возможность установки на Windows. Хотя навряд ли, без хорошего знания используемой операционной системы, это решение будет стабильным, но в качестве тестов или необходимости быстрого развёртывания решения вполне может иметь место и кому-то будет легче и быстрее пойти таким путём.