Задача: Проработать чтобы можно было через домашний сервис телефонии на базе 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.