Задача: Хочу видеть в 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.