Полный IOT-стек, работающий на Raspberry Pi, — это эффективный способ интеграции различных датчиков для автоматизации дома. В прошлых статьях мы узнали, как вручную добавить датчик температуры/влажности в домашнюю сеть. Используя PlatformIO, мы вручную прошиваем датчик, затем выбираем доступную библиотеку для взаимодействия с датчиком и добавляем дополнительные библиотеки для взаимодействия с MQTT и отправки правильно преобразованных данных JSON. Мы имеем полный контроль над всеми этими шагами и можем настроить каждый символ, который выводит датчик. В дополнение к этому ручному способу существуют отличные фреймворки для прошивки и установки утилит на датчики, а также отличные платформы, которые получают доступ к нескольким датчикам и отображают результаты измерений в графическом виде, а также дают вам возможность напрямую взаимодействовать с этими датчиками.
В этой статье вы узнаете, как использовать фреймворк ESPHome для конфигурирования, установки и управления платами ESP8266 и подключенными к ним датчиками. В частности, мы подключим плату ESP32-Camera со встроенной камерой, а затем получим доступ к этой плате через ESPHome Dashboard.
Техническим контекстом данной статьи является Raspberry Pi OS 2021-05-07 и ESPHome v2021.9.1. Все инструкции должны работать и с более новыми версиями ОС и библиотеки.
Эта статья первоначально появилась в моем блоге admantium.com.
Основы ESPHome
ESPHome — это фреймворк, который упрощает конфигурирование, установку и управление платами ESP8266 или ESP32 и их датчиками. Из коробки он поддерживает датчики качества воздуха, энергии, движения, расстояния и многое другое. Датчики конфигурируются с помощью декларативных файлов YAML. Здесь вы указываете специфику датчика, например, модель и конфигурацию GPIO, а также возможности датчика, какие функции вы хотите использовать и к каким данным вы хотите получить доступ. С помощью этой конфигурации ESPHome компилирует специфический, пользовательский код платы, который автоматически включает все необходимые библиотеки. При первой конфигурации платы ее следует подключить непосредственно к компьютеру, на котором установлена ESPHome. После этого все последующие изменения конфигурации и обновления можно выполнять по беспроводной связи с помощью обновлений по воздуху.
Вы также получаете приборную панель, которая показывает состояние каждого узла, и вы можете редактировать все конфигурации для всех датчиков.
Конфигурация и запуск Docker Compose
Добавьте следующий код в ваш файл docker-compose.yml
:
esphome:
container_name: esphome
image: esphome/esphome:2021.9.1
volumes:
- ./volumes/esphome/config:/config
devices:
- /dev/ttyUSB0:/dev/ttyUSB0
ports:
- "6052:6052"
privileged: true
networks:
- iotstack_nw
Этот файл делает следующие выборы и предположения о контейнере ESPHome:
- Version pinning: Установить версию образа на самую актуальную, стабильную версию (здесь
esphome:2021.9.1
). - Тома: Смонтируйте том, чтобы все конфигурационные файлы хранились на компьютере, на котором запущен контейнер, а также для которого можно легко создавать резервные копии.
- Устройства: Как уже объяснялось, вам нужно прошить ESP8266/ESP32 home в первый раз через физическое соединение. Я использую для этого USB-адаптер FTL, который имеет файл устройства
/dev/ttyUSB0
на Raspberry Pi. - Привилегированный: Этот контейнер имеет привилегированные права доступа к хосту для обеспечения доступа к подключенным устройствам. После того, как вы прошили все платы, попробуйте удалить эту настройку и перезапустить контейнер.
С этой конфигурацией вы можете запустить контейнер, выполнив команду docker-compose up -d esphome
. Приборная панель доступна на порту 6052
.
Базовая конфигурация платы/датчика
В приборной панели нажмите на зеленую кнопку с плюсом, откроется диалог конфигурации.
Введите имя датчика, детали WIFI-соединения, которое он должен использовать, и нажмите ‘Next’. Здесь выберите тип платы и продолжите. Теперь вы видите новый узел на приборной панели. Зайдите в его конфигурацию через EDIT
. Она должна выглядеть так, как показано на рисунке:
esphome:
name: esp8266-test
platform: ESP32
board: esp32dev
# Enable logging
logger:
# Enable Home Assistant API
api:
ota:
password: "57251b5351294c8728c61e2f04d1109b"
wifi:
ssid: "TEST"
password: "TEST"
captive_portal:
Эта базовая конфигурация включает предоставленную информацию об имени узла, его платформе и доступе к WIFI. Дополнительные секции ap
и captive_portal
могут быть удалены. Пункты api
и ota
будут необходимы, когда мы захотим получить доступ к управляемым устройствам ESPHome с помощью других приложений или для применения обновлений over-the-air.
Теперь давайте продолжим добавление платы ESP32-Cam.
Настройка платы ESP32-Cam
Плата ESP32-Cam поставляется в различных версиях с разным расположением выводов. Эти детали необходимо искать на домашней странице производителя и/или в руководствах. Моя конкретная плата — это ESP32-Cam AI-Thinker
. Комбинирование строфы конфигурации ESP32-Cam, применение специфического расположения выводов и добавление дополнительных опций конфигурации привело меня к такой конфигурации:
# ESP32-CAM
esp32_camera:
external_clock:
pin: GPIO0
frequency: 20MHz
i2c_pins:
sda: GPIO26
scl: GPIO27
data_pins: [GPIO5, GPIO18, GPIO19, GPIO21, GPIO36, GPIO39, GPIO34, GPIO35]
vsync_pin: GPIO25
href_pin: GPIO23
pixel_clock_pin: GPIO22
power_down_pin: GPIO32
resolution: 1024x768
idle_framerate: 0.05 fps
max_framerate: 5 fps
vertical_flip: false
horizontal_mirror: false
name: esp32camera
Интересны следующие моменты этой конфигурации:
- Разрешение: ESP32-Cam поддерживает разрешения от 160×120 до 1600×1200 пикселей, что сильно влияет на …
- Частота кадров: В режиме ожидания камера записывает одно изображение раз в 12 секунд. При использовании применяется настройка
max_framerate
. Однако не ожидайте более 5FPS для среднего разрешения, плата просто недостаточно мощная, чтобы обеспечить лучшую скорость. - Горизонтальный и вертикальный переворот: Эти опции изменяют отображаемое изображение, используйте их, чтобы приспособиться к тому, где и как вы разместите плату.
Подтвердите, что эта конфигурация работает, нажав Validate
, а затем нажмите Install
. Вы должны увидеть следующее сообщение:
HARDWARE: ESP32 240MHz, 320KB RAM, 4MB Flash
PACKAGES:
- framework-arduinoespressif32 3.10006.210326 (1.0.6)
- tool-esptoolpy 1.30000.201119 (3.0.0)
- tool-mkspiffs 2.230.0 (2.30)
- toolchain-xtensa32 2.50200.97 (5.2.0)
Library Manager: Installing Hash
Library Manager: Already installed, built-in library
Dependency Graph
|-- <AsyncTCP-esphome> 1.2.2
|-- <FS> 1.0
|-- <ESPAsyncWebServer-esphome> 1.3.0
| |-- <AsyncTCP-esphome> 1.2.2
| |-- <Crypto> 0.2.0
| |-- <FS> 1.0
| |-- <WiFi> 1.0
|-- <ESPmDNS> 1.0
| |-- <WiFi> 1.0
|-- <noise-c> 0.1.1
|-- <DNSServer> 1.1.0
| |-- <WiFi> 1.0
|-- <Update> 1.0
|-- <WiFi> 1.0
Retrieving maximum program size .pioenvs/terrace_camera/firmware.elf
Checking size .pioenvs/terrace_camera/firmware.elf
RAM: [= ] 12.8% (used 41792 bytes from 327680 bytes)
Flash: [===== ] 52.5% (used 963438 bytes from 1835008 bytes)
Configuring upload protocol...
AVAILABLE: esp-prog, espota, esptool, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa
CURRENT: upload_protocol = esptool
Looking for upload port...
Use manually specified: /dev/ttyUSB0
Uploading .pioenvs/terrace_camera/firmware.bin
Serial port /dev/ttyUSB0
Connecting....
Chip is ESP32-D0WDQ6 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: 9c:9c:1f:ca:59:20
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Auto-detected Flash size: 4MB
Compressed 17104 bytes to 11191...
Writing at 0x00001000... (100 %)
Wrote 17104 bytes (11191 compressed) at 0x00001000 in 1.0 seconds (effective 137.1 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 144...
Writing at 0x00008000... (100 %)
Wrote 3072 bytes (144 compressed) at 0x00008000 in 0.0 seconds (effective 1329.8 kbit/s)...
Hash of data verified.
Compressed 8192 bytes to 47...
Writing at 0x0000e000... (100 %)
Wrote 8192 bytes (47 compressed) at 0x0000e000 in 0.0 seconds (effective 6672.4 kbit/s)...
Hash of data verified.
Compressed 963552 bytes to 533955...
Writing at 0x00010000... (3 %)
Writing at 0x00014000... (6 %)
Writing at 0x00018000... (9 %)
Writing at 0x0001c000... (12 %)
...
Writing at 0x0002c000... (100 %)
Wrote 963438 bytes (812793 compressed) at 0x00000000 in 26.4 seconds...
Hash of data verified.
Если вы проследите за этими логами, то увидите, что используется несколько основных библиотек из ESPHome, а также дополнительные библиотеки для выбранной платы. Интересно, что за кулисами задействован универсальный инструмент PlatformIO (который был рассмотрен для ручной установки плат ESP в моей предыдущей статье).
Проверка подключения камеры
Давайте проверим, что камера работает правильно, нажав на Logs
в Dashboard.
INFO Reading configuration /config/camera.yaml...
INFO Starting log output from /dev/ttyUSB0 with baud rate 115200
[13:20:32][D][esp32_camera:156]: Got Image: len=10882
[13:20:42][D][esp32_camera:156]: Got Image: len=10575
Да, камера захватывает изображения правильно!
Обновления по воздуху
Теперь давайте попробуем установить обновления по воздуху. Нажмите на Install
, выберите Wirelessly
, и в новом окне отобразится процесс обновления.
Вы должны увидеть что-то вроде этого:
Updating /config/tower.yaml
------------------------------------------------------------
INFO Running: esphome --dashboard run /config/tower.yaml --no-logs --device OTA
INFO Reading configuration /config/tower.yaml...
INFO Generating C++ source...
INFO Compiling app...
INFO Running: platformio run -d /config/terra
Processing terra (board: esp32dev; framework: arduino; platform: platformio/espressif32@3.2.0)
--------------------------------------------------------------------------------
HARDWARE: ESP32 240MHz, 320KB RAM, 4MB Flash
PACKAGES:
- framework-arduinoespressif32 3.10006.210326 (1.0.6)
- tool-esptoolpy 1.30000.201119 (3.0.0)
- toolchain-xtensa32 2.50200.97 (5.2.0)
Library Manager: Installing Hash
Library Manager: Already installed, built-in library
Dependency Graph
|-- <ESPmDNS> 1.0
| |-- <WiFi> 1.0
|-- <noise-c> 0.1.1
|-- <Update> 1.0
|-- <WiFi> 1.0
Retrieving maximum program size .pioenvs/terra/firmware.elf
Checking size .pioenvs/terra/firmware.elf
RAM: [= ] 14.0% (used 45764 bytes from 327680 bytes)
Flash: [===== ] 54.4% (used 998702 bytes from 1835008 bytes)
========================= [SUCCESS] Took 8.38 seconds =========================
INFO Successfully compiled program.
INFO Connecting to 192.168.3.212
INFO Uploading /config/terra/.pioenvs/terra/firmware.bin (998816 bytes)
Uploading: [============================================================] 100% Done...
INFO Waiting for result...
INFO OTA successful
INFO Successfully uploaded program.
=============== [SUCCESS] /config/tower.yaml ===============
======================== [SUMMARY] ========================
- /config/tower.yaml: SUCCESS
Это также работает. Таким образом, наша первая плата ESP32 и сенсор камеры полностью установлены и полностью управляются ESPHome.
Устранение неполадок: Приборная панель показывает «Узел находится в автономном режиме».
Если ваш датчик отображается на приборной панели как автономный, но при этом он работает, например, вы можете получить доступ к его журналам, выполните следующие действия.
- Добавьте новую переменную окружения в контейнер ESPHome. В файле
docker-compose.yml
добавьте следующее:
services:
esphome:
...
environment:
- ESPHOME_DASHBOARD_USE_PING=true
- Настройте маршрутизатор для назначения статического IP-адреса узлу ESP8266/ESP32 и добавьте эту сетевую конфигурацию в
configuration.yml
в ESPHome.
wifi:
...
manual_ip:
static_ip: 192.168.3.212
gateway: 192.168.2.1
subnet: 255.255.254.0
Заключение
В этой статье мы показали, как настроить ESPHome, фреймворк для автоматической прошивки, конфигурирования и обновления плат ESP8266/ESP32 и подключенных к ним датчиков. Мы узнали, как добавить новый контейнер Docker в наш стек и применить необходимую конфигурацию. Затем мы открыли приборную панель ESPHome и добавили первый узел. Узлы конфигурируются с помощью декларативных файлов YAML, в них подробно описываются особенности платы и активируются функции платы/сенсора. Продолжая применять необходимую конфигурацию для платы ESP32-Cam, мы изначально прошили датчик. С этого момента мы можем просматривать его лог-файлы и выполнять все последующие изменения конфигурации или обновления по беспроводной связи. В целом, ESPHome — это потрясающий опыт, который значительно упрощает работу с несколькими платами ESP и датчиками.