blogy logo
login PRIHLÁS SA
BLOG deadawp
ČLÁNKY
DISKUSIE
3
SLEDUJETE BLOG
martinius96 (at) gmail.com
deadawp



ThingsBoard - JSON endpoint Watmonitora
pridal deadawp 23.9. 2025 o 12:26 (naposledy upravené 28.9. 2025 o 17:31)

Dnes si ukážeme integráciu projektu Watmonitor (hladinomer) do služby ThingsBoard, čo je Open-source IoT (Internet of Things) platforma pre industriálne, hobby a firemné projekty. ThingsBoard má mnoho možností, ktoré je možné kombinovať, alebo samostatne použiť a dokážete dosiahnuť rovnaký výsledok rôznymi spôsobmi. ThingsBoard je typom Push platformy. Teda štandardne funguje a spúšťa funkcionality iba na základe prichádzajúcich dát, či už po REST API, alebo skrz MQTT.

Ako sme si spomínali v predchádzajúcom článku, Watmonitor (webové rozhranie hladinomera) má dva JSON endpointy, ktoré distribuujú dáta zo systému. Endpointy sa volajú HTTP GET metódou a sú následovné:

  • json_output.php - vracia posledné dáta z databázy
  • json_output2.php - vracia všetky dáta z databázy, ktoré je možné ešte filtrovať spôsobom od-do, alebo všetko od, alebo všetko do zadaním GET parametrov.

Dnes využijeme endpoint json_output.php pre zobrazovanie nameraných dát Watmonitorom na platforme ThingsBoard. ThingsBoard v základnej funkcionalite nevie urobiť GET request a preto budeme musieť prispôsobiť funkcionality, pre získanie dát týmto spôsobom, prejdeme z push modelu na pull.

Vzorové JSON dáta Watmonitora (json_output.php):
{
"name": "Studňa Poprad - záhrada",
"value": 265,
"volume": 1332.04,
"time": "16. Sep 20:25"
}

Najprv si vytvoríme samostatné zariadenie v menu Devices, ktoré môže fungovať aj len virtuálne, alebo môže obsahovať aj priamo telemetriu z Watmonitora. V našom prípade to bude zariadenie Studna-Poprad. V zariadení nastavíme len názov a nič viac nepotrebujeme.

1. - Custom widget
Platforma ThingsBoard má k dispozícii dashboardy, ktoré slúžia pre vizualizáciu timeseries dát, telemetrie. Na to je možné použiť preddefinované widgety, ktoré si systémom Drag&Drop natiahnete do dashboardu a nastavíte, aké dáta používajú, ak to nemajú obsiahnuté priamo v sebe. Rovnako tak sú tieto widgety upraviteľné používateľom.

Ak žiadny z widgetov neposkytuje požadovanú funkcionalitu, môžete si vytvoriť aj vlastný widget pre dosiahnutie vzhľadu, ktorý preferujete, ale aj funkčnosti, ktorú vyžadujete. Custom widgety je možné vytvárať v časti Resources --> Widgets Library, kde si môžete vybrať vytvorenie nového widgetu. Systém vám dá na výber z viacerých šablón na základe toho, aký typ widgetu chcete - Static, Latest values, Alarm widget, Time series, Control Widget. 

Keďže budeme získavať posledné dáta z Watmonitora a jeho JSON endpointu json_output.php, zvolíme si Latest values. Následne môžeme v rozhraní zadať HTML kód, ktorý bude vnorený do elementu widgetu, vieme doplniť aj CSS pre vizuál podľa vlastného gusta a najdôležitejšie, môžeme zadať aj Javascript, ktorý bude vykonávať celú funkcionalitu widgetu, nakoľko widget nebude používať telemetriu zo zariadení, ale dáta bude ťahať externe pri spustení widgetu a potom automatizovane každých 5 minút, aby v dashboarde boli stále posledné známe dáta.

