Rozdíly
Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
| Obě strany předchozí revize Předchozí verze Následující verze | Předchozí verze | ||
| it:iot:nodered [2023/01/04 22:56] – Petr Nosek | it:iot:nodered [2023/10/06 13:30] (aktuální) – [tutoriály na Node RED] Petr Nosek | ||
|---|---|---|---|
| Řádek 99: | Řádek 99: | ||
| Nejprve je potřeba vytvořit certifikáty. Protože jsem nechtěl vytvářet další certifikační autoritu, využil jsem certifikáty, | Nejprve je potřeba vytvořit certifikáty. Protože jsem nechtěl vytvářet další certifikační autoritu, využil jsem certifikáty, | ||
| - | Skript mi vytvořil certifikát **server-key.pem** a **server-cert.pem**. | + | Skript mi vytvořil certifikát **server-key.pem** a **server-cert.pem**. Jen pro úplnost. Node RED i Mosquitto mi běží na jednom serveru. Proto si mohu dovolit použít stejné certifikáty. Pokud by každá služba běžela na jiném serveru, musel bych vygenerovat nové certifikáty pro konkrétní IP adresu. |
| Poté jsem editoval konfigurační soubor **settings.js** pro Node RED ve kterém jsem zadal absolutní cesty k certifikátům a zapnul vyžadování HTTPS. Bez absolutních cest nemohl Node RED najít certifikáty: | Poté jsem editoval konfigurační soubor **settings.js** pro Node RED ve kterém jsem zadal absolutní cesty k certifikátům a zapnul vyžadování HTTPS. Bez absolutních cest nemohl Node RED najít certifikáty: | ||
| Řádek 146: | Řádek 146: | ||
| {{: | {{: | ||
| + | |||
| + | |||
| + | ===== spouštění příkazů mimo kontejner ===== | ||
| + | |||
| + | Protože Node RED běží v kontejneru, tak se všechny příkazy spustí uvnitř. V [[https:// | ||
| + | |||
| + | Nejprve je potřeba na straně docker kontejneru spusti následující: | ||
| + | |||
| + | <code bash> | ||
| + | docker exec -it nodered ssh-keygen -q -t ed25519 -C " | ||
| + | </ | ||
| + | |||
| + | Poté přenést klíč na raspberry, na kterém budu chtít povolit, aby se Node RED automaticky připojil. | ||
| + | |||
| + | <code bash> | ||
| + | docker exec -it nodered ssh-copy-id myrpiuser@192.168.1.20 | ||
| + | </ | ||
| + | |||
| + | A nyní mohu otestovat, zda to funguje. Spustím v kontejneru v Node RED příkaz, který vypíše obsah adresáře mého Raspberry. | ||
| + | |||
| + | <code bash> | ||
| + | docker exec -it nodered ssh myrpiuser@192.168.1.20 ls -l | ||
| + | </ | ||
| + | |||
| + | |||
| + | Pokud nechci zadávat dlouhé názvy serveru, mohu si vytvořit v kontejneru konfigurační soubor pro ssh. Soubor vytvořím v kontejneru v **/ | ||
| + | |||
| + | <code bash> | ||
| + | host iot-dev | ||
| + | hostname 192.168.1.20 | ||
| + | user myrpiuser | ||
| + | IdentitiesOnly yes | ||
| + | IdentityFile / | ||
| + | </ | ||
| + | |||
| + | |||
| + | Pro jistotu upravit práva: | ||
| + | |||
| + | <code bash> | ||
| + | chmod 644 config | ||
| + | sudo chown root:root config | ||
| + | </ | ||
| + | |||
| + | No a nyní mohu volat ssh příkazy jednodušeji. | ||
| + | |||
| + | <code bash> | ||
| + | docker exec -it nodered ssh iot-dev ls -l | ||
| + | </ | ||
| + | |||
| + | |||
| + | A tady ukázka z Node RED: | ||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | ===== node-red-node-mysql | ||
| + | |||
| + | Chtěl jsem využít node [[https:// | ||
| + | |||
| + | V Dockeru mi ale běží Node RED a chci, aby přistupoval k localhostu hostnovaného počítače, | ||
| + | |||
| + | První překážka k tomu, aby se Node RED dokázal připojit k databázi je, že pokud zadám v Node RED localhost, tak se bude snažit připojit na port MySQL databáze v Node RED, kde žádná databáze neběží. O mém problému popisuje tato [[https:// | ||
| + | |||
| + | Zkoušel jsem nejdříve, aby MySQL naslouchala na IP adrese síťového bridge Node RED, ale pak bych musel vyřadit naslouchání MySQL na localhostu. A to jsme nechtěl. Proto jsem zvolil variantu, kdy kontejner v Node RED dostane k dispozici localhost hostitelského počítače. Není to úplně doporučované řešení, nicméně aktuálně mi to problém řeší a tím, že Node RED také může běžet pouze na localhostu, tak mi to až tak nevadí. | ||
| + | |||
| + | Konfigurace Node RED pro docker-composer tedy vypadá takto (přidán parametr **network_mode: | ||
| + | |||
| + | <code yaml> | ||
| + | version: ' | ||
| + | |||
| + | services: | ||
| + | |||
| + | nodered: | ||
| + | container_name: | ||
| + | ports: | ||
| + | - ' | ||
| + | environment: | ||
| + | - LANG=cs_CZ.UTF-8 | ||
| + | - TZ=Europe/ | ||
| + | volumes: | ||
| + | - ' | ||
| + | image: nodered/ | ||
| + | network_mode: | ||
| + | |||
| + | </ | ||
| + | |||
| + | To mi pomohlo, aby byla databáze dostupná. Pak jsem ale narazil na to, že uživatel neměl do databáze přístup. Setkal jsem se s hlášením: | ||
| + | |||
| + | Z hostitelského počítače jsem problém s připojením neměl, takže to byl problém z kontejneru s Node RED. Někdo přede mnou měl také podobný problém: [[https:// | ||
| + | |||
| + | <code JavaScript> | ||
| + | const mysql = require(' | ||
| + | |||
| + | var connection = mysql.createConnection({ | ||
| + | host : ' | ||
| + | user : ' | ||
| + | port : ' | ||
| + | password : ' | ||
| + | database : ' | ||
| + | }); | ||
| + | |||
| + | |||
| + | connection.connect((err) => { | ||
| + | if(!err) | ||
| + | console.log(' | ||
| + | else | ||
| + | console.log(' | ||
| + | }); | ||
| + | </ | ||
| + | |||
| + | |||
| + | Skript jsem pak spustil v kontejneru: | ||
| + | |||
| + | <code bash> | ||
| + | node jmenoskriptu.js | ||
| + | </ | ||
| + | |||
| + | |||
| + | Nakonec jsem přišel na to, že problém byl v MySQL databázi u uživatele. Vytvořil jsem uživatele s omezeným oprávněním přístupu do databáze. Namísto uživatele **mujzivatel@localhost** jsem měl vytvořil uživatele **mujuzivatel@%**. Tady se promítá to, že nepřistupuji jako uživatel z localhostu, ale kontejneru. | ||
| + | |||
| + | |||
| + | V mém případě jsem u modulu zjistil ještě jednu zradu. Pro každý příkaz, který jde na nod MySQL, se vytvoří zvlášť připojení do MySQL databáze. Protože mám počet připojení do databáze limitovaný, | ||
| + | |||
| + | Dalším průzkumem jsem zjistil, že v pluginu je max connection nastaven na 50. Například [[https:// | ||
| + | |||
| + | Pro vypsání všech uživatelů a procesů v databázi slouží dotaz: | ||
| + | |||
| + | <code sql> | ||
| + | show processlist; | ||
| + | </ | ||
| + | |||
| + | |||
| + | V kódu pluginu jsem vyčetl tento řádek: | ||
| + | |||
| + | <code JavaScript> | ||
| + | connectionLimit: | ||
| + | </ | ||
| + | |||
| + | Řádek říká, že pokud je nastavená proměnná **RED.settings.mysqlConnectionLimit** v Node RED, tak vezme číslo z ní a pokud nastavená není, tak defaultní connectionLimit je 50. | ||
| + | |||
| + | Řešením pro mě bylo nastavit proměnnou v Node RED v souboru **settings.js**: | ||
| + | |||
| + | <code JavaScript> | ||
| + | module.exports = { | ||
| + | |||
| + | // tady přidávám proměnnou pro limit spojení s databází | ||
| + | // přidání musí být za definicí module.exports = { | ||
| + | mysqlConnectionLimit: | ||
| + | |||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Animace v Node RED ===== | ||
| + | |||
| + | Toto video popisuje práci s pluginem [[https:// | ||
| + | |||
| + | {{youtube> | ||
| + | |||
| + | Nabízí se připravit si v Inkscape SVG grafiku a pak jí v NodeRED dodělat " | ||
| + | |||
| + | {{youtube> | ||
| + | |||
| + | |||
| + | ===== tutoriály na Node RED ===== | ||
| + | |||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | |||
| + | |||
| + | {{youtube> | ||
| + | |||
| + | |||
| + | {{youtube> | ||
| + | ==== InfluxDB ==== | ||
| + | |||
| + | {{youtube> | ||
| + | |||
| + | ==== InfluxDB2 ==== | ||
| + | Zdá se, že je pouze pro 64 bit verzi operačního systému. Takže minimálně RPi4 a 64 bit verzi. | ||
| + | |||
| + | {{youtube> | ||
| + | |||
| + | {{youtube> | ||
| + | |||
| + | {{youtube> | ||