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:54] – 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 142: | Řádek 142: | ||
</ | </ | ||
+ | Restartuju kontejner a při startu se mi už ke konfiguraci načítá přihlašovací obrazovka. | ||
+ | |||
+ | {{: | ||
+ | |||
+ | |||
+ | |||
+ | ===== 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> |