Программирование микроконтроллеров ESP8266/ESP32 написанием YAML конфиг файлов

  • Tutorial

Будучи поклонником системы управления "умным домом" 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 и работать в удобном интерфейсе:



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

Средняя зарплата в IT

113 000 ₽/мес.
Средняя зарплата по всем IT-специализациям на основании 5 065 анкет, за 2-ое пол. 2020 года Узнать свою зарплату
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 27

    0
    Правильно понял из конфига, что получились сенсор и свич. И теперь логика: «нажали кнопку — выключился свет» переехала внутрь HA?
      0
      Спасибо за замечание, выложил нефинальную версию конфига. Поправил. Выключатель, конечно, должен быть самодостаточен в отсутствие подключения к НА.
        0
        Это уже интереснее — смотрел по диагонали месяц назад, не нашел локальной автоматизации, вчитаюсь поподробнее.
        Сам перелез с OH на HA еще год назад, очень динамично развивается система.
        На счет инсталляции — все гораздо проще в Hass io, буквально два клика в addon и контейнер ESP Home раскатывается. При чем hassio без проблем встал на Debian 9, очень крутая система получается, куча всего в два клика в морде делается. Забыл когда ssh на сервак открывал.
          0

          У меня точно так же стоит Hass.io
          Несколько раз ошибался в конфиге так, что он не стартовал — тут помогает, что он в Debian и можно зайти по ssh и все поправить, в отличае от их решения на Hassbian.

      0

      Не нашёл апи для формирования ble клиента, кроме как ibeakon. У Вас нет информации на этот счёт?

        0
        Насколько я понимаю, там нет (пока) API для работы с произвольными BLE клиентами. Есть, как вы сказали, возможность работы с ibeakon как бинарным сенсором и есть возможность создать BLE хаб и получать броадкасты с других девайсов, типа сенсоров Xiaomi. Вот тут описывается как: esphome.io/components/esp32_ble_tracker
        0
        «ESP Home представляет собой набор библиотек и инструментов, генерирующих прошивку для микроконтроллеров ESP8266 и ESP32 из созданного пользователем конфиг файла в формате YAML».

        А как вам сервис wifi-iot.com, генерирующий прошивку в режиме онлайн?

        Или считаете рассматриваемый в статье более гибким в плане настройки, подключения устройств и т.п.?
          0
          Сервис интересный и довольно богатый, но моя главная проблема с ним — это привязка к собственно сервису для обновления и настройки. С ESP Home и, опционально, Home Assistant у меня все работает локально, без сторонних сервисов и необходимости в интернет соединении.
          Кроме того, ESP Home дает возможность более гибкой настройки автоматизации на самом устройстве, вообще без какого-либо сетевого подключения — яркий пример кнопка выключателя, управляющая реле.
            0
            Строго говоря, гибкая настройка и там имеется.

            Web-интерфейс, который доступен на ESP после прошивки, позволяет настраивать термостаты, делать макросы на своеобразном языке и проч.

            Впрочем, «на вкус и цвет»…
            0
            Ничего не имею против IoT, но его платность убивает.
            Причем отменить ее, перепрошив на другую прошивку нельзя, а в паре вещей он проигрывает…

            Ну и таки ESPHome у вас на машине, а не где-то там…
            0
            Ссылку на Home assistant в самом начале статьи поправьте пожалуйста.
              0
              Поправил, спасибо.
              0

              Не сочтите хейтером, но ИМХО и в Eclipse без всяческих извращений пишется неплохо, а главное — что хочешь. Очень сомневаюсь, что с этим ESP Home можно выводить инфу на дисплей (OLED) или играть OGG с SD карты (да, я знаю, что некоторое извращение).


              Да и доверять стороннему инструменту в вопросах генерации кода немного не хочется.

                0
                Я же не говорю, что нельзя в Eclipse или Arduino IDE написать на C или Micro Python. Но этот инструмент проще для человека, который не очень опытен в программировании, позволяет намного быстрее добиться минимально работающей конфигурации и дальше удобно исправлять и добавлять по воздуху.

                Умеет OLED, LCD, E-Ink и семисегментные дисплеи (хотя и ограниченное количество).

                Вот OGG с SD, пожалуй, нет.
                0
                Начал переводить на него свой дом…
                Сейчас разбросано между Tasmota на Соноффах, IoT на некоторых и самописках на роллшторах и ещё в паре вещей…

                Вопрос:
                Вот там это API для Ассистанса — у меня дома Мажордомо стоит и я по MQTT работаю. При включении API начинает слать еще и пачку в топик HomeAssistans…
                Алекс Квазис на ютубе, из роликов которого про эту прошивку я и узнал, говорил, что она при подключении от нескольких серверов Ассистента всем раздаёт показания и принимает команды…
                И вот я понять не могу: оно как при этом работает? Добавляет MQTT новых серверов или как-то ещё???
                  +1
                  API для HA работает без MQTT, там, видимо, REST. Просто если его включить, то прошивка начнет заодно отправлять в MQTT топик homeassistant потому, что API появился только в этом году и работает с новыми версиями HA, а в старых в таком случае заработало бы auto discovery (если включено) этого MQTT топика и устройства сами бы добавились.
                    0
                    Сижу, пытаюсь впилить в этот API…
                    Примеров толковых так и не нашёл…
                      0

                      Вам для НА? Тогда чего в него впиливать — в настройках НА -> Integrations выбираете ESPhome, вводите адрес и порт и, по необходимости, пароль и все сенсоры, выключатели и т.д. появляются в НА.

                        0
                        Естессно нет: мне под Мажордомо переделывать
                          0
                          А зачем тогда API, если есть MQTT?
                            0
                            MQTT сервер может быть только один, а для резервирования надо управлять с нескольких… Ну и данные получать.
                              0

                              MQTT можно кластеризирровать. Вот тут можно посмотреть какие серверы поддерживают кластеризацию https://github.com/mqtt/mqtt.github.io/wiki/server-support


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

                                0
                                Вобщем подумал тут и решил: а почему не поставить до кучи HA как дубляж системы?!
                                Выделил очередную виртуалку на сервере, поставил…

                                Под это дело переводил девайсы на единый ESPHome…
                                Реле, датчики, соноффы, часы на кухне… Радует, что зачастую можно задать как параметр, что это лампа или вентилятор и HA его подхватывает в этом качестве…

                                Столкнулся с веселостью при переходе с IoT на EspHome в контроллере света для щитка… Он на ESP32…
                                Шутка вышла в том, что MQTT под 32й в качестве значения принимает не само значение, а JSON запись… Это там по умолчанию и как переделать глобально — непонятно! В 8266 без проблем, а тут…

                                Сейчас перевожу прошивку для роллштор на нее…
                                Пока как-то маловразумительно, но тут просто я туплю…
                                  0

                                  А можете пример конфига для света в щитке выложить — интересно посмотреть в чем может быть проблема?

                                    0
                                    Пароли и сети заменил на фейки, а так — вот такое вот…
                                    По справочнику — нужно в ОБРАБОТЧИКИ топиков MQTT вставить schema: template или standart.
                                    Третий вариант — JSON выдает в стиле:
                                    light2/light/hall_light_1/state={«state»:«OFF»}

                                    И для 32 версии вместо стандарта он почему-то использует именно его… Нашёл в проверке конфига: она при этом дополняет поумолчательными настройками и там в обработчиках и засек…

                                    Конфиг
                                    esphome:
                                    name: light2
                                    platform: ESP32
                                    board: esp-wrover-kit

                                    wifi:
                                    networks:
                                    - ssid: 'net1'
                                    password: '***'
                                    - ssid: 'net2'
                                    password: '***'
                                    - ssid: 'net3'
                                    password: '***'
                                    manual_ip:
                                    static_ip: 192.168.2.12
                                    gateway: 192.168.0.1
                                    subnet: 255.255.252.0

                                    mqtt:
                                    broker: 192.168.1.2:1883
                                    username: light2
                                    password: ******

                                    # Enable logging
                                    logger:

                                    # Enable Home Assistant API
                                    api:
                                    password: '***'
                                    reboot_timeout: 0s

                                    ota:
                                    password: '***'

                                    web_server:
                                    port: 80

                                    status_led:
                                    id: light_module_status
                                    pin:
                                    number: GPIO2

                                    output:
                                    - platform: gpio
                                    id: relay1
                                    pin:
                                    number: GPIO27
                                    inverted: True

                                    - platform: gpio
                                    id: relay2
                                    pin:
                                    number: GPIO26
                                    inverted: True

                                    - platform: gpio
                                    id: relay3
                                    pin:
                                    number: GPIO25
                                    inverted: True

                                    - platform: gpio
                                    id: relay4
                                    pin:
                                    number: GPIO33
                                    inverted: True

                                    - platform: gpio
                                    id: relay5
                                    pin:
                                    number: GPIO32
                                    inverted: True

                                    - platform: gpio
                                    id: relay6
                                    pin:
                                    number: GPIO18
                                    inverted: True

                                    - platform: gpio
                                    id: relay7
                                    pin:
                                    number: GPIO19
                                    inverted: True

                                    - platform: gpio
                                    id: relay8
                                    pin:
                                    number: GPIO21
                                    inverted: True

                                    - platform: gpio
                                    id: relay9
                                    pin:
                                    number: GPIO22
                                    inverted: True

                                    - platform: gpio
                                    id: relay10
                                    pin:
                                    number: GPIO23
                                    inverted: True

                                    light:
                                    - platform: binary
                                    output: relay1
                                    id: kitchen_light
                                    name: "Kitchen Light"

                                    - platform: binary
                                    output: relay2
                                    id: reserv_light_2
                                    name: "Reserv 2"

                                    - platform: binary
                                    output: relay3
                                    id: reserv_light_3
                                    name: "Reserv 3"

                                    - platform: binary
                                    output: relay4
                                    id: reserv_light_4
                                    name: "Reserv 4"

                                    - platform: binary
                                    output: relay5
                                    id: toilet_light
                                    name: "Toilet Light"

                                    - platform: binary
                                    output: relay6
                                    id: bathroom_light
                                    name: "Bathroom Light"

                                    - platform: binary
                                    output: relay7
                                    id: lab_light
                                    name: "Laboratory Light"

                                    - platform: binary
                                    output: relay8
                                    id: hall_light_0
                                    name: "Hall Light 0"

                                    - platform: binary
                                    output: relay9
                                    id: hall_light_1
                                    name: "Hall Light 1"

                                    - platform: binary
                                    output: relay10
                                    id: hall_light_2
                                    name: "Hall Light 2"

                                      0
                                      Интересно, спасибо.

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

              Самое читаемое