ESP32 — недорогой микроконтроллер с Wi-Fi и Bluetooth, который часто берут для датчиков температуры, реле и кнопок. Классический путь требует Arduino IDE, библиотек и навыков C++, а ещё пары вечеров на отладку. ESPHome предлагает другой подход: устройство описывается в YAML, программа сама собирает прошивку, заливает её по USB или по сети и отдаёт данные в Home Assistant. Разберём полный цикл — от установки до диагностики, когда плата не выходит на связь.
Что понадобится
- Плата ESP32: классическая
esp32dev,esp32-s3-devkitc-1илиesp32-c3-devkitm-1. Название платы в конфиге должно совпадать с реальной. - USB-кабель с линиями данных, а не только зарядный. Это самая частая причина «плата не определяется».
- Компьютер с Linux, Python 3.11+ или Docker.
- Датчики с питанием 3,3 В. Если модуль рассчитан на 5 В, нужен преобразователь уровней.
- Опционально — Home Assistant в той же сети.
Всё, что связано с 220 В, оставьте электрику. ESP32 работает с низким напряжением, а готовые реле на DIN-рейку подключаются к сети только специалистом.
Установка и первый проект
Проще всего поставить ESPHome через pipx, чтобы не смешивать зависимости с системным Python.
sudo apt install pipx
pipx ensurepath
pipx install esphome
esphome version
Мастер создаст заготовку и спросит имя, плату, Wi-Fi и пароль. Файл можно править вручную — это обычный YAML.
esphome wizard kitchen.yaml
esphome config kitchen.yaml
Команда config проверяет синтаксис и подставляет секреты, но не собирает прошивку. Если нужен веб-интерфейс, запустите официальный контейнер:
docker run --rm --net=host -v "$PWD":/config \
-it ghcr.io/esphome/esphome dashboard /config
Анатомия конфигурации
Минимальный рабочий конфиг для датчика выглядит так. Обратите внимание на esp-idf: для новых плат это основной фреймворк, Arduino оставьте только для старых проектов.
substitutions:
name: kitchen-sensor
friendly_name: "Кухня: датчик"
esphome:
name: ${name}
friendly_name: ${friendly_name}
esp32:
board: esp32dev
framework:
type: esp-idf
logger:
level: INFO
api:
encryption:
key: !secret kitchen_api_key
ota:
- platform: esphome
encryption:
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
manual_ip:
static_ip: 192.168.1.51
gateway: 192.168.1.1
subnet: 255.255.255.0
ap:
ssid: "${name} fallback"
password: !secret fallback_password
captive_portal:
Секреты храните в secrets.yaml рядом с конфигом. Ключ API — 32 байта в base64, его удобно сгенерировать командой openssl rand -base64 32.
wifi_ssid: "home-iot"
wifi_password: "..."
fallback_password: "..."
kitchen_api_key: "BASE64_KEY"
В ESPHome 2026.9 и новее пустой блок encryption: у OTA наследует ключ API. Отдельный пароль не нужен, а обновление по сети шифруется тем же ключом. На старых прошивках придётся один раз обновить устройство по USB, иначе смена схемы авторизации отрежет OTA.
Датчики, кнопки и фильтры
Адреса I²C удобно искать сканером: включите scan: true, посмотрите лог и уберите лишний вывод. BME280 обычно виден как 0x76 или 0x77.
i2c:
sda: GPIO21
scl: GPIO22
scan: true
sensor:
- platform: bme280_i2c
address: 0x76
temperature:
name: "Температура"
humidity:
name: "Влажность"
pressure:
name: "Давление"
update_interval: 60s
binary_sensor:
- platform: gpio
pin:
number: GPIO27
mode:
input: true
pullup: true
name: "Дверь"
filters:
- delayed_on: 50ms
- delayed_off: 200ms
Фильтры гасят дребезг: delayed_on подтверждает срабатывание, delayed_off не даёт короткому отпусканию сбросить сенсор. Для геркона на двери этого достаточно. Для DHT22 используйте платформу dht с пином и моделью DHT22, но помните, что она медленнее и капризнее к питанию.
На классическом ESP32 АЦП2 (GPIO 0, 2, 4, 12–15, 25–27) конфликтует с Wi-Fi. Для аналоговых датчиков берите выводы АЦП1: GPIO 32–39. Выводы 34–39 работают только на вход и не имеют подтяжки.
Первая прошивка и обновления
ls /dev/ttyUSB*
sudo usermod -aG dialout "$USER"
esphome run kitchen.yaml --device /dev/ttyUSB0
esphome logs kitchen.yaml --device 192.168.1.51
После добавления в группу dialout нужно перелогиниться. Первая сборка занимает несколько минут: скачиваются платформа и зависимости. Дальше esphome run kitchen.yaml без --device предложит OTA и обновит плату по Wi-Fi.
Если плата на ESP32-S3 или C3 с нативным USB, порт может называться /dev/ttyACM0. Иногда помогает зажать BOOT при подключении. Для плат с UART-переходником CH340 или CP2102 проверьте, что модуль ядра загрузился: dmesg | tail -20.
Диагностика и типовые ошибки
- Появилась сеть «kitchen-sensor fallback». Плата не подключилась к Wi-Fi. Подключитесь к ней, откройте
192.168.4.1и задайте сеть через captive portal. Пароль указан в блокеap. - OTA падает с ошибкой авторизации. Ключ в конфиге не совпадает с прошитым. Обновите устройство по USB один раз, затем повторите OTA.
- Плата перезагружается по кругу. Скорее всего, дело в просадке питания или в boot-loop из-за вывода, который тянет GPIO0, 2, 12 или 15 при старте. Питайте от качественного блока 5 В с запасом по току.
- В Home Assistant нет сущностей. Проверьте, что порт 6053 доступен, устройства в одной подсети и ключ API скопирован верно. Статический IP надёжнее mDNS.
- После смены фреймворка сборка странно себя ведёт. Выполните
esphome clean kitchen.yamlи соберите заново.
Полезно смотреть не только esphome logs, но и уровень DEBUG для Wi-Fi и API. Не оставляйте его навсегда: отладочные логи замедляют устройство и забивают журнал.
Чек-лист перед установкой
- Проверьте, что все датчики питаются от 3,3 В и не подают 5 В на GPIO.
- Закрепите провода и подпишите их: через месяц вы не вспомните, какой GPIO куда шёл.
- Для BME280 сделайте вентиляционные прорези: ESP32 греется и завышает температуру на 2–4 °C.
- Не используйте GPIO 6–11: они заняты флеш-памятью.
- Сохраните
secrets.yamlв менеджере паролей и сделайте резервную копию конфигов. - Проверьте поведение при пропадании Wi-Fi: устройство должно продолжать работать локально.
Итог
ESPHome убирает из разработки прошивок большую часть рутины: вы описываете пины и сущности, а сборку, OTA и интеграцию берёт на себя инструмент. Начните с одной платы и одного датчика, проверьте питание и статический IP, затем добавляйте остальные. Главные грабли — неверно выбранная плата, плохой USB-кабель и ключи API, поэтому держите под рукой кабель и esphome logs.