Работа с данными в Telegraf
Предисловие. О Telegraf
Telegraf универсальный инструмент перекладывания данных от источников данных к приемникам данных. Классическим источником данных являются протоколы опроса датчиков, такие как modbus\mqtt, а классическим приемником данных являются базы данных (influxdb, mysql). Наличие сотен плагинов для Telegraf освобождает нас от написания микросервисов по перекладыванию данных, а применять один инструмент.
- Ссылка на Telegraf: https://www.influxdata.com/time-series-platform/telegraf/
- Ссылка на плагины Telegraf: https://docs.influxdata.com/telegraf/v1.26/plugins/
Применение Telegraf
Мы используем "комбайн" Telegraf в наших решениях по сбору данных и любим его за универсальность.
Пример конфиг для сбора данных по modbus выглядит так
Modbus TCP
[[inputs.modbus]]
name = "Device"
slave_id = 4
timeout = "3s"
controller = "tcp://127.0.0.1:502"
holding_registers = [
{ name = "elemy_binary1", byte_order = "AB", data_type = "UINT16", scale=1.0, address = [0]},
{ name = "elemy_binary2", byte_order = "AB", data_type = "UINT16", scale=1.0, address = [1]},
]
Modbus rtu (на примере датчика окружающей среды IPCDAS FS-C1)
## FrontSensor C1 Шаблон для встроенного датчика тока
[[inputs.modbus]]
name = "FS-C1"
slave_id = 1
timeout = "10s"
# busy_retries = 0
# busy_retries_wait = "100ms"
controller = "file:///dev/ttyS1"
baud_rate = 9600
data_bits = 8
parity = "N"
stop_bits = 1
transmission_mode = "RTU"
holding_registers = [
{ name = "Volt_a", byte_order = "AB", data_type = "UINT16", scale=0.01, address = [72]},
{ name = "Amp_a", byte_order = "AB", data_type = "UINT16", scale=1.0, address = [73]},
{ name = "W_a", byte_order = "AB", data_type = "UINT16", scale=1.0, address = [74]},
{ name = "PF_a", byte_order = "AB", data_type = "UINT16", scale=1.0, address = [77]},
{ name = "Freq_a", byte_order = "AB", data_type = "UINT16", scale=0.01, address = [81]},
]
MQTT Config (на примере платформы donoff)
[[inputs.mqtt_consumer]]
servers = ["tcp://SERVER:1883"]
topics = ["/donoff/+/out/sensors/+"]
username = "MQTT_USER"
password = "MQTT_PASS"
data_format = "value"
data_type = "string"
[[inputs.mqtt_consumer.topic_parsing]]
topic = "/donoff/+/out/sensors/+"
tags = "/prj/dev/_/_/_"
fields = "/_/_/_/_/sensor_name"
Преобразование данных
Прежде чем данные пойдут в приемник, они могут быть обработаны, так называемыми процессорами. Не всегда получаемые готовы в прямом виде поступить в туже базу данных. Надо отфильтровать ненужные (лишние), преобразовать типы, и даже получить новые данные на основе исходных.
Пример простого процессора для MQTT
[[processors.pivot]]
tag_key = "sensor_name"
value_key = "value"