Программирование микроконтроллеров 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 и работать в удобном интерфейсе:

3mpdgcf4wpwkajzs1o0l9qqmifw.png

Приятной работы.

© Habrahabr.ru