Здесь могла бы быть реклама
Она помогает блогу развиваться.
Кажется, сегодня она немного загрустила.

Главная страница » ESP32 / ESP8266 » ESP32 и MQTT: Подключаем датчик к Home Assistant за вечер
ESP32 и MQTT: Подключаем датчик к Home Assistant за вечер
ESP32 / ESP8266

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

31.03.2026 310
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. Это самый простой путь.

  1. Установка брокера. В боковом меню HA идём в «Настройки» -> «Дополнения». На вкладке «Магазин дополнений» ищем «Mosquitto broker» и нажимаем «Установить». Ждём завершения.
  2. Настройка брокера. После установки открываем страницу дополнения. Включаем опции «Запускать при старте» и «Включить Watchdog». Важный момент: Ставим галочку «Включить аутентификацию». Это обязательно для безопасности! Сохраняем.
  3. Создание пользователя. Теперь нужно создать пользователя для нашего ESP32. Идём в «Настройки» -> «Пользователи». В самом низу страницы находим раздел «Служебные пользователи MQTT». Нажимаем «Добавить пользователя».
    • Имя пользователя: Придумайте понятное имя, например, esp32_dht_sensor.
    • Пароль: Сгенерируйте сложный пароль. Запишите его! Он понадобится в коде для ESP32.
  4. Проверка работы брокера. После создания пользователя брокер готов. Запомните (или найдите) внутренний 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: Проверка результата

  1. Загрузите скетч на ESP32 и откройте монитор порта (скорость 115200). Вы должны увидеть процесс подключения к Wi-Fi и MQTT, а затем периодическую отправку данных.
  2. В Home Assistant перезагрузите страницу (или подождите минуту). В панели «Устройства и службы» должно появиться новое устройство.
  3. Создайте простую карточку на дашборде, чтобы видеть данные. Добавьте карточку «По entities» и выберите созданные сенсоры.
  4. Проверьте связь: Попробуйте отключить ESP32 от питания. Через некоторое время (зависит от настроек birth/will сообщений, которые мы неявно задали через status топик) датчик статуса в HA должен перейти в состояние offline. После включения — снова online.

Заключение

Вот и всё! Мы превратили обычную плату ESP32 и датчик в полноценного участника экосистемы умного дома. MQTT — это мощный и гибкий протокол, а ESP32 — идеальная платформа для таких клиентов. Теперь вы можете масштабировать эту схему: добавить больше датчиков (например, измерять температуру, влажность и давление на одной плате), управлять реле или собирать данные с аналоговых сенсоров.

Если вы только выбираете платформу для своих проектов, рекомендую почитать сравнение ESP32 vs ESP8266. А для тех, кто задумывается о более мощном центральном хабе, присмотритесь к Orange Pi 5 — на нём Home Assistant будет летать.

Экспериментируйте, задавайте вопросы в комментариях, и да пребудет с вами стабильный Wi-Fi сигнал!

Понравилась статья?

Поставьте лайк и сохраните полезный материал в закладки.

Комментарии (0)
Добавить комментарий
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
Что можно сделать на LILYGO T-Dongle S3: 10 практических проектов
ESP32 / ESP8266
01.09.2026
Что можно сделать на LILYGO T-Dongle S3: 10 практических проектов
10 практических идей для LILYGO T-Dongle S3: мониторинг сервера, Home Assistant, MQTT, USB HID, 3D-принтер, сетевые инструменты и другие проекты на ESP32-S3.
ESPHome: прошиваем ESP32 без единой строки кода. Визуальный путь к умному устройству
ESP32 / ESP8266
31.03.2026
ESPHome: прошиваем ESP32 без единой строки кода. Визуальный путь к умному устройству
Пошаговое руководство: как прошить ESP32 через ESPHome без кода. Интеграция с Home Assistant, OTA-обновления, примеры конфигов для датчиков и реле. Упрощаем DIY!
ESP32 Web Server: Управляем реле через браузер
ESP32 / ESP8266
31.03.2026
ESP32 Web Server: Управляем реле через браузер
Запускаем веб-сервер на ESP32 и управляем реле через браузер: подключение, прошивка и простой интерфейс.
ESP: как Espressif переписала правила DIY-электроники
ESP32 / ESP8266
10.09.2026
ESP: как Espressif переписала правила DIY-электроники
История создания чипов Espressif: от случайного успеха ESP8266 до линейки ESP32, C6, S3 и P4. Разбираем, чем отличаются платы и какую выбрать под конкретный DIY-проект.
Tasmota на ESP8266: Прошивка умных розеток и выключателей своими руками
ESP32 / ESP8266
31.03.2026
Tasmota на ESP8266: Прошивка умных розеток и выключателей своими руками
Пошаговое руководство по перепрошивке умных розеток на Tasmota для локального управления. Полный контроль, интеграция с Home Assistant и независимость от облака.
ESP32 Deep Sleep: как сделать датчик на батарейках, работающий месяцами
ESP32 / ESP8266
31.03.2026
ESP32 Deep Sleep: как сделать датчик на батарейках, работающий месяцами
Используем Deep Sleep на ESP32, чтобы снизить энергопотребление и продлить работу автономного датчика от батареи.

Войдите в аккаунт, чтобы пользоваться закладками, сообщениями и другими возможностями сайта.