blog.vyoralek.cz

ESPHome – alternativní firmware pro ESP8266 a ESP32

Podíváme se na v určitém úhlu pohledu alternativu k firmware Sonoff-Tasmota, a který i když existuje po relativně krátkou dobu už pro určité použití vypadá velice zajímavě.

🎙 Poslední aktualizace článku 17.10.2020. Pokud najdete nějaké rozdíly v aktuálním stavu, dejte vědět v komentářích, díky.

Pár článků zpět jsem psal o použití firmware Tasmota v kombinaci s Wemos D1 Mini a dvěmi sensory. V této kombinaci se Sonoff-Tasmota dala použít perfektně, nicméně to neplatí, pokud se rozhodneme použít ještě i displej.

Naštěstí jsem velmi nedávno objevil ESPHome, který slibuje možnost vytvoření vlastního firmware s připojením velkého množství všemožných druhů sensorů a displejů. To vše navíc téměř bez nutnosti znalosti C/C++.

Na velmi podobném projektu jako minule si tak ukážeme jak Esphomelib použít. V nějakém dalším článku bych pak rád ukázal možnosti použití se Sonoff Basic.

Co budeme potřebovat?

  1. nepájivé pole (breadboard) – cca. $1 AliExpress
  2. vodiče samec-samec – 4 žíly – cca. $0,7 AliExpress
  3. desku Wemos D1 mini s čipem ESP8266 – cca. $2.25 AliExpress
  4. sensor BME280 – měření teploty, vlhkosti a tlaku – cca. $2.18 AliExpress
  5. nebo sensor SHT31 – měření teploty a vlhkosti – cca. $3.7 AliExpress
  6. displej SSD1306 I2C – Oled displej s rozlišením 128×64 – cca $2.12 AliExpress
  7. jakýkoliv USB kabel s USB nabíječkou (např. i mobilní nabíječku)

Zapojení

Schéma zapojení - všechny součástky na I2C sběrnici
Schéma zapojení – všechny součástky na I2C sběrnici
Fyzické zapojení - dislej (SSD1306) + 2 senzory (SH31 + BME280) a mikrokontroler Wemos D1 mini
Fyzické zapojení – dislej (SSD1306) + 2 senzory (SH31 + BME280) a mikrokontroler Wemos D1 mini

Pokud byste rádi znali více k zapojení koukněte do přechozího článku, který je z hlediska součástek téměř stejný – jen neobsahuje displej, který však má zapojení I2C stejné jako sensory.

Firmware

Instalace

Ukážeme si rovnou tři možnosti a nechám na každém, ať si vybere. Obecně bych doporučoval variantu první.

1.a Pro Python 3 – Linux / Mac

Pokud už Python 2 nemáte nainstalovaný či z jakéhokoliv jiného důvodu chcete použít pouze Python 3 pak existuje možnost, která je o něco komplikovanější a má jisté limity – z mého zkoušení nefunguje pouze webový dashboard.

Začneme vytvořením virtuálního Python 3 prostředí

python3 -m venv esphome

a virtuální prostředí si zaktivujeme

cd esphome
./bin/activate

Nyní už by nám balíček esphome měl jít nainstalovat

pip install esphome

1.b Pro Python 3 – Windows

V základní instalaci Windows 10 zřejmě stále nebudeme mít Python 3. Ten připadáme například přímo pomocí Microsoft Store:

Dále si vytvoříme virtuální prostředí pro EspHome s Pythonem 3:

python3 -m venv esphome

a virtuální prostředí si zaktivujeme

cd esphome
Scripts/activate

Nyní už by nám balíček esphome měl jít nainstalovat

pip install esphome

2.a Pro Python 2 – Linux / Mac (zastaralé)

🔔 Pro úplnost zde nechávám i návod pro Python 2, který již je dnes zastaralý a není doporučovaný.

Začneme vytvořením virtuálního Python 2 prostředí pomocí virtualenv

virtualenv esphome

Pokud ještě virtualenv nemáme tak si ho můžeme doinstalovat

pip install virtualenv

Virtuální prostředí si zaktivujeme:

cd esphome
source ./bin/activate

a doinstalujeme do něj esphome se všemi závislostmi:

pip install esphome

2.b Pro Python 2 – Windows (zastaralé)

