Блок для MQTT
Добавлено: 24 мар 2026, 18:00
Всем Доброго времени суток!
Давно не мог найти блок под ESP8266 со стабильной работой на бета версиях, в старых версиях не тестировал. Решил попробовать сделать блок сам (в планах добавить поддержку ESP32). Но так как я не очень "волоку", мне помог ИИ. Так что сильно не ругайтесь, ваял недели две.
Это мой второй блок (раньше даже ни чего не писал, по этому критика приветствуется и если можно то с разъяснениями).
Если у кого ни будь возникнет желание протестировать блоки на ранних версиях, то буду безмерно благодарен, главное отпишитесь.
К каждому блоку есть описание
Пакет MQTT блоков (протестирован на FLProg 9.6.20) обеспечивает стабильную работу с MQTT брокерами на платформе ESP8266.
Позволяет подключаться к любому MQTT брокеру, принимать и отправлять сообщения.
СОСТАВ ПАКЕТА
MQTT_CORE Центральное ядро подключение к брокеру, прием сообщений, буферизация 1 в проекте (обязательный)
MQTT_SUB Подписка на топик, получение сообщений до 20 в проекте
MQTT_PUB Публикация сообщений в топик до 20 в проекте
===================================================================================
===================================================================================
Блок MQTT_CORE является центральным ядром MQTT-функциональности.
Отвечает за:
Подключение к MQTT брокеру
Поддержание постоянного соединения
Прием всех входящих сообщений от брокера
Управление буфером сообщений
Отладку и диагностику
Блок должен быть только один на схеме. Все блоки SUB и PUB используют его ресурсы.
Особенности работы
Подключение к брокеру
При запуске:
1. Чтение настроек из входов блока
2. Инициализация MQTT клиента
3. При наличии WiFi соединения - подключение к брокеру
4. Периодическое поддержание соединения (keepAlive)
5. Автоматическое переподключение при обрыве связи
Прием сообщений
Все входящие сообщения от брокера:
Сохраняются в общий буфер (размер задается параметром mqttBufferSize)
Каждое сообщение получает уникальный ID
Блоки SUB читают сообщения из буфера
Отладка
При включенном debugEnable:
Выводятся все этапы подключения
Отображаются отправленные и полученные сообщения
Сообщается о потерях связи и ошибках на выходе debugEnable
======================================================================
Входы блока MQTT_CORE
Имя входа Описание
mqttServer String Адрес MQTT брокера (IP или доменное имя)
mqttPort Integer Порт MQTT брокера (обычно 1883, для TLS 8883)
mqttUser String Имя пользователя для аутентификации на брокере
mqttPassword String Пароль для аутентификации на брокере
mqttClientId String Уникальный идентификатор клиента. При пустом значении формируется автоматически из MAC адреса
debugEnable Включение режима отладки. (При true в выход debug выводятся все события)
Выходы блока MQTT_CORE
Имя выхода Описание
mqttConnected Boolean Статус подключения к MQTT брокеру. (true - подключен, false - отключен)
debug String Отладочные сообщения. Содержит информацию о подключении, подписках, полученных и отправленных сообщениях
========================================================================
ДИАГНОСТИКА НЕПРАВИЛЬНЫХ НАСТРОЕК
Проблема Вероятная причина Решение
Частые WDT сбросы process_interval слишком мал Увеличить на 5-10 мс
Пропуск сообщений mqttBufferSize слишком мал Увеличить на 10-20
Медленное подключение reconnectTime слишком велик Уменьшить до 3000-5000
Потеря подписок после перезагрузки cleanSession = 1 Установить cleanSession = 0
Переполнение памяти mqttBufferSize слишком велик Уменьшить до 40-50 для ESP8266
Возможные ошибки и их решение MQTT_CORE
Ошибка в debug Причина Решение
Connection failed, state: -2 Неправильный адрес сервера Проверить mqttServer
Connection failed, state: -4 Неправильный порт Проверить mqttPort
Connection failed, state: -5 Неправильный логин/пароль Проверить mqttUser, mqttPassword
WiFi lost Потеря WiFi соединения Проверить WiFi настройки
Connection timeout Таймаут подключения Увеличить reconnectTime
Возможные ошибки и их решение MQTT_SUB
Проблема Причина Решение
Нет импульса Received Подписка не выполнена Проверить Topic, включить debugEnable
Message пустой Сообщение не пришло Проверить, что брокер отправляет сообщения
Ошибка компиляции Превышен max_subscription Увеличить параметр max_subscription
Долгое получение Большое количество SUB Уменьшить process_interval
Сообщения перезаписываются Малый mqttBufferSize Увеличить mqttBufferSize
==========================================================================================
==========================================================================================
Блок MQTT_SUB (До 20ти блоков в проекте) предназначен для получения сообщений из указанного MQTT топика.
Он автоматически подписывается на топик и выдает полученные сообщения на свои выходы.
На схеме может быть неограниченное количество блоков SUB (ограничено параметром max_subscription).
Особенности работы
Регистрация подписки
При первом подключении MQTT_CORE:
1. Блок SUB регистрирует свой топик в системе
2. MQTT_CORE выполняет подписку на брокере
3. Подписка сохраняется при cleanSession = 0
Получение сообщений
Алгоритм обработки:
1. Все сообщения поступают в MQTT_CORE
2. MQTT_CORE помещает их в общий буфер
3. Блоки SUB по очереди проверяют буфер на наличие своих сообщений
4. При нахождении сообщения:
- Выставляется Received = true (импульс)
- В Message записывается текст сообщения
Round-Robin обработка
При большом количестве SUB блоков (более 3-4) используется циклическая обработка:
Каждый цикл Loop обрабатывается только один SUB блок
Интервал обработки задается параметром process_interval
Задержка получения сообщения = process_interval × количество SUB блоков
Wildcard символы в топиках
Символ Название Описание Пример
+ Одноуровневый Заменяет один уровень топика +/temp = все топики с temp на втором уровне
# Многоуровневый Заменяет все последующие уровни sensors/# = все топики, начинающиеся с sensors/
QoS (Quality of Service)
QoS Название Описание Применение
0 At most once "Не более одного раза". Сообщение отправляется без подтверждения. Может быть потеряно. Телеметрия, некритичные данные, частая отправка
1 At least once "Не менее одного раза". Сообщение отправляется с подтверждением. Может быть дублировано. Важные данные, команды управления
2 Exactly once "Ровно один раз". Гарантированная доставка без дублирования. Критичные команды, финансовые операции
Рекомендации по выбору QoS:
Сценарий Рекомендуемый QoS
Температура, влажность 0
Статус реле, датчик движения 1
Команда включения/выключения 1
Обновление прошивки, настройки 2
=========================================================
Входы блока
Имя входа Тип Вид Описание
Topic String Имя MQTT топика для подписки. Может содержать wildcard символы + и #
QoS Byte Уровень качества обслуживания (0, 1, 2)
==========================================================
Выходы блока
Имя выхода Тип Вид Описание
Received Boolean Создавать переменную Импульс при получении нового сообщения. Устанавливается в true на один цикл Loop
Message String Создавать переменную Текст полученного сообщения
===========================================================
===========================================================
Возможные ошибки и их решение
Проблема Причина Решение
Нет импульса Received Подписка не выполнена Проверить Topic, включить debugEnable
Message пустой Сообщение не пришло Проверить, что брокер отправляет сообщения
Ошибка компиляции Превышен max_subscription Увеличить параметр max_subscription
Долгое получение Большое количество SUB Уменьшить process_interval
Сообщения перезаписываются Малый mqttBufferSize Увеличить mqttBufferSize
==========================================================================================
==========================================================================================
Блок MQTT_PUB (Publisher) предназначен для отправки сообщений в MQTT брокер. Он публикует данные в указанный топик с заданным уровнем качества обслуживания (QoS) и флагом сохранения (Retain).
Обнаружение фронта
Блок отправляет сообщение только по фронту (переход из 0 в 1) на входе Send:
Время: t0 t1 t2 t3 t4
Send: 0 → 1 1 0 0
↑
Фронт! Отправка сообщения
Подтверждение доставки
Выход Delivered выдает один импульс:
Время: t0 t1 t2 t3 t4
Send: 0 → 1 1 0 0
Delivered: 0 1 0 0 0
↑
Импульс подтверждения
Защита от повторной отправки
Блок имеет встроенную защиту: пока вход Send остается в 1, повторная отправка не происходит. Для новой отправки необходимо:
Сбросить Send в 0
Снова установить в 1
Входы блока MQTT_PUB
Имя входа Тип Вид Описание
Send Boolean Вход Фронтовый вход. Отправляет сообщение при переходе из 0 в 1. Для повторной отправки необходимо сбросить вход в 0, затем снова установить в 1.
Topic String Имя MQTT топика для публикации. Например: home/room1/temperature, device/relay/state
Message String Текст сообщения для отправки. Может быть статическим текстом или динамически формироваться из переменных.
QoS Byte Уровень качества обслуживания: 0, 1 или 2. Определяет гарантии доставки сообщения.
Retain Boolean Флаг сохранения сообщения на брокере. При true сообщение сохраняется и отправляется новым подписчикам.
Выходы блока MQTT_PUB
Имя выхода Описание
Delivered Создавать переменную Импульсный выход. Устанавливается в true на один цикл Loop после успешной отправки сообщения. Используется для подтверждения доставки.
QoS (Quality of Service)
QoS Название Описание Применение
0 At most once "Не более одного раза". Сообщение отправляется без подтверждения. Может быть потеряно. Телеметрия, некритичные данные, частая отправка
1 At least once "Не менее одного раза". Сообщение отправляется с подтверждением. Может быть дублировано. Важные данные, команды управления
2 Exactly once "Ровно один раз". Гарантированная доставка без дублирования. Критичные команды, финансовые операции
Рекомендации по выбору QoS:
Сценарий Рекомендуемый QoS
Температура, влажность 0
Статус реле, датчик движения 1
Команда включения/выключения 1
Обновление прошивки, настройки 2
Retain (Сохранение сообщения)
Retain Описание Пример использования
false Сообщение не сохраняется на брокере. Получают только текущие подписчики. Динамические данные: температура, влажность
true Сообщение сохраняется на брокере и отправляется новым подписчикам. Последнее известное состояние: статус реле, режим работы
Важно: При использовании Retain = true, брокер хранит последнее сообщение. При новом подключении подписчик сразу получает это сообщение.
// Пример: "Temperature: 22.5°C, Humidity: 45%"
Message = "Temperature: " + String(temp) + "°C, Humidity: " + String(hum) + "%"
// Пример: время и значение
Message = String(millis()) + ":" + String(value)
Коды ошибок MQTT клиента
Код Значение Решение
-4 MQTT_CONNECTION_TIMEOUT Проверить сервер и порт
-3 MQTT_CONNECTION_LOST Проверить WiFi стабильность
-2 MQTT_CONNECT_FAILED Проверить логин/пароль
-1 MQTT_DISCONNECTED Нет соединения, ожидание
0 MQTT_CONNECTED Нормальная работа
4 MQTT_CONNECT_BAD_CREDENTIALS Неверный логин/пароль
Возможные ошибки и их решение
Проблема Причина Решение
Нет отправки Send не имеет фронта Использовать блок "Фронт" или импульсный выход
Нет импульса Delivered MQTT не подключен Проверить CORE и WiFi
Сообщение не доходит до брокера Неправильный топик Проверить топик в веб-интерфейсе брокера
Ошибка аутентификации Неверный логин/пароль Проверить mqttUser, mqttPassword
Дублирование сообщений QoS 1 или 2 Нормальное поведение при QoS 1-2
Сообщение не сохраняется Retain = false Установить Retain = true при необходимости
Рекомендации по настройке
Параметр Рекомендация Пояснение
Send Использовать импульс, а не уровень Добавить блок [Rtrig] перед входом Send
Topic Использовать осмысленные имена sensors/temperature, actuators/relay
QoS 0 для телеметрии, 1 для команд Баланс между надежностью и трафиком
Retain true для состояния, false для данных Сохранять только последнее известное состояние
==========================================================================================
==========================================================================================
Сами блоки и тестовый проект прилагаю
Добавил поддержку ESP32 смотрите в архиве
Давно не мог найти блок под ESP8266 со стабильной работой на бета версиях, в старых версиях не тестировал. Решил попробовать сделать блок сам (в планах добавить поддержку ESP32). Но так как я не очень "волоку", мне помог ИИ. Так что сильно не ругайтесь, ваял недели две.
Это мой второй блок (раньше даже ни чего не писал, по этому критика приветствуется и если можно то с разъяснениями).
Если у кого ни будь возникнет желание протестировать блоки на ранних версиях, то буду безмерно благодарен, главное отпишитесь.
К каждому блоку есть описание
Пакет MQTT блоков (протестирован на FLProg 9.6.20) обеспечивает стабильную работу с MQTT брокерами на платформе ESP8266.
Позволяет подключаться к любому MQTT брокеру, принимать и отправлять сообщения.
СОСТАВ ПАКЕТА
MQTT_CORE Центральное ядро подключение к брокеру, прием сообщений, буферизация 1 в проекте (обязательный)
MQTT_SUB Подписка на топик, получение сообщений до 20 в проекте
MQTT_PUB Публикация сообщений в топик до 20 в проекте
===================================================================================
===================================================================================
Блок MQTT_CORE является центральным ядром MQTT-функциональности.
Отвечает за:
Подключение к MQTT брокеру
Поддержание постоянного соединения
Прием всех входящих сообщений от брокера
Управление буфером сообщений
Отладку и диагностику
Блок должен быть только один на схеме. Все блоки SUB и PUB используют его ресурсы.
Особенности работы
Подключение к брокеру
При запуске:
1. Чтение настроек из входов блока
2. Инициализация MQTT клиента
3. При наличии WiFi соединения - подключение к брокеру
4. Периодическое поддержание соединения (keepAlive)
5. Автоматическое переподключение при обрыве связи
Прием сообщений
Все входящие сообщения от брокера:
Сохраняются в общий буфер (размер задается параметром mqttBufferSize)
Каждое сообщение получает уникальный ID
Блоки SUB читают сообщения из буфера
Отладка
При включенном debugEnable:
Выводятся все этапы подключения
Отображаются отправленные и полученные сообщения
Сообщается о потерях связи и ошибках на выходе debugEnable
======================================================================
Входы блока MQTT_CORE
Имя входа Описание
mqttServer String Адрес MQTT брокера (IP или доменное имя)
mqttPort Integer Порт MQTT брокера (обычно 1883, для TLS 8883)
mqttUser String Имя пользователя для аутентификации на брокере
mqttPassword String Пароль для аутентификации на брокере
mqttClientId String Уникальный идентификатор клиента. При пустом значении формируется автоматически из MAC адреса
debugEnable Включение режима отладки. (При true в выход debug выводятся все события)
Выходы блока MQTT_CORE
Имя выхода Описание
mqttConnected Boolean Статус подключения к MQTT брокеру. (true - подключен, false - отключен)
debug String Отладочные сообщения. Содержит информацию о подключении, подписках, полученных и отправленных сообщениях
========================================================================
ДИАГНОСТИКА НЕПРАВИЛЬНЫХ НАСТРОЕК
Проблема Вероятная причина Решение
Частые WDT сбросы process_interval слишком мал Увеличить на 5-10 мс
Пропуск сообщений mqttBufferSize слишком мал Увеличить на 10-20
Медленное подключение reconnectTime слишком велик Уменьшить до 3000-5000
Потеря подписок после перезагрузки cleanSession = 1 Установить cleanSession = 0
Переполнение памяти mqttBufferSize слишком велик Уменьшить до 40-50 для ESP8266
Возможные ошибки и их решение MQTT_CORE
Ошибка в debug Причина Решение
Connection failed, state: -2 Неправильный адрес сервера Проверить mqttServer
Connection failed, state: -4 Неправильный порт Проверить mqttPort
Connection failed, state: -5 Неправильный логин/пароль Проверить mqttUser, mqttPassword
WiFi lost Потеря WiFi соединения Проверить WiFi настройки
Connection timeout Таймаут подключения Увеличить reconnectTime
Возможные ошибки и их решение MQTT_SUB
Проблема Причина Решение
Нет импульса Received Подписка не выполнена Проверить Topic, включить debugEnable
Message пустой Сообщение не пришло Проверить, что брокер отправляет сообщения
Ошибка компиляции Превышен max_subscription Увеличить параметр max_subscription
Долгое получение Большое количество SUB Уменьшить process_interval
Сообщения перезаписываются Малый mqttBufferSize Увеличить mqttBufferSize
==========================================================================================
==========================================================================================
Блок MQTT_SUB (До 20ти блоков в проекте) предназначен для получения сообщений из указанного MQTT топика.
Он автоматически подписывается на топик и выдает полученные сообщения на свои выходы.
На схеме может быть неограниченное количество блоков SUB (ограничено параметром max_subscription).
Особенности работы
Регистрация подписки
При первом подключении MQTT_CORE:
1. Блок SUB регистрирует свой топик в системе
2. MQTT_CORE выполняет подписку на брокере
3. Подписка сохраняется при cleanSession = 0
Получение сообщений
Алгоритм обработки:
1. Все сообщения поступают в MQTT_CORE
2. MQTT_CORE помещает их в общий буфер
3. Блоки SUB по очереди проверяют буфер на наличие своих сообщений
4. При нахождении сообщения:
- Выставляется Received = true (импульс)
- В Message записывается текст сообщения
Round-Robin обработка
При большом количестве SUB блоков (более 3-4) используется циклическая обработка:
Каждый цикл Loop обрабатывается только один SUB блок
Интервал обработки задается параметром process_interval
Задержка получения сообщения = process_interval × количество SUB блоков
Wildcard символы в топиках
Символ Название Описание Пример
+ Одноуровневый Заменяет один уровень топика +/temp = все топики с temp на втором уровне
# Многоуровневый Заменяет все последующие уровни sensors/# = все топики, начинающиеся с sensors/
QoS (Quality of Service)
QoS Название Описание Применение
0 At most once "Не более одного раза". Сообщение отправляется без подтверждения. Может быть потеряно. Телеметрия, некритичные данные, частая отправка
1 At least once "Не менее одного раза". Сообщение отправляется с подтверждением. Может быть дублировано. Важные данные, команды управления
2 Exactly once "Ровно один раз". Гарантированная доставка без дублирования. Критичные команды, финансовые операции
Рекомендации по выбору QoS:
Сценарий Рекомендуемый QoS
Температура, влажность 0
Статус реле, датчик движения 1
Команда включения/выключения 1
Обновление прошивки, настройки 2
=========================================================
Входы блока
Имя входа Тип Вид Описание
Topic String Имя MQTT топика для подписки. Может содержать wildcard символы + и #
QoS Byte Уровень качества обслуживания (0, 1, 2)
==========================================================
Выходы блока
Имя выхода Тип Вид Описание
Received Boolean Создавать переменную Импульс при получении нового сообщения. Устанавливается в true на один цикл Loop
Message String Создавать переменную Текст полученного сообщения
===========================================================
===========================================================
Возможные ошибки и их решение
Проблема Причина Решение
Нет импульса Received Подписка не выполнена Проверить Topic, включить debugEnable
Message пустой Сообщение не пришло Проверить, что брокер отправляет сообщения
Ошибка компиляции Превышен max_subscription Увеличить параметр max_subscription
Долгое получение Большое количество SUB Уменьшить process_interval
Сообщения перезаписываются Малый mqttBufferSize Увеличить mqttBufferSize
==========================================================================================
==========================================================================================
Блок MQTT_PUB (Publisher) предназначен для отправки сообщений в MQTT брокер. Он публикует данные в указанный топик с заданным уровнем качества обслуживания (QoS) и флагом сохранения (Retain).
Обнаружение фронта
Блок отправляет сообщение только по фронту (переход из 0 в 1) на входе Send:
Время: t0 t1 t2 t3 t4
Send: 0 → 1 1 0 0
↑
Фронт! Отправка сообщения
Подтверждение доставки
Выход Delivered выдает один импульс:
Время: t0 t1 t2 t3 t4
Send: 0 → 1 1 0 0
Delivered: 0 1 0 0 0
↑
Импульс подтверждения
Защита от повторной отправки
Блок имеет встроенную защиту: пока вход Send остается в 1, повторная отправка не происходит. Для новой отправки необходимо:
Сбросить Send в 0
Снова установить в 1
Входы блока MQTT_PUB
Имя входа Тип Вид Описание
Send Boolean Вход Фронтовый вход. Отправляет сообщение при переходе из 0 в 1. Для повторной отправки необходимо сбросить вход в 0, затем снова установить в 1.
Topic String Имя MQTT топика для публикации. Например: home/room1/temperature, device/relay/state
Message String Текст сообщения для отправки. Может быть статическим текстом или динамически формироваться из переменных.
QoS Byte Уровень качества обслуживания: 0, 1 или 2. Определяет гарантии доставки сообщения.
Retain Boolean Флаг сохранения сообщения на брокере. При true сообщение сохраняется и отправляется новым подписчикам.
Выходы блока MQTT_PUB
Имя выхода Описание
Delivered Создавать переменную Импульсный выход. Устанавливается в true на один цикл Loop после успешной отправки сообщения. Используется для подтверждения доставки.
QoS (Quality of Service)
QoS Название Описание Применение
0 At most once "Не более одного раза". Сообщение отправляется без подтверждения. Может быть потеряно. Телеметрия, некритичные данные, частая отправка
1 At least once "Не менее одного раза". Сообщение отправляется с подтверждением. Может быть дублировано. Важные данные, команды управления
2 Exactly once "Ровно один раз". Гарантированная доставка без дублирования. Критичные команды, финансовые операции
Рекомендации по выбору QoS:
Сценарий Рекомендуемый QoS
Температура, влажность 0
Статус реле, датчик движения 1
Команда включения/выключения 1
Обновление прошивки, настройки 2
Retain (Сохранение сообщения)
Retain Описание Пример использования
false Сообщение не сохраняется на брокере. Получают только текущие подписчики. Динамические данные: температура, влажность
true Сообщение сохраняется на брокере и отправляется новым подписчикам. Последнее известное состояние: статус реле, режим работы
Важно: При использовании Retain = true, брокер хранит последнее сообщение. При новом подключении подписчик сразу получает это сообщение.
// Пример: "Temperature: 22.5°C, Humidity: 45%"
Message = "Temperature: " + String(temp) + "°C, Humidity: " + String(hum) + "%"
// Пример: время и значение
Message = String(millis()) + ":" + String(value)
Коды ошибок MQTT клиента
Код Значение Решение
-4 MQTT_CONNECTION_TIMEOUT Проверить сервер и порт
-3 MQTT_CONNECTION_LOST Проверить WiFi стабильность
-2 MQTT_CONNECT_FAILED Проверить логин/пароль
-1 MQTT_DISCONNECTED Нет соединения, ожидание
0 MQTT_CONNECTED Нормальная работа
4 MQTT_CONNECT_BAD_CREDENTIALS Неверный логин/пароль
Возможные ошибки и их решение
Проблема Причина Решение
Нет отправки Send не имеет фронта Использовать блок "Фронт" или импульсный выход
Нет импульса Delivered MQTT не подключен Проверить CORE и WiFi
Сообщение не доходит до брокера Неправильный топик Проверить топик в веб-интерфейсе брокера
Ошибка аутентификации Неверный логин/пароль Проверить mqttUser, mqttPassword
Дублирование сообщений QoS 1 или 2 Нормальное поведение при QoS 1-2
Сообщение не сохраняется Retain = false Установить Retain = true при необходимости
Рекомендации по настройке
Параметр Рекомендация Пояснение
Send Использовать импульс, а не уровень Добавить блок [Rtrig] перед входом Send
Topic Использовать осмысленные имена sensors/temperature, actuators/relay
QoS 0 для телеметрии, 1 для команд Баланс между надежностью и трафиком
Retain true для состояния, false для данных Сохранять только последнее известное состояние
==========================================================================================
==========================================================================================
Сами блоки и тестовый проект прилагаю
Добавил поддержку ESP32 смотрите в архиве