MQTT — PubSubClient
Брокер, топики, подписки, умный дом
Протокол интернета вещей: публикуем данные датчиков, подписываемся на команды, строим умный дом на ESP32 и MQTT.
Прогресс раздела0/65 · 0%
- MQTT простыми словами: издатель, подписчик, брокерМодель pub-sub на пальцах: кто такой издатель, подписчик и брокер, почему платам не нужны адреса друг друга и когда MQTT честнее HTTP для коротких событий.14 мин
- Mosquitto: свой брокер на Raspberry Pi и ПКСтавим брокер Mosquitto на Raspberry Pi и ПК: apt install, тест mosquitto_sub и mosquitto_pub из консоли, конфиг listener для платы из домашней сети.16 мин
- PubSubClient: установка библиотеки и первый скетчПервый скетч на PubSubClient: установка через Library Manager, client.connect с проверкой, publish с кодом возврата, client.loop и таблица кодов client.state().15 мин
- Групповые команды: топики для всех устройствОдин топик home/all/light включает свет во всей квартире: две подписки на плате, приоритет локальной команды и ловушка эха, когда отчёт возвращается в группу.16 мин
- Мониторинг брокера: mosquitto_sub и логиСтетоскоп для MQTT: сырой поток mosquitto_sub -v, пульс $SYS с числом клиентов и сообщений в секунду, логи Mosquitto и три находки мониторщика.16 мин
- Итоговый проект: умный дом на MQTT и Home AssistantФинальная сборка MQTT-дома: карта топиков, статусы через LWT и retain, discovery-паспорты для Home Assistant, групповой свет и контрольная таблица проверок.17 мин
- Светильник с яркостью: команда set → плавный переходPayload 128 на cmd/light: парсинг яркости, плавный переход шагом 2 за 15 мс и отчёт state/light по достижению.16 мин
- RGB-лента как индикатор: сеть, брокер, устройстваФиолетовый мигает — нет сети, красный — брокер молчит, зелёный — всё ок, белая вспышка — команда пришла.16 мин
- Реле с гарантией: QoS 1 и подтверждение командыКоманда с номером, ack-топик, таймаут 3 секунды и до трёх повторов.17 мин
- Счётчик воды: геркон, импульсы и публикацияГеркон на счётчике воды: импульс за литр или десять, антидребезг 50 мс на millis, счёт литров в переменной и публикация раз в минуту с JSON и retain.16 мин
- Рестарт без потерь: подписка на свои топики при стартеПочему подписку держат в reconnect, а не в setup: PubSubClient забывает топики.16 мин
- Гибрид: веб-панель ESP32 + MQTT-брокер в одном устройствеОдин ESP32 держит веб-панель и MQTT-клиент сразу: состояние в общих переменных, HTML-фрагмент с JS-таймером опроса, кооперативный цикл без delay и цена RAM.16 мин
- Last Will и retain: как подписчик узнаёт, что плата умерлаКто и когда раздаёт Last Will, что получает подписчик и зачем завещанию willRetain: механика брокера, скетч с волей в connect и окно незнания в 22 секунды.16 мин
- QoS 0, 1 и 2: за что плата платит за надёжностьСколько пакетов стоит QoS 0, 1 и 2, почему PubSubClient публикует только с нулевым и как строить надёжность поверх: дубликаты, пульсы, абсолютные команды.16 мин
- Сырые значения против JSON: сколько байт весит ваш payloadСколько байт весит MQTT-пакет: считаем заголовки, сравниваем сырой payload с JSON, ищем границу окупаемости документа и ловим payload без нуля на конце.15 мин
- Один callback на все топики: маршрутизация внутри setCallbackОдин setCallback ловит все подписки: что лежит в topic, payload и length, как разобрать строку топика startsWith и indexOf и развести ветки на светодиод и реле.16 мин
- Команды из облака: валидация payload перед действиемКоманда из брокера не равна правде: словарь, длина, диапазон, JSON-контракт с containsKey и типами — реле щёлкает только от проверенных payload.16 мин
- Агрегатор статусов: home/+/state и сводка с устройств в одну строкуПодписка home/+/state собирает статусы комнат: имя узла из топика, свежесть значений по millis и сводка одной строкой в Serial по таймеру и запросу.16 мин
- Обрыв связи как state-машина: экспонента вместо delay(5000)Обрыв связи как машина состояний: ONLINE и WAIT, экспоненциальная пауза вручную 500-8000 мс и цена delay(5000) в loop — от слепых кнопок до поджатого keepalive.16 мин
- DHT22 в MQTT: раз в 30 секунд, интервал меняет брокерDHT22 публикует температуру и влажность JSON-документом раз в 30 секунд по millis, а интервал меняет брокер командой: границы 5-3600 и подтверждение настройки.16 мин
- Свет из брокера: цикл команда → действие → статусСвет из брокера по циклу команда → действие → статус: словарь значений в callback, реле щёлкает в loop, ответный топик с retain показывает дашборду правду.15 мин
- Схема топиков для дома: четыре уровня и цена решёткиСхема топиков как договор дома: четыре уровня с ролями, словарь действий set и state, цена решётки для брокера и случай, когда плоские имена честнее иерархии.16 мин
- Телеграм-стиль команд: парсим payload с аргументомКоманда с аргументом в payload MQTT: глагол до пробела, ловушки toInt на стыке строки и числа, границы аргумента и ответ-эхо в отдельный топик.16 мин
- Ночной режим по расписанию: брокер публикует режим, платы слушаютНочной режим по расписанию: брокер публикует режим с retain, платы трактуют его по-своему, кнопка даёт обход с тайм-аутом — без восьми таймеров и перепрошивок.17 мин
- Оффлайн-буфер: копилка показаний на время отвалаПлата без сети копит показания в кольцевой буфер: что копить, сколько влезает в RAM Uno, что затирается при переполнении и когда историю честно выбросить.16 мин
- Раздача копилки после reconnect: пачка с паузами и метки времениКопилка полна, сеть вернулась: темп раздачи 50 мс между публикациями, метки ts в payload, порядок старое-первым и почему пачку едут по одной точке, а не циклом.16 мин
- Подвисший сокет: setSocketTimeout против тихого зависанияРеле работает, Serial молчит: loop застрял в чтении мёртвого TCP.17 мин
- Last Will и Retain: пусть брокер расскажет, что устройство умерлоЗавещание в аргументах connect и retain-память брокера: статус датчика online/offline для Home Assistant, окно тишины и подвох с disconnect().16 мин
- QoS 0, 1, 2: что выбрать для датчика температурыТри уровня доставки MQTT по пакетам: fire-and-forget для телеметрии, PUBACK для команд и почему у publish в PubSubClient нет аргумента QoS вовсе.16 мин
- Управление светом из Home Assistant: топики и JSON-payloadСхема command/state/availability для светильника: строки ON/OFF против JSON с яркостью 0-255, подтверждение команды фактом и короткий callback без разрывов.15 мин
- Буфер PubSubClient и RAM: ужимаемся на ESP8266Один буфер на приём и передачу: длинное входящее пропадает молча, соединение живо.16 мин
- Несколько подписок и один callback: разбор топиковТри подписки и один callback: strcmp по топику без String, приоритет конкретного над общим, wildcard против россыпи и двойная доставка при перекрытии фильтров.15 мин
- Датчик на батарейке: deep sleep + MQTT-публикация раз в часЦикл батарейного датчика: рукопожатие Wi-Fi и MQTT съедает секунды, публикация — миг.16 мин
- Подключение ESP32 к брокеру: ID клиента и статусыКоды client.state() от -4 до 5, почему connect возвращает rc=-2, правила clientId и живая диагностика Mosquitto.15 мин
- client.publish: публикуем показания датчикаПубликация показаний из неблокирующего millis-цикла: payload строкой, String(t,1) и c_str(), выбор периода и цена слишком частых сообщений для брокера.16 мин
- subscribe и callback: подписка на командыКак broker доставляет команды в плату: подписка, callback в PubSubClient, payload как байты, разбор по топику, флаг-паттерн и валидация сообщений с сервера.15 мин
- MQTT через Ethernet W5500: проводной клиент, когда WiFi не нуженW5500 и EthernetClient под PubSubClient: DHCP против статики, грабли CS-пина 10 и SD-карты, сброс после питания.16 мин
- Кнопка-публикатор: отправляем событие по нажатию, а не по циклуКнопка в MQTT: публикация на фронте нажатия с антидребезгом 25-50 мс, событие против состояния, буфер одного события при обрыве и выбор между QoS 0 и QoS 1.15 мин
- Версия прошивки в payload: поле fw и совместимость клиентовПоле fw в каждом payload: сервер видит, кто на старой прошивке.15 мин
- Retained-сообщения: статус для новых подписчиковПубликуем состояние реле с retain: брокер хранит последнее значение и отдаёт его панели сразу при подписке.15 мин
- Last Will: как брокер узнаёт, что плата умерлаЗавещание в CONNECT: брокер сам публикует offline, когда плата молчит дольше полутора keepalive.16 мин
- Дерево топиков для дома: структура и правилаhome/kitchen/temp и home/kitchen/light/set: уровни через слэш, каналы set и status, retained у состояний.15 мин
- Структура топиков: иерархия для умного домаПравила именования MQTT-топиков: уровни, слэши, регистр, дефисы, кириллица и доллар.15 мин
- Retained-сообщения: последний статус всегда актуаленФлаг retain у публикации: брокер хранит последнее сообщение топика и отдаёт его новому подписчику.16 мин
- QoS 0, 1 и 2: уровни доставки MQTTГарантии at most, at least и exactly once: обмен PUBACK, PUBREC, PUBREL, PUBCOMP, цена каждого уровня в пакетах и выбор QoS для телеметрии, команд и счётчиков.16 мин
- LWT: Last Will и статус офлайн устройстваЗавещательное сообщение в MQTT: как ESP32 прощается с брокером при отвале, связка retained online и offline, топик статуса и от чего завещание не спасает.16 мин
- KeepAlive и PingReq: почему клиент отваливаетсяПочему PubSubClient рвёт связь: PINGREQ и окно keepalive, setKeepAlive, блокирующий delay дольше окна, NAT-роутеры с таймаутами и диагностика отвала с gap_max.15 мин
- Home Assistant: подключение устройства через MQTTПодключаем ESP32 к Home Assistant через MQTT: брокер-аддон, сущности sensor и switch в configuration.yaml, state_topic и command_topic, тест mosquitto_pub.16 мин
- MQTT Discovery: датчик температуры в Home AssistantДатчик сам регистрируется в Home Assistant: discovery-топик homeassistant/sensor/…/config, поля name и state_topic, retain и отладка через mosquitto_sub.16 мин
- Свет из Home Assistant: команда на ESP32Команда, действие, отчёт: подписка на cmd-топик, реле на D7 и публикация фактического состояния.16 мин
- Wildcard-подписки: плюс и решётка в топикахПлюс ловит ровно один уровень, решётка — всю ветку: home/+/temp, home/#, служебные $SYS-топики, цена широкой подписки для батарейки и разбор топика в callback.15 мин
- JSON в payload: структурированные сообщения MQTTОдин топик с JSON против трёх: ArduinoJson собирает документ на отправке и разбирает на приёме, цена вложенности в байтах и случаи, когда три топика лучше.15 мин
- setBufferSize: большие сообщения в PubSubClientБуфер PubSubClient по умолчанию 256 байт: почему длинный discovery-JSON молча не уходит, как поднять лимит setBufferSize и чем это платит RAM на Uno и ESP32.16 мин
- reconnect без блокировки: цикл с millisclient.connect блокирует loop на секунды: переводим восстановление связи на millis-таймер с состоянием и backoff 5-10-30 секунд, а датчики и индикация живут.16 мин
- MQTT в кооперативном цикле: вместе с мигалкамиМигалка на millis и client.loop() в одном loop: сколько съедает каждая задача, почему delay рвёт keepalive и как собрать кооперативный цикл без единой паузы.16 мин
- TLS для MQTT: шифруем каналWiFiClientSecure, порт 8883 и setCACert: переносим MQTT на шифрованный канал, считаем RAM и секунды handshake, проверяем, чем опасен setInsecure.17 мин
- Логин, пароль и ACL: доступ к брокеруallow_anonymous false, mosquitto_passwd и ACL: кто какой topic читает и пишет, pattern home/%u/# и почему один пароль на все платы — худший вариант.16 мин
- Публичные брокеры: test.mosquitto.org и HiveMQПорты test.mosquitto.org: 1883, 8883 и 8080, риски открытых брокеров, уникальные префиксы топиков, этика общей площадки и план переезда на свой Mosquitto.16 мин
- Мосты Mosquitto: связываем два брокераBridge в mosquitto.conf: connection, address, topic out/in/both.16 мин
- Публичный тест на практике: mosquitto_pub/sub и логиОтладка MQTT в терминале: mosquitto_sub -t # -v, mosquitto_pub с командой, log_type all в Mosquitto, охота на топики-призраки и чтение трафика по журналу.15 мин
- Контроль связи: LWT на практикеLast will и heartbeat: плата оставляет брокеру завещание, дашборд узнаёт об отвале за 20 секунд.16 мин
- Индикатор офлайн: ретейн плюс Last WillПолный скетч статуса: retained online при подключении, offline от брокера при отвале.16 мин
- MQTT Dash на телефоне: панель управленияПанель на телефоне без программирования: виджеты MQTT Dash, привязка кнопок и меток к топикам, грабли мобильных сетей и безопасность домашней панели.15 мин
- MQTT: как устроен протокол умного домаКак устроен MQTT: брокер, топики, publish и subscribe, уровни QoS и порт 1883.15 мин
- ESP32 публикует данные датчиков в MQTTESP32 подключается к Wi-Fi и MQTT: WiFi.begin, reconnect-логика без пауз, client.loop() в millis-цикле и публикация home/temp каждые 10 секунд с датчика DHT22.18 мин
Гайды по теме раздела
- ESP32 MQTT: умный дом с Home AssistantESP32 + MQTT + Home Assistant: автодискавери, реле, датчик, сценарии.
- MQTT симулятор ESP32: PubSubClient и брокер в браузере без платыMQTT симулятор для ESP32: PubSubClient — connect, publish, subscribe.
- Умный дом на Arduino: реле, датчики — сначала в симулятореУмный дом на Arduino без риска: свет по PIR с таймаутом на millis(), реле и DHT22 в симуляторе, честная оговорка про 220 В и скетч, готовый к переносу.