элемент Web-интерфейса, как "Переключатели"

Задача: Проработать чтобы можно было через домашний сервис телефонии на базе Ubuntu 22.04 Server + Asterisk 16 задействовать реле Sonoff TH10 посредством которого у меня через систему умный дом на базе Domoticz происходит удаленное включение моего тестового сервера Debian 10 + Proxmox 6.4-13. Т.е. я включаю реле, подается питание на сервер на котором в настройках BIOS выставлено, что если есть питание то включать. Когда тестовый сервер больше не нужен, то я через Web-консоль Proxmox выключаю его.

Исходя из этого я хочу сделать чтобы

  • при звонке на определенный номер я мог включиться сервер

В заметке участвуют:

Шаг №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

IDx переключателя в системе Domoticz

Либо: элемент Web-интерфейса, как "Переключатели"

элемент 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, а цель заметки взаимодействовать с ним через телефонию.

На заметку: Если вы не используете 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\&param=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\&param=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\&param=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\&param=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\&param=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\&param=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.