ESP32 и MQTT: Подключаем датчик к Home Assistant за вечер

Пошаговое руководство: как подключить датчик на ESP32 к умному дому через MQTT и Home Assistant. Пишем прошивку, настраиваем брокер, используем автообнаружение.
Привет всем, кто любит оживлять железо! Сегодня мы займёмся одной из самых фундаментальных и при этом невероятно полезных задач в DIY-умном доме: подключим датчик на базе ESP32 к Home Assistant через протокол MQTT. Это тот самый «золотой стандарт», который обеспечивает надёжную, быструю и двустороннюю связь между вашими устройствами и хабами.
Зачем это нужно? Представьте: у вас есть самодельная метеостанция на ESP32, которая меряет температуру на улице. Вы хотите, чтобы её показания отображались в интерфейсе Home Assistant, сохранялись в лог, участвовали в автоматизациях (например, включали полив газона при высокой температуре). MQTT — это идеальный «почтальон» для таких задач. Он лёгкий, работает по принципу издатель-подписчик (pub/sub) и не нагружает сеть. А ESP32 с его Wi-Fi и двумя ядрами — идеальная платформа для таких клиентов.
В этой статье мы шаг за шагом настроим MQTT-брокер в Home Assistant, подготовим и прошивку для ESP32, и подключим, например, датчик DHT22 (температура и влажность). Всё сделаем своими руками.
Что нам понадобится
- Аппаратная часть:
- Плата ESP32 (любая, например, DevKit C).
- Датчик DHT22 (или DHT11, или любой другой цифровой датчик для примера).
- Макетная плата и провода «папа-папа».
- USB-кабель для питания и прошивки.
- Программная часть:
- Установленная и работающая система Home Assistant (HA). Подойдёт любая инсталляция: HA OS, в Docker или на Orange Pi Zero 3.
- Редактор кода, например, VS Code с расширением PlatformIO или Arduino IDE.
- Базовое понимание, как заливать скетчи на ESP32.
Шаг 1: Настраиваем MQTT-брокер в Home Assistant
Home Assistant имеет встроенный аддон с отличным брокером — Mosquitto. Это самый простой путь.
- Установка брокера. В боковом меню HA идём в «Настройки» -> «Дополнения». На вкладке «Магазин дополнений» ищем «Mosquitto broker» и нажимаем «Установить». Ждём завершения.
- Настройка брокера. После установки открываем страницу дополнения. Включаем опции «Запускать при старте» и «Включить Watchdog». Важный момент: Ставим галочку «Включить аутентификацию». Это обязательно для безопасности! Сохраняем.
- Создание пользователя. Теперь нужно создать пользователя для нашего ESP32. Идём в «Настройки» -> «Пользователи». В самом низу страницы находим раздел «Служебные пользователи MQTT». Нажимаем «Добавить пользователя».
- Имя пользователя: Придумайте понятное имя, например,
esp32_dht_sensor. - Пароль: Сгенерируйте сложный пароль. Запишите его! Он понадобится в коде для ESP32.
- Имя пользователя: Придумайте понятное имя, например,
- Проверка работы брокера. После создания пользователя брокер готов. Запомните (или найдите) внутренний IP-адрес вашего сервера Home Assistant. Он понадобится для подключения ESP32.
Типичная ошибка: Пытаться подключиться к брокеру с внешнего IP или использовать порт 1883 без настройки сети. На начальном этапе подключайтесь только по локальному IP из той же сети Wi-Fi.
Шаг 2: Подготавливаем ESP32 и пишем прошивку
Мы будем использовать среду Arduino IDE для простоты. Убедитесь, что у вас установлена поддержка плат ESP32 через Board Manager.
Схема подключения
Подключим DHT22 к ESP32: * VCC (DHT22) -> 3.3V (ESP32) * GND (DHT22) -> GND (ESP32) * DATA (DHT22) -> GPIO 4 (ESP32) (можно любой другой цифровой пин, просто не забудьте поменять в коде)
Устанавливаем необходимые библиотеки
В меню «Инструменты» -> «Управлять библиотеками» установите: 1. DHT sensor library by Adafruit (для работы с датчиком). 2. PubSubClient by Nick O'Leary (это и есть наш MQTT-клиент).
Код прошивки (скетча)
Вот полный, хорошо закомментированный код. Вам нужно будет заменить значения в угловых скобках <...> на свои.
#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
// 1. Конфигурация Wi-Fi
const char* ssid = "<ВАШ_SSID_СЕТИ_WI-FI>";
const char* password = "<ВАШ_ПАРОЛЬ_WI-FI>";
// 2. Конфигурация MQTT-брокера (Home Assistant)
const char* mqtt_server = "<IP_АДРЕС_ВАШЕГО_HA>"; // Например, "192.168.1.100"
const char* mqtt_user = "esp32_dht_sensor"; // Имя пользователя, которое создали
const char* mqtt_password = "<СГЕНЕРИРОВАННЫЙ_ПАРОЛЬ>"; // Пароль пользователя
const int mqtt_port = 1883; // Стандартный порт MQTT
// 3. Конфигурация датчика
#define DHTPIN 4 // GPIO, к которому подключен DATA-пин датчика
#define DHTTYPE DHT22 // Тип датчика (DHT22 или DHT11)
DHT dht(DHTPIN, DHTTYPE);
// 4. Топики MQTT (адреса, куда публикуются данные)
const char* topic_temperature = "home/sensor/dht22/temperature";
const char* topic_humidity = "home/sensor/dht22/humidity";
const char* topic_status = "home/sensor/dht22/status"; // Топик для статуса "online/offline"
// 5. Интервалы
const long measurementInterval = 30000; // Измерять каждые 30 секунд
const long reconnectInterval = 5000; // Пытаться переподключиться каждые 5 секунд
unsigned long previousMillis = 0;
// Создаём объекты клиентов
WiFiClient espClient;
PubSubClient client(espClient);
// ===== ФУНКЦИИ =====
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Подключение к ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("Wi-Fi подключен");
Serial.print("IP-адрес: ");
Serial.println(WiFi.localIP());
}
// Функция обратного вызова для входящих MQTT-сообщений.
// Пока не используется, но нужна для подписки на топики.
void callback(char* topic, byte* payload, unsigned int length) {
// Здесь можно обрабатывать команды из HA (например, перезапуск датчика)
Serial.print("Сообщение в топике [");
Serial.print(topic);
Serial.print("]: ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
}
void reconnect() {
// Цикл до тех пор, пока не подключимся
while (!client.connected()) {
Serial.print("Попытка подключения к MQTT-брокеру...");
// Пытаемся подключиться с уникальным ClientID
String clientId = "ESP32-DHT22-Client";
clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str(), mqtt_user, mqtt_password)) {
Serial.println("успешно!");
// Публикуем сообщение о том, что устройство онлайн
client.publish(topic_status, "online", true); // true = retain сообщение
// Здесь можно подписаться на топики для управления
// client.subscribe("home/sensor/dht22/command");
} else {
Serial.print("ошибка, код=");
Serial.print(client.state());
Serial.println(". Пробуем снова через 5 секунд.");
delay(reconnectInterval);
}
}
}
void setup() {
Serial.begin(115200);
dht.begin();
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
randomSeed(micros());
}
void loop() {
// Проверяем соединение с MQTT
if (!client.connected()) {
reconnect();
}
client.loop(); // Даём клиенту возможность обрабатывать входящие сообщения
unsigned long currentMillis = millis();
// Измеряем и публикуем данные по интервалу
if (currentMillis - previousMillis >= measurementInterval) {
previousMillis = currentMillis;
// Чтение данных с датчика
float h = dht.readHumidity();
float t = dht.readTemperature(); // Чтение в градусах Цельсия
// Проверяем, удалось ли прочитать данные
if (isnan(h) || isnan(t)) {
Serial.println("Ошибка чтения с датчика DHT!");
client.publish(topic_status, "error"); // Отправляем статус ошибки
return;
}
// Преобразуем числа в строки для отправки
char tempString[8];
char humString[8];
dtostrf(t, 6, 2, tempString); // Формат: 6 знаков всего, 2 знака после запятой
dtostrf(h, 6, 2, humString);
// Публикуем данные в MQTT-топики
Serial.print("Температура: ");
Serial.print(tempString);
Serial.print(" °C, Влажность: ");
Serial.print(humString);
Serial.println(" %");
bool pubTemp = client.publish(topic_temperature, tempString, true); // retain = true
bool pubHum = client.publish(topic_humidity, humString, true);
if (pubTemp && pubHum) {
Serial.println("Данные успешно отправлены в MQTT.");
} else {
Serial.println("Ошибка отправки данных в MQTT!");
}
}
}
Ключевые моменты в коде:
* Retain-флаг (true): Сообщение сохраняется на брокере. Когда Home Assistant (или другое устройство) подпишется на топик, оно мгновенно получит последнее актуальное значение, даже если датчик был временно отключён.
* Статус online/offline: Позволяет видеть в HA, активно ли устройство.
* Обработка ошибок датчика: Важно, чтобы некорректные чтения не ломали логику.
* Уникальный ClientID: Помогает брокеру различать устройства.
Типичная ошибка: Использовать delay() в основном цикле. Это блокирует работу клиента MQTT и может привести к разрыву соединения. Мы используем неблокирующий подход с millis().
Шаг 3: Интеграция с Home Assistant (автообнаружение)
Самая красивая часть — Home Assistant умеет автоматически добавлять устройства из MQTT, если отправить специальное сообщение с конфигурацией. Это называется MQTT Discovery.
Добавьте этот блок кода в функцию reconnect(), сразу после успешного подключения к брокеру (client.connect(...)).
// Отправка конфигурации для автообнаружения в Home Assistant
// Конфиг для датчика температуры
String configTemp = "{"name":"DHT22 Temperature", "device_class":"temperature", "unit_of_measurement":"°C", "state_topic":"" + String(topic_temperature) + "", "unique_id":"esp32_dht22_temp", "device":{"identifiers":["esp32_dht22_sensor"], "name":"ESP32 DHT22 Sensor"}}";
client.publish("homeassistant/sensor/esp32_dht22/temp/config", configTemp.c_str(), true);
// Конфиг для датчика влажности
String configHum = "{"name":"DHT22 Humidity", "device_class":"humidity", "unit_of_measurement":"%", "state_topic":"" + String(topic_humidity) + "", "unique_id":"esp32_dht22_hum", "device":{"identifiers":["esp32_dht22_sensor"], "name":"ESP32 DHT22 Sensor"}}";
client.publish("homeassistant/sensor/esp32_dht22/hum/config", configHum.c_str(), true);
// Конфиг для бинарного датчика статуса
String configStatus = "{"name":"DHT22 Status", "device_class":"connectivity", "payload_on":"online", "payload_off":"offline", "state_topic":"" + String(topic_status) + "", "unique_id":"esp32_dht22_status", "device":{"identifiers":["esp32_dht22_sensor"], "name":"ESP32 DHT22 Sensor"}}";
client.publish("homeassistant/binary_sensor/esp32_dht22/status/config", configStatus.c_str(), true);
Что это делает? После прошивки и перезагрузки ESP32 эти сообщения улетят в специальные топики homeassistant/.../config. Home Assistant их прочитает и автоматически создаст в панели «Устройства и службы» новое устройство «ESP32 DHT22 Sensor» с тремя сущностями: сенсорами температуры, влажности и статусом подключения. Вам не нужно будет вручную прописывать ничего в configuration.yaml!
Шаг 4: Проверка результата
- Загрузите скетч на ESP32 и откройте монитор порта (скорость 115200). Вы должны увидеть процесс подключения к Wi-Fi и MQTT, а затем периодическую отправку данных.
- В Home Assistant перезагрузите страницу (или подождите минуту). В панели «Устройства и службы» должно появиться новое устройство.
- Создайте простую карточку на дашборде, чтобы видеть данные. Добавьте карточку «По entities» и выберите созданные сенсоры.
- Проверьте связь: Попробуйте отключить ESP32 от питания. Через некоторое время (зависит от настроек
birth/willсообщений, которые мы неявно задали черезstatusтопик) датчик статуса в HA должен перейти в состояниеoffline. После включения — сноваonline.
Заключение
Вот и всё! Мы превратили обычную плату ESP32 и датчик в полноценного участника экосистемы умного дома. MQTT — это мощный и гибкий протокол, а ESP32 — идеальная платформа для таких клиентов. Теперь вы можете масштабировать эту схему: добавить больше датчиков (например, измерять температуру, влажность и давление на одной плате), управлять реле или собирать данные с аналоговых сенсоров.
Если вы только выбираете платформу для своих проектов, рекомендую почитать сравнение ESP32 vs ESP8266. А для тех, кто задумывается о более мощном центральном хабе, присмотритесь к Orange Pi 5 — на нём Home Assistant будет летать.
Экспериментируйте, задавайте вопросы в комментариях, и да пребудет с вами стабильный Wi-Fi сигнал!
Понравилась статья?
Поставьте лайк и сохраните полезный материал в закладки.
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
Что можно сделать на LILYGO T-Dongle S3: 10 практических проектов
ESPHome: прошиваем ESP32 без единой строки кода. Визуальный путь к умному устройству
ESP32 Web Server: Управляем реле через браузер
ESP: как Espressif переписала правила DIY-электроники
Tasmota на ESP8266: Прошивка умных розеток и выключателей своими руками
ESP32 Deep Sleep: как сделать датчик на батарейках, работающий месяцами