Pokud ještě Python 2.7.x nemáme, pak si ho stáhneme ze stránek Python.org a konkrétně nás bude většinou zajímat verze s označením Windows x86-64 MSI installer.

Instalace Python 2.7 na Windows

V dalším kroku pokud ještě nemáme utilitu virtualenv, tak si ji doinstalujeme:

pip install virtualenv
pip install esphome

… a hned ji použijeme pro vytvoření virtuálního Python prostředí:

virtualenv esphome

Nově vytvořené prostředí si aktivujeme

cd esphome\Scripts
activate

… a doinstalujeme ESPHome se všemi závislostmi:

pip install esphome

3. Pro Docker

Instalace je pouze jedním příkazem, pokud už máte nainstalovaný Docker. Já měl u téhle verze ale problém, že výchozí hypervizor Dockeru neumí předávat dovnitř kontejneru USB port. Je pak potřeba použít hypervizor jiný – např. VirtualBox a celé řešení už pak začne být zbytečně velké.

docker pull esphome/esphome

Generování konfigurace

Máme možnost použít buď webové rozhraní a nebo textovou konzoli. Ukážeme si oboje.

1. Webové rozhraní

Spustíme pomocí příkazu

esphome wemos dashboard

a měli bychom vidět hlášku, kde bylo webové rozhraní spuštěno:

INFO Starting dashboard web server on port 6052 and configuration dir wemos...

Wemos určuje název adresáře s konfigurací, přičemž ale v jednom adresáři můžeme mít konfigurací klidně více.

Do prohlížeče zadáme http://localhost:6052 a jsme tam:

Průvodce konfigurací se sestává se čtyřech kroků – všechny údaje můžete později změnit ve vygenerovaném souboru ručně a není se třeba toho bát:

  1. název (name) – zvolte cokoliv co neobsahuje mezery a bude potřeba zachovat jedinečnost v rámci všech zařízeních.
  2. typ zařízení (device type) – seznam je rozdělený dle použitého čipu, tj. na ESP8266 a ESP32. My si vybereme pro tento článek Wemos D1 mini.
  3. WiFi a OTA aktualizace – jméno WiFi sítě (SSID) a heslo do WiFi. Volitelně pak je možné nastavit i heslo pro OTA aktualizace.
  4. hotovo – konfigurace se uloží do souboru název.yaml
Webový průvodce konfigurací ESPHome
Výsledek webového průvodce konfigurací ESPHome

2. Příkazová řádka

V přechozích verzi <1.6 ESPHomeYaml byl obsažený pouze textový průvodce, který však můžeme stále použít – například pokud máme pouze textovou konzoli.

Generování konfigurace spustíme pomocí příkazu:

esphome wemos.yaml wizard

a čeká nás velice podobný průvodce jako ve webovém rozhraní ve čtyřech krocích.

Hi there!
I'm the wizard of ESPHome :)
And I'm here to help you get started with ESPHome.
In 4 steps I'm going to guide you through creating a basic configuration file for your custom ESP8266/ESP32 firmware. Yay!

Konfigurace komponent

V případě webového rozhraní máme k dispozici přímo editor po kliknutí na Edit u konfigurace:

Do vygenerované konfigurace z předchozího kroku si přidáme nastavení potřebné pro naše senzory a displej:

i2c:
  sda: D1
  scl: D2
  scan: True

sensor:
  - platform: bme280
    temperature:
      name: "BME Temperature"
      oversampling: 16x
      id: bme_temp
    pressure:
      name: "BME Pressure"
      id: bme_press
    humidity:
      name: "BME Humidity"
      id: bme_humid
    address: 0x76
    update_interval: 60s

  - platform: sht3xd
    temperature:
      id: sht31_temp
      name: "SHT31 Temperature"
    humidity:
      id: sht31_humid
      name: "SHT31 Humidity"
    address: 0x44
    update_interval: 60s

font:
  - file: "PTM55FT.ttf"
    id: font
    size: 10

display:
  - platform: ssd1306_i2c
    model: "SSD1306 128x64"
    address: 0x3C
    lambda: |-
      it.printf(0, 10, id(font), "Teplota je %.1f°C", id(sht31_temp).state);
      it.printf(0, 20, id(font), "Vlhkost je %.0f%% ", id(sht31_humid).state);
      it.printf(0, 30, id(font), "Teplota je %.1f°C", id(bme_temp).state);
      it.printf(0, 40, id(font), "Vlhkost je %.0f%% ", id(bme_humid).state);
      it.printf(0, 50, id(font), "Tlak je %.1f hPa", id(bme_press).state);

