Задача: Хочу видеть в 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)
  • Задержка данных: Отключен

Создаю в Domotiz шаблон по виртуальный сенсор = Dummy:

и нажимаю "Добавить"

Затем на основе данного шаблона создаю виртуальный датчик

нажимаю на "Создать виртуальный датчик"

Создаю виртуальный датчик

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

  • Имя: Курс $
  • Тип датчика: Custom Sensor
  • Метки оси: $

и нажимаю "ОК"

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

Созданный виртуальный датчик размещается во вкладке "Вспомогательные"

Созданный виртуальный датчик размещается во вкладке "Вспомогательные"

Шаг №4: Чтобы передать значение из скрипт получения текущего курса доллара в виртуальный датчик вкладки "Вспомогательные" нужно знать его IDX. Его можно посмотреть если у виртуального датчика с именем "Курс $" нажать "Редактировать"

Узнаю IDX виртуального датчика

либо перейти:

http://IP&DNS:8080 (http://172.33.33.122) - user&pass - Настройка - Устройства

Либо по-другому узнаю idx виртуального датчика

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

Шаг №5: Пробую передать произвольное значение в виртуальный датчик через запрос посредством утилиты curl:

ekzorchik@srv-bionic:~$ curl -s -i -H "Accept: application/json" "http://127.0.0.1:8080/json.htm?type=command&param=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

Результат:

Передача курса доллара через Curl запрос

Шаг №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&param=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&param=udevice&idx=1&svalue=$currentRate"

curl -s -i -H "Accept: application/json" "http://$host:$port/json.htm?type=command&param=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&param=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:~$

Смотрю на виртуальный сенсор:

Передача значения курса доллара через скрипт и json

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

История работы скрипт и получаемых значений с боевого Domoticz:

Итого я разобрал данную задачу оформив в шагах как ее реализовать, просто на ее основе уже можно делать что-то похожее.

На этом я прощаюсь, с уважением автор блога Олло Александр aka ekzorchik.