Skip to content

Отправка состояния Unit через MQTT

WARNING

Поддерживаемые топики состояний должны быть отражены в schema_example.json в разделе output_base_topic.

Unit должен отправлять форматированные данные в топики, которые указаны. Pepeunit обязуется обработать их по единому паттерну, описанному в данном разделе.

Всего в Pepeunit есть два топика отвечающий за отправку состояния:

  1. state/pepeunit - output_base_topic
  2. log/pepeunit output_base_topic

state/pepeunit - output_base_topic

Когда Unit отправляет данные в этот топик?

  1. Каждые STATE_SEND_INTERVAL секунд указанные в env.json.

Данные отправляемые Unit, преобразуются на стороне Pepeunit в отображение состояния в меню Unit. Также данное состояние можно получить через REST и GQL.

Формат сообщений в топик state/pepeunit

json
{
    "ifconfig": ["192.168.0.3", "255.255.255.0", "192.168.0.1", "192.168.0.1"],
    "millis": 595925249.0,
    "mem_free": 12368.0,
    "mem_alloc": 25648.0,
    "freq": 80000000.0,
    "statvfs": [4096, 4096, 763, 716, 716, 0, 0, 0, 0, 255],
    "commit_version": "7f1b6564c4885432a17e5892e3c98f3a2ad33658"
}

Разберём каждый ключ:

  • ifconfig - данные о подключении к сети в формате [ip, subnet, gateway, dns]
  • millis - время в миллисекундах с момента старта программы или время unix также в миллисекундах
  • mem_free - свободная RAM память в Байтах
  • mem_alloc - используемая RAM память в Байтах
  • freq - частота работы кристала в Гц
  • statvfs - состояние файловой системы flash памяти, позволяет вычислить сколько flash памяти используется и осталось:
    python
    [
        f_bsize,  # file system block size
        f_frsize,  # fragment size
        f_blocks,  # size of fs in f_frsize units
        f_bfree,  # number of free blocks
        f_bavail,  # number of free blocks for unprivileged users
        f_files,  # number of inodes
        f_ffree,  # number of free inodes
        f_favail,  # number of free inodes for unprivileged users
        f_flag,  # mount flags
        f_namemax,  # maximum filename length
    ]
  • commit_version - ключ COMMIT_VERSION из env.json файла Unit. Данный ключ используется в системе обновлений Pepeunit, для отслеживания текущей версии Unit.

DANGER

Для корректной работы статусов обновлений у Unit, требуется отправлять commit_version

WARNING

Размер передаваемого Unit состояния ограничен количеством символов указанных в переменной окружения MQTT_MAX_PAYLOAD_SIZE из Backend ENV. По умолчанию это значение составляет 50000 символов.

INFO

Pepeunit не обязывает отправлять все ключи указанные в примере, можно отправить например только два ключа millis и commit_version

Алгоритм отправки

  1. Каждые STATE_SEND_INTERVAL секунд опросить состояние системы
  2. Отформатировать данные для отправки в json формате
  3. Отправить данные в топик state/pepeunit из output_base_topic, указанный в schema.json

log/pepeunit - output_base_topic

Когда Unit отправляет данные в этот топик?

  1. Если Unit сам считает нужным отправить лог или набор логов для отображения Пользователю
  2. В случае получения команды в топике log_sync/pepeunit, подробнее

Данные отправляемые Unit, преобразуются на стороне Pepeunit в меню логов Unit. Также данные логи можно получить через REST и GQL.

Формат сообщений в топик log/pepeunit

Поддерживается несколько форматов отправки логов:

  1. Отправка одного лога напрямую:
    json
    {
        "level": "Info",
        "text": "Subscribed: 83 (0, 0, 0, 0, 0)",
        "create_datetime": "2025-04-08T11:27:52.044394"
    }
  2. Отправка одного лога напрямую, без указания времени:
    json
    {
        "level": "Info",
        "text": "Subscribed: 83 (0, 0, 0, 0, 0)"
    }
  3. Отправка множества логов:
    json
    [
        {
            "level": "Info",
            "text": "Subscribed: 5 (0, 0, 0, 0, 0)",
            "create_datetime": "2025-04-08T11:37:55.087036"
        },
        {
            "level": "Debug",
            "text": "Unit 7d99d194-fe09-4737-b991-0a67cff966d7 get msg from topic log_sync",
            "create_datetime": "2025-04-08T11:38:22.828806"
        },
        {
            "level": "Debug",
            "text": "Unit 7d99d194-fe09-4737-b991-0a67cff966d7 get msg from topic env_update",
            "create_datetime": "2025-04-08T11:41:15.974031"
        }
    ]
  4. Отправка множества логов, без указания времени:
    json
    [
        {
            "level": "Info",
            "text": "Subscribed: 5 (0, 0, 0, 0, 0)"
        },
        {
            "level": "Debug",
            "text": "Unit 7d99d194-fe09-4737-b991-0a67cff966d7 get msg from topic log_sync"
        },
        {
            "level": "Debug",
            "text": "Unit 7d99d194-fe09-4737-b991-0a67cff966d7 get msg from topic env_update"
        }
    ]

Разберём каждый ключ и логику обработки на стороне Pepeunit:

  • level - указывает уровень логирования и может принимать следующие значения: Debug, Info, Warning, Error, Critical
  • text - содержание лога в текстовом формате, желательно укладывать в 256 символов для корректного отображения в Frontend
  • create_datetime - необязательный ключ, указывающий временную метку для Pepeunit. Именно данная метка отображается Пользователю, в случае отсутствия Pepeunit действует по следующим алгоритмам:
    1. Если сообщение содержит один лог и данный ключ отсутствует, берётся время когда Pepeunit получил сообщение.
    2. Если отправлено множество логов и данный ключ отсутствует, Pepeunit берёт текущее время для самого первого элемента листа и добавляет по 1 секунде для каждого последующего элемента c целью сохранить порядок логов полученный от Unit.

WARNING

Размер передаваемого Unit лога ограничен количеством символов указанных в переменной окружения MQTT_MAX_PAYLOAD_SIZE из Backend ENV. По умолчанию это значение составляет 50000 символов.

По умолчанию время жизни логов ограничено 86400 секундами. За это отвечает переменная BACKEND_UNIT_LOG_EXPIRATION из Backend ENV.

Алгоритм отправки

  1. Отформатировать данные для отправки в json формате
  2. Отправить данные в топик log/pepeunit из output_base_topic, указанный в schema.json