Tasmota a protokol MQTT: implementácia vo firmvéri

25. 5. 2021
Doba čtení: 15 minut

Sdílet

 Autor: Ľubomír Patek
V minulom dieli sme sa oboznámili s protokolom MQTT všeobecne, dnes si povieme niečo o tom, ako je protokol MQTT implementovaný vo firmvéri Tasmota a vyskúšame si komunikáciu pomocou brokera a klientov Mosquitto.

Najprv sa pozrieme na to, ako firmvér skladá témy z jednotlivých častí, v ktorých témach publikuje a do ktorých sa prihlasuje na odber, povieme si niečo o nastaveniach firmvéru súvisiacich s protokolom MQTT a vyskúšame si komunikáciu s firmvérom Tasmota pomocou MQTT klientov Mosquitto.

Aj keď sú predvolené nastavenia firmvéru zvolené tak, aby bolo možné používať zariadenie hneď po jeho nahratí, na lepšie pochopenie komunikácie a jej neskoršiu diagnostiku bude užitočné pozrieť sa na spôsob tvorby tém podrobnejšie.

Názvy tém v Tasmota

V minulej časti sme si povedali, že názov témy (Topic Name) je textový reťazec, ktorý môže byť rozdelený separátormi na niekoľko úrovní.Tasmota pri prihlasovaní sa na odber a publikovaní používa niekoľko rôznych názvov tém, pričom každý z nich vytvára z viacerých častí.

Terminológia

Keďže dokumentácia Tasmota nie je v názvosloví úplne dôsledná, dovolím si niekoľko poznámok k niektorým termínom a ich prekladom.

Pokiaľ bude reč o celom reťazci označujúcom tému, budem okrem už spomenutého označenia názov témy (Topic Name) používať aj stručnejšie označenie téma.

Tasmota používa na označenie časti témy, ktorá slúži na identifikovanie zariadenia v sieti, označenie topic (téma). Keďže je to názov príliš všeobecný a často používaný (aj mnou) na označenie úplného názvu témy, v článku budem namiesto neho používať termín názov témy zariadenia, ktorý presnejšie vystihuje jeho účel. Stručnejší preklad „názov zariadenia“ som nemohol použiť kvôli inému názvu „Device Name“.

Poznámka: K zrozumiteľnosti neprispieva ani skutočnosť, že označenie topic je v dokumentácii použité aj na označenie tokenu %topic% – ktorý môže byť nahradený názvom témy zariadenia (topic), ale ako sa dozvieme o chvíľu, aj inými reťazcami.

Termín Full Topic Tasmota používa (nie celkom logicky) na označenie neúplného názvu témy. Na označenie celého názvu už máme v článku (a špecifikácii) definovaný termín názov témy, resp. téma. V prípade, že o ňom bude reč, použijem anglický názov s upozornením, že nejde o úplný názov v zmysle špecifikácie.

Tokeny prefix a topic

Časť názvu témy, ktorú Tasmota nazýva Full Topic, je zložená z prefixu (token %prefix%), názvu témy zariadenia (token %topic%) a voliteľne z ďalších tokenov alebo reťazcov. V predvolenom nastavení je to kombinácia %prefix%/%topic%/.

Pri nahrádzaní tokenov sa firmvér riadi kontextom. Token %prefix% nahradí v prípade publikovania správ o stave reťazcom stat, v prípade pravidelného publikovania telemetrických údajov reťazcom tele a pri prihlasovaní sa na odber (napr. pri štarte) reťazcom cmnd.

Namiesto tokenu %topic% dosadí Tasmota pri publikovaní názov témy zariadenia (dá sa zmeniť príkazom Topic), ktorý je v predvolenom nastavení zložený z reťazca „tasmota_“ a posledných šiestich znakov MAC adresy zariadenia.

Token %topic% sa použije aj pri tvorbe skupinovej a záložnej témy, na odber ktorých sa Tasmota prihlási pri štarte zariadenia.

