Программирование микроконтроллеров ESP8266/ESP32 написанием YAML конфиг файлов
Будучи поклонником системы управления «умным домом» Home Assistant я недавно открыл для себя интересный инструмент, тесно с HA интегрированный и ранее на Хабре не освещенный — ESP Home (ранее ESPhomeYAML).
ESP Home представляет собой набор библиотек и инструментов, генерирующих прошивку для микроконтроллеров ESP8266 и ESP32 из созданного пользователем конфиг файла в формате YAML. Это значительно упрощает написание прошивок малого и среднего уровня сложности в особенности для тех, кто не силен в программировании под Arduino и сильно сокращает количество строк кода/конфигурации для тех, кто силен.
Для удобства настройки поддерживается обновление прошивки по воздуху.
ESP Home поддерживает устройства на базе ESP8266 и ESP32, очень популярных среди любителей домашней автоматизации и прочих самоделкиных, а так же несколько десятков сенсоров и различную периферию — дисплеи, сетевые карты и т.д. Для обмена данными с запрограммированным устройством поддерживаются MQTT, UART, I2C, SPI и API, интегрированное с Home Assistant.
Ниже короткий пример установки ESP Home и простой настройки устройства на примере выключателя Sonoff T1, который представляет из себя ESP8266 с одним реле, одной кнопкой и одним управляемым светодиодом. В примере будут шаги установки одновременно для чистого Python и Docker.
Установка
Python 2.7 (из-за зависимостей Platformio)
pip2 install esphome
Docker из готового образа
docker pull esphome/esphome
Создание конфигурационного файла
ESP Home включает в себя визард, который помогает создать начальный конфигурационный файл.
Эти же шаги можно проделать в WEB интерфейсе ESP Home, про который написано в конце статьи.
Для начала нужно указать:
- Название устройства (назовем его switch)
- ESP8266 (в примере) или ESP32
- Тип платы (у нас esp01_1m)
- Назване точки доступа WiFi
- Пароль от WiFi
- Пароль от API Home Assistant, он же будет по умолчанию использоваться для обновления прошивки по воздуху.
Результатом работы визарда будет файл switch.yaml в текущей папке примерно такого вида:
esphome:
name: switch
platform: ESP8266
board: esp01_1m
wifi:
ssid: 'wifi_ap'
password: 'wifi_password'
# Enable logging
logger:
# Enable Home Assistant API
api:
password: 'api_password'
ota:
password: 'api_password'
Этого достаточно, чтобы скомпилировать прошивку и дальнейшие изменения производить по воздуху.
Первая прошивка
Теперь, если подключить контроллер к компьютеру по USB (NodeMCU) или через программатор можно заливать прошивку.
Python:
esphome switch.yaml run
ESP Home проверит, что в файле конфигурации нет ошибок, скомпилирует и загрузит прошивку. Кроме того в текущей папке появится новая папка с именем вашего устройства и проектом platformio внутри.
Если программатор/устройство не подключены к компьютеру можно выполнить команду:
esphome switch.yaml compile
и скомпилированный файл прошивки появится в папке switch/.pioenvs/switch/firmware.bin
Docker
На Linux или MacOS можно добавить в --device=/dev/ttyUSB0 Docker-команду — адрес устройства программатора или серийного порта.
docker run --rm -v "${PWD}":/config --device=/dev/ttyUSB0 -it esphome/esphome switch.yaml compile
Аналогично команде esphome в результате запуска контейнера появится папка switch/.pioenvs/switch/firmware.bin
Бинарный файл прошивки можно загрузить на контроллер через Arduino IDE.
После этого устройство можно отключить от USB и дальнейшие обновления прошивки будут проходить автоматически по воздуху.
Настройка выключателя
Дальше можно добавлять необходимые компоненты:
# Настройка сенсоров
binary_sensor:
# Считывание нажатий кнопки
- platform: gpio
pin:
number: GPIO0
mode: INPUT_PULLUP
inverted: True
name: "Switch button"
# Автоматизация, для управления реле по нажатию кнопки
on_press:
- switch.toggle: relay_1
# Сенсор, отчитывающийся о статусе утройства
- platform: status
name: "Switch Status"
switch:
# Управление реле
- platform: gpio
name: "Switch Relay 1"
pin: GPIO12
id: relay_1
output:
# Регистрация синего светодиода, как диммируемого выхода
- platform: esp8266_pwm
id: blue_led
pin: GPIO13
inverted: True
light:
# Превращаем выход в "лампочку", которой можно управлять
- platform: monochromatic
name: "Switch Blue LED"
output: blue_led
id: blue_led_light # ID для того, чтобы обращаться к диоду в командах автоматизации
Чтобы в итоге получить:
esphome:
name: switch
platform: ESP8266
board: esp01_1m
# Павило автоматизации, влючающее синий светодиод после запуска устройства.
on_boot:
# Минимальный приоритет
priority: -10
then:
- light.turn_on: blue_led_light
wifi:
ssid: 'wifi_ap'
password: 'wifi_password'
# Модуль логирования
logger:
# Активация Home Assistant API
api:
password: 'api_password'
# Активация прошивки по воздуху
ota:
password: 'api_password'
# Активация web сервера
# Ест довольно много ресурсов и лучше отключать его после финальной настройки
web_server:
port: 80
# Активация MQTT
mqtt:
broker: 10.0.0.2
username: mqt_user
password: mqtt_password
# Настройка сенсоров
binary_sensor:
# Считывание нажатий кнопки
- platform: gpio
pin:
number: GPIO0
mode: INPUT_PULLUP
inverted: True
name: "Switch button"
# Автоматизация, для управления реле по нажатию кнопки
on_press:
- switch.toggle: relay_1
# Сенсор, отчитывающийся о статусе утройства
- platform: status
name: "Switch Status"
switch:
# Управление реле
- platform: gpio
name: "Switch Relay 1"
pin: GPIO12
id: relay_1
output:
# Регистрация синего светодиода, как диммируемого выхода
- platform: esp8266_pwm
id: blue_led
pin: GPIO13
inverted: True
light:
# Превращаем выход в "лампочку", которой можно управлять
- platform: monochromatic
name: "Switch Blue LED"
output: blue_led
id: blue_led_light # ID для того, чтобы обращаться к диоду в командах автоматизации
WEB интерфейс
Те же действия можно проделать через WEB интерфейс, который работает на Linux и MacOS.
Python
Нужно установить дополнительные зависимости:
pip2 install tornado esptool
и запустить ESP Home такой командой:
esphome config/ dashboard
Docker
В документации написано, что для работы индикаторов статуса нужно подключить контейнер к сети host такой командой:
docker run --rm --net=host -v "${PWD}":/config -it esphome/esphome
У меня она не заработала и я использовал:
docker run --rm --net=bridge -p 6052:6052 -v "${PWD}":/config -it esphome/esphome
После этого можно зайти на 127.0.0.1:6052 и работать в удобном интерфейсе:
Приятной работы.