1.7 ESPHome zariadenia v Home Assistant
ESPHome
Veľmi zaujímavým open-source projektom, ktorý spolupracuje aj so systémom Home Assistant, je ESPHome. Názov napovedá, že sa týka obľúbených mikrokontrolérov ESP32 a umožňuje z nich vytvoriť inteligentné zariadenia pre domácnosť. V súčasnosti ide o veľmi rozvinutý systém, ktorý spolupracuje aj s inými mikrokontrolérmi.
Nie je potrebné žiadne zložité programovanie, postačia nám definície v prehľadnom textovom formáte YAML – tie nám v aktuálnych verziách dokonca dokáže generovať samotný systém ESPHome formou sprievodcu. Z týchto definícií nám systém vytvorí firmvér pre cieľový hardvér, nahrá ho do zariadenia a navyše ho umožní kedykoľvek aktualizovať aj po sieti.
ESPHome je možné integrovať do Home Assistant OS, no v princípe je nezávislý. Server ESPHome nie je nutný na prevádzku zariadení, ale len pre ich vytváranie a aktualizovanie.
Základná konfigurácia zariadenia
Celá konfigurácia je definovaná opisne v jazyku YAML. V každom projekte je potrebné definovať hardvér, s ktorým pracujeme, ale aj spôsob, ako sa s ním spojíme. Pokiaľ v ESPHome využijeme sprievodcu a nájdeme v jeho katalógu presne to zariadenie, ktoré máme v rukách, konfigurácia bude jednoduchšia – základné parametre už budeme mať zadefinované.
Opis zariadenia
Prvou konfiguračnou položkou je esphome. Tu môžeme naše zariadenie pomenovať a prípadne aj uviesť, v ktorej miestnosti sa nachádza. Obvykle definujeme vlastnosti:
name: povinný „technický“ názov zariadenia, použije sa aj ako sieťový názov, mal by byť malými písmenami bez medzier, napríklad „esp32-c3-zero-ust-a2“;friendly_name: plný názov, pod ktorým sa zariadenie predstaví aj v systéme Home Assistant;area: názov oblasti (miestnosti), v ktorej sa zariadenie nachádza – aj táto informácia sa prenesie do systému Home Assistant.
Ukážka konfigurácie:
esphome:
name: esp32-c3-vzor
friendly_name: ESP32-C3 - Vzor
area: Demo
Definícia hardvéru
Hardvérom je v našom prípade zariadenie s mikrokontrolérom (MCU) – či už v podobe vývojovej dosky alebo komplexnejšieho zariadenia v kompaktnej krabičke s perifériami. V našom kurze pracujeme so zariadeniami, ktoré obsahujú mikrokontrolér ESP32, preto budeme konfigurovať položku esp32 a v nej typicky tieto vlastnosti:
variant: povinný konkrétny variant mikrokontroléra ESP32, či už klasický„esp32“ alebo novšie varianty ako „esp32s3“, „esp32c6“ a podobne;flash_size: udáva veľkosť flash pamäte (ak neuvedieme, predvolenou hodnotou je „4MB“) – ak nemáme istotu, radšej neuvádzajme žiadnu hodnotu (nevyužijeme celé úložisko, ale len 4 MiB), lebo ak uvedieme viac, ako máme, zariadenie nenaštartuje.
Pre nás bude typickou konfiguráciou:
esp32:
variant: esp32
Ešte nedávno sa namiesto vlastnosti variant definovala vlastnosť board, pri ktorej sa uvádzal identifikátor konkrétneho zariadenia / vývojovej dosky (napríklad „lilygo-t-display“). V aktuálnych verziách sa však už tento prístup neodporúča. Taktiež už nemá význam definovať vlastnosť framework, dnes už používame výhradne „esp-idf“.
V prípade, že náš model ESP32 má aj prídavnú operačnú pamäť (PSRAM) a chceme ju využiť, je potrebné to uviesť v samostatnej konfiguračnej položke psram. Konkrétne informácie musíme hľadať u výrobcu / predajcu, definujeme tieto vlastnosti:
mode: pre ESP32-S3 je nutné uviesť konkrétny režim (napr. „octal“), pre ostatné varianty obvykle vyhovuje predvolený (napr. „quad“ pre ESP32);speed: ak nevieme a neuvedieme, použije sa najnižšia podporovaná rýchlosť komunikácie (čo je lepšie ako keby sme rýchlosť prehnali a zariadenie ani nenaštartuje alebo sa bude zasekávať).
Aplikačné rozhranie (API) a logovanie
Mikrokontrolér s ESPHome je vo svojej podstate server – poskytuje totiž rôzne služby (informácie o teplote, ovládanie LED a podobne). Znie to trochu paradoxne, ale klientom v tomto zmysle bude náš server Home Assistant. Klient sa pripojí na aplikačné rozhranie (API) mikrokontroléra a môže s ním komunikovať – získavať od neho informácie o stave senzorov, posielať pokyny na ovládanie pripojených zariadení a podobne. Aplikačné rozhranie je pre nás nevyhnutnosť, ktorú zapneme konfiguračnou položkou api.
Z hľadiska firewallu je potrebné vedieť, že ESPHome API je dostupné na porte TCP/6053 – je ho však možné zmeniť.
Samozrejme, poskytované služby nemajú byť dostupné voľne pre kohokoľvek, preto využijeme šifrovanie – šifrovací kľúč musí poznať server i klient. Pri vytváraní konfigurácie v ESPHome sa kľúč vygeneruje automaticky – môžeme ho ponechať, ale musíme ho nahrať aj klientovi (pri pripájaní ESPHome zariadenia). Prípadne môžeme pre všetky zariadenia projektu používať rovnaký kľúč, no nemali by sme používať rovnaký kľúč aj pre rôzne projekty.
Aplikačné rozhranie vieme využiť aj pre sledovanie protokolu (logu) nášho zariadenia cez ESPHome, no túto funkciu musíme zapnúť samostatnou položkou logger, ktorá nepotrebuje žiadne parametre. Server ESPHome sa na vyžiadanie pripojí cez API a bude nám zobrazovať všetky debugovacie informácie – predvolenou úrovňou protokolu je totiž DEBUG.
Konfigurácia API so zapnutým logovaním teda môže vyzerať napríklad takto:
api:
encryption:
key: "mRwcAG8K8glUytBgygJBBbMUYZ7Nr3+0rX4GniojdWI="
logger:
Bezdrôtová aktualizácia (OTA)
Na ESPHome zariadenie je možné nahrať novú verziu softvéru aj vzdialene, typicky prostredníctvom Wi-Fi siete. Pokiaľ túto službu zapneme, na zariadení bude dostupná ďalšia služba, nazvaná OTA (Over-The-Air) – zapneme ju konfiguračnou položkou ota. K tejto službe sa však nepripája Home Assistant server, ale priamo ESPHome server. Je možné využiť rôzne protokoly, no najefektívnejší je natívny protokol (platform: esphome).
Z hľadiska firewallu je potrebné vedieť, že služba ESPHome OTA je v prípade ESP32 dostupná na porte TCP/3232 – je ho však možné zmeniť.
Každý iste chápe, že ak by sme túto službu nechali bez zabezpečenia, ktokoľvek by si mohol nahrať na náš mikrokontrolér akýkoľvek program, preto opäť využijeme šifrovanie – zapneme ho prázdnou vlastnosťou encryption.
V staršom type konfigurácie (do augusta 2026) sa používalo zabezpečenie cez konfiguračnú položku password s ľubovoľným textovým heslom. Toto riešenie sa však už neodporúča, na nové zariadenia by sme mali použiť klasický šifrovací kľúč cez položku encryption – zabezpečí aj šifrovaný prenos softvéru. Šifrovací kľúč však neuvádzame, použije sa kľúč z API.
OTA so šifrovaním teda zapneme takto:
ota:
- platform: esphome
encryption:
Wi-Fi pripojenie
Na našom zariadení sme sprístupnili server API a server OTA, no ako by sme sa k nim dostali bez nejakej siete? V kontexte internetu vecí je pripojenie do siete nevyhnutnosťou, preto sa pripojíme k Wi-Fi.
Definícia zdieľaných tajomstiev
Zrejme budeme mať viaceré ESPHome zariadenia, ktoré sa budú pripájať do tej istej Wi-Fi siete. Nemá zmysel pri každom zariadení zvlášť definovať názov Wi-Fi (SSID) i prístupové heslo – môžeme ich zadefinovať cez hlavnú ponuku ESPHome (tri bodky vpravo hore) a položku Change Wi-Fi credentials.
Zadané údaje o Wi-Fi sieti sa uložia do zoznamu zdieľaných „tajomstiev“ – položku Secrets v tej istej hlavnej ponuke. Tu môžeme definovať aj akékoľvek iné hodnoty, na ktoré sa budeme odvolávať v konfiguráciách zariadení. Všimnime si, že údaje o Wi-Fi majú názov wifi_ssid a wifi_password.
Z bezpečnostného hľadiska je vhodné, aby IoT zariadenia mali samostatnú sieť, ktorá je obmedzená firewallom v oboch smeroch len na nutné spojenia. A z technického hľadiska je potrebné, aby bola Wi-Fi vysielaná aj na 2,4 GHz, pretože zatiaľ väčšina zariadení IoT nepodporuje frekvencie 5 a 6 GHz.
Konfigurácia Wi-Fi klienta
Rozhranie Wi-Fi definujeme v konfiguračnej položke wifi, obvykle nastavujeme tieto parametre:
ssid: názov Wi-Fi siete, obvykle neuvádzame priamo, ale odvoláme sa na uložené tajomstvo „!secret wifi_ssid“;password: podobne, odvoláme sa na uložené heslo „!secret wifi_password“;power_save_mode: môžeme povoliť vyššiu úsporu energie zapnutím režimu úspory HIGH;passive_scan: môžeme zapnúť, pokiaľ na Wi-Fi AP nepoužívame skrývanie SSID – naše zariadenie nebude zbytočne „kričať do okolia“ názov hľadanej siete (pozri kurz Počítačové siete);use_address: tu neurčujeme IP adresu, ktorú si má zariadenie nastaviť, ale uvádzame adresu, ktorú zariadenie dostane z DHCP servera, aby sa naň (OTA, či protokoly cez API) mohol pripojiť server ESPHome.
Pokiaľ je server ESPHome v tej istej sieti ako zariadenie, nie je nutné definovať use_address – zariadenie nájde podľa jeho sieťového názvu (esphome.name) prostredníctvom mDNS.
Pokiaľ pre konfiguráciu Wi-Fi využijeme sprievodcu ESPHome, ten zapne ešte vlastnosť ap a samostatnú položku captive_portal. Obe slúžia na núdzové pripojenie k zariadeniu v prípade, že nebude dostupná Wi-Fi sieť – spustí sa AP. Z bezpečnostného hľadiska je vhodné oboje odstrániť.
Konfigurácia Wi-Fi klienta teda môže byť napríklad takáto:
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
power_save_mode: HIGH
passive_scan: true
#use_address: 10.110.16.??? # na vzdialené preprogramovanie OTA a log cez API
Je možné definovať viaceré Wi-Fi siete?
Áno, dvojicu parametrov
ssidapasswordnebudeme definovať priamo v položkewifi, ale zadefinujeme v nej parameternetworksa do neho zapíšeme zoznam týchto dvojíc.wifi: networks: - ssid: !secret wifi_ssid password: !secret wifi_password - ssid: !secret wifi_ssid2 password: !secret wifi_password2Ktorú sieť potom zariadenie zvolí na pripojenie?
Tú s najsilnejším signálom.
Diagnostické informácie
Samotný mikrokontrolér ESP32, aj pokiaľ by nemal žiadne pripojené senzory a tlačidlá, nás môže informovať o rôznych zaujímavých diagnostických parametroch – prezradí nám MAC adresu svojho Wi-Fi AP a úroveň jeho signálu, svoju IP adresu, ako dlho už beží a podobne.
Základné informácie o Wi-Fi získame cez konfiguračnú položku takzvaného „textového senzora“ text_sensor, ktorej nastavíme parameter platform: wifi_info. Môžeme potom využiť parametre ako ssid, bssid, ip_address, dns_address, power_save_mode. Užitočný je aj ďalší senzor, informujúci o dobe prevádzky – nastavíme parameter platform: uptime:
text_sensor:
- platform: wifi_info
ssid:
name: Wi-Fi SSID
bssid:
name: Wi-Fi AP (BSSID)
dns_address:
name: DNS server
ip_address:
name: IP adresa
power_save_mode:
name: Wi-Fi úspora energie
- platform: uptime
name: Čas prevádzky
format:
separator: " "
Pokiaľ chceme vidieť aj úroveň signálu Wi-Fi, musíme využiť samostatnú položku „bežného senzora“ sensor s parametrom platform: wifi_signal, ktorému ešte môžeme upresniť interval aktualizácie:
sensor:
- platform: wifi_signal
name: WiFi signál
update_interval: 15s
Hardvérové komponenty
Tlačidlo
…
binary_sensor:
- platform: gpio
name: "Tlačidlo"
pin:
number: 9
ignore_strapping_warning: true
mode:
input: true
pullup: true
inverted: true
Obyčajná LED
…
NeoPixel LED
…
Bluetooth proxy
…
Kompilácia a nahratie firmvéru
…