Промышленные датчики без боли. Telegraf заменяет сотни строк кода
Промышленные датчики без боли. Telegraf заменяет сотни строк кода

Каждый инженер, работавший с RS485-датчиками, знает этот путь наизусть: Python-скрипт, падение через неделю, watchdog, и в итоге - осознание, что CSV был плохой идеей с самого начала. Оказывается, весь этот круг можно обойти стороной.

Классика жанра: как рождается «технический долг»

Сценарий повторяется с пугающей регулярностью. Нашли Modbus-датчик, раздобыли карту регистров, написали скрипт на Python. Он опрашивает устройство раз в десять секунд и пишет строчку в CSV. Работает - и ладно.

Через неделю скрипт молчит. Порт захвачен другим процессом, systemd не поднял службу после перезагрузки, датчик трижды не ответил и поток завис в ожидании. Чинишь, добавляешь перезапуск, потом watchdog. Потом понимаешь, что данные надо хранить нормально, а не в плоском файле. Цикл замкнулся - и ты потратил не один вечер на инфраструктуру вместо задачи.

Что предлагает связка Telegraf - InfluxDB - Grafana

Telegraf - агент сбора метрик от InfluxData - умеет опрашивать Modbus-устройства напрямую через плагин inputs.modbus. Никакого промежуточного кода. Демон работает в фоне, читает регистры по расписанию и пишет временные ряды прямо в InfluxDB 2.x. Grafana строит графики поверх базы. Весь стек открытый, работает локально, интернет не нужен.

На практике это выглядит так: создаёшь конфиг-файл с описанием регистров, указываешь адрес датчика, токен InfluxDB - и перезапускаешь службу. Данные начинают поступать. Без скрипта, без CSV, без ручного watchdog.

Ключевые параметры конфига, которые важно понять сразу

  • byte_order - порядок байт. Большинство Modbus-устройств используют big-endian ("AB"). Если значения выглядят бессмыслицей - меняй на "BA".
  • data_type - тип данных в регистре. UINT16 для беззнакового целого, INT16 для значений с минусом, FLOAT32 для устройств, передающих числа с плавающей точкой через два регистра.
  • scale - множитель. Датчик часто умножает реальное значение на 10 перед записью, чтобы обойтись целыми числами. Scale=0.1 возвращает смысл обратно.
  • address - PDU-адрес регистра, нумерация с нуля. Если документация пишет 40003 - вычти единицу и убери ведущую четвёрку: получишь 2.

Перед конфигом - проверь физику

Прежде чем трогать Telegraf, стоит убедиться, что датчик вообще отвечает. Утилита modpoll позволяет опросить устройство вручную за несколько секунд. Если ответ пришёл - можно идти в конфиг. Если нет - проблема в проводах, полярности или адресе. Telegraf здесь не поможет: сначала физика, потом софт.

На шину RS-485 без дополнительного оборудования влезает до 32 устройств. Каждому - уникальный slave_id. Telegraf опрашивает их последовательно, один конфиг-файл на каждый датчик или группу.