Для тех, кто создает системы мониторинга метрик датчиков для умных домов и промышленного оборудования есть хорошая новость. Теперь такие системы можно собирать с применением микрокомпьютера российской сборки Repka Pi 4, который есть в реестре Минпромторга, и операционной системы Napi Linux 0.2.2 с открытым кодом.
К микрокомпьютеру Repka Pi через порты USB, Ethernet и GPIO можно подключать различное оборудование с целью мониторинга средствами ОС Napi Linux.
Операционная система Napi Linux разработана для встраиваемых (Embedded) систем и обладает множеством преимуществ:
- простая установка, которая сводится к записи образа Napi Linux на SD-карту или на карту EMMC;
- настройка всех параметров системы через Web-интерфейс NapiConfig, исключающий необходимость работы в командной строке через SSH;
- предустановленное и уже настроенное ПО для сбора, хранения и отображения данных метрик — агент сбора метрик и данных Telegraf, высокопроизводительная база данных временных рядов InfluxDB, популярная платформа визуализации и мониторинга данных Grafana;
- наличие программного интерфейса NaPi API, позволяющего создавать собственные программы для обработки данных метрик и использования всех функций NapiConfig их программ;
- наличие дублирующих системных разделов (A/B) для безопасного обновления и автоматического отката при сбое загрузки;
- хранение пользовательских данных отдельно от системной области, что сохраняет их при переустановке или обновлении ОС
В статье Собираем метрики с датчиков через Modbus и Telegraf уже рассказывалось про установку и настройку Telegraf, InfluxDB и Grafana на микрокомпьютерах, в том числе на Repka Pi 4. ОС Napi Linux делает такую сложную установку и настройку излишней — достаточно просто записать образ этой ОС на карту SD или EMMC, и можно начинать работу.
В этой рассказывается, как приступить к работе с Napi Linux, установив ее на Repka Pi 4 - показаны основные этапы настройки, подключение датчиков загрузки процессора CPU, датчика температуры и влажности XY-MD02, датчика напряжения, тока, мощности и частоты питающего напряжения PZEM-016 и датчика устройства ATS-1204, так же Вы узнаете, как просматривать графики изменения метрик в Web-интерфейсах NapiConfig, InfluxDB, а также при помощи Grafana и будут приведены примеры вызова NaPi.API через утилиту curl и с помощью программы на Python.
Оглавление #
Установка Napi Linux на Repka Pi 4
Установка Napi Linux на Repka Pi 4 #
Процедура установки ОС Napi Linux включает в себя скачивание образа SD-карты и определение текущего адреса IP, выделенного Repka Pi 4. Если ваш микрокомпьютер оборудован EMMC, то имеет смысл скопировать ОС Napi Linux на этот модуль памяти.
Запись образа Napi Linux на SD-карту #
ОС Napi Linux способен работать на различных платформах. Готовые образы этой ОС размещены на сайте https://download.napilinux.ru/napilinux/. На момент подготовки статьи была доступна версия ОС 0.2.2 с поддержкой микрокомпьютера Repka Pi 4.
Войдите в каталог napilinux-repka-pi4-optimal-dev и скачайте файл napilinux-repka-pi4-optimal-dev-0.2.2.rootfs.system_img.xz (рис. 1).
Рис. 1. Образы Napi Linux для различных платформ
Запишите файл на SD-карту объемом 32 Гбайт с помощью программы BalenaEtcher или Rufus. Далее вставьте SD-карту с образом Napi Linux в микрокомпьютер и загрузите ОС.
Определение адреса IP микрокомпьютера #
Для определения текущего адреса IP, выделенного микрокомпьютеру с ОС Napi Linux подключите к Repka Pi монитор с интерфейсом HDMI и клавиатуру. Затем введите в консоли команду «ip -a» (рис. 2).
Рис. 2. Определение текущего адреса IP
Команда покажет в консоли искомый адрес IP. В дальнейшем с помощью web-интерфейса NapiConfig его нетрудно будет заменить постоянным адресом.
Чтобы проверить работу Web-интерфейса NapiConfig, введите в адресной строке браузера URL вида https://192.168.0.20/, где вместо 192.168.0.20 укажите адрес вашего узла. Подтвердив использование самоподписанного сертификата, вы увидите приглашение для ввода логина и пароля (рис. 3).
Рис. 3. Приглашение для ввода логина и пароля
Ведите логин «admin» и пароль «admin», и на экране появится главное окно web-интерфейса NapiConfig (рис. 4).
Рис. 4. Главное окно web-интерфейса NapiConfig
Копирование Napi Linux на EMMC #
Для увеличения надежности работы скопируем образ Napi Linux на карту EMMC с помощью команды dd. Для этого важно узнать название устройства EMMC.
Команда lsblk покажет информацию о всех блочных устройствах:
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
mmcblk0 179:0 0 28.8G 0 disk
├─mmcblk0p1 179:1 0 1.5G 0 part /mount/rfs/ro
├─mmcblk0p2 179:2 0 1.5G 0 part
└─mmcblk0p3 179:3 0 25.9G 0 part /mount/rfs/rw
mmcblk1 179:32 0 28.9G 0 disk
└─mmcblk1p1 179:33 0 28.6G 0 part
mmcblk1boot0 179:64 0 4M 1 disk
mmcblk1boot1 179:96 0 4M 1 disk
Здесь показан результат выполнения команды lsblk сразу после установки Napi Linux на SD-карту. Видно, что SD-карте соответствует устройство mmcblk0, а памяти EMMC — устройство mmcblk1.
Назначение устройства можно проверить и такими командами:
# cat /sys/class/block/mmcblk0/device/type
SD
# cat /sys/class/block/mmcblk1/device/type
MMC
Для загрузки образа ОС Napi Linux на карту EMMC, установленную в Repka Pi 4, запустите команду:
# wget -O - https://download.napilinux.ru/napilinux/0.2.2/napilinux-repka-pi4-optimal-dev/napilinux-repka-pi4-optimal-dev-0.2.2.rootfs.system_img.xz | xz -T0 -d | dd of=/dev/mmcblk1 bs=4M status=progress
Эта команда скачивает образ NapiLinux версии 0.2.2, распаковывает его и записывает на устройство /dev/mmcblk1. Если у вас EMMC соответствует другому устройству, отредактируйте параметр of соответствующим образом.
После запуска команды wget начнется загрузка и распаковка образа, а также запись образа на устройство /dev/mmcblk1:
Connecting to download.napilinux.ru (87.245.206.189:443)
wget: note: TLS certificate validation not implemented
writing to stdout
- 43% |***************************** | 193M 0:03:39 ETA
Предупреждение «TLS certificate validation not implemented» можно игнорировать. Чтобы оно не появлялось, добавьте к команде wget --no-check-certificate.
Дождитесь завершения процесса записи:
writing to stdout
- 100% |*******************************************************************| 441M 0:00:00 ETA
written to stdout
3188154368 bytes (3.2 GB, 3.0 GiB) copied, 412 s, 7.7 MB/s
0+107914 records in
0+107914 records out
3581935616 bytes (3.6 GB, 3.3 GiB) copied, 426.483 s, 8.4 MB/s
Когда запись будет закончена, сбросьте содержимое буфера и завершите работу ОС:
# sync
shutdown -h now
После этого выключите питание Repka Pi 4, извлеките SD-карту и загрузите Napi Linux с карты EMMC.
Настройка статического адреса IP для узла Repka Pi 4 #
Как мы уже говорили, в состав Napi Linux входит web-интерфейс NapiConfig, позволяющий выполнять необходимые настройки через браузер.
Откройте NapiConfig по адресу https://192.168.0.20/, заменив 192.168.0.20 адресом IP вашего узла, определенного с помощью команды «ip -a». Выберите строку Интерфейсы в разделе Сеть (рис. 5).Рис. 5. Настройка сетевых интерфейсов
Здесь щелкните ссылку end0 и введите сетевые настройки в панели Настройки интерфейса (рис. 6).
Рис. 6. Настройки интерфейса
Здесь нужно задать как минимум IP-адрес, маршруты и DNS-серверы. Для сохранения параметров щелкните кнопку Применить. Проверьте, что после перезагрузки ОС установились правильно, а сеть доступна.
Подключение датчиков #
С помощью NapiConfig можно подключить к системе сбора данных датчики самых разных типов. Для получения метрик от датчиков по протоколам Modbus RTU через RS485, через шлюз Modbus TCP и SNMP применяется Telegraf.
Собранные данные сохраняются в базе данных InfluxDB2 и могут передаваться для отображения в Grafana.
Добавляем датчик CPU #
Даже если у вас еще пока нет ни одного датчика, который можно было бы подключить к Repka Pi 4, можно настроить сбор метрик с данными о загрузке CPU. Давайте добавим этот датчик в мониторинг.
Откройте раздел Датчики (рис. 7).Рис. 7. Раздел управления датчиками
Сразу после установки NapiLinux этот раздел пустой, а служба датчиков не активна. Чтобы добавить датчик для CPU щелкните кнопку Добавить новый и заполните форму (рис. 8).Рис. 8. Добавление датчика CPU
В поле Название введите строку CPU, а в поле Редактор конфигурации скопируйте данные для Telegraf, представленные ниже:
# Read metrics about cpu usage
[[inputs.cpu]]
## Whether to report per-cpu stats or not
percpu = false
## Whether to report total system cpu stats or not
totalcpu = true
## If true, collect raw CPU time metrics
collect_cpu_time = false
## If true, compute and report the sum of all non-idle CPU states
## NOTE: The resulting 'time_active' field INCLUDES 'iowait'!
report_active = false
## If true and the info is available then add core_id and physical_id tags
core_tags = false
Щелкните кнопку Сохранить. Появится кнопка Тест, с помощью которой нужно выполнить тестирование конфигурации (рис. 9).Рис. 9. Окно тестирования конфигурации
Если ошибок нет, в окне Тест пройден появится сообщение «Конфигурация действительна». Закройте окно кнопкой Закрыть, а потом щелкните кнопку ^+S сохранения зеленого цвета с изображением дискеты.
После этого вернитесь в окно просмотра датчиков и щелкните там кнопку Активировать, расположенную в строке только что добавленного датчика CPU.
Через некоторое время будет активирован датчик CPU, а также служба датчиков (рис. 10).Рис. 10. Активирован датчик CPU и служба датчиков
Служба датчиков должна быть запущена и активирована.
Подождите несколько минут, а затем откройте страницу Графики в разделе Основные. Выберите здесь датчик cpu и поле usage_user. Вы увидите график соответствующей метрики загрузки процессора (рис. 11).Рис. 11. Просмотр графика загрузки процессора
Здесь можно выполнять различные операции с графиком — задавать период автоматического обновления, растягивать участки графика для детального просмотра, задавать временной интервал отображения метрики, коэффициент масштабирования по вертикальной оси и выполнять другие действия, описанные в документации NapiConfig.
Подключаем датчик XY-MD02 с интерфейсом RS-485 #
Для контроля температуры и влажности воспользуемся датчиком XY-MD02. Подключите его к микрокомпьютеру и Repka Pi 4 с помощью переходника из USB в RS-485.
Приобретая переходник из USB в RS-485, убедитесь, что в нем предусмотрена гальваническая развязка цепей. В описании преобразователя интерфейсов USB-RS485/RS232 на чипах CH340 и MAX232 есть фраза: "Адаптер имеет полную изоляцию источника питания и сигналов, обеспечивая надежную защиту от помех и безопасное использование."
Макет на базе Repka Pi 4 c ОС Napi Linux и датчиком XY-MD02 показан на рис. 12.Рис. 12. Подключение датчика XY-MD02 к микрокомпьютеру Repka Pi 4
При сборке макета подключите питание 12 В к соответствующим выводам датчика. Контакты A+ и B- датчика подключите к контактам A и B переходника.
Для проверки возможности получения метрик от датчика используйте команду mbpoll, которая есть в ОС Napi Linux:
# 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><01><1F><01><8B>
[2]: 287
[3]: 507
Как видите, датчик работает. Он вернул такие значения температуры и влажности:
- температура: 287/10 = 28.7 градусов Цельсия;
- влажность: 507/10 = 50.7%
При запуске команде 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 добавьте с помощью NapiConfig шаблон, представленный ниже:
## XY_MD02 Temperature\Humidity) Modbus RTU
[[inputs.modbus]]
name = "XY_MD02" # Название устройства
slave_id = 1
timeout = "10s"
# busy_retries = 0
# busy_retries_wait = "100ms"
controller = "/dev/ttyUSB0"
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=0.1, address = [1]},
{ measurement="XY_MD02-rtu", name = "Humidity", byte_order = "AB", data_type = "UINT16", scale=0.1, address = [2]},
]
На рис. 13 мы показали, что теперь Telegraf собирает метрики уже с двух датчиков.Рис. 13. Активированы датчики CPU и XY_MD02
Через несколько минут после активации датчика XY_MD02 откройте страницу Графики в разделе Основные. Выберите здесь датчик XY_MD02-rtu и поле Humidity. Появится график изменения влажности со временем (рис. 14).Рис. 14. График изменения влажности со временем
Подключаем датчик PZEM-016 с интерфейсом RS-485 #
Для того чтобы контролировать напряжение, ток и мощность нагрузки, получающей питание от электросети, можно использовать датчик PZEM-014/016 AC communication module.
Схема подключения этого датчика есть в документации, а также нарисована на корпусе датчика (рис. 15).Рис. 15. Схема подключения датчика PZEM-016
Напряжение 220 В с вилки подается на нижние два контакта PZEM-016.
На рис. 16 показан макет в сборе, с помощью которого можно контролировать энергопотребление паяльника.Рис. 16. Измеряем параметры потребления электроэнергии паяльника
К верхним двум контактам PZEM-016 подключается датчик тока, который нужно обернуть вокруг одного из поводов, идущих к розетке. Розетка в данном случае используется для подключения нагрузки.
После подключения PZEM-016 к микрокомпьютеру Repka Pi 4 выполним тестирование командой mbpoll:
# 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/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 = 0, count = 10
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][00][00][0A][70][0D]
Waiting for a confirmation...
<01><04><14><08><00><00><00><01><9A><00><00><00><00><00><01><00><64><00><00>
[0]: 2226
[1]: 184
[2]: 0
[3]: 410
[4]: 0
[5]: 240
[6]: 0
[7]: 500
[8]: 100
[9]: 0
Команда читает десять входных регистров начиная с регистра с номером 0. Полученные данные можно сверить с даташитом датчика, доступном на сайте https://smacont.ru/applying/015/PZEM-014-016-Datasheet-User-Manual.pdf.
В результате измерений были получены следующие значения от команды mbpoll, характерные для паяльника мощностью 40 Вт:
- Напряжение: 222.6 В
- Ток: 0.184 А
- Мощность: 41.0 Вт
- Энергия: 240 Вт*ч
- Частота: 50.0 Гц
- Коэффициент мощности: 1.00
Добавьте шаблон датчика с помощью NapiConfig, как это было описано ранее, а затем активируйте датчик:
##
AC communication module
[[inputs.modbus]]
name = "pzem016"
controller = [file:///dev/ttyUSB0](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]},
]
Теперь можно смотреть графики изменения метрик со временем. На рис. 17 показаны графики изменения питающего напряжения, на рис. 18 — частоты, а на рис. 19 — потребляемой мощности, соответственно.Рис. 17. Контроль питающего напряжения
Рис. 18. Контроль частоты питающего напряжения
Рис. 19. Контроль потребляемой мощности
Скачок на графике потребляемой мощности соответствует периоду времени, когда в розетку был включен паяльник на 40 Вт.
Подключаем датчик ATS-1204 #
С помощью NapiConfig можно настроить мониторинг по протоколу SNMP устройства ELEMY-ATS1204. Для этого в разделе SNMP – MIBs web-интерфейса NapiConfig загрузите файлы ELEMY-MIB и ELEMY-ATS1204-MIB, доступные на сайте https://github.com/lab240/telegraf-grafana-configs/tree/main/snmp/elemy-snmp (рис. 20).Рис. 20. Загрузка файлов ELEMY-MIB и ELEMY-ATS1204-MIB
Загрузите файл конфигурации датчика для Telegraf Elemy_ATS-1204_snmp_1.conf с сайта https://github.com/lab240/telegraf-grafana-configs/blob/main/conf-telegraf/Elemy/ATS-1204-snmp-starlrk/Elemy_ATS-1204_snmp_1.conf.
В списке датчиков должен появиться датчик Elemy_ATS-1204 (рис. 21).Рис. 21. Датчик Elemy_ATS-1204 в списке датчиков
Щелкните название датчика и запустите тестирование конфигурации с помощью кнопки Тест. Убедитесь, что тестирование завершилось успешно.
Выберите в разделе Графики датчик Elemy_ATS-1204. Теперь можно просматривать графики данных различных метрик, выбранных в списке Поле (рис. 22).Рис. 22. Просмотр графиков данных метрик датчика Elemy_ATS-1204
Как видите, при наличии файлов шаблонов подключение датчиков к мониторингу через NapiConfig не представляет особой трудности.
Просмотр данных в InfluxDB #
Для хранения данных, поступающих от датчиков через Telegraf, в Napi Linux используется база данных InfluxDB.
Откройте web-интерфейс InfluxDB, указав в адресной строке браузера URL вида http://192.168.0.20:8086/, заменив адрес IP своим. Введите логин «admin» и пароль «nnzadmin». На экране появится окно Get Started (рис. 23).Рис. 23. Окно Get Started
Затем откройте раздел Data Explorer, щелкнув соответствующий значок в левой панели (рис. 24).Рис. 24. Значок для открытия раздела Data Explorer
Выберите в списке FROM контейнер (бакет) bucket1. Появится список Filter. Установите в этом списке флажок cpu.
Справа от списка Filter появится еще один такой же фильтр со списком метрик. Выберите здесь метрику usage_user. При появлении третьего списка отметьте в нем флажок cpu-total.
После выбора датчика и нужных метрик щелкните кнопку SUBMIT. Вы увидите график изменения данных, причем сможете задавать, за какое время нужно показать данные (рис. 25).Рис. 25. График изменения данных метрики usage_user
Для получения данных в InfluxDB используется скрипт на языке программирования Flux. Чтобы просмотреть созданный скрипт, щелкните кнопку SCRIPT EDITOR. В результате вы увидите текст скрипта, который можно копировать или редактировать (рис. 26).Рис. 26. Текст скрипта на языке Flux для получения метрики usage_user
Сохраните этот скрипт в текстовом виде:
from(bucket: "bucket1")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|> filter(fn: (r) => r["_measurement"] == "cpu")
|> filter(fn: (r) => r["_field"] == "usage_user")
|> filter(fn: (r) => r["cpu"] == "cpu-total")
|> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)
|> yield(name: "mean")
Он будет нужен для создания панели в Grafana.
Просмотр данных в Grafana #
Если вы установили на Repka Pi 4 Napi Linux, то у вас уже есть мощная открытая платформа для визуализации и анализа данных Grafana. С ее помощью можно настроить мониторинг метрик в реальном времени через интерактивные дашборды. Среди множества источников данных она поддерживает InfluxDB.
В Grafana нетрудно создавать графики, диаграммы и алерты (оповещения о критичных событиях). Она может, например, отправлять уведомления о выходах значений метрик из заданных диапазонов.
Запуск Grafana на узле Napi Linux #
Чтобы запустить Grafana на узле Napi Linux, выберите строку Службы в разделе Настройки – Система. Далее найдите сервис grafana-server.service и убедитесь, что он запущен и активирован (рис. 27).Рис. 27. Проверка состояния сервиса grafana-server.service
После того как вы убедились, что сервис grafana-server.service работает, откройте в браузере адрес вида http://192.168.0.20:3000/, где вместо 192.168.0.20 укажите адрес IP вашего узла Napi Linux. Для доступа по этому адресу нужно использовать протокол HTTP, а не HTTPS.
Если служба запустилась без ошибок, вы увидите в браузере главную страницу Grafana (рис. 28).Рис. 28. Главное окно Grafana
Для входа введите логин «admin» и пароль «nnzadmin».
Добавление источника данных #
Убедитесь, что в Grafana добавлен источник данных — база данных InfluxDB. Для этого откройте главное меню и в разделе Connections выберите меню Data sources (рис. 29).Рис. 29. Выбор Data sources для просмотра источников данных
Откроется вкладка Data sources (рис. 30).Рис. 30. Вкладка Data sources
Обратите внимание, что источник данных InfluxDB уже добавлен.
Создание Dashboard #
Чтобы Grafana могла отображать данные измерений, полученные от датчиков, нужно создать Dashboard или подключить уже готовые.
Откройте главное меню Grafana и выберите строку Dashboards (рис. 31).Рис. 31. Создание панели Dashboards
Чтобы создать новую панель, щелкните ссылку New dashboard в разделе Dashboards. Далее в блоке Add panel щелкните ссылку Add a new panel для добавления новой панели (рис. 32).Рис. 32. Добавление новой панели
Будет создана панель, показанная на рис. 33.Рис. 33. Создание новой панели для датчика cpu
Скопируйте текст запроса на языке Flux, который мы привели в конце раздела статьи «Просмотр данных в InfluxDB». Также в поле Title задайте имя панели как CPU Panel. На рис. 33 все эти изменения уже сделаны.
После внесения изменений щелкните кнопку Apply. Вы увидите панель CPU Panel с графиком изменения значений метрики usage_user (рис. 34).Рис. 34. Панель CPU Panel с графиком изменения значений метрики usage_user
Если все получилось, то все основные службы, необходимые для полноценной работы с ОС Napi Linux в качестве системы сбора и мониторинга данных настроены правильно.
На рис. 35 показан результат добавления панелей.Рис. 35. Добавлены панели для основных метрик датчика PZEM-016
Дополнительно можно настроить пороги, чтобы показывать напряжение или ток другим цветом, например, при превышении заданных значений. Также есть возможность отправки оповещений из Grafana при выполнении каких-либо условий, например, если напряжение пропало или стало слишком высоким.
Готовые шаблоны датчиков #
Для Grafana по адресу https://sensor.napilinux.ru/ вы можете скачать готовый шаблон (рис. 36).Рис. 36. Готовые шаблоны для датчиков
Импортируйте шаблон ATS-1204 (или другой нужный шаблон) в разделе Import dashboard (рис. 37).Рис. 37. Импорт шаблона
Если все сделано правильно, вы увидите данные в панели Dashboard (рис. 38).Рис. 38. Данные датчика Elemy ATS-1204 в панели Dashboard
Работаем с NaPi.API #
После установки Napi Linux вам будет доступно NaPi.API, открывающее возможность вызывать функции NapiConfig из ваших программ.
Создание API ключа #
Чтобы использовать NaPi.API, создайте API ключ в разделе Безопасность (рис. 39).Рис. 39. Создание API ключа в разделе Безопасность
Щелкните здесь кнопку Создать API ключ. На экране появится форма, где нужно заполнить поле Имя и, если это нужно, поле Описание (рис. 40).Рис. 40. Создание API ключа
После создания ключа у вас будет одноразовая возможность его скопировать (рис. 41).Рис. 41. Копирование API ключа
Сохраните ключ в безопасном месте. После того как вы щелкните кнопку Готово, этот ключ нельзя будет посмотреть. Но при необходимости вы можете создать новый ключ.
Созданные ключи будут показаны на вкладке API (рис. 42).Рис. 42. Созданные API ключи
Документация NaPi.API опубликована в формате OpenAPI.
Вызов маршрутов NaPi.API с помощью утилиты curl #
Приведем примеры вызова NaPi.API с помощью утилиты curl, а также код программы на Python, работающей с этим API.
Для вызова маршрута /v1/login используйте следующую команду:
$ curl -k -X POST https://192.168.0.20/api/v1/login \
-H "Content-Type: application/x-www-form-urlencoded" \
-H "X-API-Key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE3NTI2NTY3OTIuNTI2MTUsInR5cGUiOiJhcGlfa2V5Iiwib3JpZyI6Im15X2FwcCIsImRlc3QiOiJuYXBpLXJpdmVyYW50In0.m_GUOLH2HSc-Otsz4kNOptI3_SyeLKHXy2eBFfvfniI" \
-d "username=admin&password=admin"
Здесь нужно подставить свою строку X-API-Key, о получении которой было написано выше.
Маршрут возвращает API ключ:
{"access_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuaWNrbmFtZSI6ImFkbWluIiwiZXhwIjoxNzUyNzQzOTE4LCJpYXQiOjE3NTI2NTc1MTh9.N7Dr8hgmzMzlMGZlsLyjbDXVzjqKUtr-o35i8bV_Aos"}
Чтобы получить конфигурацию всех датчиков, используйте маршрут v1/sensors/configs:
$ curl -k -X GET https://192.168.0.20/api/v1/sensors/configs \
-H "Accept: application/json" \
-H "X-API-Key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE3NTI2NTY3OTIuNTI2MTUsInR5cGUiOiJhcGlfa2V5Iiwib3JpZyI6Im15X2FwcCIsImRlc3QiOiJuYXBpLXJpdmVyYW50In0.m_GUOLH2HSc-Otsz4kNOptI3_SyeLKHXy2eBFfvfniI "
В результате вы получите данные в виде строки, формат которой не очень удобен для просмотра:
[{"name":"CPU","description":null,"manufacturer":null,"tags":[],"file_path":"/opt/app/app/data/sensor_configs/cpu.conf","id":1,"created_at":"2025-07-14T13:18:11.088583","updated_at":"2025-07-14T13:24:20.109532","is_active":true},{"name":"XY_MD02","description":null,"manufacturer":null,"tags":[],"file_path":"/opt/app/app/data/sensor_configs/xy_md02.conf","id":2,"created_at":"2025-07-14T15:32:16.489520","updated_at":"2025-07-14T16:09:51.868062","is_active":true},{"name":"PZEM-016","description":null,"manufacturer":null,"tags":[],"file_path":"/opt/app/app/data/sensor_configs/pzem-016.conf","id":3,"created_at":"2025-07-15T08:25:41.768879","updated_at":"2025-07-15T08:25:56.086385","is_active":true}]
Для форматирования строки передайте ее команде python3 -m:
echo '[{"name":"CPU","description":null,"manufacturer":null,"tags":[],"file_path":"/opt/app/app/data/sensor_configs/cpu.conf","id":1,"created_at":"2025-07-14T13:18:11.088583","updated_at":"2025-07-14T13:24:20.109532","is_active":true},{"name":"XY_MD02","description":null,"manufacturer":null,"tags":[],"file_path":"/opt/app/app/data/sensor_configs/xy_md02.conf","id":2,"created_at":"2025-07-14T15:32:16.489520","updated_at":"2025-07-14T16:09:51.868062","is_active":true},{"name":"PZEM-016","description":null,"manufacturer":null,"tags":[],"file_path":"/opt/app/app/data/sensor_configs/pzem-016.conf","id":3,"created_at":"2025-07-15T08:25:41.768879","updated_at":"2025-07-15T08:25:56.086385","is_active":true}]' | python3 -m json.tool
[
{
"name": "CPU",
"description": null,
"manufacturer": null,
"tags": [],
"file_path": "/opt/app/app/data/sensor_configs/cpu.conf",
"id": 1,
"created_at": "2025-07-14T13:18:11.088583",
"updated_at": "2025-07-14T13:24:20.109532",
"is_active": true
},
{
"name": "XY_MD02",
"description": null,
"manufacturer": null,
"tags": [],
"file_path": "/opt/app/app/data/sensor_configs/xy_md02.conf",
"id": 2,
"created_at": "2025-07-14T15:32:16.489520",
"updated_at": "2025-07-14T16:09:51.868062",
"is_active": true
},
{
"name": "PZEM-016",
"description": null,
"manufacturer": null,
"tags": [],
"file_path": "/opt/app/app/data/sensor_configs/pzem-016.conf",
"id": 3,
"created_at": "2025-07-15T08:25:41.768879",
"updated_at": "2025-07-15T08:25:56.086385",
"is_active": true
}
]
Здесь показаны данные трех датчиков, которые я добавил ранее. Для каждого датчика выводится имя, описание, производитель и теги (если заданы), путь к файлу конфигурации Telegraf, идентификатор, даты создания и обновления конфигурации.
Вызов маршрутов NaPi.API из программы Python #
Приведем для примера исходный код программы, получающей список всех датчиков и метрики датчика XY_MD02-rtu, считывая их из InfluxDB через NaPi.API.
Перед запуском программы установите пакет requests:
$ pip3 install requests
Исходный код программы приведен ниже:
import requests
import getpass
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
API_BASE = "https://192.168.0.20/api/v1"
API_KEY = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE3NTI2NTY3OTIuNTI2MTUsInR5cGUiOiJhcGlfa2V5Iiwib3JpZyI6Im15X2FwcCIsImRlc3QiOiJuYXBpLXJpdmVyYW50In0.m_GUOLH2HSc-Otsz4kNOptI3_SyeLKHXy2eBFfvfniI"
HEADERS = {
"Accept": "application/json",
"X-API-Key": API_KEY,
"Content-Type": "application/json"
}
# --- Получение всех measurements ---
meas_url = f"{API_BASE}/influxdb/data/measurements"
response = requests.get(meas_url, headers=HEADERS, verify=False)
if response.status_code != 200:
print(f"[!] Ошибка получения measurements: {response.status_code}")
print(response.text)
exit(1)
measurements = response.json()
print("\n[+] Доступные измерения (measurements):")
for m in measurements:
print("-", m)
# --- Работа с XY_MD02-rtu ---
target_measurement = "XY_MD02-rtu"
#target_measurement = "cpu"
print(f"\n[+] Обработка measurement: {target_measurement}")
# Получаем поля
fields_url = f"{API_BASE}/influxdb/data/measurements/{target_measurement}/fields"
response = requests.get(fields_url, headers=HEADERS, verify=False)
if response.status_code != 200:
print(f"[!] Ошибка получения полей для {target_measurement}: {response.status_code}")
print(response.text)
exit(1)
fields = response.json()
print(f"[+] Поля для {target_measurement}:")
for field in fields:
print("-", field)
# Получаем данные по каждому полю
print(f"\n[+] Данные по каждому полю:")
for field in fields:
sensor_url = f"{API_BASE}/influxdb/data/sensors/{target_measurement}/{field}"
response = requests.get(sensor_url, headers=HEADERS, verify=False)
print(f"\n📌 Поле: {field}")
if response.status_code == 200:
try:
data = response.json()
entries = data.get(target_measurement, {}).get(field, [])
if not entries:
print("Нет данных")
else:
for entry in entries:
print(f"{entry['time']}: {entry['value']}")
except Exception as e:
print("Ошибка разбора JSON:", e)
else:
print("Ошибка запроса:", response.text)
Результаты своей работы программа выводит на консоль:
# python3 napi_api.py
[+] Доступные измерения (measurements):\
XY_MD02-rtu\
cpu
[+] Обработка measurement: XY_MD02-rtu
[+] Поля для XY_MD02-rtu:\
Humidity\
Temperature
[+] Данные по каждому полю:
📌 Поле: Humidity
2025-07-16T09:29:40+00:00: 52
2025-07-16T09:29:50+00:00: 52
2025-07-16T09:30:00+00:00: 52
2025-07-16T09:30:10+00:00: 52
2025-07-16T09:30:20+00:00: 52
2025-07-16T09:30:30+00:00: 52
2025-07-16T09:30:40+00:00: 52
2025-07-16T09:30:50+00:00: 53
2025-07-16T09:31:00+00:00: 53
2025-07-16T09:31:10+00:00: 53
2025-07-16T09:31:20+00:00: 53
2025-07-16T09:31:30+00:00: 53
2025-07-16T09:31:40+00:00: 53
2025-07-16T09:31:50+00:00: 53
2025-07-16T09:32:00+00:00: 53
2025-07-16T09:32:10+00:00: 53
2025-07-16T09:32:20+00:00: 53
2025-07-16T09:32:30+00:00: 53
2025-07-16T09:32:40+00:00: 54
2025-07-16T09:32:50+00:00: 54
2025-07-16T09:33:00+00:00: 54
2025-07-16T09:33:10+00:00: 54
2025-07-16T09:33:20+00:00: 54
2025-07-16T09:33:30+00:00: 54
2025-07-16T09:33:40+00:00: 54
2025-07-16T09:33:50+00:00: 54
2025-07-16T09:34:00+00:00: 54
2025-07-16T09:34:10+00:00: 54
2025-07-16T09:34:20+00:00: 54
2025-07-16T09:34:30+00:00: 54
📌 Поле: Temperature
2025-07-16T09:29:40+00:00: 27
2025-07-16T09:29:50+00:00: 27
2025-07-16T09:30:00+00:00: 27
2025-07-16T09:30:10+00:00: 27
2025-07-16T09:30:20+00:00: 27
2025-07-16T09:30:30+00:00: 27
2025-07-16T09:30:40+00:00: 27
2025-07-16T09:30:50+00:00: 27
2025-07-16T09:31:00+00:00: 27
2025-07-16T09:31:10+00:00: 27
2025-07-16T09:31:20+00:00: 27
2025-07-16T09:31:30+00:00: 27
2025-07-16T09:31:40+00:00: 27
2025-07-16T09:31:50+00:00: 27
2025-07-16T09:32:00+00:00: 27
2025-07-16T09:32:10+00:00: 27
2025-07-16T09:32:20+00:00: 27
2025-07-16T09:32:30+00:00: 27
2025-07-16T09:32:40+00:00: 27
2025-07-16T09:32:50+00:00: 27
2025-07-16T09:33:00+00:00: 27
2025-07-16T09:33:10+00:00: 27
2025-07-16T09:33:20+00:00: 27
2025-07-16T09:33:30+00:00: 27
2025-07-16T09:33:40+00:00: 27
2025-07-16T09:33:50+00:00: 27
2025-07-16T09:34:00+00:00: 27
2025-07-16T09:34:10+00:00: 27
2025-07-16T09:34:20+00:00: 27
2025-07-16T09:34:30+00:00: 27
На рис. 43 показан соответствующий этим измерениям график изменения влажности.Рис. 43. График изменения влажности
Таким образом, с помощью NaPi.API вы можете создавать программы, получающие данные метрик из InfluxDB для обработки согласно нужным вам алгоритмам.
Итоги #
Теперь, когда появился образ Napi Linux для Repka Pi 4, вы можете собрать систему сбора данных с использованием Modbus, даже не обладая навыками системного администрирования Linux.
В этом материале показано, как подключить датчики XY-MD02, PZEM-016 и ATS-1204, при этом все действия по настройке конфигурации можно сделать через Web-интерфейс NapiConfig. Данные собираются с датчиков при помощи Telegraf, а затем сохраняются в InfluxDB, как можно настроить отображение этих данных в Grafana. Все эти настройки также выполняются при помощи NapiConfig.
Прочитав статью, вы узнали о том, как использовать программный интерфейс NaPi.API, предусмотренный в Napi Linux, для реализации собственных алгоритмов обработки данных и управления узлом из своих программ, показано, как вызывать маршруты NaPi.API при помощи программы curl, а также из программы на Python.
Хочется надеяться, что вся эта информация поможет вам при создании систем сбора и мониторинга данных на базе микрокомпьютера российской сборки Repka Pi 4.
Полезные ссылки #
- Сайт микрокомпьютера Repka Pi
- Repka Pi в реестре Минпромторга
- Операционная система Napi Linux
- Образы Napi Linux для различных платформ
- Программа BalenaEtcher
- Программа Rufus
- Карта EMMC
- Документация NapiConfig
- Документация NaPi.API
- Формат OpenAPI
- Протокол Modbus
- Modbus
- Как общаются машины: протокол Modbus
- Telegraf documentation
- Introduction to the InfluxData platform
- Описание XY-MD02
- PZEM-014/016 AC communication module
- ELEMY-ATS1204
- Grafana Technical documentation
- Готовые шаблоны датчиков для Grafana
- Статья Собираем метрики с датчиков через Modbus и Telegraf