Použití NodeRed a IBM BlueMix přes EVOK za použití websocketů

Domů Tutoriály Použití NodeRed a IBM BlueMix přes EVOK za použití websocketů Zpět
Tutoriály

Příklad nasazení NodeRed na websocket rozhraní

Společnost IBM již nějakou dobu vyvíjí skvělé nástroje pro IoT. Jeden z nich, Node-RED, je vynikajícím nástrojem pro vzájemné propojování hardwaru. Umožňuje totiž uživateli snadno psát chování hardwarových zařízení za pomoci Javascriptu. IBM ale šli ještě dál a přímo pro IoT vyvinuli cloudovou platformu Bluemix, což je ve své podstatě virtuální server, na kterém lze spouštět a propojovat více aplikací, služeb, databází a virtuálních zařízení. Pro účely tohoto tutoriálu ale využijeme jen malou část funkcí této vynikající platformy. 

 

Příprava software

Na začátek potřebujete jednotku UniPi s nakonfigurovaným a spuštěným open-source Evok API. Pro práci doporučujeme výchozí Rapsbian, pracujeme ale i na naší vlastní modifikované distribuci Minibianu.
V dalším kroku je třeba nainstalovat a spustit lokální instanci Node-RED - zde se řiďte naším tutoriálem.
A ještě něco - pokud chcete propojit UniPi s cloudem, budete potřebovat i účet na Bluemixu. 

Node-RED na UniPi

Pro naší práci využijeme společnou výhodu EVOKu i Node-RED - obě platformy totiž podporují komunikaci skrze websocket. Níže je schéma principu komunikace: 

EVOK zde funguje jako websocketový server, skrze který se mohou připojovat klienty. Po jejich připojení pak mohou přijímat a vysílat zprávy skrze socket přímo do UniPi. 

Lokální ovládání UniPi
Níže jsme připravili jednoduchý příklad, který umožní skrze Node-RED ovládat UniPi. Skládá se pouze z websocket síťového uzlu napojeného na UniPi a několika inject uzlů pro odesílání zpráv do UniPi. Níže je uveden obsah inject uzlů sloužící jako příklad typické zprávy. Popis všech možných příkazů lze nalézt na GitHub úložišti pro EVOK
Klikněte na modrý inject uzel a všímejte si odpovědi UniPi: 

[{"id":"a3c2ed71.5c3d1","type":"websocket-client","path":"ws://127.0.0.1/ws","wholemsg":"false"},{"id":"c7a9d1f1.38563","type":"websocket out","name":"","server":"","client":"a3c2ed71.5c3d1","x":643,"y":272,"z":"2b1b35ba.d4e4ca","wires":[]},{"id":"80afc33f.7f504","type":"inject","name":"R1 ON","topic":"","payload":"{\"dev\":\"relay\", \"circuit\":\"1\", \"value\":\"1\"}","payloadType":"string","repeat":"","crontab":"","once":false,"x":363,"y":199,"z":"2b1b35ba.d4e4ca","wires":[["c7a9d1f1.38563"]]},{"id":"3964a515.c69b5a","type":"inject","name":"R1 OFF","topic":"","payload":"{\"dev\":\"relay\", \"circuit\":\"1\", \"value\":\"0\"}","payloadType":"string","repeat":"","crontab":"","once":false,"x":357,"y":273,"z":"2b1b35ba.d4e4ca","wires":[["c7a9d1f1.38563"]]},{"id":"aa9c56df.5563a8","type":"inject","name":"AO set 5V a","topic":"","payload":"{\"dev\":\"ao\", \"circuit\":\"1\", \"value\":\"5\"}","payloadType":"string","repeat":"","crontab":"","once":false,"x":363,"y":114,"z":"2b1b35ba.d4e4ca","wires":[["c7a9d1f1.38563"]]}]

Tento příklad ukazuje jen základní příkazy, funkční kódy ale lze využít i pro popis vlastního chování a tvorbu komplexních funkčních bloků. 

UniPi na cloudu

Rozšíříme předchozí příklad tím, že dáme UniPi možnost komunikovat s cloudovou službou Bluemix skrze MQTT frontu na iot.eclipse.org, která poskytuje volné sandboxové prostředí pro testování IoT projektů.
Po registraci k free trialu na Bluemixu běžte do konzole a v Katalogu v kategorii Boilerplates najděte spouštěč Node-RED. Následně dejte své aplikaci název a vyplňte jméno hostitele. Po kliknutí na tlačítko "Create" vyčkejte na spuštění aplikace a následně se podívejte do svého Node-Red flow editoru na Bluemixu. 
Na iot.eclipse.org nemusíte vytvářet žádný účet. Stačí jen vytvořit unikátní téma (např. UniPi_to_Bluemix or Bluemix_to_UniPi), aby nedošlo k promíchání vašich příchozích zpráv se zprávami ostatních uživatelů sandboxu. 

