Добрый день, читатели Хабра!

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

Постановка задачи довольно простая: при открытии замка и в случае его не закрытия, через 3 минуты локально уведомлять посредством голосового сообщения через аудиовыход сервера Умного Дома и отправка на голосовые терминалы (в т.ч. и Яндекс станции). В случае, если замок так и не закрыт, то ещё через 2 минуты оповестить простым звонком на телефон с проигрыванием сообщения. Немного усложнил для себя задачу – без всякого стороннего вмешательство в работу телефона (установки дополнительных программ и приложений, глобальных перенастроек смартфона).
Публикация является продолжением моей предыдущей статьи. В ней немного затронем общую информацию о системе домашней автоматизации MajorDoMo, настройках, и создании автоматизаций (сценариев), а так же уведомлений и сообщений «Умного Дома»,
Во второй части, научим систему «Умного Дома» оповещать о критическом событии звонком на телефон (к примеру мобильный). Данную часть, думаю можно реализовать не только в MajorDoMo, но и в любой открытой системе «Умного Дома».

Напомню, в прошлой статье (Просто о сложном. MajorDoMo и контроль входного замка. Начало) мы установили с помощью скрипта домашнюю автоматизация на Raspberry Pi 3B, так же был установлен сервис zigbee2mqtt для локального подключения устройств zigbee и синтезатор голоса RHVoice. Создали и подключили первое устройство: датчик открытия дверей и окон Xiaomi MiJia Door and Window Sensor, а также несколько его модернизировали для работы в качестве датчика контроля замка.
Установку перепроверил на текущий момент (май месяц 2024), устанавливал на Raspberry Pi OS Lite Debian version: 12 (bookworm) 32-bit, с момента написания прошлой статьи появились некоторые новые нужные опции, также установка может производиться не только на устройства с Raspbian OS, но и другие работающие компьютеры на ОС Debian и Ubuntu последних версий.
Итак: у нас есть простое устройство Датчик открытия замка — немного модернизированный датчик открытия дверей и окон Xiaomi MiJia Door and Window Sensor. После его модернизации, из коробки домашней системы он отображает свое состояние только в Web интерфейсе MajorDoMo.



Научим наш «Умный дом» уведомлять голосом об открытии замка.
При установке в системе имеется единственный терминал сервера УД, MAIN, текстовая и голосовая информация о событиях в первую очередь появляется в нём. По умолчанию этот терминал настроен на получение всех сообщений и воспроизведения как на главной странице УД MajorDoMo, так и на выходе аудио разъёма Audio 3,5.
Проверим его настройки Панель Управления – Настройки – Терминалы и открываем редактирование:



Можно ничего не менять, единственное отмечу (на что в дальнейшем стоит обратить внимание): параметр МУВС (минимальный уровень важности сообщений), при отсутствии значения — проговаривает все сообщения, при установке значения, будет игнорировать сообщения с меньшим уровнем важности).
В MajorDoMo есть несколько вариантов программирования устройств (автоматизаций). Начнем с самого простого, в разделе Устройства – Простые Устройства можем в настройках указать тип устройства, сообщения при открытии/закрытии.



Так же в разделе настроек, в пункте «Связанные устройства» – сделать простейшие автоматизации (включить/выключить другое умное устройство, к примеру свет в прихожей и т.д.).



Более расширенный способ автоматизации – использование методов устройства или же создание своего сценария при определенном условии/действии.
Перейдём на вкладку действия и выберем метод Status updated event (метод срабатывает при каждом изменении статуса устройства), допустим при переходе нашего датчика из состояния «открыто» в «закрыто» и наоборот.



Программировать, можно используя написание кода (на PHP), либо используя Blockly, кому то, возможно, этот вариант более нагляднее и проще (почти как в детском языке программирования Scratch).
С помощью блоков будет сделан небольшой сценарий: при обновлении статуса устройства, если замок в состоянии Закрыт, то ничего не делаем, если же он наоборот открыт, запускаем таймер с именем zamok_timer, который по истечении 180 секунд, произносит фразу «Дверь открыли 3 минуты назад, Замок не закрыт».



Как уже писал выше, проговаривание идёт через выход Audio 3,5 сервера «Умного Дома» (напомню, у меня малинка Raspberry 3 B). Для синтеза речи, используется сервис TTS RHVoice и настройки соответствующего модуля в системе домашней автоматизации MajorDoMo.
Итак самая первая и простая сделана сделана.

Частичная интеграция «Яндекс.Станции» в MajorDoMo


В качестве терминала, довольно часто используют Умные колонки или голосовых помощников.
Для отправки сообщений на «Яндекс.Станцию» можно использовать модуль YaDevice. Рекомендую назначить на роутере статический адрес для колонки.
Устанавливаем этот модуль из Маркета Дополнений – Оборудование – YaDevices.

Модуль осуществляет взаимодействие с устройствами Умного Дома через облако Яндекс, а так же использование Яндекс.Станции в качестве терминала (синтез речи и управление).



