Задача: Проработать чтобы можно было через домашний сервис телефонии на базе Ubuntu 22.04 Server + Asterisk 16 задействовать реле Sonoff TH10 посредством которого у меня через систему умный дом на базе Domoticz происходит удаленное включение моего тестового сервера Debian 10 + Proxmox 6.4-13. Т.е. я включаю реле, подается питание на сервер на котором в настройках BIOS выставлено, что если есть питание то включать. Когда тестовый сервер больше не нужен, то я через Web-консоль Proxmox выключаю его.
Исходя из этого я хочу сделать чтобы
- при звонке на определенный номер я мог включиться сервер
В заметке участвуют:
- Ubuntu 22.04 + Asterisk 16 — мой сервис домашней телефонии
Sonoff TH10— перепрошитое реле на прошивку отTasmota, как это сделано см. заметку"Как перепрошить реле Sonoff TH10 на Tasmota Firmware"
Шаг №1: Подключаюсь по SSH к серверу домашней телефонии на базе Ubuntu 22.04 + Asterisk 16:
Шаг №2: Чтобы включать и выключать реле:
Включить реле:
ekzorchik@srv-us2204a:~$ sudo apt-get install -y curl
ekzorchik@srv-us2204a:~$ curl http://172.33.33.120/cm?cmnd=Power%20On
{"idx":5,"nvalue":1,"svalue":"","Battery":100,"RSSI":6,"POWER":"ON"}
Выключить реле:
ekzorchik@srv-us2204a:~$ curl http://172.33.33.120/cm?cmnd=Power%20Off
{"idx":5,"nvalue":0,"svalue":"","Battery":100,"RSSI":5,"POWER":"OFF"}
Шаг №3: Открываю свой Domoticz (Разворачиваем Domoticz на Ubuntu 20.04 Server) on Ubuntu 20.04 Server через Web—интерфейс и создаю "Переключатель":
http://IP&DNS:8080 (172.35.35.10:8080) — Настройка — Оборудование — сперва создано одно оборудование:
Включено: ДаИмя: DummyТип: Dummy (Does nothing, use for virtual switches only)Log Level: (Info,Состояние,Ошибка): ДаЗадержка данных: отключено
и нажимаю Добавить.
Затем на созданном устройстве нажимать "Создать виртуальные датчики"
Имя: Relay1Тип датчика: Переключатель
созданное устройство ищем в "Настройки" - "Устройства" -
его Idx = 9
![]()
Либо: элемент Web-интерфейса, как "Переключатели"

Шаг №4: На системе где установлен Domoticz создаем два скрипта ответственных за включение и выключение реле:
ekzorchik@ekzhome:~$ nano ~/.bashrc
alias srv-domoticz='sshpass -p 712mbddr@ ssh -o "StrictHostKeyChecking no" ekzorchik@172.35.35.10 -p 22'
ekzorchik@ekzhome:~$ source ~/.bashrc
ekzorchik@ekzhome:~$ srv-domoticz
Включение реле:
ekzorchik@srv-domoticz:~$ sudo nano domoticz/scripts/customscripts/relay1on.sh
#!/bin/bash
curl http://172.33.33.120/cm?cmnd=Power%20On
exit
Выключение реле:
ekzorchik@srv-domoticz:~$ sudo nano domoticz/scripts/customscripts/relay1off.sh
!/bin/bash
curl http://172.33.33.120/cm?cmnd=Power%20Off
exit
ekzorchik@srv-domoticz:~$ sudo chmod +x domoticz/scripts/customscripts/relay1o*.sh
Шаг №5: В созданном "Переключателе" прописываем действия на включение и выключение:
http://IP&DNS:8080 (172.35.35.10:8080) — Переключатели — Relay1 (нажимаем на "Редактировать")
и нажимаем "Сохранить"
Имя: Relay1Тип переключателя: On/OffЗадержка включения: 0Задержка выключения: 0Действие при включении: script://customscripts/relay1on.shДействие при выключении: script://customscripts/relay1off.shЗащищенный: НетОписание: ничего пока не заполняю
и нажимаю "Сохранить"

