Будучи поклонником системы управления "умным домом" 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)
ogregor
01.03.2019 10:34Не нашёл апи для формирования ble клиента, кроме как ibeakon. У Вас нет информации на этот счёт?
vnkr Автор
01.03.2019 12:47Насколько я понимаю, там нет (пока) API для работы с произвольными BLE клиентами. Есть, как вы сказали, возможность работы с ibeakon как бинарным сенсором и есть возможность создать BLE хаб и получать броадкасты с других девайсов, типа сенсоров Xiaomi. Вот тут описывается как: esphome.io/components/esp32_ble_tracker
AndrewVlz
01.03.2019 13:30«ESP Home представляет собой набор библиотек и инструментов, генерирующих прошивку для микроконтроллеров ESP8266 и ESP32 из созданного пользователем конфиг файла в формате YAML».
А как вам сервис wifi-iot.com, генерирующий прошивку в режиме онлайн?
Или считаете рассматриваемый в статье более гибким в плане настройки, подключения устройств и т.п.?vnkr Автор
01.03.2019 13:33Сервис интересный и довольно богатый, но моя главная проблема с ним — это привязка к собственно сервису для обновления и настройки. С ESP Home и, опционально, Home Assistant у меня все работает локально, без сторонних сервисов и необходимости в интернет соединении.
Кроме того, ESP Home дает возможность более гибкой настройки автоматизации на самом устройстве, вообще без какого-либо сетевого подключения — яркий пример кнопка выключателя, управляющая реле.AndrewVlz
01.03.2019 13:53Строго говоря, гибкая настройка и там имеется.
Web-интерфейс, который доступен на ESP после прошивки, позволяет настраивать термостаты, делать макросы на своеобразном языке и проч.
Впрочем, «на вкус и цвет»…
Siorinex
02.03.2019 14:06Ничего не имею против IoT, но его платность убивает.
Причем отменить ее, перепрошив на другую прошивку нельзя, а в паре вещей он проигрывает…
Ну и таки ESPHome у вас на машине, а не где-то там…
vyo
01.03.2019 19:34Не сочтите хейтером, но ИМХО и в Eclipse без всяческих извращений пишется неплохо, а главное — что хочешь. Очень сомневаюсь, что с этим ESP Home можно выводить инфу на дисплей (OLED) или играть OGG с SD карты (да, я знаю, что некоторое извращение).
Да и доверять стороннему инструменту в вопросах генерации кода немного не хочется.
vnkr Автор
01.03.2019 19:40Я же не говорю, что нельзя в Eclipse или Arduino IDE написать на C или Micro Python. Но этот инструмент проще для человека, который не очень опытен в программировании, позволяет намного быстрее добиться минимально работающей конфигурации и дальше удобно исправлять и добавлять по воздуху.
Умеет OLED, LCD, E-Ink и семисегментные дисплеи (хотя и ограниченное количество).
Вот OGG с SD, пожалуй, нет.
Siorinex
02.03.2019 14:14Начал переводить на него свой дом…
Сейчас разбросано между Tasmota на Соноффах, IoT на некоторых и самописках на роллшторах и ещё в паре вещей…
Вопрос:
Вот там это API для Ассистанса — у меня дома Мажордомо стоит и я по MQTT работаю. При включении API начинает слать еще и пачку в топик HomeAssistans…
Алекс Квазис на ютубе, из роликов которого про эту прошивку я и узнал, говорил, что она при подключении от нескольких серверов Ассистента всем раздаёт показания и принимает команды…
И вот я понять не могу: оно как при этом работает? Добавляет MQTT новых серверов или как-то ещё???vnkr Автор
02.03.2019 14:27+1API для HA работает без MQTT, там, видимо, REST. Просто если его включить, то прошивка начнет заодно отправлять в MQTT топик homeassistant потому, что API появился только в этом году и работает с новыми версиями HA, а в старых в таком случае заработало бы auto discovery (если включено) этого MQTT топика и устройства сами бы добавились.
Siorinex
02.03.2019 16:32Сижу, пытаюсь впилить в этот API…
Примеров толковых так и не нашёл…vnkr Автор
02.03.2019 18:54Вам для НА? Тогда чего в него впиливать — в настройках НА -> Integrations выбираете ESPhome, вводите адрес и порт и, по необходимости, пароль и все сенсоры, выключатели и т.д. появляются в НА.
Siorinex
02.03.2019 19:19Естессно нет: мне под Мажордомо переделывать
vnkr Автор
02.03.2019 19:49А зачем тогда API, если есть MQTT?
Siorinex
02.03.2019 20:01MQTT сервер может быть только один, а для резервирования надо управлять с нескольких… Ну и данные получать.
vnkr Автор
02.03.2019 20:22MQTT можно кластеризирровать. Вот тут можно посмотреть какие серверы поддерживают кластеризацию https://github.com/mqtt/mqtt.github.io/wiki/server-support
И с одним брокерем можно и отправлять, и получать данные на множество устройств.
Nizametdinov
Правильно понял из конфига, что получились сенсор и свич. И теперь логика: «нажали кнопку — выключился свет» переехала внутрь HA?
googhalava
Спасибо за замечание, выложил нефинальную версию конфига. Поправил. Выключатель, конечно, должен быть самодостаточен в отсутствие подключения к НА.
Nizametdinov
Это уже интереснее — смотрел по диагонали месяц назад, не нашел локальной автоматизации, вчитаюсь поподробнее.
Сам перелез с OH на HA еще год назад, очень динамично развивается система.
На счет инсталляции — все гораздо проще в Hass io, буквально два клика в addon и контейнер ESP Home раскатывается. При чем hassio без проблем встал на Debian 9, очень крутая система получается, куча всего в два клика в морде делается. Забыл когда ssh на сервак открывал.
googhalava
У меня точно так же стоит Hass.io
Несколько раз ошибался в конфиге так, что он не стартовал — тут помогает, что он в Debian и можно зайти по ssh и все поправить, в отличае от их решения на Hassbian.