Přinášíme návod, jak využít převodník Unipi Gate a rozšiřující modul xG18 k vyčítání teplot a jejich odesílání do cloudové platformy.
Úvod
Produktová řada Unipi Gate je navržena jako brána do již existující technologie pro její vzdálený monitoring a ovládání. V tomto článku si předvedeme, jak s pomocí 8 kanálového 1-Wire rozšíření Unipi Extension xG18 a platformy Node-RED zasílat a zobrazovat teploty v cloudu ThingsBoard.
Data loggery, tak jak je známe, jsou povětšinou specializovaná zařízení. Mají možnost připojit externí paměť v podobě USB flash disku nebo SD karty a periodicky vzorkovat a ukládat hodnoty z monitorované technologie. Analýza získaných dat pak často představuje jejich převedení do počítače a vizualizaci v programech jako je např. MS Excel.
S nástupem cloudových technologií a IoT se otevřela cesta, jak data z různých zařízení agregovat do jednoho místa a provádět tak hodnotnější analýzy a vizualizace jak nad historickými, tak nad aktuálními údaji a to naprosto automaticky a bez nutnosti ručního zásahu člověka. Zařízení s těmito službami komunikují přes definované protokoly, tzv. API (application programming interface). Uživatelská práce nad daty a jejich zobrazení se pak provádí přes webový prohlížeč a s okamžitou dostupností odkudkoliv.
Tzv. cloudových platforem - tedy služeb umožňující přijímat data - je v dnešní době velké množství. Prakticky každá velká internetová společnost nabízí podobnou službu, např. Google Cloud Platform, Microsoft Azure či IBM Watson. Služby se liší podle toho, zda jsou spíše pro vývojáře aplikací, nebo již řeší konkrétní úlohu. Dalším z faktorů ovlivňující výběr je cenová politika. Ukládání dat je většinou zdarma do určitého množství, pro více dat či zařízení je pak zpoplatněno.
V tomto článku použijeme platformu ThingsBoard, která řeší získávání a zobrazení dat. Služba nabízí měsíční zkušební lhůtu a narozdíl od konkurence si nevyžádá číslo kreditní karty.
HW propojení a konfigurace
Pro napájení Unipi G110 a xG18 použijeme stejnosměrný zdroj 24V. Rozšiřující moduly se chovají jako ModbusRTU slave zařízení, komunikující přes RS485. Pro propojení s PLC na krátkou vzdálenost stačí obyčejná dvojlinka, pro delší vzdálenosti doporučujeme použít kroucenou, stíněnou dvojlinku. Stínění na jedné straně doporučujeme propojit se zemí a pomocí DIP switchů nastavit zakončovací odpory na zařízeních, které se nachází na konci sběrnice.
Konfigurace Node-RED
Jako SW pro vyčítání dat z rozšíření xG18, jejich formátování a posílání do cloudu použijeme platformu Node-RED. Operační systém s touto platformou je do Unipi Gate nahrán již při výrobě, případně jej můžete stáhnout z našich stránek a nahrát do PLC pomocí zdokumentovaného postupu.
Po připojení Unipi Gate do sítě a k napájení Node-RED automaticky nastartuje. Jeho ovládací a konfigurační panel je dostupný z webového prohlížeče přímo na IP adrese Unipi Gate. IP adresu můžete zjistit několika způsoby - přímo v rozhraní Vašeho routeru, pomocí skenovací aplikace nebo využitím mDNS. mDNS umožní identifikaci zařízení pomocí jeho názvu, který se sestává z názvu modelu a sériového čísla. Pro Unipi G110 a sériové číslo 130 je název g110-sn130 , do webového prohlížeče tedy v našem případě zadáme http://g110-sn130 (je důležité zadat i “http://”):
Tato stránka je vytvořena přímo pomocí Node-RED Dashboard. Ovládací rozhraní Node-RED nalezneme klasicky na portu 1880, nebo kliknutím na odkaz na výše uvedené stránce. Po kliknutí se nám objeví výchozí program, který můžeme nechat tak, jak je.
Projekt vyčítání teplot začneme tím, že vytvoříme nový program, neboli flow a to tak, že klikneme na tlačítko "+":
Vytvoří se nám nové flow, které si můžeme pojmenovat např. "xG18 to ThingsBoard". To provedeme kliknutím na ikonu Menu a volbou Flows → Rename.
V dialogu přejmenujeme "Flow 2" na "xG18 to ThingsBoard" a potvrdíme.
Dalším krokem pro vyčítání teplot je komunikace s Unipi xG18. Ta probíhá přes protokol ModbusRTU. Pro tuto komunikaci jsou již v naší instalaci Node-REDu předchystány potřebné funkční bloky, tzv. "node". Seznam všech bloků naleznete v levém rolovacím menu. Zde je seznam bloků pro komunikaci Modbus:
Pro vyčítání skupiny registrů použijeme blok "Modbus Read". Pozor, vyhledávací dialog nad seznamem vyhledává pouze podle jednoho slova, slovní spojení “Modbus Read” nenalezne. Na blok v seznamu najedeme myší, klikneme levým tlačítkem, podržíme, přetáhneme do prázdného programu a položíme uvolněním tlačítka:
Nyní se podíváme do dokumentace Modbusové mapy registrů pro Unipi xG18. Tu nalezneme v sekci "Ke stažení" na našich stránkách Knowledge Base:
V otevřeném dokumentu nalezneme v záložce "Registers" potřebné registry:
Z dokumentace vidíme, že hodnoty teplot jsou dostupné v registrech na adrese 1-8. Každá teplota je v jednom registru a je vynásobena číslem 100 a zaokrouhlena na celá čísla. Tento způsob přenosu čísel s desetinnou čárkou v určitém rozsahu a přesnosti je pro Modbus komunikaci typický. Pro nás znamená, že hodnotu, kterou vyčteme ze zařízení vydělíme 100 a dostaneme tak teplotu s přesností na 2 desetinná místa. Pozor, záporné hodnoty jsou vyjádřeny jako dvojkový doplněk.
Nyní můžeme s touto znalostí nakonfigurovat vyčítání dat. Dvojklikem na položený blok "Modbus Read" se dostaneme do jeho vlastností. V nich nastavíme tyto parametry:
- Jméno: "xG18 Temperatures"
- FC neboli Function Code na "FC 3: Read Holding Registers" - vyčítání tzv. holding registrů, ve kterých je dostupná teplota
- Address: 1 - Adresa prvního registru, který chceme vyčíst
- Quantity: 8 - Počet registrů, který chceme vyčítat
- Poll Rate: 1s - jak často se mají data vyčítat
Dále je potřeba nastavit komunikační parametry Modbus Serveru. Klikněme na ikonu tužky u položky "Server":
Ve výchozím nastavení je Modbus adresa modulu xG18 nastavena na 15, rychlost na 19200 baud, 8 datových bitů, 1 stop bit a bez parity. Více o nastavení komunikačních parametrů se můžete dozvědět zde. V dialogu editace komunikačních parametrů nastavíme následující:
- Název: xG18
- Type: Serial
- Serial port: /dev/ttyS1
- Serial type: RTU
- Baud rate: 19200
- Unit-Id: 15 - toto je Modbus adresa Unipi xG18
Ostatní parametry (8N1) jsou výchozí. Pro jejich změnu je potřeba změnit Type na "Serial Expert". Výsledek nastavení by měl vypadat takto:
Potvrdíme kliknutím na tlačítko "Add" a vrátíme se do předchozího dialogu s nastavením vyčítání registrů. Tento dialog by měl vypadat takto:
Potvrdíme dialog kliknutím na "Done". Nyní máme nakonfigurovánu komunikaci a můžeme ověřit, zda funguje. Z levého seznamu dostupných bloků najdeme "debug" a položíme jej do programu za blokem, který jsme přejmenovali na "xG18 Temperatures":
Nyní najedeme myší na jeden ze dvou bodů na pravé straně bloku vyčítání dat dokud bod nezmění barvu na oranžovou. Klikneme a táhnutím myši začneme od tohoto bodu vytvářet čáru:
Se stále stisknutým tlačítkem najedeme na vstupní (levý) bod zeleného bloku, dokud opět nezoranžoví. Jakmile máme, pustíme tlačítko myši:
Tímto způsobem jsme nastavili posílání načtených hodnot teploty do bloku, který je nám bude zobrazovat v ladícím okně. Je to nástroj, jak se napojit do různých částí programu a sledovat, jaká data a v jakém formátu v programu "tečou".
Unipi Gate zatím takto vytvořený program neprovádí. Veškeré změny jsou potřeba nahrát a to kliknutím na tlačítko "Deploy":
Pokud je tlačítko červené, znamená, že jsou v programu provedeny změny, které nejsou ještě nahrány. Po nahrání tlačítko bude šedé. Nahrejme tedy program do zařízení a v pravém sloupci klikněme na ikonu brouka, která nám zobrazí záložku s ladícími informacemi, které produkuje funkční blok "debug":
Vidíme neustále přibývající zprávy, které nám generuje blok Modbus Read. Když si rozklikneme pomocí ikony trojúhelníku, tak zjistíme, že obsahují Javascriptový objekt s polem s 8 hodnotami. Tento objekt je ve standardním formátu Node-RED, tedy data jsou obsažena ve vlastnosti "payload".
Jak vidíme na pozici 0 je hodnota 2375. Toto je surová hodnota z registru číslo 1 a reprezentuje teplotu čidla zapojeného do portu 1. Číslo 2375 odpovídá teplotě 23,75 °C. Nyní je potřeba tyto hodnoty převést na skutečné teploty a připravit data tak, abychom je mohli rovnou předat do cloudu ThingsBoard.
Data do ThingsBoard se posílají pomoci MQTT a musí obsahovat JSON objekt, který bude obsahovat názvy jednotlivých dat a jejich hodnotu. Momentálně nemáme k dispozici žádný název, pouze pole hodnot. Název tedy vytvoříme jako "temperature_1", "temperature_2",... K takové transformaci dat nemáme Node-RED k dispozici grafický nástroj a je potřeba se uchýlit k Javascriptové funkci. Tu nalezneme v levém panelu pod názvem "function". Položíme ji již známým způsobem do programu.
Dále potřebujeme tuto funkci vložit mezi bloky vyčítání a logování - potřebujeme aby funkce tato data zpracovala a předala dál. Klikneme na položený "drát" až zoranžoví a stiskneme Delete. A natáhneme nový drát mezi vyčítací blok a položenou funkci a druhý mezi funkci a logovací blok. Výsledek po uspořádání bloků by měl vypadat takto:
Následně nakonfigurujeme funkci, aby provedla potřebnou transformaci dat. Dvojklikem na blok funkce se dostaneme do její vlastnosti. Funkci si pojmenujeme "Temperature calculation" a tělo funkce změníme na následující kód:
var UInt16 = function (value) {
return (value & 0xFFFF);
};
var Int16 = function (value) {
var ref = UInt16(value);
return (ref > 0x7FFF) ? ref - 0x10000 : ref;
};
msgWithNames = {'payload': {}};
msg.payload.forEach(function (item, index, arr) {
msgWithNames.payload['temperature_'.concat(index+1)] = Int16(item) / 100;
});
return msgWithNames;
Výsledek by měl vypadat takto:
Než změny uložíme, pojďme si projít, co daná funkce provádí.
Na řádcích 1-8 jsou pomocné funkce pro překlad čísla reprezentovaným jeho dvojkovým doplňkem.
Na řádku 10 vytvoříme lokální proměnnou msgWithNames a uložíme do ní objekt, který má vlastnost "payload", která je opět prázdným objektem. Tímto vytvoříme "obálku", do které budeme ukládat data ve formátu pro ThingsBoard.
Na řádcích 11-13 je cyklus, který projde všechny prvky pole objektu msg.payload. Tento objekt obsahuje data, která nám přitekla z bloku vyčítání a která jsme si v předchozím kroku zobrazovali v konzoli ladění.
Řádek 12 je kód, který provádí transformaci dat. Na pravé straně výrazu porovnáme hodnotu teploty. Pokud je 32768, znamená to, že čidlo není zapojeno. Ternárním operátorem tedy vrátíme pro tuto hodnotu "false". Pokud je hodnota jiná, tedy korektní, podělíme ji 100. Na levé straně výrazu zapíšeme tuto ošetřenou a přepočtenou hodnotu do předpřipraveného objektu msgWithNames.payload.
Na posledním řádku vrátíme naplněný objekt, který tak pošleme pomocí výstupního bodu dál. Uložíme změny kliknutím na "Done" a nahrajeme změny do Unipi Gate pomocí tlačítka "Deploy". V ladící konzoli by se nám měl změnit formát výstupu:
Vidíme, že po zpracování dat funkcí již nemáme pole hodnot, ale objekt s vlastnostmi "temperature_X" a hodnotou přímo ve stupních, nebo hodnotou "false" v případě nezapojeného čidla. Modbusová mapa modulu xG18 také obsahuje registr, ve kterých je indikace, zda je vyčtená hodnota korektní. V rámci tohoto článku jsme provedli pouze jednoduchou kontrolu, správně bychom měli korektnost dat porovnávat podle stavového registru.
Nyní můžeme přejít k zasílání dat do cloudu ThingsBoard.
Nastavení ThingsBoard
Cloudová platforma ThingsBoard umožňuje sbírat data z různých zařízení, provádět na nich různé operace a akce a taktéž je vizualizovat. V našem ukázkovém příkladu budeme zobrazovat nasbírané teploty.
ThingsBoard můžete provozovat ve dvou režimech - buď využít služeb thingsboard.cloud, nebo si celou platformu nainstalovat na své infrastruktuře. V článku budeme využívat zkušební účet, který vytvoříme na thingsboard.cloud. Tento účtu nevyžaduje při svém vytváření zadání čísla kreditní karty a umožní používat službu měsíc zdarma.
Po otevření stránky https://thingsboard.cloud nás uvítá přihlašovací formulář, kde můžeme vybrat přihlášení již stávájícím účtem různých sociálních sítí, nebo můžeme vytvořit nezávislý učet kliknutím na "Sign Up":
Po vyplnění registračního formuláře nám na email dorazí potvrzovací odkaz. Po aktivaci účtu se budeme moci okamžitě přihlásit.
Prvním z kroků v administrátorském rozhraní je vytvoření nového zařízení, které bude do cloudu zasílat data. Na domovské stránce rozhraní klikneme v levém menu na "Device groups". Objeví se seznam všech skupin zařízení. K dispozici máme skupinu "All" a kliknutím na ikonu seznamu se přepneme do seznamu všech zařízení této skupiny:
Nyní přidáme nové zařízení do této skupiny pomocí tlačítka "+":
Objeví se dialog "Add new device". Vyplníme jméno zařízení, tak abychom jej byli schopni rozpoznat a potvrdíme kliknutím na tlačítko "Add":
Zařízení se nám přidalo do systému. Abychom mohli jeho jménem zasílat data, potřebuje k němu získat přihlašovací údaje, které jsou pro každé zařízení unikátní. Klikněme v seznamu na ikonu štítu:
Objeví se nám dialog, obsahující pole "Access Token". Zkopírujme si jej a dialog zavřeme:
Nyní nastavíme komunikaci do cloudu v rozhraní Node-RED. Komunikace probíhá přes protokol MQTT. V levém panelu v Node-REDu nalezneme blok "mqtt-out" a přidáme jej do našeho programu a dvojklikem si otevřeme jeho vlastnosti. Pro komunikaci musíme nastavit parametry připojení k MQTT serveru (tzv. broker). Klikněme na ikonu tužky:
Vyplníme název ("ThingsBoard cloud") a adresu serveru ("thingsboard.cloud") a přepneme se do záložky "Security":
V záložce "Security" vyplníme položku "Username", kam vložíme Access token, který jsme získali v rozhraní ThingsBoard a poté dialog potvrdíme kliknutím na "Add":
Potvrzení dialogu nás vrátí zpět do vlastností bloku "mqtt-out". Již máme vyplněnou položku "Server". Doplníme ještě následující položky:
- Topic: zadejme "v1/devices/me/telemetry”
- Name: zadejme "ThingsBoard MQTT"
Výsledný dialog by měl vypadat takto a potvrdíme jej kliknutím na "Done":
V programu vidíme přejmenovaný blok a na jeho vstup přitáhneme drát z výstupu funkce "Temperature calculation" a klikneme na "Deploy". Pokud vše dopadlo v pořádku, uvidíme pod MQTT blokem stav "connected":
Pokud je stav delší dobu "connecting" nebo "disconnected", zkontrolujte prosím:
- zda máte správně zadanou adresu serveru
- zda máte správně zadaný Access token v položce "Username"
- zda má Unipi Gate přístup k internetu, včetně funkčního DNS serveru
Pokud je stav "connected", můžeme zkontrolovat, zda přichází data do cloudu. V seznamu zařízení klikneme na název naší Unipi Gate:
Otevře se nám okno s detaily zařízení. Přepneme se do záložky "Latest telemetry". Ta obsahuje kompletní objekt, který byl poslán do cloudu jako poslední. Pokud je vše v pořádku, měla by záložka obsahovat poslední naměřené teploty u zapojených senzorů:
Nyní můžeme přejít k vizualizaci dat. V levém menu klikneme na "Dashboard groups". Automaticky máme k dispozici skupinu "All". Přejdeme do ni kliknutím na ikonu seznamu:
V této skupině není žádný dashboard, na který bychom mohli pokládat grafické prvky. Vytvoříme jej kliknutím na tlačítko "+":
Objeví se nám dialog "Add Dashboard", ve kterém vyplníme jeho jméno: "Boiler room temperatures" a klikneme na "Add":
Nový dashboard se nám objeví v seznamu a můžeme jej otevřít kliknutím na první ikonu:
Dalším krokem je přidání grafických elementů, tzv. widgetů, které budou zobrazovat data získaná ze zařízení. Dashboard musíme nejdříve přepnout do režimu editace kliknutím na ikonu pera:
Nyní do dashboardu přidáme datový zdroj. Klikneme na "Entity aliases":
V dialogu dále na "Add alias":
A u nového aliasu nastavíme následující hodnoty:
- Alias name: "Unipi G110"
- Filter type: "Single entity"
- Type: "Device"
- Device: seznam nám nabídne naše zařízení, které jsme si pojmenovali "Boiler room (Unipi G110)"
Výsledný dialog by měl vypadat takto a potvrdíme jej kliknutím na "Add":
Dialog nás vrátí zpět do seznamu "Entity aliases", který uložíme kliknutím na "Save":
Nyní můžeme přidat grafický element, který nám bude zobrazovat všechny teploty v grafu. Klikneme na "Add new widget", nebo na ikonu "+" ve spodní části obrazovky:
V dialogu "Select widget" vybereme skupinu widgetů "Charts", které obsahují grafy. kliknutím vybereme "Timeseries - Flot".
Otevře se nám dialog, ve kterém nastavíme, z jakého zdroje se mají hodnoty vyčítat. V sekci "Datasources" klikneme na "+ Add" a v poli "Entity alias" vyberem námi vytvořený zdroj "Unipi G110". V poli "Entity timeseries" se nám automaticky načtou dostupné hodnoty, které nám přichází z Node-REDu:
Postupně přidáme všechny teploty, dokud dialog nevypadá takto:
Potvrdíme kliknutím na "Add". Graf se nám přidá do panelu a rovnou začne zobrazovat aktuální hodnoty.
Graf si můžeme roztáhnout kliknutím a tažením za pravý spodní roh. Rychlost aktualizace a délku zobrazovaného období můžeme pro celý dashboard změnit kliknutím na "Realtime - last minute":
Pokud jsme s konfigurací hotovi, klikneme na ikonu "fajfky" v pravém dolním rohu:
Závěr
V tomto článku jsme si popsali, jak:
- Komunikovat s obecným Modbus zařízením
- Transformovat data pomocí vlastní Javascriptové funkce
- Posílat data přes MQTT
- Vizualizovat data cloudovou platformou ThingsBoard
Pokud se Vám některý z kroků nepodařil, nebo máte návrh na zlepšení, neváhejte nás kontaktovat na info@unipi.technology.