Гайд · MQTT · IoT
MQTT на ESP32: от нуля до Home Assistant
Когда один датчик должен дойти сразу до трёх приложений, связывать каждую пару вручную быстро разваливается. MQTT переворачивает это: устройство публикует в топик, а всё, кому интересно, подписывается — с брокером посередине. Вот почему это ложится на IoT, три слова, что реально нужны (топик, QoS, retain), и код ESP32 для разговора с 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++.