RisalDash RisalDash

Гайд · MQTT · IoT

MQTT на ESP32: от нуля до Home Assistant

Когда один датчик должен дойти сразу до трёх приложений, связывать каждую пару вручную быстро разваливается. MQTT переворачивает это: устройство публикует в топик, а всё, кому интересно, подписывается — с брокером посередине. Вот почему это ложится на IoT, три слова, что реально нужны (топик, QoS, retain), и код ESP32 для разговора с Home Assistant.

MQTTHome AssistantPubSubClientESP32IoT
MQTT pub/sub: ESP32 публикует home/temp в брокер Mosquitto; Home Assistant, приложение на телефоне и логгер подписаны
Публикуешь раз в топик — получают все подписчики, кому важно. Без поллинга и без связывания каждой пары.

Почему MQTT лучше HTTP-поллинга

С обычным HTTP дашборд спрашивает устройство «есть новости?» по таймеру — расточительно, с задержкой и не масштабируется дальше пары клиентов. MQTT переворачивает поток: устройство пушит значение в момент изменения, а брокер раздаёт его всем подписчикам. Он создан для множества мелких сообщений по нестабильным маломощным каналам — как раз IoT. Если вообще выбираешь транспорт — сначала глянь Wi-Fi против остальных; MQTT здесь едет поверх Wi-Fi.

Топики, QoS и retain — простыми словами

Топик — это просто путь вроде home/livingroom/temp; издатели и подписчики встречаются на нём (подписка с масками: home/+/temp). QoS — гарантия доставки, а retain говорит брокеру хранить последнее значение, чтобы новый подписчик получил его сразу, а не ждал следующего обновления.

ПонятиеЧто значитДля чего
QoS 0максимум один раз (без гарантий)частые показания датчиков
QoS 1хотя бы раз (возможен дубль)команды, смена состояния
QoS 2ровно один раз (медленно)редко — критичное, разово
Retainброкер хранит последнее сообщениетекущее состояние при подключении
Last Willброкер публикует, если ты отвалилсядетект «оффлайн»

Брокер за пять минут

MQTT нужен брокер посередине — почтамт. Дефолт — Mosquitto: ставишь на Raspberry Pi, NAS или ту же машину, что и Home Assistant (там он ставится в один клик как add-on), и всё. Облачный брокер (HiveMQ, EMQX Cloud) тоже подойдёт, если не хочешь ничего локального. Направь все устройства на IP брокера и порт 1883 — и они найдут друг друга.

Сторона ESP32: PubSubClient

На устройстве классический выбор — библиотека PubSubClient. Форма всегда одна: подключился, подписался на то, чем управляешь, публикуешь то, что измеряешь, и переподключаешься, когда Wi-Fi моргнёт:

connect:    client.connect("esp32-kitchen")        // к брокеру
subscribe:  client.subscribe("home/relay/set")     // сюда брокер шлёт команды
publish:    client.publish("home/temp", "24.1")    // шлёшь; получают подписчики
callback:   пришло сообщение  →  щёлкаем реле       // реагируем без поллинга

Держи маленький reconnect-цикл в loop(), чтобы оборванный канал сам восстанавливался, и публикуй значения датчиков только когда они реально изменились — так трафик (и питание) остаются низкими, та же дисциплина, что и глубокий сон на батарее.

Home Assistant без ручной настройки

Фокус — MQTT discovery: публикуешь один маленький JSON в специальный топик homeassistant/…/config (с retain), и Home Assistant создаёт сущность сам — без правки YAML, датчик или выключатель просто появляется. Показания шлёшь в state-топик, управление приходит на command-топик. Дальше — дашборды, автоматизации и голос, всё бесплатно. Хочешь совсем без кода? ESPHome делает MQTT/discovery из YAML.

Хочешь, чтобы устройство ещё и отдавало свой UI? Полный дашборд из пары строк C++.