«Телегра́ф (др.-греч. τῆλε — «далеко» + γράφω — «пишу») в современном значении — средство передачи сигнала по проводам, радио или другим каналам. Передачу информации телеграфным способом называют телеграфией»
— Википедия
Для сбора метрик с датчиков промышленного оборудования и умных домов используются самое разное оборудование, проводные и беспроводные сети, различные протоколы и стандарты.
В этой статье я расскажу о том, как можно сделать подобную систему сбора, используя очень гибкий агент сбора метрик и данных Telegraf, а также высокопроизводительную базу данных временных рядов InfluxDB. С целью визуализации и мониторинга данных, а также для оповещения об их критичных изменениях будет установлена популярная платформа Grafana.
Вы научитесь получать данные через протокол Modbus на примере датчиков XY-MD02 и PZEM-016, доступных на известных маркетплейсах. Первый из них измеряет температуру и влажность окружающей среды, а второй — параметры электрической сети, такие как напряжение, ток, мощность, потребляемая энергия и частота переменного тока. Используя полученные знания, можно будет подключать и другие аналогичные датчики.
Среди всех разновидностей протокола Modbus в этой статье будет использован Modbus RTU (Remote Terminal Unit), который применяется в промышленности для сбора данных через RS-485 или RS-232. Заметим, что длина линии RS-485 может достигать 1200 м.
В своих экспериментах я использовал микрокомпьютеры Raspberry Pi 3, Orange Pi 3, отечественный микрокомпьютер Repka Pi 4, а также готовый модуль сбора данных Front Control Compact, который также собирается в России.
Применение перечисленных выше микрокомпьютеров требует работ по установке программного обеспечения и дополнительного оборудования для связи с RS-485. В то же время модуль Front Control Compact поставляется в готовом виде. Он хорошо подходит для промышленного применения и для автоматизации, например, умного дома, не требует навыков системного администрирования.
Дополнительно я расскажу об установке InfluxDB и Grafana на виртуальной машине Ubuntu Server, которая намного мощнее перечисленных выше микрокомпьютеров и может быть использована для мониторинга большого количества датчиков.
Содержание
Сборка макета для тестирования
Подготовка микрокомпьютеров и виртуального сервера
Установка утилиты mbpoll для тестирования датчиков
Получаем данные от датчиков в Telegraf
Добавляем шаблон плагина датчика в конфигурацию Telegraf
Проверяем передачу данных в InfluxDB
Установка срока хранения данных в InfluxDB
Тестирование Front Control Compact
Сборка макета для тестирования
Промышленные датчики с интерфейсом Modbus относительно дорогие, однако на известных маркетплейсах есть и вполне доступные. Я собрал макет с датчиками XY-MD02 и PZEM-016 с интерфейсом RS-485 (рис. 1).
Рис. 1. Датчики XY-MD02 и PZEM-016
Чтобы подключить эти датчики к микрокомпьютерам Raspberry Pi 3, Orange Pi 3 и Repka Pi 4, пришлось приобрести недорогой переходник из USB в RS-485 (рис. 2).
Рис. 2. Переходник из USB в RS-485
Приобретая переходник из USB в RS-485, убедитесь, что в нем предусмотрена гальваническая развязка цепей.
Что же касается модуля Front Control Compact, предназначенного для монтажа на DIN-рейку, то у него на корпусе уже есть контакты RS-485 (рис. 3).
Рис. 3. Подключение датчика XY-MD02 к модулю Front Control Compact
В модуле Front Control Compact есть и разъем USB, который тоже можно использовать с переходником из USB в RS-485.
Для тестирования датчика PZEM-016 была собрана схема, показанная на рис. 4.
Рис. 4. Схема для тестирования датчика PZEM-016
При работе с ней будьте очень внимательны, так как здесь присутствует высокое напряжение.
Напряжение 220 В с вилки подается на нижние два контакта PZEM-016 в соответствии со схемой подключения, нарисованной на самом датчике (рис. 5).
Рис. 5. Схема подключения датчика PZEM-016
К верхним двум контактам подключается датчик тока, который нужно обернуть вокруг одного из поводов, идущих к розетке. Розетка в данном случае используется для подключения нагрузки. Я пробовал подключать к этой розетке паяльник мощностью 40 Вт, электрический утюг, а также монитор BENQ с экраном 22 дюйма.
Подготовка микрокомпьютеров и виртуального сервера
Начальная подготовка микрокомпьютеров и виртуального сервера Ubuntu заключалась в установке на них операционных систем, а также обновление пакетов. После этого была установлена утилита тестирования mbpoll, Telegraf, InfluxDB и Grafana.
К сожалению, на Raspberry Pi 3 с архитектурой armv7l удалось установить только mbpoll и Telegraf, так как там используется 32-разрядная ОС Raspbian GNU/Linux 11 (bullseye). Тем не менее, вы можете использовать этот микрокомпьютер для передачи данных через Telegraf в InfluxDB, работающей на другом микрокомпьютере или сервере.
Что касается Orange Pi 3 и Repka Pi 4 с архитектурой aarch64, то с ними не возникло никаких проблем. На Orange Pi 3 была установлена ОС Orange Pi 1.0.6 Focal, а на Repka Pi 4 — Repka OS версии Repka-Pi4-Optimal.
Модуль Front Control Compact поставляется с ОС Napi Linux (Yocto build), и он не требует предварительной установки ОС и другого ПО. Операционная система c открытым кодом NapiLinux работает на микрокомпьютерах с архитектурой Rockchip. В ней предусмотрен Web-интерфейс NapiConfig, избавляющий пользователей от необходимости работать с командной строкой Linux.
При необходимости, однако, в этот модуль можно установить ОС Armbian и выполнить все настройки самостоятельно.
И, наконец, на виртуальной машине, работающей под управлением WMware, была установлена ОС Ubuntu 20.04.5 LTS.
Установка утилиты mbpoll для тестирования датчиков
Прежде чем создавать и активировать шаблон датчика в Telegraf, я протестировал получение данных по протоколу Modbus RTU через RS-485.
Процедура установки утилиты mbpoll описана на сайте https://github.com/epsilonrt/mbpoll и подходит для всех микрокомпьютеров, которые я протестировал — Raspberry Pi 3, Orange Pi 3 и Repka Pi4. В модуле Front Control Compact эта утилита уже установлена.
Для установки mbpoll выполните следующие команды:
$ wget -O- http://www.piduino.org/piduino-key.asc | sudo apt-key add -
$ echo 'deb http://raspbian.piduino.org stretch piduino' | sudo tee /etc/apt/sources.list.d/piduino.list
$ sudo apt update
$ sudo apt install mbpoll
Для проверки утилиты я подключил датчик XY-MD02 через переходник USB-RS485 (рис. 6).
Рис. 6. Подключение датчика XY-MD02 через переходник USB-RS485 к Orange Pi 3
Рис. 6. Подключение датчика XY-MD02 через переходник USB-RS485 к Orange Pi 3
На датчик было подано питание 12 В от блока питания, установленного на дин-рейке. После подключения данные были получены такой командой:
$ mbpoll -m rtu -a 1 -r 2 -c 2 -t 3 -b 9600 -P none -s 1 -d 8 -1 -v /dev/ttyUSB0
debug enabled
Set device=/dev/ttyUSB0
mbpoll 1.5-2 - ModBus(R) Master Simulator
Copyright (c) 2015-2023 Pascal JEAN, https://github.com/epsilonrt/mbpoll
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions; type 'mbpoll -w' for details.
Opening /dev/ttyUSB0 at 9600 bauds (N, 8, 1)
Set response timeout to 1 sec, 0 us
Protocol configuration: ModBus RTU
Slave configuration...: address = [1]
start reference = 2, count = 2
Communication.........: /dev/ttyUSB0, 9600-8N1
t/o 1.00 s, poll rate 1000 ms
Data type.............: 16-bit register, input register table
-- Polling slave 1...
[01][04][00][01][00][02][20][0B]
Waiting for a confirmation...
<01><04><04><00><EC><00><FA><BA><32>
[2]: 236
[3]: 250
Датчик вернул значения температуры и влажности:
-
температура: 236/10 = 23.6 градусов Цельсия;
-
влажность: 250/10 = 25.0%
При запуске команде mbpoll были заданы такие параметры:
-
устройство /dev/ttyUSB0;
-
-b: скорость передачи данных 9600 бод;
-
-P, -d, -s: параметры связи: 8 бит данных, 1 стоп-бит, без бита четности;
-
-m: протокол Modbus RTU;
-
-a: адрес устройства (Slave) 1;
-
-r: адрес первого регистра для чтения 2;
-
-c: количество читаемых регистров 2:
-
-t : читаются входные (Input) регистры;
-
-1: однократное чтение данных;
-
-v: режим отладки, позволяет увидеть данные, отправляемые в датчик и получаемые от него, в шестнадцатеричном формате
Описание всех параметров можно получить, если указать параметр -h:
$ mbpoll -h
Детальное описание датчика XY-MD02, его команд и возвращаемых данных можно найти, например, на сайте https://www.idbsmart.cz/wp-content/uploads/2024/05/xy-md02-manual.pdf. Также описание часто входит в комплект поставки датчиков.
Важно, что измеренные данные находятся в регистрах типа Input Register. При этом температура записана в регистре с адресом 1, а влажность — в регистре с адресом 2.
Теперь займемся проверкой датчика PZEM-016. Подключим его по описанной ранее схеме (рис. 4), а в качестве нагрузки используем паяльник мощностью 40 Вт (рис. 7).
Рис. 7. Проверка датчика PZEM-016 с подключенным паяльником
Введем следующую команду:
$ mbpoll -m rtu -a 1 -r 0 -c 10 -t 3 -b 9600 -P none -s 1 -d 8 -1 -0 -v /dev/ttyUSB0
debug enabled
Set device=/dev/ttyS3
mbpoll 1.0-0 - ModBus(R) Master Simulator
Copyright (c) 2015-2023 Pascal JEAN, https://github.com/epsilonrt/mbpoll
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions; type 'mbpoll -w' for details.
Opening /dev/ttyS3 at 9600 bauds (N, 8, 1)
Set response timeout to 1 sec, 0 us
Protocol configuration: ModBus RTU
Slave configuration...: address = [1]
start reference = 0, count = 10
Communication.........: /dev/ttyS3, 9600-8N1
t/o 1.00 s, poll rate 1000 ms
Data type.............: 16-bit register, input register table
-- Polling slave 1...
[01][04][00][00][00][0A][70][0D]
Waiting for a confirmation...
<01><04><14><08><DE><00><BC><00><00><01><AA><00><00><00><B9><00><00><01><F4><00><64><00><00><60><31>
[0]: 2270
[1]: 188
[2]: 0
[3]: 426
[4]: 0
[5]: 185
[6]: 0
[7]: 500
[8]: 100
[9]: 0
Эта команда аналогична предыдущей, с помощью которой мы проверяли датчик XY-MD02. Отличие здесь в том, что мы читаем десять входных регистров начиная с регистра с номером 0.
Полученные данные можно сверить с даташитом датчика, доступном на сайте https://smacont.ru/applying/015/PZEM-014-016-Datasheet-User-Manual.pdf.
В результате измерений были получены следующие значения от команды mbpoll:
-
Напряжение: 227.0 В
-
Ток: 0.188 А
-
Мощность: 42.6 Вт
-
Энергия: 185 Вт*ч
-
Частота: 50.0 Гц
-
Коэффициент мощности: 1.00
Эти данные вполне соответствуют использованной нагрузке — паяльнику мощностью 40 Вт.
Если вы работаете в ОС Microsoft Windows, то можете установить утилиту Modpoll Modbus Master Simulator, доступную по адресу https://www.modbusdriver.com/modpoll.html.
Скачайте архив утилиты modpoll-3.15.zip, распакуйте ее и запустите в командной строке:
$ cd C:modpoll-3.15win
modpoll-3.15win
$ modpoll.exe -h
Установка InfluxDB
Итак, мы убедились, что датчики возвращают правильные данные. Я проверил это для всех перечисленных ранее микрокомпьютеров, для модуля Front Control Compact и датчиков.
Теперь нужно установить высокопроизводительную базу данных временных рядов InfluxDB, в которой будут храниться результаты измерений, полученные от Telegraf. Параметры доступа InfluxDB будут нам нужны для настройки Telegraf, а также Grafana. В то время как Telegraf записывает данные в InfluxDB, Grafana читает их оттуда.
Инструкция по установке InfluxDB есть на сайте https://docs.influxdata.com/influxdb/v2/install/#install-linux.
Заметим, что InfluxDB нельзя установить на Raspberry Pi 3, так как нужна 64-разрядная ОС. Подойдет Raspberry Pi 4, Orange Pi 3, а также сервер или виртуальная машина Ubuntu 20.04.5 LTS. Модуль Front Control Compact поставляется с заранее установленной InfluxDB.
Чтобы установить InfluxDB, используйте следующие команды:
$ wget -qO- https://repos.influxdata.com/influxdata-archive_compat.key | sudo apt-key add -
echo "deb https://repos.influxdata.com/ubuntu focal stable" | sudo tee /etc/apt/sources.list.d/influxdb.list
$ sudo apt-get update
$ sudo apt-get install influxdb2
Далее запустите InfluxDB и проверьте состояние:
$ sudo systemctl start influxdb
$ sudo systemctl status influxdb
Утилита influx CLI устанавливается отдельно:
$ wget https://dl.influxdata.com/influxdb/releases/influxdb2-client-2.7.5-linux-arm64.tar.gz
$ tar xvzf ./influxdb2-client-2.7.5-linux-arm64.tar.gz
$ ./influx version
Influx CLI dev (git: a79a2a1b825867421d320428538f76a4c90aa34c) build_date: 2024-04-16T14:34:26Z
После установки InfluxDB нужно выполнить настройку. Для этого войдите в web-интерфейс http://192.168.0.17:8086/ (замените адрес IP своим). На экране появится страница с кнопкой GET STARTED (рис. 8).
Рис 8. Начало настройки InfluxDB
Щелкните здесь эту кнопку. Появится страница начальной регистрации пользователя InfluxDB.
Введите имея пользователя Username, пароль Password и его подтверждение Confirm Password, имя организации Initial Organization Name, а также имя контейнера (бакета), в котором хранятся данные временных рядов Initial Bucket Name (рис. 9).
Рис. 9. Начальная регистрация пользователя InfluxDB
Заполнив форму, щелкните кнопку CONTUNUE. На этом начальная настройка завершена, но вам еще нужно скопировать токен, выделенный на рис. 10 рамкой красного цвета.
Рис. 10. Настройка InfluxDB завершена
Сохраните токен в безопасном месте, он вам еще потребуется для интеграции с Telegraf и Grafana.
Установка Telegraf
Теперь мы готовы к установке Telegraf — высокопроизводительного и гибкого агента для сбора метрик и данных, разработанного компанией InfluxData.
Возможности Telegraf достаточно велики. Он может собирать, обрабатывать и отправлять метрики в различные системы хранения данных, такие как InfluxDB, Prometheus и другие. При этом для Telegraf имеется более 200 плагинов, предназначенных для сбора данных из различных источников. Это не только датчики, но и серверы, облачные сервисы, серверы баз данных и так далее.
В этой статье я приведу пример использования Telegraf в комбинации с InfluxDB и Grafana для создания систем мониторинга и визуализации данных.
Агент Telegraf может быть установлен на Raspberry Pi 3, Orange Pi 3 и Repka Pi 4 и другие микрокомпьютеры с Linux. Он уже есть в модуле Front Control Compact.
Процедура установки Telegraf описана на сайте https://docs.influxdata.com/telegraf/v1/install/.
Для микрокомпьютеров Orange Pi 3 и Repka Pi 4 нужно скачать и распаковать архив:
$ wget https://dl.influxdata.com/telegraf/releases/telegraf-1.33.0_linux_arm64.tar.gz
$ tar xvzf telegraf-1.33.0_linux_arm64.tar.gz
Далее вручную следует скопировать файлы из архива в одноименные каталоги ОС:
./telegraf-1.33.0/usr/
./telegraf-1.33.0/usr/bin/
./telegraf-1.33.0/usr/bin/telegraf
./telegraf-1.33.0/usr/lib/
./telegraf-1.33.0/usr/lib/telegraf/
./telegraf-1.33.0/usr/lib/telegraf/scripts/
./telegraf-1.33.0/usr/lib/telegraf/scripts/telegraf.service
./telegraf-1.33.0/usr/lib/telegraf/scripts/init.sh
./telegraf-1.33.0/etc/
./telegraf-1.33.0/etc/logrotate.d/
./telegraf-1.33.0/etc/logrotate.d/telegraf
./telegraf-1.33.0/etc/telegraf/
./telegraf-1.33.0/etc/telegraf/telegraf.d/
./telegraf-1.33.0/etc/telegraf/telegraf.conf
./telegraf-1.33.0/var/
./telegraf-1.33.0/var/log/
./telegraf-1.33.0/var/log/telegraf/
Отдельно нужно скопировать unit-файл telegraf.service из каталога telegraf-1.33.0/usr/lib/telegraf/scripts в каталог /etc/systemd/system.
После копирования файлов создайте пользователя telegraf:
$ sudo useradd -r -s /bin/false telegraf
Отредактируйте файл /etc/telegraf/telegraf.conf:
$ vim /etc/telegraf/telegraf.conf
Найдите в этом файле секцию [[outputs.influxdb_v2]] и укажите следующие параметры (токен показан только для примера, у вас будет свой):
[[outputs.influxdb_v2]]
urls = ["http://127.0.0.1:8086"]
organization = "it-matrix"
token = "VWZ80W5LMctVEjae3pAMsITUVzWCnQVKAj1eGPDxbLGsCHV0-tYzKx8rTEtFgQeT6DchVs8e982t1mTxp3D0VA=="
bucket = "my-home"
user_agent = "telegraf"
Вам нужно указать здесь свою организацию, свой токен, полученный при настройке InfluxDB, и свой контейнер данных (бакет).
Запустите Telegraf и проверьте, что он работает:
$ sudo systemctl start telegraf
$ sudo systemctl enable telegraf
$ sudo systemctl status telegraf
Для микрокомпьютера Raspberry Pi 3 процедура установки отличается только тем, что нужно скачать архив для архитектуры armhf:
$ wget https://dl.influxdata.com/telegraf/releases/telegraf-1.33.0_linux_armhf.tar.gz
$ tar xvzf telegraf-1.33.0_linux_armhf.tar.gz
Далее скопируйте файлы, создайте пользователя telegraf и запустите сервис, как это было описано выше.
Для того чтобы Telegraf мог работать с последовательными устройствами, добавьте его в группу dialout и перезапустите Telegraf:
$ sudo usermod -aG dialout telegraf
$ sudo systemctl restart telegraf
Установка Grafana
Для визуализации и мониторинга данных, поступающих от датчиков, установим популярную платформу Grafana. Она будет получать данные из InfluxDB и отображать их в панелях (дашбордах). Также настроим отправку оповещений на основе заданных условий.
Мы будем использовать версию Grafana с открытым исходным кодом. Инструкцию по ее установке можно найти на сайте https://grafana.com/grafana/download?edition=oss&platform=arm.
Заметим, что хотя Grafana уже установлена в модуле Front Control Compact, для больших конфигураций рекомендуется запускать Grafana на микрокомпьютерах или серверах с большим объемом оперативной памяти.
Установка Grafana очень проста, но она отличается для разных платформ.
На микрокомпьютере Raspberry Pi 3 были использованы такие команды:
$ sudo apt-get install -y adduser libfontconfig1 musl
$ wget https://dl.grafana.com/oss/release/grafana_11.4.0_armhf.deb
$ sudo dpkg -i grafana_11.4.0_armhf.deb
$ sudo /bin/systemctl daemon-reload
$ sudo /bin/systemctl enable grafana-server
$ sudo /bin/systemctl start grafana-server
$ sudo /bin/systemctl status grafana-server
Чтобы установить Grafana на Orange Pi 3 и Repka Pi 4, нужно выбрать платформу arm64:
$ sudo apt-get install -y adduser libfontconfig1 musl
$ wget https://dl.grafana.com/oss/release/grafana_11.4.0_arm64.deb
$ sudo dpkg -i grafana_11.4.0_arm64.deb
$ sudo /bin/systemctl daemon-reload
$ sudo /bin/systemctl enable grafana-server
$ sudo /bin/systemctl start grafana-server
$ sudo /bin/systemctl status grafana-server
И, наконец, на Ubuntu Server установка выполняется следующим образом:
$ sudo apt-get install -y adduser libfontconfig1 musl
$ wget https://dl.grafana.com/oss/release/grafana_11.4.0_amd64.deb
$ sudo dpkg -i grafana_11.4.0_amd64.deb
$ sudo /bin/systemctl daemon-reload
$ sudo /bin/systemctl enable grafana-server
$ sudo /bin/systemctl start grafana-server
$ sudo /bin/systemctl status grafana-server
После установки Grafana войдите в web-интерфейс по адресу вида http://192.168.0.19:3000, указав здесь адрес IP вашего хоста. На экране появится приглашение для входа (рис. 11).
Рис. 11. Приглашение для входа в Grafana
Введите здесь логин «admin» и пароль «admin». После этого вам будет сразу предложено сменить пароль. Далее вы увидите главное окно web-интерфейса Grafana (рис. 12).
Рис. 12. Главное окно web-интерфейса Grafana
Итак, мы установили все необходимое ПО и теперь можно переходить к настройкам.
Получаем данные от датчиков в Telegraf
Чтобы Telegraf автоматически считывал данные с датчиков, нужно добавить для каждого датчика свой шаблон конфигурации типа Inputs.
Выходной шаблон [[outputs.influxdb_v2]], необходимый для отправки данных в InfluxDB, мы добавили ранее на этапе установки Telegraf.
Добавляем шаблон плагина датчика в конфигурацию Telegraf
Отредактируйте конфигурационный файл Telegraf /etc/telegraf/telegraf.conf, добавив в его конец плагин датчика PZEM-016:
## PZEM-016 AC communication module
[[inputs.modbus]]
name = "pzem016"
controller = "file:///dev/ttyUSB0"
baud_rate = 9600
data_bits = 8
parity = "N"
stop_bits = 1
transmission_mode = "RTU"
slave_id = 1
timeout = "5s"
input_registers = [
{ measurement="pzem016-modbus-rtu", name = "Volt_a", byte_order = "AB", data_type = "UINT16", scale=0.1, address = [0]},
{ measurement="pzem016-modbus-rtu", name = "Current", byte_order = "AB", data_type = "UINT16", scale=0.001, address = [1]},
{ measurement="pzem016-modbus-rtu", name = "Power", byte_order = "AB", data_type = "UINT16", scale=0.1, address = [3]},
{ measurement="pzem016-modbus-rtu", name = "Energy", byte_order = "AB", data_type = "UINT16", scale=1.0, address = [5]},
{ measurement="pzem016-modbus-rtu", name = "Frequency", byte_order = "AB", data_type = "UINT16", scale=0.1, address = [7]},
{ measurement="pzem016-modbus-rtu", name = "Power factor", byte_order = "AB", data_type = "UINT16", scale=1.0, address = [8]},
{ measurement="pzem016-modbus-rtu", name = "Alarm status", byte_order = "AB", data_type = "UINT16", scale=1.0, address = [9]},
]
После этого перезапустите Telegraf и проверьте, не возникают ли при перезапуске ошибки:
$ sudo systemctl restart telegraf
$ sudo systemctl status telegraf
Для удобства можно размещать файлы шаблонов датчиков не в главном файле конфигурации Telegraf, а в отдельных файлах, записав их в каталог /etc/telegraf/telegraf.d.
Проверяем передачу данных в InfluxDB
Проверим, что данные измерений поступают из Telegraf в InfluxDB. Для этого откройте web-интерфейс InfluxDB, указав в адресной строке браузера URL вида http://192.168.0.19:8086/. Замените здесь адрес IP своим.
После ввода логина и пароля, который вы задали при установке InfluxDB, перейдите в раздел Data Explorer.
Выберите созданный нами ранее контейнер (бакет) my-home, далее в списке метрик _measurement установите флажок напротив датчика (в нашем случае это pzem016-modbus-rtu).
Далее выберите нужное вам для контроля поле и щелкните кнопку SUBMIT. Вы увидите график изменения данных, причем сможете задавать, за какое время нужно показать данные. На рис. 13 показан график результатов измерения напряжения в сети переменного тока датчиком PZEM-016.
Рис. 13. График изменения напряжения
Если выбрать поле Frequency и снова щелкнуть кнопку SUBMIT, можно увидеть график изменения частоты переменного тока в сети (рис. 14).
Рис. 14. Измеренная частота переменного тока в сети
Таким образом, мы проверили, что Telegraf получает данные от датчика PZEM-016 и эти данные сохраняются в базе данных InfluxDB.
Установка срока хранения данных в InfluxDB
По умолчанию данные контейнера будут храниться без ограничения срока. Если для экономии места на диске нужно указать срок хранения данных, это можно сделать утилитой influx CLI.
Прежде всего посмотрите список организаций (здесь и далее токен показан только для примера):
$ ./influx org list --token VWZ80W5LMctVEjae3pAMsITUVzWCnQVKAj1eGPDxbLGsCHV0-tYzKx8rTEtFgQeT6DchVs8e982t1mTxp3D0VA==
ID Name
b6aefffdbca73479 it-matrix
Далее выведите на консоль список контейнеров организации:
$ ./influx bucket list --org it-matrix --token VWZ80W5LMctVEjae3pAMsITUVzWCnQVKAj1eGPDxbLGsCHV0-tYzKx8rTEtFgQeT6DchVs8e982t1mTxp3D0VA==
ID Name Retention Shard group duration Organization ID Schema Type
f8b3379ba65f0879 _monitoring 168h0m0s 24h0m0s b6aefffdbca73479 implicit
52ca89efe5f353b6 _tasks 72h0m0s 24h0m0s b6aefffdbca73479 implicit
6c0f37602e951840 my-home infinite 168h0m0s b6aefffdbca73479 implicit
Установите срок хранения данных, например, семь дней для контейнера с заданным идентификатором:
$ ./influx bucket update --id 6c0f37602e951840 --retention 7d --token VWZ80W5LMctVEjae3pAMsITUVzWCnQVKAj1eGPDxbLGsCHV0-tYzKx8rTEtFgQeT6DchVs8e982t1mTxp3D0VA==
ID Name Retention Shard group duration Organization ID Schema Type
6c0f37602e951840 my-home 168h0m0s 168h0m0s b6aefffdbca73479 implicit
Теперь база данных будет автоматически очищаться от старых данных.
Каталог конфигураций датчиков
На сайте https://sensor.napilinux.ru вы найдете большой каталог готовых конфигураций популярных датчиков (рис. 16).
Рис. 16. Каталог конфигураций для датчиков
Здесь можно выбрать нужную вам конфигурацию, а затем просто добавить ее в Telegraf или в модуль Front Control Compact через web-интерфейс NapiConfig.
Подключаем Grafana к InfluxDB
Для подключения Grafana к InfluxDB прежде всего добавьте в Grafana источник данных. Для этого в главном меню перейдите в раздел Connections и там выберите строку Data sources. Далее щелкните кнопку Add data source и выберите в списке плагин InfluxDB.
Появится форма, в которой нужно будет заполнить данные подключения (рис. 15).
Рис. 15. Верхняя часть формы данных подключения
В списке Query language выберите строку Flux, а в поле URL введите адрес, по которому доступна база данных InfluxDB.
В качестве URL мы указали адрес http://192.168.0.19:8086, вам нужно будет указать здесь свой адрес IP, на котором работает InfluxDB.
Отключите режим Basic auth для того, чтобы использовать токены при авторизации в InfluxDB.
В нижней части формы заполните поля организации Organization, Token и Default Bucket, как это показано на рис. 16.
Рис. 16. Верхняя часть формы данных подключения
После заполнения формы щелкните кнопку Save & test. Должно появиться сообщение datasource is working (рис. 16).
Чтобы Grafana могла отображать данные измерений, полученные от датчиков, нужно создать панели Dashboard или подключить уже готовые. Откройте главное меню Grafana и выберите строку Dashboards. Далее создайте Dashboard с помощью кнопки Create dashboard (рис. 17).
Рис. 17. Создание Dashboard
Добавьте название Dashboard, а затем добавьте панели с данными с помощью кнопки Add visualization (Рис. 18).
Рис. 18. Добавление панели в Dashboard
При добавлении визуализации вам нужно выбрать источник данных InfluxDB, а затем ввести запрос на языке Flux для получения нужной метрики.
Этот запрос можно скопировать из Web-интерфейса InfluxDB. Для этого перейдите в раздел Data Explorer, выберите контейнер (бакет) my-home. В списке метрик _measurement установите флажок напротив датчика (в нашем случае это pzem016-modbus-rtu) и выберите поле, соответствующее нужной метрике.
Далее щелкните кнопку SCRIPT EDITOR и скопируйте текст запрос из поля Query 1 (рис. 19).
Рис. 19. Копирование текста запроса для метрики напряжения
Для метрики напряжения запрос будет такой:
from(bucket: "my-home")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|> filter(fn: (r) => r["_measurement"] == "pzem016-modbus-rtu")
|> filter(fn: (r) => r["_field"] == "Volt_a")
|> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)
|> yield(name: "mean")
Далее сохраните Dashboard и добавьте визуализацию описанным выше образом для других метрик датчика. На рис. 20 показан результат добавления панелей.
Рис. 20. Добавлены панели для основных метрик датчика PZEM-016
Дополнительно можно настроить пороги, чтобы показывать напряжение или ток другим цветом, например, при превышении заданных значений. Также есть возможность отправки оповещений из Grafana при выполнении каких-либо условий, например, если напряжение пропало или стало слишком высоким.
Тестирование Front Control Compact
Модуль Front Control Compact (рис. 3) специально предназначен для сбора данных по шине Modbus. Этот модуль устанавливается на din-рейку и поддерживает Modbus RTU и Modbus TCP, а также может служить прозрачным шлюзом между Modbus RTU и Modbus TCP.
В модуле установлен 4-ядерный процессор RK3308 и ОЗУ объемом 512 Мб, память NAND, есть порт RS-485 с гальванической развязкой, порты Ethernet, USB и другое оборудование. Этот модуль вполне пригоден для промышленного применения.
Важно, что помимо утилиты mbpoll, Telegraf и Grafana, в модуле предусмотрен web-интерфейс NapiConfig, существенно упрощающей конфигурирование и обслуживание устройства.
Для тестирования я подсоединил к модулю датчик XY-MD02, как это показано на рис. 3. Подключившись к Front Control Compact через SSH, я получил от этого датчика данные о температуре и влажности с помощью утилиты mbpoll:
# mbpoll -m rtu -a 1 -r 2 -c 2 -t 3 -b 9600 -P none -s 1 -d 8 -1 -v /dev/ttyUSB0
debug enabled
Set device=/dev/ttyUSB0
mbpoll 1.0-0 - ModBus(R) Master Simulator
Copyright (c) 2015-2023 Pascal JEAN, https://github.com/epsilonrt/mbpoll
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions; type 'mbpoll -w' for details.
Opening /dev/ttyUSB0 at 9600 bauds (N, 8, 1)
Set response timeout to 1 sec, 0 us
Protocol configuration: ModBus RTU
Slave configuration...: address = [1]
start reference = 2, count = 2
Communication.........: /dev/ttyUSB0, 9600-8N1
t/o 1.00 s, poll rate 1000 ms
Data type.............: 16-bit register, input register table
-- Polling slave 1...
[01][04][00][01][00][02][20][0B]
Waiting for a confirmation...
<01><04><04><00><E1><01><1F><EB><EA>
[2]: 225
[3]: 287
Однако это единственная операция, для которой мне понадобился доступ через консоль. Все остальное, в том числе и тестирование датчика, можно сделать через web-интерфейс NapiConfig. Этот интерфейс предусмотрен в NapiLinux.
Например, для добавления шаблона конфигурации датчика предусмотрен удобный интерфейс. В нем отображается список уже установленных конфигураций, и есть возможность активировать или отключать конфигурации датчиков (рис. 21).
Рис. 21. Управление конфигурациями датчиков
Чтобы не редактировать вручную конфигурацию Telegraf, предусмотрен удобный редактор шаблонов (рис. 22).
Рис. 22. Редактор шаблонов датчиков
Шаблон датчика XY_MD02 представлен ниже:
## XY_MD02 TemperatureHumidity) Modbus RTU
[[inputs.modbus]]
name = "XY_MD02" # Название устройства
slave_id = 1
timeout = "10s"
# busy_retries = 0
# busy_retries_wait = "100ms"
controller = "/dev/ttyS3"
baud_rate = 9600
data_bits = 8
parity = "N"
stop_bits = 1
transmission_mode = "RTU"
# Список регистров для чтения
input_registers = [
{ measurement="XY_MD02-rtu", name = "Temperature", byte_order = "AB", data_type = "UINT16", scale=1.0, address = [1]},
{ measurement="XY_MD02-rtu", name = "Humidity", byte_order = "AB", data_type = "UINT16", scale=1.0, address = [2]},
]
Для тестирования шаблона удобно воспользоваться кнопкой Тест конфигурации.
При обнаружении ошибок на экране появится сообщение об ошибке, которое поможет понять, в чем проблема. Если же тест завершился успешно, можно из web-интерфейса посмотреть графики изменения метрик выбранного вами датчика за указанное время (рис. 23).
Рис. 23. Просмотр графика изменения температуры за 5 минут
Графики будут показывать данные, сохраненные в InfluxDB.
На рис. 24 показаны измерения температуры и влажности в Grafana, полученные через модуль Front Control Compact.
Рис. 24. Данные о температуре и влажности в Grafana
Выводы
Если у вас небольшой бюджет, но есть навыки системного администрирования Linux, то можно собрать систему сбора и мониторинга данных по протоколу Modbus на микрокомпьютерах.
В дело может пойти даже Raspberry Pi 3 — на него можно установить Telegraf, а данные от него передавать на другой узел, где работает InfluxDB и Grafana. Более мощные микрокомпьютеры, такие как Raspberry Pi 4, Orange Pi 3 и Repka Pi 4, «потянут» Telegraf, InfluxDB, и Grafana.
Пользуясь этой статьей, вы сможете выполнить все необходимые работы по установке ПО, а также подключить датчики, такие как XY-MD02 и PZEM-016, через RS-485.
Для промышленного применения, а также в тех случаях, когда хочется упростить управление системой сбора, очень удобен модуль Front Control Compact. Его можно смонтировать на DIN-рейку, а благодаря удобному web-интерфейсу — избавить себя от работы в командной строке Linux. Это особенно удобно, если у вас есть опыт использования Microsoft Windows, но нет навыков работы в Linux.
Полезные ссылки
· Modbus
· Как общаются машины: протокол Modbus
· Introduction to the InfluxData platform
· PZEM-014/016 AC communication module
· Grafana Technical documentation
Автор: AlexandreFrolov