Jednotlivé bloky vyjadřují:

  • i2c – zapnutí I2C komunikace. V našem případě nastavíme kam máme u Wemos D1 připojené SDA (D1) a SCL (D2). Pro prvotní spuštění si můžeme nechat scan zaplé a díky tomu uvidíme na obrazovce adresy všech připojených zařízeních,
  • sensor BME280 – nastavení prvního sensoru BME280. Definujeme si názvy, id i2c adresu a jak často chceme data získávat – my máme 1x za minutu.
  • sensor SHTxd – nastavení druhého sensoru SHT31. Konfigurace je víceméně stejné jako v případě BME280.
  • displej ssd1306– nastavení pro displej. Toto nastavení už je hodně uživatelsky specifické, jelikož v něm můžeme určit co se na displeji bude zobrazovat. Pro účely článku si zobrazíme hodnoty měřených údajů z obou sensorů. Jelikož máme variantu s rozlišením 128×64 nastavíme model na SSD1306 128×64.
  • font – tato sekce slouží pro displej a určuje jaký font a jaké velikosti bude použit pro text na displeji. Je potřeba si nejprve stáhnout patričný TTF soubor s písmem a uložit do adresáře s konfigurací.

Kontrola konfigurace

Ještě než se pustíme do kompilace je vhodné konfiguraci zkontrolovat. K tomu máme ve webovém rozhraní u konfigurace tlačítko Validate.

Pokud na něj klikneme dostaneme zřejmě následující chybovou hlášku:

INFO Reading configuration...
Failed config

font: [source wemos/wemos_d1.yaml:48]
  
  Please install the pillow python package to use this feature. (pip install pillow). Got '{"file": "PTM55FT.ttf", "id": "font", "size": 10}'
  - [source wemos/wemos_d1.yaml:48]
    file: PTM55FT.ttf
    id: font
    size: 10

Jak vidíme bude potřeba doinstalovat ještě jeden balíček, který se používá k převádění textů z TrueFont do binární podoby.

pip install pillow

Klikneme znovu na validovat a pravděpodobně dostaneme ještě jednu chybu:

INFO Reading configuration...
Failed config

font: [source wemos/wemos_d1.yaml:48]
  - [source wemos/wemos_d1.yaml:48]
    
    Could not find file 'wemos/PTM55FT.ttf'. Please make sure it exists. Got 'PTM55FT.ttf'
    file: PTM55FT.ttf
    id: font
    size: 10

Je potřeba ještě na uvedené místo zkopírovat použitý font.

Ještě jednou kliknout na validovat a už bychom měli mít informaci o korektní konfiguraci.

ESPHome - validace konfigurace v pořádku
ESPHome – validace konfigurace v pořádku

Kompilace a nahrání firmware

V pravém horním rohu si nastavíme správný port kde máme připojené Wemos D1 mini a klikneme na upload.

Pokud vše proběhlo správně měli bychom nejprve vidět informaci o úspěšné kompilaci a následném nahrání.

ESPHome má velice hezky udělané logování, které je i barevné, takže se můžeme podívat na spoustu více či méně užitečných informací o všech připojených a nakonfigurovaných komponentách.