Но это мы управляем реле через Domoticz, а цель заметки взаимодействовать с ним через телефонию.
На заметку: Если вы не используете Domoticz то часть выше можно пропустить и использовать создаваемые скрипты на включение и выключение напрямую.
Шаг №6: Чтобы взаимодействовать с "Переключателем" зная его IDX через консоль, т.е. с сервера где развернут сервис Asterisk посредством консоли выполняем запрос с системы Domoticz:
ekzorchik@ekzhome:~$ srv-asterisk
На заметку: Если у Вас доступ к Domoticz настроен, как https://IP&DNS:8080 то строки ниже работать не будут.
(включение)
ekzorchik@srv-us2204a:~$ curl http://172.35.35.10:8080/json.htm\?type=command\¶m=udevice\&idx=9\&nvalue=1
{
"status" : "OK",
"title" : "Update Device"
}
ekzorchik@srv-us2204a:~$
(выключение)
ekzorchik@srv-us2204a:~$ curl http://172.35.35.10:8080/json.htm\?type=command\¶m=udevice\&idx=9\&nvalue=0
{
"status" : "OK",
"title" : "Update Device"
}
ekzorchik@srv-us2204a:~$
Шаг №7: Как будем действовать дальше, либо Asterisk запускает скрипт выключения/включения реле обращаясь к Sonoff TH10, либо обращается к созданному idx в Domoticz:
ekzorchik@ekzhome:~$ nano ~/.bashrc
alias srv-asterisk='sshpass -p 712mbddr@ ssh -o "StrictHostKeyChecking no" ekzorchik@172.35.35.14 -p 22'
ekzorchik@ekzhome:~$ source ~/.bashrc
ekzorchik@ekzhome:~$ srv-asterisk
ekzorchik@srv-us2204a:~$ sudo nano /etc/asterisk/pjsip.conf
[endpoint-template](!)
;relay1
context = relay1
;relay1
[1012](endpoint-template)
auth = auth1012
callerid = phone1 <1012>
aors = 1012
[1012](aor-reg-template)
[auth1012](auth-userpass-template)
username = 1012
password = pbx1
Т.е. при звонке на номер 1012 будет совершаться обработка, значит опишем план работы контекста relay1:
ekzorchik@srv-us2204a:~$ sudo nano /etc/asterisk/extensions.conf
[relay1]
exten => 1012,1,Answer()
same => n,WaitExten()
;Ждем ввода от пользователя
same => n,WaitExten()
;делаем переход в контекст по нажатию клавиши 1
exten => 1,1,Goto(ON,s,1)
;делаем переход в контекст по нажатию клавиши 2
exten => 2,1,Goto(OFF,s,1)
[ON]
exten => s,1,NoOp(Включаем реле)
same => n,System(curl -v "http://172.35.35.10:8080/json.htm\?type=command\¶m=udevice\&idx=9\&nvalue=1")
same => n,NoOp(${SYSTEMSTATUS})
same => n,hangup()
[OFF]
exten => s,1,NoOp(Выключаем реле)
same => n,System(curl -v "http://172.35.35.10:8080/json.htm\?type=command\¶m=udevice\&idx=9\&nvalue=0")
same => n,NoOp(${SYSTEMSTATUS})
same => n,hangup()
ekzorchik@srv-us2204a:~$ sudo asterisk -rx "core reload"
ekzorchik@srv-us2204a:~$ sudo asterisk -rx "dialplan reload"
Dialplan reloaded.
ekzorchik@srv-us2204a:~$
Проверяю звонком: на номер 1012 и после нажимаю либо 1 для включения, либо 2 для выключения реле:
sudo asterisk -rvvv
(включаем: 1112 и нажимаем 1)
-- Executing [1012@relay1:1] Answer("PJSIP/1001-00000014", "") in new stack
-- Executing [1012@relay1:2] WaitExten("PJSIP/1001-00000014", "") in new stack
-- Executing [1@relay1:1] Goto("PJSIP/1001-00000014", "ON,s,1") in new stack
-- Goto (ON,s,1)
-- Executing [s@ON:1] NoOp("PJSIP/1001-00000014", "Включаем реле") in new stack
-- Executing [s@ON:2] System("PJSIP/1001-00000014", "curl -v "http://172.35.35.10:8080/json.htm\?type=command\¶m=udevice\&idx=9\&nvalue=1"") in new stack
-- Executing [s@ON:3] NoOp("PJSIP/1001-00000014", "SUCCESS") in new stack
-- Executing [s@ON:4] Hangup("PJSIP/1001-00000014", "") in new stack
== Spawn extension (ON, s, 4) exited non-zero on 'PJSIP/1001-00000014'
(выключаем: 1112 и нажимаем 2)
-- Executing [1012@relay1:1] Answer("PJSIP/1001-00000015", "") in new stack
-- Executing [1012@relay1:2] WaitExten("PJSIP/1001-00000015", "") in new stack
-- Executing [2@relay1:1] Goto("PJSIP/1001-00000015", "OFF,s,1") in new stack
-- Goto (OFF,s,1)
-- Executing [s@OFF:1] NoOp("PJSIP/1001-00000015", "Выключаем реле") in new stack
-- Executing [s@OFF:2] System("PJSIP/1001-00000015", "curl -v "http://172.35.35.10:8080/json.htm\?type=command\¶m=udevice\&idx=9\&nvalue=0"") in new stack
-- Executing [s@OFF:3] NoOp("PJSIP/1001-00000015", "SUCCESS") in new stack
-- Executing [s@OFF:4] Hangup("PJSIP/1001-00000015", "") in new stack
== Spawn extension (OFF, s, 4) exited non-zero on 'PJSIP/1001-00000015'
srv-us2204a*CLI>
Отлично, пока остановлюсь на этом тем более в планах усовершенствовать, нужно создать меню IVR чтобы голосом проговаривалось, текущий статус реле, если нажал 1, то голосом реле включено, если нажал 0, то голосом реле выключено.
Пока на этом всё, я добился того чего задумывал. С уважением автор блога Олло Александр aka ekzorchik.