Tu som narazil na problém s CORS, nakoľko natívne je v prehliadačoch blokované vykonávanie medzi-doménového requestu z dôvodu same-origin policy. To sa vyriešilo obsiahnutím http://corsproxy.io/ služby, ktorú vo Watmonitore používa aj QR skener, či AR scéna pri HTTPS GET požiadavke na získanie dát.  Priamo toto rozhranie na CORS neupozornilo, ale pri spustení widgetu v tomto testovacom prostredí bolo vidieť, že sa nezobrazujú dáta. Až prechodom na Dev Tools (F12) sa to ukázalo, kde bol problém obsiahnutý.

Javascript ďalej rieši po získaní dát v JSON formáte ich parsing. Funkcia onInit() je najdôležitejšia, nakoľko práve ona volá podprogram pre získanie dát a JSON parsing. Vďaka tomu je možné spustiť funkcionalitu pri načítaní widgetu a potom opakovane každých 5 minút.

Vnorený JS kód:
self.onInit = function() {

loadData();
self.interval = setInterval(loadData, 300000); // 5 min
};

self.onDestroy = function() {
if (self.interval) {
clearInterval(self.interval);
}
};

function loadData() {
var url = "https://corsproxy.io/?https%3A%2F%2Fhladinomer.eu%2Fjson_output.php";
fetch(url)
.then(r => r.json())
.then(data => {
self.ctx.$scope.name = data.name;
self.ctx.$scope.value = data.value;
self.ctx.$scope.volume = data.volume;
self.ctx.$scope.time = data.time;
self.ctx.detectChanges();
})
.catch(err => console.error("Fetch error:", err));
}


Po skompletovaní HTML, CSS a JS je výsledkom funkčný widget, ktorý je možné uložiť. Po prechode do dashboardu môžeme tento widget nájsť v zozname widgetov, je ale nutné prepnúť Widgets bundle na All widgets. Widget môžeme pridať do dashboardu a môžeme vidieť dáta.

V prípade, že sa dáta zmenia, opätovná GET požiadavka o 5 minút, respektíve pri ďalšom načítaní dashboardu získa aktuálne dáta a uvidíte iné dáta, ktoré odpovedajú tomu, čo sa nachádza vo Watmonitore. Tento princíp získavania dát z JSON endpointu sa dá použiť prakticky s akoukoľvek IoT platformou, či priemyselným systémom, ktorý podporuje HTTP GET a má JSON parser / JSON mapper.

2. - Rule Chain
Druhým spôsobom je Rule Chain, ako už názov napovedá, pôjde o zreťazenie pravidiel, ktoré dosiahnu určitý výsledok. V našom prípade budeme potrebovať, aby sa request uskutočnil každých 5 minút s následnym parsingom dát a ich uložím v rámci ThingsBoardu, do telemetrie zariadenia.

Pokúsime sa to urobiť čo najľahšie aj s vysvetlením jednotlivých krokov. Vytvoríme si čistý Rule Chain. Ten obsahuje prvý blok Input, ktorý ale nebudeme používať a nič s ním zreťazovať nebudeme. Do editora si vložíme prvý blok - Generator. V jeho vlastnostiach nastavíme Originator - zariadenie, do ktorého budeme chcieť ukladať telemetriu, nakoľko tá sa uloží k danému originatoru na konci sekvencie zreťazených blokov. Nastavíme aj generovanie unlimited správ (0) a tiež generovanie každých 300 sekúnd, teda 5 minút.

Druhým blokom bude REST API CALL, ktorý zreťazíme z Generátora pre label Success. Tento label spustí blok REST API CALL v prípade, že nastal "TICK", teda bol vygenerovaný impulz po stanovenom čase. To nám umožňuje spúšťať automatickú funkcionalitu každých XY sekúnd, minimum bloku Generator je 60s.

V bloku REST API CALL zadáme URL adresu JSON endpointu Watmonitora, HTTP metódu a uložíme, nie je potrebné nič viac nastavovať. Tento blok vykoná HTTPS GET request a prijatú response zo servera posunie ďalej. Tu už problémy s politikou CORS nehrozia a nemusíte sa starať o úpravu, či tvorbu requestu cez CORS proxy server.

