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



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

Комментарии (22)


  1. Nizametdinov
    28.02.2019 20:08

    Правильно понял из конфига, что получились сенсор и свич. И теперь логика: «нажали кнопку — выключился свет» переехала внутрь HA?


    1. googhalava
      28.02.2019 20:19

      Спасибо за замечание, выложил нефинальную версию конфига. Поправил. Выключатель, конечно, должен быть самодостаточен в отсутствие подключения к НА.


      1. Nizametdinov
        28.02.2019 20:29

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


        1. googhalava
          28.02.2019 20:51

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


  1. ogregor
    01.03.2019 10:34

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


    1. vnkr Автор
      01.03.2019 12:47

      Насколько я понимаю, там нет (пока) API для работы с произвольными BLE клиентами. Есть, как вы сказали, возможность работы с ibeakon как бинарным сенсором и есть возможность создать BLE хаб и получать броадкасты с других девайсов, типа сенсоров Xiaomi. Вот тут описывается как: esphome.io/components/esp32_ble_tracker


  1. AndrewVlz
    01.03.2019 13:30

    «ESP Home представляет собой набор библиотек и инструментов, генерирующих прошивку для микроконтроллеров ESP8266 и ESP32 из созданного пользователем конфиг файла в формате YAML».

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

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


    1. vnkr Автор
      01.03.2019 13:33

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


      1. AndrewVlz
        01.03.2019 13:53

        Строго говоря, гибкая настройка и там имеется.

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

        Впрочем, «на вкус и цвет»…


    1. Siorinex
      02.03.2019 14:06

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

      Ну и таки ESPHome у вас на машине, а не где-то там…


  1. RStarun
    01.03.2019 17:41

    Ссылку на Home assistant в самом начале статьи поправьте пожалуйста.


    1. vnkr Автор
      01.03.2019 17:41

      Поправил, спасибо.


  1. vyo
    01.03.2019 19:34

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


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


    1. vnkr Автор
      01.03.2019 19:40

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

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

      Вот OGG с SD, пожалуй, нет.


  1. Siorinex
    02.03.2019 14:14

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

    Вопрос:
    Вот там это API для Ассистанса — у меня дома Мажордомо стоит и я по MQTT работаю. При включении API начинает слать еще и пачку в топик HomeAssistans…
    Алекс Квазис на ютубе, из роликов которого про эту прошивку я и узнал, говорил, что она при подключении от нескольких серверов Ассистента всем раздаёт показания и принимает команды…
    И вот я понять не могу: оно как при этом работает? Добавляет MQTT новых серверов или как-то ещё???


    1. vnkr Автор
      02.03.2019 14:27
      +1

      API для HA работает без MQTT, там, видимо, REST. Просто если его включить, то прошивка начнет заодно отправлять в MQTT топик homeassistant потому, что API появился только в этом году и работает с новыми версиями HA, а в старых в таком случае заработало бы auto discovery (если включено) этого MQTT топика и устройства сами бы добавились.


      1. Siorinex
        02.03.2019 16:32

        Сижу, пытаюсь впилить в этот API…
        Примеров толковых так и не нашёл…


        1. vnkr Автор
          02.03.2019 18:54

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


          1. Siorinex
            02.03.2019 19:19

            Естессно нет: мне под Мажордомо переделывать


            1. vnkr Автор
              02.03.2019 19:49

              А зачем тогда API, если есть MQTT?


              1. Siorinex
                02.03.2019 20:01

                MQTT сервер может быть только один, а для резервирования надо управлять с нескольких… Ну и данные получать.


                1. vnkr Автор
                  02.03.2019 20:22

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


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