...
doc_tap_pp_listener_script_description; Listener script sa spusti pri prijati každého paketu, konkrétne pri MQTT sa zavolá listener skript vtedy, ak cez MQTT príde akákoľvek správa, ktorej Topic zodpovedá Topic-filtru nastaveného v TapHome;; tých správ môžu byť aj stovky za minútu. Tu je dôležité spomenúť dve veci:
...
...
Niektoré zariadenia produkujú mnoho rôznych správ, ktoré majú rovnaký topic, resp. niekedy musíme nastaviť topic napr. na a.b pretože nás zaujímajú správy a.b.c.d ale aj a.b.x.y, čo sa samozrejme spôsobí, že dorazia aj správy s topic a.b.k.l.m, ktoré nás nezaujímajú. To nie je v zásade zlé, ale niektoré zariadenia generujú rôzne aktualizácie statusu alebo správy, ktoré obsahujú popisy polí iných správ (metadáta) a tie môžu mať aj stovky KB a môžu prichádzať relatívne často - každých pár sekúnd (napr. Zigbee2MQTT)
Kvôli hore spomenutým dôvodom je pri MQTT, v listener skripte, veľmi dôležité na základe hodnoty Topic rozhodnúť, či sa jedná o relevantnú správu a ak nie, okamžite ukončiť vykonávanie skriptu a neanalyzovať vtedy zbytočne obsah správy. Algoritmus v TapHome riadiacej jednotke obsahuje mechanizmy, ako zabrániť zahlteniu MQTT správami. Napriek tomu sa ale nedá vylúčiť, že veľmi voľne nastavený MQTT topic filter a veľké množstvo veľkých správ nespôsobia zvýšenie doby odozvy riadiacej jednotky.
Prijatý paket sa nachádza v premennej (štruktúre) RECEIVEDMSG. Prijaté dáta sa dajú prečítať v premennej RECEIVEDMSG.Payload. Payload má dátový typ BLOB (large binary object), nie je to string ani pole bytov. Pokiaľ je payload typu string, je potrebné použiť funkciu TOSTRING, ale vo všeobecnosti payload môže byť hocičo. RECEIVEDMSG tiež obsahuje údaje špecifické pre protokol, napr. RECEIVEDMSG.Topic pri MQTT. Použitie RECEIVEDMSG.TOPIC je veľmi rýchla a efektívna možnosť ako zistiť hodnotu topic na rozdiel od starého spôsobu kedy sa používalo RECEIVEDBYTES.
doc_tap_pp_listener_script_improvements_heading;
...
doc_tap_pp_listener_script_instead_of; Namiesto:
Code Block |
---|
VAR jsonResponse := TOSTRING(RECEIVEDBYTES); if parsejson(jsonResponse, "Topic") = "my-topic" Va := todouble(parsejson(jsonResponse, "Payload")); end |
doc_tap_pp_listener_script_new_way; sa to dá napísať takto:
Code Block |
---|
if RECEIVEDMSG.TOPIC = "my-topic" Va := todouble(TOSTRING(RECEIVEDMSG.PAYLOAD)); end |
doc_tap_pp_listener_script_new_way_description; V čom je to lepšie - ušetrí sa jedno volanie PARSEJSON na zistenie, aká je hodnota topic. V prípade, že prichádza veľmi veľa mqtt správ a zaujímavé sú len niektoré, je výhodnejšie použiť tento nový spôsob.
...