Prijatý JSON je ale nutné vyparsovať pre získanie jednotlivých dát, ktoré budú vložené do premenných a v poslednej fáze budú uložené aj do telemetrie. Využijeme preto blok script z Transformácii. V nastaveniach bloku je možné testovať aj JS kód na konkrétny payload, vďaka čomu je možné si vložiť JSON payload, ktorý je očakávaný zo servera a môžeme sledovať aj výsledok, či sa transformácia podarí, alebo zlyhá. Ako môžeme vidieť, používateľský kód je vnorený do JS funkcie Transform s dvoma parametrami.

Typ správy POST_TELEMETRY_REQUEST poukazuje na to, že tento blok žiada o zápis dát ďalší blok, ktorý správu obdrží.

Vnorený JS kód:
const value = msg.value;

const volume = msg.volume;
const name = msg.name;
const time = msg.time;

const newTelemetry = {
value: value,
volume: volume,
name: name,
time: time
};

return {
msg: newTelemetry,
metadata: metadata,
msgType: "POST_TELEMETRY_REQUEST"
};




Posledným blokom bude Save Timeseries blok, ktorý na základe requestu a známeho Originatora, ktorý Rule Chain spustil zapíše dáta pod toto konkrétne zariadenie. V tomto bloku nie je potrebné nič upravovať. Finálna štruktúra a zreťazenie blokov na stave Success vidíme nižšie.


Takto vytvorený Rule chain, ktorý obsahuje generátor beží nezávisle na tom, či je priradený pod niektorým zariadením, či jeho Device profile. Rule Chain tak nemusí striktne používať zariadenie. Dáta sa tak dostávajú do telemetrie zariadenia Studna-Poprad, aj keď je zariadenie iba virtuálne a nikdy nemalo reálnu konektivitu, či push dát po REST API, či MQTT. Funguje len ako prostredník, ktorý pod sebou uchováva telemetriu a z neho sa telemetria berie v dashboarde pre vizualizáciu.

Takto ako môžeme vidieť, môžeme mať v jednom dashboarde aj dve na sebe nezávislé vizualizácie. Naľavo vizualizácia realizovaná prvým spôsobom s custom Javascriptom vo vlastnom widgete. Dáta sú ťahané pri otvorení dashboardu a potom každých 5 minút, pokým je používateľ stále vo vizualizácii. Na pravej strane máme trojicu dát v troch samostatných widgetoch (cards), ktoré prislúchajú telemetrii pod zariadením. Tieto cards widgety dokonca vizualizujú aj čas posledného updatu a tak viete, kedy zhruba môžete očakávať nové dáta.

Tieto dáta sú získavané cez Rule chain automatizovane, keď generátor urobí tick. Toto môže byť výhodnejšie pre time series dáta, ktoré môžete následne vizualizovať a v grafe podľa času ThingsBoard servera, kedy boli zapísané. Nemusíte sa o nič starať a ThingsBoard so svojim Rule Chain bude fungovať ako CRON, ktorý si v pravidelných intervaloch zažiada o dáta a uloží ich. V prvom prípade na ľavej strane dashboardu máme vždy len poslednú hodnotu, ktorá sa dá získať, nie sú tam uchované žiadne time-series dáta. Je to len hodnota z response servera, nie je nikde uložená.

Telemetria zapísaná skrz Rule Chain má výhodu aj v tom, že zapísané dáta sú v ten istý moment. V rámci Rule Chainu sa dajú volať aj ďalšie iné podporné bloky, volania, ktoré môžu vykonávať automatizácie, zasielanie upozornení, zmenu stavov a veľa iného. Rule Chain má mnoho blokov, vrátane posielania emailov, SMS, prenos po MQTT, AI volania a tiež má metódy na prenesenie dát aj medzi ďalšími Rule Chainami.


Vyskúšajte Watmonitor s vašim hardvéorm zdarma ešte dnes s Arduinom, ESP32, ESP8266, alebo si vytvorte custom firmvér a pripojte svoj hardvér do Watmonitora: 
https://your-iot.github.io/Watmonitor/sk/

Exportované .json súbory Dashboardu, Rule Chainu a Widgetu z ThingsBoardu pre oba typy integrácii nájdete na: 
https://github.com/martinius96/hladinomer-studna-scripty/tree/master/examples/Hladinomer/TB