Node-RED - UniPi

Jste připraveni? Kódujmež! Nebo spíše...flowujmež? 

Nyní musíte jednotce UniPi říci, aby všechny zprávy zasílala na MQTT server a aby zároveň zprávy i příjímala. K tomu je třeba vytvořit vstupní a výstupný MQTT síťové uzly. Ujistěte se, že názvy témat se neshodují, aby se vám nepromíchaly zprávy pro UniPi a Bluemix. Níže je rozšířená verze předchozího příkazu - tentokrát i s debug módem, abyste mohli sledovat, jaké zprávy jsou předávány: 

[{"id":"a3c2ed71.5c3d1","type":"websocket-client","path":"ws://127.0.0.1/ws","wholemsg":"false"},{"id":"b826f19f.47d91","type":"mqtt-broker","broker":"iot.eclipse.org","port":"1883","clientid":""},{"id":"821258ce.7deda8","type":"mqtt in","name":"","topic":"Bluemix -> Unipi Topic","broker":"b826f19f.47d91","x":341,"y":422,"z":"2b1b35ba.d4e4ca","wires":[["c7a9d1f1.38563","f950058b.06aff8"]]},{"id":"c7a9d1f1.38563","type":"websocket out","name":"","server":"","client":"a3c2ed71.5c3d1","x":643,"y":272,"z":"2b1b35ba.d4e4ca","wires":[]},{"id":"80afc33f.7f504","type":"inject","name":"R1 ON","topic":"","payload":"{\"dev\":\"relay\", \"circuit\":\"1\", \"value\":\"1\"}","payloadType":"string","repeat":"","crontab":"","once":false,"x":363,"y":199,"z":"2b1b35ba.d4e4ca","wires":[["c7a9d1f1.38563"]]},{"id":"3964a515.c69b5a","type":"inject","name":"R1 OFF","topic":"","payload":"{\"dev\":\"relay\", \"circuit\":\"1\", \"value\":\"0\"}","payloadType":"string","repeat":"","crontab":"","once":false,"x":357,"y":273,"z":"2b1b35ba.d4e4ca","wires":[["c7a9d1f1.38563"]]},{"id":"aa9c56df.5563a8","type":"inject","name":"AO set 5V a","topic":"","payload":"{\"dev\":\"ao\", \"circuit\":\"1\", \"value\":\"5\"}","payloadType":"string","repeat":"","crontab":"","once":false,"x":363,"y":114,"z":"2b1b35ba.d4e4ca","wires":[["c7a9d1f1.38563"]]},{"id":"efd26312.102da","type":"websocket in","name":"","server":"","client":"a3c2ed71.5c3d1","x":364,"y":627,"z":"2b1b35ba.d4e4ca","wires":[["69420e76.96bdf","f950058b.06aff8"]]},{"id":"69420e76.96bdf","type":"mqtt out","name":"","topic":"Unipi -> Bluemix Topic","qos":"","retain":"","broker":"b826f19f.47d91","x":629,"y":627,"z":"2b1b35ba.d4e4ca","wires":[]},{"id":"f950058b.06aff8","type":"debug","name":"","active":true,"console":"false","complete":"payload","x":616,"y":490,"z":"2b1b35ba.d4e4ca","wires":[]}]

 

Node-RED - Bluemix
Na svém Bluemix účtu spusťte Node-RED flow editor a importujte následující kód:

