Задача: Хочу видеть в Domoticz
текущий курс доллара
Сегодня я для себя покажу, каким я способом решил поставленную задачу. Для чего это? А просто так, просто уже на основе этого я смогу что-либо еще таким образом сделать, да и интересно. Делаю через скрипт на Bash
который получает значение, приводит его к виду который отправляется через json
запрос в Domoticz.
Шаг №1:
Обновляю информацию о дефолтных репозитариях и обновляю систему до самого актуального состояния в рамках текущего релиза Ubuntu 18.04 Server:
ekzorchik@srv-bionic:~$ sudo rm -Rf /var/lib/apt/lists ekzorchik@srv-bionic:~$ sudo apt-get update && sudo apt-get upgrade -y ekzorchik@srv-bionic:~$ sudo apt-get install -y curl
Шаг №2:
Чтобы получить текущий курс доллара:
ekzorchik@srv-bionic:~$ nano dollar #!/bin/bash freshPage='http://www.cbr.ru/scripts/xml_daily.asp?date_req='$(date +%d.%m.%Y) curl $freshPage > /tmp/dollar #sudo apt install -y enca #or #sudo apt install recode enconv -L russian -x utf8 /tmp/dollar currentRate=$(grep -o 'Доллар США.*[0-9]*,[0-9]*' /tmp/dollar | grep -o '[0-9]*,[0-9]*' | head -1) echo 'Курс доллара на сегодня:' $currentRate rm /tmp/dollar exit 0 ekzorchik@srv-bionic:~$ chmod +x dollar ekzorchik@srv-bionic:~$ ./dollar % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 5151 100 5151 0 0 84442 0 --:--:-- --:--:-- --:--:-- 84442 Курс доллара на сегодня: 72,7245 ekzorchik@srv-bionic:~$
Но в Domotiz
я буду передавать полученное значение не разделенное запятой, а точкой, а потому изменяю скрипт:
ekzorchik@srv-bionic:~$ nano dollar #!/bin/bash freshPage='http://www.cbr.ru/scripts/xml_daily.asp?date_req='$(date +%d.%m.%Y) curl $freshPage > /tmp/dollar enconv -L russian -x utf8 /tmp/dollar currentRate=$(grep -o 'Доллар США.*[0-9]*,[0-9]*' /tmp/dollar | grep -o '[0-9]*,[0-9]*' | head -1 | sed 's/,/./') echo 'Курс доллара на сегодня:' $currentRate rm /tmp/dollar exit 0 ekzorchik@srv-bionic:~$ ./dollar % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 5151 100 5151 0 0 41540 0 --:--:-- --:--:-- --:--:-- 41540 Курс доллара на сегодня: 72.7245 ekzorchik@srv-bionic:~$
Шаг №3:
Создаю в Domotiz
шаблон по виртуальный сенсор = Dummy:
http://IP&DNS:8080 (http://172.33.33.122) - user&pass - Настройка - Оборудование -
Включено: Активировано
Имя: Dummy
Тип: Dummy (Does nothing, use for virtual switches only)
Задержка данных: Отключен
и нажимаю "Добавить"
Затем на основе данного шаблона создаю виртуальный датчик
нажимаю на "Создать виртуальный датчик"
и параметры создания виртуального датчика:
Имя: Курс $
Тип датчика: Custom Sensor
Метки оси: $
и нажимаю "ОК"
Созданный виртуальный датчик размещается во вкладке "Вспомогательные"
Шаг №4:
Чтобы передать значение из скрипт получения текущего курса доллара в виртуальный датчик вкладки "Вспомогательные"
нужно знать его IDX
. Его можно посмотреть если у виртуального датчика с именем "Курс $"
нажать "Редактировать"
либо перейти:
http://IP&DNS:8080 (http://172.33.33.122) - user&pass - Настройка - Устройства
после на основе добавленного создаю виртуальный датчик
Шаг №5:
Пробую передать произвольное значение в виртуальный датчик через запрос посредством утилиты curl:
ekzorchik@srv-bionic:~$ curl -s -i -H "Accept: application/json" "http://127.0.0.1:8080/json.htm?type=command¶m=udevice&idx=1&svalue=72" HTTP/1.1 200 OK Content-Length: 49 Cache-Control: no-cache Pragma: no-cache Access-Control-Allow-Origin: * Content-Type: application/json;charset=UTF-8 Set-Cookie: DMZSID=3dcfcd5791506142aa24b771c4aaf325_ZDQzZDI3ZWYtNjE1MC00MmNlLThkOTMtMzk1OWM4MTg3ZmI4.1632515837; HttpOnly; path=/; Expires=Fri, 24 Sep 2021 20:37:17 GMT { "status" : "OK", "title" : "Update Device" } ekzorchik@srv-bionic:~$
-s, --silent Silent mode
-i, --include Include protocol response headers in the output
-H, --header <header/@file> Pass custom header(s) to server
Результат:
Шаг №6:
А теперь создаю скрипт который полученный результат получения курса доллара на текущий день присвоит виртуальному датчику по его IDX:
ekzorchik@srv-bionic:~$ sudo mkdir domoticz/scripts/customscripts ekzorchik@srv-bionic:~$ sudo nano domoticz/scripts/customscripts/dollar.sh #!/bin/bash #setup host=localhost port=8080 #username=domoticzuser #password=domoticzpassword freshPage='http://www.cbr.ru/scripts/xml_daily.asp?date_req='$(date +%d.%m.%Y) curl $freshPage > /tmp/dollar enconv -L russian -x utf8 /tmp/dollar currentRate=$(grep -o 'Доллар США.*[0-9]*,[0-9]*' /tmp/dollar | grep -o '[0-9]*,[0-9]*' | head -1 | sed 's/,/./') echo 'Курс доллара на сегодня:' $currentRate rm /tmp/dollar exit 0 #IDX Virtual Sensor idxdollar=1 curl -s -i -H "Accept: application/json" "http://$host:$port/json.htm?type=command¶m=udevice&idx=1&svalue=$currentRate" ekzorchik@srv-domoticz:~$ sudo chmod +x domoticz/scripts/customscripts/dollar.sh
В bash есть опция -x , которая будет показывать вам команды по мере их выполнения (запустите сценарий с bash -x script.sh вместо bash script.sh или ./script.sh )., это покажет вам команды в правильных кавычках и будет более полезно, чем печатать их с помощью echo.
ekzorchik@srv-bionic:~$ sudo bash -x domoticz/scripts/customscripts/dollar.sh + host=127.0.0.1 + port=8080 ++ date +%d.%m.%Y + freshPage='http://www.cbr.ru/scripts/xml_daily.asp?date_req=24.09.2021' + curl 'http://www.cbr.ru/scripts/xml_daily.asp?date_req=24.09.2021' % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 5151 100 5151 0 0 60600 0 --:--:-- --:--:-- --:--:-- 60600 + enconv -L russian -x utf8 /tmp/dollar ++ grep -o 'Доллар США.*[0-9]*,[0-9]*' /tmp/dollar ++ sed s/,/./ ++ grep -o '[0-9]*,[0-9]*' ++ head -1 + currentRate=72.7245 + echo 'Курс доллара на сегодня:' 72.7245 Курс доллара на сегодня: 72.7245 + rm /tmp/dollar + exit 0 ekzorchik@srv-bionic:~$
вижу что до curl
запроса скрипт не доходит, почему? А все потому, что нужно строку exit 0 поставить в самом конце после curl.
Итого скрипт и его результат:
sudo nano domoticz/scripts/customscripts/dollar.sh #!/bin/bash #setup host=127.0.0.1 port=8080 #username=domoticzuser #password=domoticzpassword freshPage='http://www.cbr.ru/scripts/xml_daily.asp?date_req='$(date +%d.%m.%Y) curl $freshPage > /tmp/dollar enconv -L russian -x utf8 /tmp/dollar currentRate=$(grep -o 'Доллар США.*[0-9]*,[0-9]*' /tmp/dollar | grep -o '[0-9]*,[0-9]*' | head -1 | sed 's/,/./') echo 'Курс доллара на сегодня:' $currentRate rm /tmp/dollar #IDX Virtual Sensor idxdollar=1 #curl -s -i -H "Accept: application/json" "http://$username:$password@$host:$port/json.htm?type=command¶m=udevice&idx=1&svalue=$currentRate" curl -s -i -H "Accept: application/json" "http://$host:$port/json.htm?type=command¶m=udevice&idx=$idxdollar&svalue=$currentRate" exit 0
ekzorchik@srv-bionic:~$ sudo bash -x domoticz/scripts/customscripts/dollar.sh + host=127.0.0.1 + port=8080 ++ date +%d.%m.%Y + freshPage='http://www.cbr.ru/scripts/xml_daily.asp?date_req=24.09.2021' + curl 'http://www.cbr.ru/scripts/xml_daily.asp?date_req=24.09.2021' % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 5151 100 5151 0 0 90368 0 --:--:-- --:--:-- --:--:-- 91982 + enconv -L russian -x utf8 /tmp/dollar ++ grep -o 'Доллар США.*[0-9]*,[0-9]*' /tmp/dollar ++ sed s/,/./ ++ head -1 ++ grep -o '[0-9]*,[0-9]*' + currentRate=72.7245 + echo 'Курс доллара на сегодня:' 72.7245 Курс доллара на сегодня: 72.7245 + rm /tmp/dollar + idxdollar=1 + curl -s -i -H 'Accept: application/json' 'http://127.0.0.1:8080/json.htm?type=command¶m=udevice&idx=1&svalue=72.7245' HTTP/1.1 200 OK Content-Length: 49 Cache-Control: no-cache Pragma: no-cache Access-Control-Allow-Origin: * Content-Type: application/json;charset=UTF-8 { "status" : "OK", "title" : "Update Device" } + exit 0 ekzorchik@srv-bionic:~$
Смотрю на виртуальный сенсор:
Шаг №7:
Чтобы скрипт отрабатывал каждый день в 12:05
и тем самым обновлял значение в Domoticz
создаю задание, т.к. по данным центрального банка России каждый рабочий день в 11:30
по московскому времени устанавливается на текущий день курс доллара, а я с запасом по времени обновляю в 12:05
. К уже существующему заданию добавляю следующей строкой свой вызов скрипта:
ekzorchik@srv-bionic:~$ sudo crontab -e @reboot /usr/sbin/ntpdate -s 0.pool.ntp.org > /dev/null 05 12 */1 * * /home/ekzorchik/domoticz/scripts/customscripts/dollar.sh
Шаг №8:
Ниже история работы скрипт и получаемых значений с боевого Domoticz:
Итого я разобрал данную задачу оформив в шагах как ее реализовать, просто на ее основе уже можно делать что-то похожее.
На этом я прощаюсь, с уважением автор блога Олло Александр aka ekzorchik.