V prípade skupinovej témy (Group Topic) bude v predvolenom nastavení nahradený reťazcom tasmotas a v prípade záložnej témy (Fallback Topic) reťazcom DVES_XXXXXX_fb ktorý je jedinečný (za znaky X bude dosadených posledných šesť znakov MAC) a nemeniteľný. Záložnú tému môže použiť nadriadený systém (napr. Home Assistant) v prípade, ak by zistil dve zariadenia s rovnakým názvom témy.

Názvy skupinovej a záložnej témy publikuje Tasmota pri štarte v MQTT správe tele/názov_témy_zariadenia/INFO1 a sú dostupné aj vo webovom rozhraní (tlačítko Information). Názov skupinovej témy zistíte aj príkazom GroupTopic, alebo príkazom Status 1.

Ďalšie tokeny a úrovne témy

Poradie tokenov %prefix% a %topic% je možné navzájom prehodiť, doplniť ich o ďalšie tokeny %hostname% a %id% a tiež o vlastné úrovne ich vložením kamkoľvek pred, za, alebo medzi tokeny %prefix% a %topic% podľa nasledujúcich príkladov:

tasmota/%topic%/%prefix%/
tasmota/kuchyňa/%topic%/%prefix%/
%prefix%/doma/kúpeľňa/%topic%/

Poslúži vám na to webové rozhranie, alebo príkaz FullTopic.

Pravdepodobne ste si už všimli zdanlivo nadbytočný znak lomka ( /) na konci tej časti názvu témy, ktorú Tasmota nazýva Full Topic. V skutočnosti nejde o nadbytočný znak názvu témy, pretože firmvér zaň dosadí ešte jednu úroveň (už vieme, že full v tomto prípade nie je celkom úplne full). Pri publikovaní správ je to reťazec upresňujúci za ním nasledujúce prenášané dáta („RESULT“, „POWER“, „STATE“ a pod.) a pri „počúvaní“ príkazov tu očakáva samotný príkaz – až s touto časťou je názov témy úplný. Parametre príkazu už do názvu témy nepatria, tie sú už považované za prenášané dáta.