Самое главное, добиться авторизации в этом модуле, осуществить которую, как видно, на скрине, можно несколькими способами.



После авторизации можем и настроить озвучивание событий на колонке.
Как немного выше писал, обращаем внимание на параметр Мин. уровень важности. Установим его в значение 5 (всё что ниже значения — игнорируется). С помощью команд на странице модуля проверяем озвучивание.



Сейчас создадим сценарий, с использованием отправки уведомлений как на главный сервер, так и на другие терминалы в т.ч. и Яндекс станции. Сделаем его уже через код PHP.
Из раздела Панель Управления – Объекты – Сценарии создаём новый сценарий, даём ему название и включаем в выбранную категорию.




Код сценария:
Код сценария:
//Проверка замка
echo gg("Openclose01.status");
$open=gg("Openclose01.status");
echo $open;
if ($open==1) 
{sayto("Дверь закрыта",2,"MAIN");}
else 
{say("дверь открыта, закройте ее",5,);}



Отметим «Выполнять периодически», выберем время действия и добавим нужные нам дни недели (я отметил все).
В итоге, получаем: каждый день в 22 часа запускается проверка состояния замка, в случае если он закрыт на главный терминал сервера и в историю сообщений посылаем сообщение «Дверь закрыта», если же дверь не закрыта, то на все терминалы в том числе и на Яндекс станцию, УД проговаривает напоминание, что дверь открыта.

В качестве терминалов также могут быть использованы устройства на Android: телефон/планшет и прочее (как дело обстоит на Apple честно сказать, я не знаю, не пользуюсь этим производителем) с установленным приложением MajorDroid (точнее их официальных два: — первое приложение, уже давно работающий MajorDroid Official , Второе – совсем недавно вышедший, находящийся в стадии активной разработки MajorDroid NG , есть ещё несколько приложений, разработанные сообществом.

Первую часть можно сказать сделали, но в данном случае, она работает только в локальной сети. Для внешнего контроля и управления можно использовать разные варианты, их довольно много это и использование сервиса MajorDoMo Connect, модуля Telegramm и соответствующего мессенджера, и настройка сети с использованием белого статического адреса и пробросом портов, использование VPN и т.д.
Вторая часть публикации, про удаленное оповещение будет немного очень сильно распространённой.

Использование оповещения на мобильный телефон с проигрыванием голосового сообщения посредством простого телефонного звонка.


Рассмотрим два варианта использования оповещения. Оба используют технологию IP телефонии по протоколу SIP.
Первый способ:
Создание оповещения с использованием внешнего стороннего SIP сервера (провайдером IP телефонии), в качестве примера использовал довольно известный сервис IP телефонии: Zadarma.com.
Второй способ — полностью локальный (все сетевые соединения внутри нашего УД, для связи с внешним миром используются стандартные телефонные каналы связи, которые не зависят от доступа к Internet, внешним сетям, сетевым сервисам и облакам. Во этом варианте нам понадобится дополнительное оборудование – GSM/SIP шлюз и активная СИМ карта.
Напомню, постановки задачи: Требуется: в случае если забыли закрыть входную дверь на замок – уведомление через голосовые терминалы в квартире (реализовано в немного выше), в случае не закрытия замка после озвучивания уведомлений, ещё через две минуты звонок на мобильный телефон с озвучиванием «Дверь открыта уже пять минут».

В первую очередь устанавливаем консольный SIP клиент (программу для IP телефонии, не имеющую графического интерфейса). Набор номера, ответ на звонок, всё выполняется командами из командной строки. Клиент используется в обоих вариантах.

sudo apt-get install linphone-nogtk
linphonec

Запустив SIP клиент, попадаем в терминал программы, видим некоторые предупреждения. Устраним их (ошибка заключается в отсутствии путей), создадим директории в домашнем каталоге.
mkdir /home/pi/.local
mkdir /home/pi/.local/share
mkdir /home/pi/.local/share/linphone

Рассмотрим два варианта регистрации клиента:
1) Вариант использование внешнего SIP провайдера Zadarma.com
Производим регистрацию, у провайдера, при этом получаем доступ к личному кабинету и свой аккаунт SIP. Звонки вне SIP сервиса Zadarma – платные, тарифы доступны у них на сайте и на мой взгляд они не очень высокие. Ежемесячной абонентской платы нет – что радует.
После регистрации, в личном кабинете, доступен раздел с данными своего профиля для подключения IP телефонии.

Выполняем команду регистрации клиента (Linphonec) на сервере zadarma, указываем свой аккаунт и пароль на регистрацию:
register sip:xxxxxx@sip.zadarma.com sip.zadarma.com PASSWORD

Если ввод произведён правильно, то видим ответ о успешной регистрации и можем произвести, тестовый вызов из консоли клиента, на свой мобильный телефон, используя набор номера в международном формате:
call sip:+375хххххххххх@sip.zadarma.com


2) Вариант при использования GSM/SIP шлюза и его подключения практически такой же. Я использовал VOIP GSM ШЛЮЗ Yeastar TG100. Шлюз в режиме SIP-GSM, можно сказать работает из коробки. Требуется изменить только IP адрес по умолчанию. В разделе Шлюз — Линии VoIP создано уже две линии, настройки (пароль и имя пользователя) можно просто посмотреть, можно изменить на свои.

