Pull to refresh

Простой способ создания голосового оповещения в системе Домашней автоматизации («Умный дом»)

Reading time 4 min
Views 11K
Протестировав консольный SIP клиент Linphonec, увидел в нём возможность простого и быстрого способа реализации оповещения голосом на мобильный телефон, для домашней системы автоматизации.

Думаю данный способ подойдёт для многих DIY систем автоматизации своего дома, приведу свой вариант.

Имею систему автоматизации «Умный дом» MajorDoMo, которая установлена на одноплатный компьютер Raspberry Pi (под управлением ОС Raspbian (Debian 9).

Создадим возможность оповещения от MajorDoMo к смартфону без использования дополнительного оборудования и своего VoIP сервера.

Краткий принцип действия оповещения: в случае критичной аварии (перечень аварий каждый может определить для себя свой), система автоматизации управляет консольным VoIP клиентом и вызывает хозяина по SIP протоколу, после ответа проигрывает ранее записанный звуковой файл с сообщением об аварии.

Первым делом нам понадобится два аккаунта от SIP провайдера с бесплатными входящими/исходящими внутри сети. Для примера возьмем сервис облачной телефонии Zadarma.com.

Первый шаг: производим регистрацию, у провайдера, при этом получаем доступ к личному кабинету и свой аккаунт SIP. Можем зарегистрироваться с нескольких почтовых ящиков, а можем пополнить счет и получить дополнительные номера. В любом случае у нас должно быть 2 номера (аккаунта) и пароля к нему.

На смартфоне (у меня работает под ОС Androd) из маркета устанавливаем мобильное приложение, подойдёт любой SIP клиент. Для удобства и минимизации первоначальных настроек, можем использовать фирменное приложение для звонков Zadarma, а можем более функциональное.
После установки, производим регистрацию, указав свой номер и пароль к нему, на этом настройка смартфона окончена. Итак мы задействовали один номер.

На сервере домашней автоматизации Raspberry, нам потребуется терминальный SIP клиент Linphonec. При установке из репозитория Raspbian устанавливается довольно старая версия 3.6.1, которая не совсем корректно не работает с звуковой системой ALSA, но так как использовать напрямую голос нет необходимости, пойдём по легкому пути.

Установку актуальной версии пакета Linphone (3.12.0) без графического интерфейса для Debian 9, я описывал в прошлой статье: DIY кнопка вызова. Raspberry Pi, MajorDoMo, Freeswitch и Linphonec. Там же можно найти информацию по установке USB звуковой карты и настройки звука для Raspberry Pi.

В терминале выполняем следующую команду:

sudo apt-get install linphone-nogtk

Производиться установка утилиты консольного клиента linphonec и linphonecsh — консольная программа для управления работающей в фоновом режиме linphonec в директорию /usr/bin.
Произведем первый запуск набрав:

linphonec

Запускаем его, SIP клиент ругается на ALSA, не обращаем на это внимания.

Выполняем команду регистрации клиента (Linphonec) на сервере zadarma, указываем свой второй номер и пароль:

register sip:xxxxxx@sip.zadarma.com sip.zadarma.com PASSWORD

Если ввод произведён правильно, то видим ответ о успешной регистрации:

image

Выходим из клиента (Ctrl+c, при этом клиент сохраняет настройки в файл .linphonerc текущего пользователя, в моем случае, директорию /home/pi/. При следующем запуске SIP клиент автоматически регистрируется на сервере провайдера.

Делаем запись голосового сообщения (например: «Внимание системы была перезагружена, сейчас состояние в работе»:

arecord -D plughw:1,0 -f cd /home/pi/alarm_restart.wav

Для запуска и управления Linphonec в режиме демона, используется утилита Linphonecsh. Первоначально при запуске необходима инициализация клиента linphonecsh -init. При выполнении этой команды происходит запуск консольного клиента, без загрузки конфигурационного файла.

Чтобы при запуске выполнялось чтение конфигурации запустим с флагом с:

 linphonecsh init -c /home/pi/.linphonerc

Сейчас можем управлять консольным клиентом из терминала.

Список команд Linphonecsh
Usage:
linphonecsh <action> [arguments]
where action is one of
	init		: spawn a linphonec daemon (first step to make other actions)
			followed by the arguments sent to linphonec
	generic		: sends a generic command to the running linphonec daemon
			followed by the generic command surrounded by quotes,
			 for example "call sip:joe@example.net"
	register	: register; arguments are 
			--host <host>
			--username <username>
			--password <password>
	unregister	: unregister
	dial		: dial <sip uri or number>
	status		: can be 'status register', 'status autoanswer' or 'status hook'
	soundcard	: can be 'soundcard capture', 'soundcard playback', 'soundcard ring',
			 followed by an optional number representing the index of the soundcard,
			 in which case the soundcard is set instead of just read.
	exit		: make the linphonec daemon to exit.



Попробуем выполнить следующие команды:

linphonecsh generic 'soundcard use files'

linphonecsh generic 'play alarm.wav'

linphonecsh dial sip:ХХХХХ@sip.zadarma.com 

Где generic — команды самой программы Linphonec. ХХХХХ — наш SIP номер, установленный на смартфон.

При этом происходит вызов, при ответе — слышно проигрывание записанного ранее файла с аварией.

Вручную всё заработало. Для интеграции с системой домашней автоматизации на основе MajorDoMo, для примера, возьмём аварийную ситуацию с перезапуском сервера.
Прописываем следующую строку в crontab (при загрузке ПК, загружается консольный клиент:

crontab -e

@reboot sudo -u pi linphonecsh init -c /home/pi/.linphonerc

Далее переходим на web страницу системы УД, переходим в Панель Управления — Сценарии — События — Startup..



Сценарии реализуются на языке программирования PHP. В коде уже есть одна строчка, которая при запуске системы произносит фразу с IP адресом сервера.

Добавим еще несколько:

exec ("sudo -u pi linphonecsh generic 'soundcard use files'");

exec ("sudo -u pi linphonecsh generic 'play alarm.wav'");

exec ("sudo -u pi linphonecsh dial sip:576935@sip.zadarma.com ");

Устанавливаем выполнить после сохранения, сохраняем, при этом происходит вызов на мобильный телефон.

Выполняем перезагрузку системы MajorDoMo, через Сервис — Перезагрузка/отключение.
После перезагрузки на телефон поступает голосовое уведомление. Такой же алгоритм действий можно сделать для другой критичной для вас аварии.

Немного изменив последовательность действий, можно установить в свою систему домашней автоматизации собственный сервер IP телефонии (Asterisk, Freeswitch и т.д.), подключить к нему VoIP шлюз и напрямую выходить на мобильного оператора или ТфОП. Этот вариант более функциональнее, имеет больше возможностей, но и требует несколько больших затрат, как материальных, так и для настройки системы.
Tags:
Hubs:
+6
Comments 10
Comments Comments 10

Articles