IOT на Raspberry Pi: Автоматическое управление датчиками с помощью ESPHome

Полный 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.

Устранение неполадок: Приборная панель показывает «Узел находится в автономном режиме».

Если ваш датчик отображается на приборной панели как автономный, но при этом он работает, например, вы можете получить доступ к его журналам, выполните следующие действия.

  1. Добавьте новую переменную окружения в контейнер ESPHome. В файле docker-compose.yml добавьте следующее:
  services:
    esphome:
      ...
      environment:
      - ESPHOME_DASHBOARD_USE_PING=true
Войти в полноэкранный режим Выйти из полноэкранного режима
  1. Настройте маршрутизатор для назначения статического 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 и датчиками.

Оцените статью
devanswers.ru
Добавить комментарий