Poznámka: V opise špecifikácie som spomínal, že v názve témy sa rozlišujú malé a veľké písmená. Dodržiava to aj Tasmota, ale časť firmvéru, ktorá spracúva príkazy, ich dokáže spracovať bez ohľadu na veľkosť písmen.Treba si však dávať pozor, ak chcete odfiltrovať konkrétny príkaz v téme príkazov – prihlásenia na odber už spracúva broker a tomu na veľkosti záleží. Preto je istejšie vždy zadávať príkazy v takom tvare, v akom sú uvedené v dokumentácii (CamelCase), inak budete musieť filtrovať viac ako je potrebné ( cmnd/# namiesto cmnd/+/Power).

Ďalšie zaujímavé témy

Ďalšou zaujímavou funkcionalitou je možnosť publikovania správ na základe stlačenia tlačidla (resp. zmene úrovne na vstupe), ale opis všetkého čo s tým súvisí by rozsahom presiahol jeden diel seriálu. Na tomto mieste len spomeniem názvy tém Button Topic, do ktorej Tasmota publikuje správu pri stlačení tlačidla (aj viacnásobnom) a Switch Topic, obe však vyžadujú zmeny predvoleného nastavenia, z čoho vyplývajú aj zmeny správania sa firmvéru. Tlačítkam a spínačom venuje dokumentácia samostatnú časť.

Inštalácia brokera Mosquitto

Balíčky MQTT servera Mosquitto od nadácie Eclipse existujú asi pre všetky bežné distribúcie, vrátane tých pre Raspberry Pi.Distribúcie často obsahujú samostatný balíček so serverom a samostatný s klientami (napr. mosquitto a mosquitto-clients v Debiane).

Ak si nechcete server inštalovať, môžete použiť verejný server https://test.mosquitto.org/. V takom prípade stačí ak si lokálne nainštalujete len klientov Mosquitto, ale môžete použiť aj iného klienta – napr. MQTT.fx (napísaný v Jave), alebo aplikáciu MQTT Lens (Google Chrome), oba s grafickým rozhraním.

V prípade, ak používate Home Assistant, server spolu s klientami nainštalujete pomocou prídavného modulu Mosquitto broker. Po jeho inštalácii pribudne v grafickom rozhraní možnosť komunikovať s MQTT brokerom.K rozhraniu brokera sa dostanete rovnakou cestou, ako k jeho konfigurácii (cez položky menu Configuration – Integrations sa dostanete ku kartičke s názvom integrácie MQTT a tam vyberte položku Configure).

Inštalácia neobsahuje žiadne nástrahy, preto sa ňou podrobnejšie nebudem zaoberať. Na Linux Mint funguje server hneď po inštalácii a nemá nastavené používanie hesla. Prídavný modul Mosquitto broker pre Home Assistant je pri predvolenej inštalácii nastavený tak, že bude vyžadovať prihlasovacie údaje, ktoré sú zhodné s údajmi na prihlasovanie do Home Assistant.

Nastavenie parametrov MQTT v Tasmota

Na to, aby sa zariadenie mohlo pripojiť k serveru MQTT, je potrebné nastaviť niekoľko údajov. Môžete ich nastaviť z webového rozhrania (Configuration – Configure MQTT), alebo z konzoly príkazom Backlog:

Backlog mqtthost adresa_mqtt_servera; mqttport port_mqtt_servera; mqttuser meno_používateľa; mqttpassword heslo

Po správnom nastavení pridá Tasmota k výpisom na konzolu riadky začínajúce reťazcom „MQT:“. Skúste teraz z konzoly webového rozhrania Tasmota zadať príkazPower (alebo stlačte tlačítko na spínači chk) a sledujte výpis na konzole:

10:56:02 MQT: stat/spínač_root/RESULT = {"POWER":"ON"}
10:56:02 MQT: stat/spínač_root/POWER = ON

Predvolený názov témy zariadenia je zvolený tak, aby bol jedinečný (obsahuje MAC zariadenia), preto nie je potrebné ho meniť. Ja som ho kvôli článku zmenil na spínač_root. Zmeniť sa dá vo webovom rozhraní (položka Topic), alebo príkazom Topic nasledovaným medzerou a vlastným názvom. Názov musí byť jedinečný aspoň v rámci vašej MQTT siete. Ak chcete vrátiť pôvodný, dosiahnete to príkazom Topic 1.

Poznámka: Limit pre celý názov témy je v Tasmota nastavený na 100 znakov.

Ďalšie nastavenia

Okrem názvov tém sa pri nastavovaní parametrov vo webovom rozhraní stretnete s ďalšími názvami, ktoré by vás spočiatku mohli mýliť.

Patria medzi ne napríklad názvy Friendly Name a Device Name, ktoré použije Tasmota napr. v správe MQTT discovery pre Home Assistant, ktorú publikuje pri štarte. Prvý z nich pomenúva výkonové výstupy (v HA to bude entita switch alebo light) a druhý je použitý ako názov celého zariadenia.

Prednastavená hodnota pre oba názvy je „Tasmota“ (pri viacerých výstupoch je k Friendly Name pripojený index, napr. „Tasmota2“) a dajú sa zmeniť v položke webového rozhrania (Configuration – Configure Other) alebo príslušnými príkazmi. Názov Device name je okrem toho použitý aj v druhom riadku záhlavia webového rozhrania Tasmota.

Ak máte len jedno zariadenie, na týchto názvoch nezáleží. Ak ich máte viac a komunikuje s nimi Home Assistant, môže to spôsobiť zmätok (HA si s tým síce poradí – pomenuje si ich po svojom, ale ťažko sa v tom potom vyznať).

Skúška komunikácie MQTT

Teraz, keď už máme všetko potrebné nainštalované a nastavené, môžeme si vyskúšať komunikáciu. Ak si prajete, aby Tasmota vypisovala na konzolu podrobnejšie informácie, použite príkaz Weblog s parametrom 3.

Prihlásenie sa na odber

Na začiatok sa skúsime prihlásiť na odber nejakej témy, o ktorej vieme, že existuje. Môže ňou byť napríklad téma závetov, na odber ktorej sa prihlásime pomocou filtra tele/+/LWT pomocou klienta mosquitto_sub takto:

mosquitto_sub -u meno_používateľa -P heslo -h adresa_brokera -t tele/+/LWT -v

Za parametrom -h nasleduje IP adresa alebo názov brokera, za parametrom -t nasleduje filter tém a parameter -v (verbose) zaistí výpis celej témy – bez neho by vypísal len prenášané dáta bez názvov tém. Ak používate meno a heslo, potrebujete ešte parametre -u a -P. V prípade, ak by názov témy obsahoval medzery, je potrebné ho vložiť do úvodzoviek.

Po prihlásení sa na odber server doručí klientovi (publikuje) všetky uložené správy v príslušnej téme, klient ich vypíše a bude čakať na nové správy.

Ak máte zapnuté aspoň jedno zariadenie s fw Tasmota, výpis by mal obsahovať najmenej jednu správu. V prípade, že zariadenie nemáte, alebo chcete vidieť viac správ, prihláste sa na odber rovnakej témy na testovacom serveri nadácie Mosquitto (meno a heslo nie sú potrebné):

mosquitto_sub -h test.mosquitto.org -t tele/+/LWT -v

Podobne si môžete pozrieť, čo server vypisuje do témy $SYS (nezabudnite znak $ escapovať). Na zastavenie výpisu použite Ctrl+C.

Ak používate prídavný modul Mosquitto pre Home Assistant, escape znaky ani úvodzovky pri zadávaní názvu témy nie sú potrebné.

Publikovanie

Prihlásením na odber sme si pozreli už existujúce témy. Teraz si vyskúšame tému publikovať pomocou klienta mosquitto_pub.

V jednom okne terminálu sa prihláste na odber tém, ktoré chcete sledovať, napr.:

mosquitto_sub -h adresa_brokera -t +/spínač_root/# -v

Pri publikovaní správy je potrebné k názvu témy pridať samotnú správu (ak ju budeme posielať) a oznámiť serveru, či si prajeme, aby správu uložil. Slúžia na to parametre -m , za ktorým nasleduje medzera a prenášané dáta, parameter -r , ktorý nastaví príznak retain, prípadne parameter -n , ktorý zaistí publikovanie prázdnej správy. V prípade, že názov témy, alebo prenášaná správa obsahujú medzery, je potrebné celú tému resp. správu vložiť do úvodzoviek alebo použiť escape znaky.

Otvorte teraz iný terminál a zadajte príkaz na publikovanie:

mosquitto_pub -h adresa_brokera -t cmnd/spínač_root/Power -m Toggle

Ak je všetko v poriadku, relé spínača prepne a v okne terminálu, v ktorom ste prihlásení na odber, uvidíte výpis publikovanej správy.

Ďalšie tipy na testovanie

Doteraz získané informácie by už mali postačovať na ďalšie oboznamovanie sa s firmvérom Tasmota a komunikáciou prostredníctvom protokolu MQTT, preto v nasledujúcich odsekoch už len pridám niekoľko tipov na ďalšie skúmanie.

Výpis jednotlivých paketov

Zatiaľ som nespomenul voľbu -d (debug), ktorá vám umožní sledovať typy MQTT paketov, pomocou ktorých klienti komunikujú a je možné ju použiť s oboma klientami. Jej význam sa pekne ukáže napríklad pri testovaní komunikácie s rôznymi úrovňami QoS (parameter -q), či sledovaní, ako klient udržiava spojenie pomocou paketov PING.

Dostupnosť zariadenia

Na lepšie pochopenie fungovania závetov a správ o dostupnosti klienta pomôže, ak si ich správanie prakticky vyskúšate s fyzickým zariadením. Pri tejto príležitosti si môžete zapnúť parameter -d a sledovať udržiavanie spojenia a pomôže aj sledovanie reakcií nadriadeného systému, ak nejaký používate.

Najprv sa pri odpojenom spínači prihláste na odber témy závetov pomocou filtra tele/+/LWT. Mala by sa zobraziť posledná uložená správa. Môže to byť správa „Online“ alebo „Offline“ – podľa toho, či server naposledy stihol zistiť odpojenie spínača, ale aj žiadna správa, ak spínač ešte nebol prihlásený, alebo ste správu vymazali. Potom spínač zapojte a počkajte na novú správu „Online“ zo spínača.

Ak chcete vidieť udržiavanie spojenia a použili ste aj parameter -d, počkajte približne minútu. Zobrazí sa komunikácia pomocou paketov PING a PINGRESP, je to však komunikácia medzi serverom a klientom mosquitto_sub, nie so zariadením Tasmota.

Ak teraz odpojíte spínač zo zásuvky a počkáte približne 30 sekúnd, zobrazí sa správa „Offline“, ktorú publikuje server v mene klienta potom, ako vypršal čas Keep Alive a klient ďalej neudržiaval spojenie (závet).

Poznámka: Hodnota keep alive je v aktuálnej verzi firmvéru Tasmota nastavená na 30 sekúnd (dá sa zmeniť pri kompilácii a od verzie 9.3.1.2 aj príkazom MqttKeepAlive). V klientoch mosquitto je predvolená hodnota 60 sekúnd (aspoň v Linux Mint) a dá sa zmeniť parametrom -k.

Uložené správy

Po nejakej dobe testovania vám na serveri budú postupne pribúdať zabudnuté uložené správy s informáciou o dostupnosti klienta. Server totiž nevie, či je zariadenie len odpojené, alebo už neexistuje (prípadne ste ho premenovali) a tak ich uchováva dovtedy, pokým ich niekto nevymaže. Nepotrebné uložené správy môžu spôsobovať nepríjemnosti, napríklad nadriadený systém môže nesprávne predpokladať, že odstránené, alebo premenované zariadenie stále existuje.

Ak by vám takéto správy prekážali, jednoduchým riešením je odstránenie všetkých uložených správ vymazaním súboru mosquitto.db, do ktorého si broker ukladá informácie o spojeniach a reštartovaním brokera, resp. reinštalácia prídavného modulu Mosquitto, ak k tomuto súboru nemáte v Home Assistant prístup.

Avšak ani vymazanie konkrétnej uloženej správy v určitej téme nie je zložitejšie – dosiahnete to publikovaním prázdnej správy v rovnakej téme s nastaveným príznakom retain. Potrebujete na to len poznať názov témy a mať prehľad o zariadeniach v sieti.

V nasledujúcom príklade vymažeme správu v téme závetov (resp. dostupnosti) uloženú na serveri pre náš testovací spínač_root:

mosquitto_pub -h adresa_brokera -t tele/spínač_root/LWT -n -r -d

Ak chcete, aby sa vymazaná správa obnovila, stačí reštartovať spínač.

Ak používate Tasmota s Home Assistant, Tasmota publikuje správy o stave/dostupnosti zariadenia do témy závetov a správy s informáciami o zariadení do témy začínajúcej reťazcom „homeassistant“. V prvom prípade pomôže filter tele/+/LWT (podľa nastavenia to môže byť tiež +/tele/LWT), v druhom filter homeassistant/#.

Informáciu o hodnote príznaku retain ponúka voľba -d. Zobrazí sa v zátvorke spolu s témou správy a ďalšími príznakmi.Prídavný modul Home Assistant pridáva ku každej zobrazenej správe informáciu o príznakoch retain a QoS automaticky.

Správy uložené na serveri je možné odstrániť aj pomocou nástroja Tasmota Device Manager, ktorý obsahuje funkciu na „automatické“ odstraňovanie starých správ. Automatické v tomto prípade znamená, že pri zavolaní funkcie z menu ponúkne zoznam všetkých zariadení, ktoré nie sú aktuálne na sieti, z ktorých je možné si vybrať tie, ktoré chcete odstrániť. Nástroj odstraňuje len správy o dostupnosti.

Ovládanie skupín zariadení

Na začiatku článku som spomenul možnosť ovládania skupín zariadení, ale zatiaľ som nespomenul, že každé zariadenie môže byť zaradené až do štyroch takýchto skupín. Prvá, už spomenutá, má prednastavený názov „tasmotas“ a ostatné sú v predvolenom nastavení prázdne – vytvoríte ich príkazom GroupTopic nasledovaným číselným indexom, medzerou a reťazcom, označujúcim skupinu.

Pri správe viacerých zariadení stojí za pozornosť najmä prvá skupina, ktorá je určená na globálne ovládanie všetkých zariadení, preto odporúčam vyskúšať si aspoň tú. Na úvod skúste publikovať nejakú neškodnú správu, napríklad príkaz Power bez parametrov (len vráti stav spínača):

mosquitto_pub -h 192.168.x.x -t cmnd/tasmotas/Power -n

Ak by ste teraz sledovali tému v ktorej ste publikovali, uvidíte len publikovanú správu (null). Jednotlivé spínače po prijatí a vykonaní príkazu publikujú informáciu o výsledku operácie každý vo svojej vlastnej téme. Sledujte, čo sa deje v témach zariadení končiacich reťazcom „POWER“ alebo „RESULT“ ( stat/+/POWER).

Poznámka: Ak budete sledovať témy končiace reťazcom „POWER“, neuvidíte stav spínačov, ktoré obsahujú viac ako jeden spínací prvok – na to, aby ste ich videli, museli by ste sledovať tému každého relé zvlášť („POWER1“…). Preto je výhodnejšie sledovať témy končiace reťazcom „RESULT“. Pripomínam, že v MQTT nemožno filtrovať jednotlivé znaky, len celé úrovne.

Názornejšie ako posielať prázdnu správu by bolo všetky zariadenia zapnúť, prepnúť, alebo vypnúť, ale v takom prípade zvážte, čo všetko máte na sieť pripojené, aby ste si nenarobili škody.

Prvú skupinovú tému je možné použiť napr. na nastavenie, resp. zmenu parametrov MQTT servera, alebo prístupového bodu WiFi (príkazy Ssid<x> a Password<x>), upgradovanie firmvéru (príkaz Upgrade), zmenu URL na bezdrôtové upgradovanie ( Otaurl), alebo na ovládanie webového rozhrania ( Webserver) na všetkých zariadeniach naraz.

Ďalšie skupiny môžete použiť na ovládanie skupín zariadení, napríklad svetiel, ale tu je už vhodné zvážiť, či nebude výhodnejšie vytvoriť skupiny v nadriadenom systéme.

Poznámka: Aby toho na začiatočníka nebolo málo, na ovládanie skupín zariadení vývojári pridali aj tzv. Device groups, ktoré slúžia na priame ovládanie skupín zariadení prostredníctvom protokolu UDP (bez účasti MQTT). Obídenie protokolu MQTT by malo zaistiť rýchlejšiu reakciu napríklad pri ovládaní skupín svetiel, adresovateľných LED pásov apod.

Publikovanie správ z konzoly Tasmota

Keď už dnes hovoríme o publikovaní MQTT správ, ich publikovanie umožňuje aj Tasmota priamo z konzoly pomocou príkazu Publish, resp. Publish2 (publikuje správy s nastaveným príznakom retain). Skôr ako na “ručné” publikovanie to využijete pri ovládaní iného zariadenia zo skriptov, napr. na základe nejakej udalosti. Môžete tak vytvárať jednoduché automatizácie na priame ovládanie vzdialených zariadení (bez nadriadenej aplikácie), alebo na publikovanie správ, ktoré Tasmota štandardne nepublikuje.

Poznámka: Tasmota obsahuje podporu dvoch druhov skriptov: hotové binárne súbory podporujú jednoduchšie Rules a pri vlastnej kompilácii sa dá vybrať výkonnejší skriptovací jazyk. A nakoniec, vo vývojových verziách pribudla pre ESP32 aj podpora skriptovacieho jazyka Berry.

bitcoin_skoleni


Dúfam, že v posledných dvoch dieloch sa mi podarilo objasniť komunikáciu pomocou protokolu MQTT aspoň na takej úrovni, aká je potrebná na používanie zariadení s firmvérom Tasmota a že vám získané informácie pomôžu pri ich nastavení a riešení problémov, prípadne pri písaní vlastných skriptov.

Niekedy nabudúce si ukážeme ovládanie zariadenia Tasmota z jednoduchého nadriadeného systému, ktorý si vytvoríme pomocou aplikácie Node Red. Vyžijeme pri tom samozrejme protokol MQTT a ďalšie znalosti, získané v predchádzajúcich dieloch seriálu.

Odkazy

Autor článku

Priaznivec open source, ktorý rád skúma, ako veci fungujú.