Building .pioenvs/wemos_d1/firmware.bin
Retrieving maximum program size .pioenvs/wemos_d1/firmware.elf
Checking size .pioenvs/wemos_d1/firmware.elf
Memory Usage -> http://bit.ly/pio-memory-usage
DATA:    [=====     ]  52.0% (used 42560 bytes from 81920 bytes)
PROGRAM: [===       ]  34.2% (used 357564 bytes from 1044464 bytes)
===================================================== [SUCCESS] Took 38.98 seconds =====================================================
INFO Successfully compiled program.
INFO Running:  esptool.py --before default_reset --after hard_reset --chip esp8266 --port /dev/cu.usbserial-1A150 write_flash 0x0 wemos/wemos_d1/.pioenvs/wemos_d1/firmware.bin
esptool.py v2.6
Serial port /dev/cu.usbserial-1A150
Connecting....
Chip is ESP8266EX
Features: WiFi
MAC: 2c:3a:e8:2f:86:18
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Auto-detected Flash size: 4MB
Compressed 361712 bytes to 249050...
Wrote 361712 bytes (249050 compressed) at 0x00000000 in 24.1 seconds (effective 119.9 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...
INFO Successfully uploaded program.
INFO Starting log output from /dev/cu.usbserial-1A150 with baud rate 115200
[12:37:00][I][logger:071]: Log initialized
[12:37:00][C][ota:461]: There have been 0 suspected unsuccessful boot attempts.
[12:37:00][I][application:053]: Running through setup()...
[12:37:00][C][display.ssd1306:301]: Setting up I2C SSD1306...
[12:37:00][C][sensor.bme280:090]: Setting up BME280...
[12:37:00][C][sensor.sht3xd:038]: Setting up SHT3xD...
[12:37:00][C][wifi:029]: Setting up WiFi...
[12:37:00][D][wifi:247]: Starting scan...
[12:37:00][D][sensor.sht3xd:083]: Got temperature=24.31°C humidity=43.06%
[12:37:01][D][sensor.bme280:211]: Got temperature=23.3°C pressure=968.8hPa humidity=41.3%

Integrace do HomeAssistenta

Jeden z nějvětších benefitů Esphome je fakt, že pro integraci do HomeAssistenta nepotřebujeme prostředníka v podobě MQTT. Celá integrace se tak zjednodušuje.

Navíc od verze HomeAssistent 0.85 si systém umí automaticky najít zařízení ESPHome a v sekci Nastavení / Integrace bychom měli ESPHome zařízení automaticky vidět.

Automatické objevení ESPHome v síti
Automatické objevení ESPHome v síti

Stačí pak kliknout na konfigurovat a víceméně potvrdit pomocí Submit.

Možnosti nastavení integrace ESPHome
Možnosti nastavení integrace ESPHome

V logu ESPHome můžeme najít informaci o úspěšném spojení:

[17:42:35][D][api:531]: Client 'Home Assistant 0.85.1 (10.2.1.25)' connected successfully!

Automaticky se nám přidají všechny sensorová data, které jsme v ESPHome nastavili. Jak jednoduché.

Zkonfigurované nastavení jedním kliknutím pro ESPHome
Zkonfigurované nastavení jedním kliknutím pro ESPHome

Bez změn v konfiguračním souboru nám pak všechny sensory přibydou na Dashboardu nahoře.

Sensorová data z ESPHome
Sensorová data z ESPHome

Webové rozhraní na mikrokontroleru

Ve výchozí konfiguraci není webové rozhraní narozdíl od Sonoff-Tasmota přítomné. Nicméně to neznamená, že tato možnost vůbec neexistuje, i když funkcionalita je oproti Tasmotě značně omezená:

  • je možné vidět stav senzorů
  • je možné provést OTA update pomocí nahrání binárního firmware přes prohlížeč
  • je možné vidět log

Webové rozhraní zapneme přidáním následujího do konfigurace

web_server:
  port: 80

Obecně se na ESP8266 příliš nedoporučuje toto rozhraní zapínat, jelikož je poměrně náročné, nicméně zrovna Wemos D1 mini je poměrně dobře vybaven, takže jsem žádný problém nezaznamenal.

Aktualizace ESPHome

V případě, že vyšla nová verze ESPHome a používáte Python virtuální prostředí pak aktualizaci uděláme pomocí:

pip install esphome --upgrade

Nezapomeňte, že musíte mít virtuální prostředí aktivované pomocí souboru bin/activate.

V dashboardu byste pak měli vidět dostupné aktualizace pro všechny zařízení z daného projektu.

Není potřeba cokoliv měnit v konfigurace, pouze klikneme na upload a zanedlouho po kompilaci a nahrání bychom měli vidět novou verzi:

[11:46:41][I][application:097]: You're running esphomelib v1.10.1 compiled on Jan 20 2019, 11:45:03

Kdy použít ESPHome

Díky zaměření na ESP32 a ESP8266 se nabízí otázka zda použít ESPHome namísto Tasmota. S ESPHome mám zatím omezené zkušenosti ale zkusme si je už nyní trochu porovnat:

VlastnostTasmotaESPHome
Webové rozhraní na zařízeníAno, spousta možností nastaveníAno, ale velmi omezené možnosti
Možnost změny konfiguracePřes webové rozhraníÚpravou konfigurace a OTA updatem
WifiManagerAnoNe
OTA aktualizaceAno (ze zařízení)Ano (nutné dělat z PC)
Sonoff produktyAnoAno (složitější konfigurace)
Rozšiřující komponenty (sensory atp.)Ano, omezeněAno, mnoho možností a detailní konfigurace
Integrace HomeAssistentAno, prostřednictvím MQTT. Ruční konfiguraceAno, přímá integrace na pár kliknutí

Zatím mi z toho vychází, že pro Sonoff produkty je stále mnohem vhodnější Sonoff-Tasmota.

Pokud však chcete použít nějakou DIY desku s připojenými sensory či displejem pak ESPHome nabízí možnost jak to udělat stále relativně jednoduše.

Dejte vědět do komentářů jaké jsou vaše zkušenosti 🙂

6 comments

Tato stránka používá Akismet k omezení spamu. Podívejte se, jak vaše data z komentářů zpracováváme..

  • Dobrý den,
    mohl bych Vás poprosit, zda byste mohl zkusit znovu nahrát program s BME280. Bohužel jsem již vyzkoušel 7 různých čidel BME280 a to i na obou adresát (0x76 i 0x77), ale s žádnou se mi nedaří aby ESPHOME fungovalo. Vyzkoušeno na ESP8266, tak i na ESP32. Na I2C sběrnici nahlásí, že bylo zařízení nalezeno, ale pak to vyhodí „The error message is: Communication with BME280 failed!“ Proto jestli Vás můžu poprosit, tak jestli byste ve volné chvíli mohl znovu zkusit, zda Vám to v poslední verzi ESPHome bude fungovat? Předem moc děkuji. Chci postavit více čidel, ale bohužel se nedaří. Třeba s BH1750 to funguje.

    • Zkuste zadat do IO 4 a 5 místo těch autorových.

  • Chápu to prosím správně, že Tasmota je primárně určena pro Arduino, kdežto ESPHome je Python a není možné je v Arduibo IDE upravovat?
    ESPHome by mě lákalo, protože není potřeba MQTT, ale na druhou stranu bych u ESP8266 raději pracoval a rozšiřoval program o vlastní kód v Arduino IDE pokud je to možné.

    • Z mého pohledu to nyní vidím spíše naopak, tj. ESPHome je poměrně více otevřené k vlastním komponentám, ale přiznám se rovnou, že zkušenost s psaním vlastního kódu nemám. V Tasmotě se hlavní konfigurace dělá pomocí webového rozhraní – což je poměrně příjemnější, kdežto ESPHome je definované pomocí YAML (odkud ta příbuznost k Pythonu). Nicméně do ESPHome je možné přidávat vlastní komponenty zřejmě jednodušeji a psané v C++. Tasmotu jsem dříve i kompiloval v Arduino IDE, ale to už dnes poměrně postrádá smysl. ESPHome je naproti tomu potřeba kompilovat vždy. Jestli tedy do toho chcete jít více do hloubky asi bych doporučoval kouknout se na ESPHome kde navíc jak sám píšete je výhoda funkčnosti bez MQTT.

  • Vyzkoušel jsem ESPHome, ale neuspěl jsem.
    První zádrhel byla nutnost přidat do Windows PATH cestu k c:\Python27\Scripts
    Když se vše podařilo, tak nakone nevidím v ESPHome Dashboard zařízení jako online a nejde upload programu. Z Arduina do něj ale bez problémů nahraji svůj program. Jako zařízení na seriovém portu ESP8266 (WeMos D1) v dashboardu vidím a tlačítka reset i flash jsem zkoušel při připojení také držet. Pořád ale zobrazuje zařízení jako offline.Pro mě jako obyčejného Arduíňáka je Python a ESPHome více než složitá cesta 🙁

    • Nevím jestli to může být nějaké ulehčení, ale pokud používáte HomeAssistant s kterým mám většinou článků tady spojených tak je možné ESPHome Dashboard tam doinstalovat jako Addon. Pokud to pak máte všechno například na Raspberry pak stačí připojit např. Wemos D1 přes USB, nastavit konfiguraci a dát upload. Ale nevím jestli vám tohle pomohlo a chápu, že je to o dost jiné než klasické použití Arduina a kompilování přímo z něj.

Odebírejte blog emailem

Mějte ihned informaci o novém článku ze světa technologií.