V minulém díle jsme společně prošli procesem instalace a prvního nahrání. Pokud jste postupovali správně, leží teď před vámi deska ESP32, která už úspěšně "žije". Je připojená k vaší Wi-Fi a v Home Assistantovi svítí zeleně jako Online.
Zatím je to ale jen chytré těžítko. Deska sice komunikuje se serverem, ale Home Assistantovi nenabízí žádné entity. Nemá žádné senzory, které by posílaly data, ani vypínače, které byste mohli ovládat.
Dnes na naši předchozí práci navážeme a vrhneme se na absolutní základy automatizace. Abychom pochopili, jak ESPHome funguje, naučíme desku ovládat světlo (výstup) a zároveň reagovat na stisk fyzického tlačítka (vstup).
Anatomie konfiguračního souboru
Otevřete si v Home Assistantovi záložku ESPHome a u svého zařízení klikněte na tlačítko EDIT. To, co vidíte, je konfigurační soubor ve formátu YAML.
Jeho horní část, kterou vygeneroval ESPHome, když jste zařízení přidali, vypadá asi takto:
esphome:
name: test-esp
friendly_name: test-esp
esp32:
board: esp32dev
framework:
type: arduino # <--- DŮLEŽITÉ! Zkontrolujte, že zde máte arduino
# ... následují sekce pro logger, api, ota, wifi ...
Zkontrolujte, zda máte v sekci framework nastaveno type: arduino. Tento řádek totiž vybírá konkrétní sadu vývojářských nástrojů (tzv. toolchain), kterou si ESPHome na pozadí stáhne a použije ke kompilaci vašeho kódu.
Některé novější verze ESPHome se snaží automaticky nastavit esp-idf. To je sice profesionální nástroj, ale jeho kompilace je poměrně náročná na paměť RAM a výkon procesoru. Pokud váš Home Assistant neběží na výkonném Mini PC, kompilace esp-idf téměř jistě selže. Verze arduino je pro domácí použití výrazně rychlejší, úspornější a spolehlivější.
Co znamenají ostatní řádky?
- esphome – Základní nastavení, jméno zařízení.
- esp32 – Říká kompilátoru, pro jaký čip má kód připravit. V této sekci lze nastavit i konkrétní desku.
- wifi a ap – Nastavení sítě (které se odkazuje do secrets.yaml).
- logger – Umožňuje desce posílat textové výpisy (logy) zpět do počítače (klíčové pro hledání chyb).
- api – Pro naše využití to nejdůležitější. Zapíná rozhraní, přes které si deska povídá s Home Assistantem.
Do této horní sekce zatím nezasahujte (kromě případné opravy frameworku). Pokud totiž smažete nebo přepíšete některé důležité nastavení, může se stát, že deska se již nepřipojí k síti nebo nepřijme nový kód přes OTA. Potom byste ji museli znova připojovat přes USB. Náš kód budeme přidávat až na konec souboru.
Ovládáme výstup: LED dioda
Většina vývojových desek ESP32 má integrovanou modrou LED diodu připojenou na pin GPIO 2. Pokud vaše deska takovou LED nemá, můžete samozřejmě přepsat číslo pinu, nebo připojit svou LEDku na nepájivém poli.
V ESPHome existuje komponenta switch (spínač), kterou použijeme, abychom řekli: "Vytvoř vypínač, který ovládá napětí na pinu 2."
Zkopírujte následující kód a vložte ho na úplný konec vašeho konfiguračního souboru:
switch:
- platform: gpio
pin: 2
name: "LED dioda"
id: led_dioda
Co jsme právě napsali?
- switch – Definujeme rodinu komponent (spínače).
- platform: gpio – Říkáme, že tento spínač bude ovládat fyzický pin na čipu (General Purpose Input/Output).
- pin: 2 - Číslo pinu, na kterém je připojená LED.
- name - Pod tímto názvem se vypínač objeví v Home Assistantovi.
- id - Interní název pouze pro potřeby ESPHome (využijeme později pro automatizace přímo v čipu).
Čteme vstup
Teď přidáme tlačítko. Protože tlačítko zná jen dva stavy (stisknuto / nestisknuto), v terminologii ESPHome jde o binary_sensor.
Zde si ukážeme jednu velmi důležitou techniku – nastavení režimu pinu. Aby tlačítko fungovalo spolehlivě a "nešumělo", potřebuje tzv. Pull-up rezistor. Ten zajišťuje, že když tlačítko není stisknuté, je na pinu stabilní napětí (3.3V). ESP32 má tyto rezistory zabudované přímo v čipu a my je můžeme zapnout kódem.
Přidejte tento kód pod sekci switch:
binary_sensor:
- platform: gpio
pin:
number: 0
mode: INPUT_PULLUP
name: "Tlačítko"
filters:
- invert:
Co jsme to právě nastavili? Všimněte si, že definice pinu se nám trochu rozrostla. Číslo 0 volíme proto, že na tomto pinu má většina vývojových desek připojené tlačítko BOOT. Klíčový je ale řádek mode: INPUT_PULLUP. Tím aktivujeme vnitřní rezistor přímo v čipu, který drží napětí "nahoře", když se tlačítka nikdo nedotýká. U systémového tlačítka to sice není nezbytně nutné (často má rezistor na desce), ale je dobrým zvykem to psát. Až si totiž budete připojovat vlastní tlačítka jen pomocí dvou drátků, bez tohoto nastavení by vám náhodně spínala sama od sebe (chytala by rušení z okolí).
Poslední důležitý detail je sekce filters. Tlačítko BOOT je totiž zapojené tzv. "proti zemi". To znamená, že při stisku se pin spojí s GND a napětí spadne na nulu. Čip by tedy hlásil "vypnuto". My ale v Home Assistantovi chceme, aby stisk logicky znamenal "zapnuto". Proto signál proženeme filtrem invert, který logiku otočí – co je pro čip nula (stisk), bude pro Home Assistant jednička.
Nahrání a testování
V editoru máme vše připraveno – definovali jsme světlo i tlačítko. Tento „recept“ teď musíme přeložit do jazyka srozumitelného pro čip a poslat ho do zařízení.
- Vpravo nahoře klikněte na SAVE.
- Klikněte na INSTALL.
- Vyberte Wirelessly (Bezdrátově).
ESPHome nyní zkompiluje nový firmware. Všimněte si, že to bude mnohem rychlejší než při prvním nahrávání, protože systém už přepočítává jen naše malé změny, ne celé jádro. Jakmile se soubor nahraje, deska se restartuje a automaticky vám otevře okno s logy (živým výpisem dění).
Testujeme v logu: Nyní sledujte běžící text v okně. Zkuste na své desce stisknout tlačítko BOOT. Pokud jsme vše nastavili správně, měli byste v logu vidět okamžitou reakci.
To je důkaz, že deska žije, správně čte stav tlačítka a posílá tuto informaci do systému!
Ovládání z Home Assistanta
Zavřete okno s logy a editor ESPHome. Jděte se podívat do "uživatelské části" Home Assistanta.
- Jděte do Nastavení -> Zařízení a služby.
- Najděte integraci ESPHome a své zařízení.
- Rozklikněte vaše zařízení.
Měli byste vidět sekci Ovládání s přepínačem "LED dioda" a sekci Senzory s "Tlačítko".
- Zkuste v Home Assistantovi přepnout přepínač LED. Modrá dioda na vašem stole by se měla rozsvítit.
- Zkuste podržet tlačítko na desce. Ikona senzoru v Home Assistantovi by se měla změnit.
Automatizace na čipu
Teď, když máme v Home Assistantovi viditelné tlačítko i světlo, se přímo nabízí propojit je tam. Tedy vytvořit běžnou automatizaci ve stylu: "Když se stiskne tlačítko, přepni světlo."
To je sice možné řešení, ale zbytečně tím vytváříte závislost na funkční síti. Signál by musel putovat z desky přes Wi-Fi do routeru, odtud do Home Assistanta, tam se zpracovat a poslat stejnou cestou zpátky. To přináší zbytečné zpoždění a hlavně riziko, že když vypadne Wi-Fi nebo se restartuje server, nerozsvítíte si ani lampičku.
ESPHome naštěstí umožňuje definovat logiku přímo v zařízení (tzv. On-Device Automation). V tu chvíli se vaše deska chová přesně jako klasické Arduino. Program běží lokálně přímo v procesoru, je bleskurychlý a naprosto nezávislý na okolním světě. Čipu prostě řekneme: "Když zjistíš stisk tlačítka, okamžitě přepni LEDku. Neptej se serveru, prostě to udělej."
Upravte v konfiguraci sekci binary_sensor následujícím způsobem:
binary_sensor:
- platform: gpio
pin:
number: 0
mode: INPUT_PULLUP
name: "Tlačítko"
filters:
- invert:
on_press:
then:
- switch.toggle: led_dioda
Všimněte si nové sekce on_press. Tím jsme přímo do senzoru vložili jednoduchý "program", který říká: "Jakmile zaznamenáš stisk, okamžitě proveď akci switch.toggle nad komponentou s ID led_dioda." Když nyní kód nahrajete, získáte zařízení, které reaguje okamžitě a spolehlivě i ve chvíli, kdy vám "spadne" celá domácí síť. Home Assistant se o změně stavu světla sice dozví, ale jen jako pasivní pozorovatel, nikoliv jako řídící prvek.
--------------------------tady video-----------------------
Práce s dokumentací
Možná si teď říkáte: "Jak autor věděl, že má napsat zrovna on_press nebo switch.toggle? To se musím naučit nazpaměť?" Vůbec ne. Psaní YAML konfigurace je jako skládání LEGA podle katalogu. Tím katalogem je oficiální databáze komponent ESPHome.
Berte tuto stránku jako obrovský e-shop s díly, kde si jen vybíráte, co zrovna potřebujete. Když si tam najdete například náš GPIO Switch, uvidíte tabulku všech parametrů, které můžete použít. Stejně tak tam najdete stovky senzorů, které znáte ze světa Arduina. Chcete měřit kvalitu vzduchu? Hledejte "CO2". Potřebujete změřit vzdálenost zaparkovaného auta? Najdete tam podporu pro ultrazvukové i laserové senzory. Vaším úkolem pak není vymýšlet složitý kód v C++, ale jen najít správnou "kostičku" v dokumentaci, zkopírovat její ukázkový YAML kód a upravit si čísla pinů.
Editor YAML v ESPHome dokonce dokáže dohledávat dokumentaci přesně podle vašeho kódu. Abyste zobrazili nápovědu, stačí najet kurzorem na prvek, který chcete vysvětlit. Editor vám dá krátký popisek a odkaz do dokumentace.
Co nás čeká příště?
Dnes jsme si vyzkoušeli "Hello World" světa elektroniky a dokonce jsme naprogramovali autonomní chování čipu. V příštím díle už to začne být vážné. Vezmeme nepájivé pole, drátky a připojíme skutečný externí senzor (teploměr/vlhkoměr), který nám bude posílat užitečná data z místnosti.