[{"id":"69cf13da.9630ec","type":"mqtt-broker","broker":"iot.eclipse.org","port":"1883","clientid":""},{"id":"3587e3c4.ca781c","type":"inject","name":"Set Relay 1 ON","topic":"UniPi_test_BM","payload":"{\"dev\":\"relay\", \"circuit\":\"1\", \"value\":\"1\"}","payloadType":"string","repeat":"","crontab":"","once":false,"x":523,"y":468,"z":"c8ebff8.f3714","wires":[["4640a6f1.b9bf58"]]},{"id":"47d95b68.b826a4","type":"inject","name":"Set Relay 1 OFF","topic":"UniPi_test_BM","payload":"{\"dev\":\"relay\", \"circuit\":\"1\", \"value\":\"0\"}","payloadType":"string","repeat":"","crontab":"","once":false,"x":525,"y":514,"z":"c8ebff8.f3714","wires":[["4640a6f1.b9bf58"]]},{"id":"4640a6f1.b9bf58","type":"mqtt out","name":"","topic":"Bluemix -> Unipi Topic","qos":"","retain":"","broker":"69cf13da.9630ec","x":761,"y":487,"z":"c8ebff8.f3714","wires":[]},{"id":"e33d237b.1cc2e","type":"mqtt in","name":"","topic":"Unipi -> Bluemix Topic","broker":"69cf13da.9630ec","x":262,"y":188,"z":"c8ebff8.f3714","wires":[["d52e5b57.2ad1a8","d73a77d5.28c588","3d062bfd.c2f9d4"]]},{"id":"d52e5b57.2ad1a8","type":"function","name":"IN 1-7 -> RELAY 1-7","func":"var status = JSON.parse(msg.payload);\nvar msg = {};\nif (status.dev == \"input\" && status.circuit<8) {\n\t//leave the relay 8 to the temp control node\n\tif (status.value == 0) {\n\t\tmsg.payload = {\"dev\":\"relay\", \"circuit\":\"\", \"value\":\"0\"};\n\t\tmsg.payload[\"circuit\"] = status.circuit;\n\t}\n\telse {\n\t\tmsg.payload = {\"dev\":\"relay\", \"circuit\":\"\", \"value\":\"1\"};\n\t\tmsg.payload[\"circuit\"] = status.circuit;\n\t}\n\treturn msg;\n}\nelse return;\n","outputs":1,"x":512,"y":349,"z":"c8ebff8.f3714","wires":[["4640a6f1.b9bf58","95b369c3.6a4c98"]]},{"id":"d73a77d5.28c588","type":"function","name":"Temp >= 26 -> R8 On","func":"var status = JSON.parse(msg.payload);\nvar newMsg = {};\nif (status.dev == \"temp\" && status.address==\"28E9E194040000C7\") {\n\tnewMsg.payload = {\"dev\":\"relay\", \"circuit\":\"8\"}\n\tif (status.value>=26) newMsg.payload[\"value\"]=1;\n\telse newMsg.payload[\"value\"]=0;\n\treturn newMsg;\n}\nelse return;","outputs":1,"x":509,"y":397,"z":"c8ebff8.f3714","wires":[["4640a6f1.b9bf58","c5f28a6b.3a0d78"]]},{"id":"95b369c3.6a4c98","type":"debug","name":"","active":true,"console":"false","complete":"payload","x":768,"y":349,"z":"c8ebff8.f3714","wires":[]},{"id":"c5f28a6b.3a0d78","type":"debug","name":"","active":true,"console":"false","complete":"false","x":768,"y":396,"z":"c8ebff8.f3714","wires":[]},{"id":"3d062bfd.c2f9d4","type":"debug","name":"","active":true,"console":"false","complete":"false","x":531,"y":188,"z":"c8ebff8.f3714","wires":[]}]

Výsledkem bude vytvoření vstupních i výstupních MQTT uzlů (ujistěte, se, že mají názvy odpovídající uzlům na UniPi) a několika debug uzlů (ty můžete vypnout skrze zelené tlačítko napravo, případně je můžete úplně smazat). Zároveň také dojde k vytvoření těch samých inject uzlů na UniPi pro ovládání relé modulů. Co ovšem nebude vytvořeno je inject uzel pro nastavení výstupní analogové hodnoty. Zkuste si to sami, ať už vytvořením nového uzlu či exportem inject uzlu z UniPi a jeho importem do Bluemixu. 

Rovněž jsme vytvořili dva upravené funkční uzly, abyste získali základní povědomí o tom, jak funguje psaní vlastního chování. Vrchní uzel nazvaný "IN 1-7 -> RELAY 1-7" reaguje na zprávy obsahující informace o digitálních vstupech UniPi a podle nich spíná a vypíná relé. Pokud tedy sepnete digitální vstup 1, sepne se i relé 1. 

Druhý funkční uzel je nazvaný "Temp >=26 -> R8 On" ovládá relé 8 podle teplotních údajů odečtených z 1-Wire senzoru napojeného k UniPI. Pokud teplota senzoru překročí 26 °C, relé 8 se sepne, při nižší teplotě se ale naopak vypne. Zde bude třeba upravit adresu senzoru funkčního uzlu tak, aby odpovídala adrese senzoru (pokud potřebujete zjistit adresu senzorů připojených k UniPi, spusťe síť EVOKu na portu 80 vašeho UniPi). 

Nejlepší na tomto příkladu je fakt, že všechny funkční uzly můžete exportovat a následně je importovat do Node-RED instance v UniPi, propojit je mezi websockety UniPi (WS out -> function in, function out -> WS in) a následně bude vše ihned pracovat bez zpoždění způsobeného dobou odesílání zpráv po síti. Zároveň tak odpadá potřeba spolehlivého síťového připojení. Také jde o vynikající příklad toho, jak napojit kritické funkční uzle na lokální zařízení a nechat cloud, aby se postaral o ukládání logů vašich dat do databáze či o poskytování webového rozhraní se základní kontrolní funkcí.

Díly

UniPi 1
Unipi 1.1

Unipi 1.1

3 999 Kč
3 305 Kč bez DPH

Skladem > 50 ks
Dalších > 20 ks do 10 dnů od objednání

Přihlásit k odběru novinek