В таком режиме, в терминале Linphonec команда для регистрации будет выглядеть
register sip:20001@192.168.1.150 192.168.1.150 pincode20001

Пример запуска с успешной регистрацией, проверкой и набор номера и успешное окончание соединения (номер используем в международном формате):



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

Сейчас можем управлять консольным клиентом из терминала.
Прописываем следующую строку в crontab, я делал от пользователя pi (при загрузке ПК, загружается консольный клиент в режиме демона) и можем перегрузить сервер УД:
crontab -e
@reboot sudo -u pi linphonecsh init -c /home/pi/.linphonerc


Сейчас можем подготовить файл для проигрывания по телефону. Для его создания выполним команду TTS RHVoice в консоли ОС.
echo "Замок открыт, проверьте состояние двери " | RHVoice-test -p anna -o /home/pi/zvonok.wav

Проверка воспроизведения звукового файла:
aplay /home/pi/zvonok.wav

Переходим к нашему «Умному Дому».
Создадим ещё один новый сценарий в MajorDoMo, с содержанием:
safe_exec ("sudo -u pi linphonecsh generic 'soundcard use files'");
safe_exec ("sudo -u pi linphonecsh generic 'play zvonok.wav'");
safe_exec ("sudo -u pi linphonecsh dial sip:+375xxxxxxxxx@192.168.1.150 ");

И отредактируем метод датчика (который был создан в начале статьи):
В итоге получим следующий сценарий:



В качестве заключения


Вот так, довольно несложно и потратив относительно небольшое время (думаю часиков 8) начиная с установки ОС и системы домашней автоматизации MajorDoMo, модернизацией датчика и заканчивая проверкой звонка, можно реализовать задачу. В дальнейшем можно модифицировать код под свои потребности.
Напоследок пару полезных ссылок на источники:
MajorDoMo Исходный код и документация
Первая часть статьи
Группа обсуждения домашней автоматизации на базе MajorDoMo.
Сервис CONNECT MajorDoMo
Сайт сервиса TTS RHVoice
Сайт разработчика Linphone

Комментарии (3)


  1. KozlovAY
    03.06.2024 05:27

    8 часов времени на напоминание об открытой двери - это автоматизация для людей! Хотя цели могут быть разными, всё равно кажется что это не так уж и просто.

    На тему статьи, было бы неплохо её разделить: как настроить Яндекс, как SIP, а так всё в кучу.

    Также, по опыту лучше и саму автоматизацию делить. Не знаю, можно ли в вашем умном доме события добавлять, но в НН проще было бы разделить: первая автоматизация генерирует событие «дверь открыта в 22», на неё «подписана» вторая с оповещением в динамики, третья с Алисой и ещё четвёртая с запуском таймера 3 минуты, которая генерирует «спустя 3 минуты дверь так и не закрыта» и т.д. Так будет проще настраивать и проще потом разбираться, проще локально выключать какую то часть, проще развивать и т.д...


    1. udvnl Автор
      03.06.2024 05:27

      Попробую ответить на ваши вопросы (может я непонятно написал, может вы не так поняли):
      1) Автоматизация - работает всё время, все 24 часа. 8 часов время работы одного блока звонка на телефон. Цель довольно простая сейчас лето, младший ребенок может оставаться один, возможно может выйти на "минуточку" к другу соседу, может сам пойти на улицу и прийти домой и просто забыть закрыть замок, честно сказать, (этот блок недавно ввёл в реализацию да и каникулы только начались). По примеру добавить условие или поменять алгоритм, думаю труда не составит.
      2) Разделить статью, я и так старался разделить статью структурно, настройка Яндекса занимает минуты 3 от силы, SIP тоже не долгое время занимает, если не вдаваться в подробности.
      3) Автоматизация именно этой задачи (уведомлений и оповещения) - для лучшего понимания была сделана цельно, для начинающего - довольно сложно когда всё разбросано по кускам. Всё можно разделить без проблем.
      Кстати, возможно вы не заметили, но в статье есть пример второй автоматизации - каждый день в 22 часа происходит проверка состояния датчика. И эта автоматизация полностью разделена от основной задачи, которую, также можно разбивать на подзадачи и выполнять отдельно, но цельное понимание лучше, когда сделано одним блоком .


    1. udvnl Автор
      03.06.2024 05:27

      И хотелось бы ещё добавить, по поводу SIP, настройка по инструкции - дело несложное, однако сам протокол SIP непривычен для общего пользования и из-за этого тяжёл в освоении. Что б, подробно написать (для общего понимания), как, что и зачем функционирует, наверное даже одной отдельной статьёй не обойдёшься...