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?
- nepájivé pole (breadboard) – cca. $1 AliExpress
- vodiče samec-samec – 4 žíly – cca. $0,7 AliExpress
- desku Wemos D1 mini s čipem ESP8266 – cca. $2.25 AliExpress
- sensor BME280 – měření teploty, vlhkosti a tlaku – cca. $2.18 AliExpress
- nebo sensor SHT31 – měření teploty a vlhkosti – cca. $3.7 AliExpress
- displej SSD1306 I2C – Oled displej s rozlišením 128×64 – cca $2.12 AliExpress
- jakýkoliv USB kabel s USB nabíječkou (např. i mobilní nabíječku)
Zapojení
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.
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:
- název (name) – zvolte cokoliv co neobsahuje mezery a bude potřeba zachovat jedinečnost v rámci všech zařízeních.
- 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.
- 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.
- hotovo – konfigurace se uloží do souboru název.yaml
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 kompo nent
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.
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.
Stačí pak kliknout na konfigurovat a víceméně potvrdit pomocí Submit.
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é.
Bez změn v konfiguračním souboru nám pak všechny sensory přibydou na Dashboardu nahoře.
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:
Vlastnost | Tasmota | ESPHome |
Webové rozhraní na zařízení | Ano, spousta možností nastavení | Ano, ale velmi omezené možnosti |
Možnost změny konfigurace | Přes webové rozhraní | Úpravou konfigurace a OTA updatem |
WifiManager | Ano | Ne |
OTA aktualizace | Ano (ze zařízení) | Ano (nutné dělat z PC) |
Sonoff produkty | Ano | Ano (složitější konfigurace) |
Rozšiřující komponenty (sensory atp.) | Ano, omezeně | Ano, mnoho možností a detailní konfigurace |
Integrace HomeAssistent | Ano, prostřednictvím MQTT. Ruční konfigurace | Ano, 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 🙂
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.