Zariadenie nie je možné exportovať a tak si ho musíte vytvoriť sami, prípadne urobiť niektoré zmeny. Ak by ste chceli realizovať podobný projekt, či už samostatný v ThingsBoarde, alebo by ste chceli prepojiť váš ThingsBoard s Watmonitorom, ozvite sa Your-IoT: https://your-iot.github.io/portfolio.html

Po importe widgetu, dashboardu a rule chainu do novej ThingsBoard inštancie je nutné urobiť nasledujúce akcie, ktoré spočívajú v nastavení konkrétneho zariadenia:

  • V Dashboarde prejdite do Edit módu a po výbere widgetu kliknite na Edit. V Datasources vyberte konkrétne zariadenie. Týmto úspešne spustíte prvý widget, ktorý ťahá dáta z Watmonitora pri spustení dashboardu a potom v 5-minútovej rutine. Rovnakú akciu vykonajte aj pre ostatné tri widgety, ktoré pracujú s telemetriou. Vyžadujú taktiež nastavenie konkrétneho zariadenia.
  • V Rule Chain pri výbere Generator nodu postupujte obdobným spôsobom v sekcii Originator, kde vyberiete konkrétne zariadenie

Tento postup je potrebný a nevyhnutný, nakoľko export vo formáte .json používa device_id parameter zariadenia, ktoré ho priamo definuje na ThingsBoarde (názov zariadenia je len textovým poľom a prakticky akékoľvek zariadenia na ThingsBoarde môžu mať rovnaké meno, ale líšia sa v tokene a najmä id. Nakoľko bolo toto zariadenie pod iným účtom, kde nemáte prístup, systém položku vynechá a nenastaví konkrétne zariadenie, Device v nastaveniach ostane prázdny. Musíte to urobiť manuálne. V prípade, že chcete ťahať dáta priamo z vášho Watmonitor rozhrania, pozmeňte v Rule Chain Node REST API CALL s URL na váš json_output.php súbor.





Prenastavené 2 zo 4 widgetov

Ak máte na ThingsBoarde predplatený aj analytický nástroj Trendz Analytics, môžete ho použiť na predikciu budúcej telemetrie, odhaľovania anomálii, ktoré môžu pri prevádzke nastať na základe telemetrie zariadenia, ktorá automatizáciou pravidelne chodí do ThingsBoardu. Rovnako tak sa môžete zamerať na analýzu sezónnych a cyklických trendov. Na základe predikcií môžete vo vlastnej automatizácii optimalizovať spotrebu vody pre zavlažovanie na základe výdatnosti studne, počasia, predikcie dažďa, úhru zrážok a ich vyplyv na prítok do studne.

Na blogu môžete nájsť aj článok o priamej integrácii Watmonitora do ThingsBoardu cez MQTT, ktorá využíva ako middleware Node-RED.



Prístupov 645
Kvalita článku
hlasov 0

PRÍSPEVKY
SLEDUJETE
Prosím prihláste sa pre možnosť pridania komentáru.
Prihláste sa, alebo použite facebook login facebook login
ĎALŠIE ČLÁNKY V BLOGU
Integrácia Watmonitora do Node-RED skrz ...
[ 25.9.2025] (príspevkov 0)
Watmonitor - spustenie na Endora.cz
[ 23.9.2025] (príspevkov 0)
ThingsBoard - JSON endpoint Watmonitora
[ 23.9.2025] (príspevkov 0)
Watmonitor - JSON endpoint integrácia
[ 21.9.2025] (príspevkov 0)
Klonovanie projektu Watmonitor
[ 19.9.2025] (príspevkov 0)
GATT server s ESP32-C6
[ 12.9.2025] (príspevkov 0)
Tohtoročné výnosy obilia pod Tatrami
[ 31.8.2025] (príspevkov 0)
Odstávky elektriny - ePaper s ESP32
[ 30.8.2025] (príspevkov 0)
Dojmy: VIETCONG
[ 28.8.2025] (príspevkov 0)
433 MHz prijímač s Arduinom v roku 2025
[ 26.8.2025] (príspevkov 0)