Страница 1 из 1

Блок для MQTT

Добавлено: 24 мар 2026, 18:00
maxrolor
Всем Доброго времени суток!
Давно не мог найти блок под 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 смотрите в архиве

Re: Блок для MQTT

Добавлено: 21 апр 2026, 14:33
Loko41
Один минус, генерирует слишком много кода, мой проект на MQTT 6.8 составил 2300 строк кода, переделал на ваш MQTT, результат 3800 строк кода может FLPROG так гребет ))) вес проекта 36мб, удаляю платы с mqtt (их было 4 1 плата core 1блок core, 2 отправка json (16 блоков pub и 16 блокок с содержанием JSON сущностей), 3 pub (15 блоков отправляли state) и 4 плата sub ( 8 блоков sub подписка на set) после удаления 5 мб )) мощно.
Забыл уточнить FLProg 9.7.1

Re: Блок для MQTT

Добавлено: 21 апр 2026, 15:36
dstrufanov
Loko41 писал(а): 21 апр 2026, 14:33 ... может FLPROG так гребет )))...
Нельзя так говорить :smile38:

Re: Блок для MQTT

Добавлено: 23 апр 2026, 08:49
maxrolor
Пока поставил разработку на паузу (работа, сезон). Как появится время продолжу, хочу lwt прикрутить, и просьба от форумчанина прием сообщений от брокера по запросу.

Re: Блок для MQTT

Добавлено: 23 апр 2026, 10:40
prostochel
В новой версии программы эти блоки работают. На личном виртуальном сервере точно.
viewtopic.php?p=120385#p120385
viewtopic.php?p=120809#p120809

Re: Блок для MQTT

Добавлено: 27 апр 2026, 00:40
Loko41
// Объект MQTT клиента и флаги состояния
extern AsyncMqttClient mqttClient; не понятно, что хотели объявить..

Re: Блок для MQTT

Добавлено: 27 апр 2026, 00:47
Loko41
extern Subscription subscriptions[];

Re: Блок для MQTT

Добавлено: 28 апр 2026, 01:44
Loko41
В блоке PUB в секции Declare в конце вы делаете объявление общих внешних переменных относящихся к настройке и к ESP8266 и ESP32
но эти объявления относятся к ESP32
extern AsyncMqttClient mqttClient;
extern extern bool mqttConnectedCore;;

// === БИБЛИОТЕКИ ДЛЯ ESP32 ===
#include <WiFi.h>
#include <AsyncMqttClient.h>
это касается и SUB

Если не прав поправьте

Re: Блок для MQTT

Добавлено: 28 апр 2026, 15:31
Loko41
Мой вердикт:
- жрет много памяти флеш
- не подходит для Home Assistant виду отсутствия топиков и пайлод в Core
- некоторые блоки требуют доработки (PUB последние 2 параметра в Declare не общие, относятся только к ESP32, судя по библиотекам)
+ мгновенно линкуется с брокером
+ подойдет хорошо для мониторинговых и систем управления посредством MQTT
+ быстрый отклик на PUB и SUB

Re: Блок для MQTT

Добавлено: 03 май 2026, 08:52
texbez
Loko41 писал(а): 28 апр 2026, 15:31 Мой вердикт:
- жрет много памяти флеш
- не подходит для Home Assistant виду отсутствия топиков и пайлод в Core
- некоторые блоки требуют доработки (PUB последние 2 параметра в Declare не общие, относятся только к ESP32, судя по библиотекам)
+ мгновенно линкуется с брокером
+ подойдет хорошо для мониторинговых и систем управления посредством MQTT
+ быстрый отклик на PUB и SUB
Я вот тоже обратно перевожу свои устройства на старые версии ( не знаю кто автор) потому что в какое-то перестают передавать данные, пока не перегрузишь в ручную , хотя брокер их видит. Возможно это из за памяти.В старых версиях только один не достаток - при подключении к брокеру много мусора сыпят в брокер, приходится в ручную чистить брокер, но работают стабильно. Лучше уж так.

Re: Блок для MQTT

Добавлено: 16 май 2026, 09:41
Loko41
texbez писал(а): 03 май 2026, 08:52
Loko41 писал(а): 28 апр 2026, 15:31 Мой вердикт:
- жрет много памяти флеш
- не подходит для Home Assistant виду отсутствия топиков и пайлод в Core
- некоторые блоки требуют доработки (PUB последние 2 параметра в Declare не общие, относятся только к ESP32, судя по библиотекам)
+ мгновенно линкуется с брокером
+ подойдет хорошо для мониторинговых и систем управления посредством MQTT
+ быстрый отклик на PUB и SUB
Я вот тоже обратно перевожу свои устройства на старые версии ( не знаю кто автор) потому что в какое-то перестают передавать данные, пока не перегрузишь в ручную , хотя брокер их видит. Возможно это из за памяти.В старых версиях только один не достаток - при подключении к брокеру много мусора сыпят в брокер, приходится в ручную чистить брокер, но работают стабильно. Лучше уж так.
Я несколько раз переписывал программу из-за этих проблем, остановился на блоках находящихся в кандидатах FLProg версия 9.7.1, работают стабильно и быстро. И выполняют практически вес функционал за исключением механизма Birth / Last Will and Testament (LWT).
Все остальные работают, но со своими оговорками и недостатками, у каждого свои, так как затачивают свои блоки все под свои задачи и специфику.
А по поводу вашей проблемы, это пока отсутствие в используемых блоках грамотной настройкой механизма Birth / Last Will and Testament (LWT).
У меня такая же проблема возникает после пропадания питания. Думаю на малине сделать независимый MQTT брокер с аккумулятором, по идее это должно решить вопрос.

Re: Блок для MQTT

Добавлено: 16 май 2026, 09:45
Loko41
maxrolor когда появится LWT ?????? ))

Re: Блок для MQTT

Добавлено: 21 май 2026, 08:31
maxrolor
Всем здравствуйте. По дальнейшей доработке, а конкретно о сроках, сказать ни чего не могу, работа сезонного характера, пока загружен на работе. Спасибо большое за замечания. В программировании пока то же не очень силён, учусь. Как будет возможность довести проект до логического завершения обязательно допишу.
В Планах:
LWT
payload
получение данных с брокера по запросу (триером)
шифрование