Node-RED: mudanças entre as edições

De Wiki Cursos IFPR Foz
Ir para navegaçãoIr para pesquisar
 
(17 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 1: Linha 1:
=Node-RED=
=Node-RED=


O '''[https://nodered.org/ Node-RED]''' é uma ferramenta de programação '''''Low Code''''', voltada para '''Internet das Coisas''', que permite interligar dispositivos físicos, ambientes de desenvolvimento de software e serviços em nuvem.
O '''[https://nodered.org/ Node-RED]''' é uma ferramenta de programação '''''Low Code''''', voltada para '''Internet das Coisas''', que permite interligar dispositivos físicos, ambientes de desenvolvimento de software ''online'' e serviços em nuvem.


Site: [https://knolleary.net  knolleary:  Words and things by Nick O'Leary]
Site: [https://knolleary.net  knolleary:  Words and things by Nick O'Leary]


==Instalação==
==Execução e utilização do Node-RED==


===Instalação no Ubuntu===
;Execução: Uma vez instalado no ambiente do Ubuntu, o '''Node-RED''' pode ser executado a partir de um terminal com o comando:
node-red
 
;Utilização: O '''Node-RED''' provê um editor de programação a partir de um '''navegador''', permitindo a construção de '''fluxos de programação'''  '''''Low Code'''''  a partir de um grande número de '''nós''' disponíveis na paleta de opções.
 
:Se instalado em uma máquina local, o acesso ao Node-RED é realizado pela URL:
localhost:1880
 
;Instalação de módulos Node-RED: Além dos '''nós''' básicos, diversos '''módulos''' podem ser instalados na paleta de opções do Node-RED.
 
Menu -> Manage palette -> Install -> Search
 
==Instalação no Ubuntu==


Instalando com '''npm''' (comando do '''node.js''')<ref>https://nodered.org/docs/getting-started/local</ref>
Instalando com '''npm''' (comando do '''node.js''')<ref>https://nodered.org/docs/getting-started/local</ref>
Linha 13: Linha 25:
  sudo npm install -g --unsafe-perm node-red
  sudo npm install -g --unsafe-perm node-red


====Instalação de módulos no node-red====
Se o '''npm''' não tiver instalado, deve ser instalado antes o '''nodejs''':
 
sudo apt install nodejs
;Menu
:verificar versão:
  Manage palette -> Install -> Search
  nodejs -v
 
:instalar npm:
;Módulos sugeridos para instalação para trabalho com IoT:  
  sudo apt install npm
  Arduino -> node-red-node-arduino, node-red-node-serialport
Firebase -> node-red-contrib-firebase


===Instalação com Docker===
==Instalação com Docker==


Necessita instalação prévia do '''[[Docker]]''' <ref name=Docker>https://nodered.org/docs/getting-started/docker</ref>.  
Necessita instalação prévia do '''[[Docker]]''' <ref name=Docker>https://nodered.org/docs/getting-started/docker</ref>.  
Linha 45: Linha 55:
  docker start node-red
  docker start node-red


====Preservação dos Dados do Usuário====
===Preservação dos Dados do Usuário===


Com o '''Node-RED''' rodando em um contêiner '''Docker''', caso o contêiner seja destruído os '''dados''' com os fluxos construídos pelo usuário serão perdidos. Para preservar estes dados é possível montar um diretório em um local externo ao contêiner <ref name=Docker>https://nodered.org/docs/getting-started/docker</ref>.
Com o '''Node-RED''' rodando em um contêiner '''Docker''', caso o contêiner seja destruído os '''dados''' com os fluxos construídos pelo usuário serão perdidos. Para preservar estes dados é possível montar um diretório em um local externo ao contêiner <ref name=Docker>https://nodered.org/docs/getting-started/docker</ref>.
Linha 62: Linha 72:
  nodered/node-red        - the image to base it one
  nodered/node-red        - the image to base it one


====Acesso as portas seriais USB====
===Acesso as portas seriais USB===


Referência <ref>https://www.losant.com/blog/how-to-access-serial-devices-in-docker</ref>
Referência <ref>https://www.losant.com/blog/how-to-access-serial-devices-in-docker</ref>
Linha 89: Linha 99:
  docker run -it -p 1880:1880 --device=/dev/ttyUSB0:/dev/ttyUSB0 --user=root --name node-red nodered/node-red
  docker run -it -p 1880:1880 --device=/dev/ttyUSB0:/dev/ttyUSB0 --user=root --name node-red nodered/node-red


===Instalação na AWS Amazon EC2 com Ubuntu===
<!--==Instalação na AWS Amazon EC2 com Ubuntu==


Procedimentos <ref>https://nodered.org/docs/getting-started/aws#running-on-elastic-beanstalk-with-high-availabilty</ref>:
Procedimentos <ref>https://nodered.org/docs/getting-started/aws#running-on-elastic-beanstalk-with-high-availabilty</ref>:
Linha 111: Linha 121:
Rodar Node-RED:
Rodar Node-RED:
  node-rede -v
  node-rede -v
-->


==Node-RED e Arduino com protocolo Firmata==
==Laboratórios com Node-RED==
 
Referência:  <ref>https://nodered.org/docs/faq/interacting-with-arduino</ref>.
 
Para interação com '''Arduíno''' o '''módulo''' correspondente deve ser instalado no '''Node-RED''':
'''node-red-node-arduino'''
 
O '''Node-RED''' se comunica com o '''Arduíno''' através da '''serial USB''' utilizando o protocolo '''Firmata'''. Para tal a '''biblioteca''' '''Firmata''' deve ser instalada no '''Arduíno''' e deve ser carregado o ''sketch'' '''StandardFirmata'''.
 
;Capacidades: O Arduíno suporta os seguintes modos de operação:
*Entradas e saídas digitais: Valores 0 ou 1
*Entradas analógicas: Valores 0 a 1023
*Saídas PWM (analógicas): Valores 0 a 255
*Saídas servo: 0 a 180
 
No '''Node-RED''' os nós '''arduino in''' e '''arduino out''' permitem interação com um '''Arduíno''' conectado a serial e rodando o sketch StandardFirmata.
 
;arduino in: Permite selecionar '''entradas digitais ou analógicas'''. Os '''valores''' são lidos em '''msg.payload''' e o '''número do pino''' como '''msg.topic'''.
 
:Quando uma entrada do Arduíno é modificada o Node-RED é imediatamente notificado.
:*Este processo '''funciona bem''' para as '''entradas digitais'''.
:*Para as '''entradas analógicas''' podem ser obtidos muitos valores, os quais devem ser manuseados. Por exemplo, pode-se usar um '''atraso''' para ajustar um tempo de amostragem e descartar valores intermediários. Outra opção é utilizar um nó '''rbe''' (''Report by Exception node'') e configurar para reportar mudanças somente a partir de um dado montante de variação.
 
;arduino out: Permite selecionar '''saídas digitais''', '''analógicas''' (PWM) ou tipo '''servo'''. Espera '''valores''' numéricos inteiros em '''msg.payload''' para transferir ao Arduíno.
 
;Programação em blocos no Node-RED
 
[[Arquivo:NodeRED-ArduinoFirmata.png|800px]]
 
==Node-RED e Arduino com comunicação serial==
 
Para interação com '''Arduíno''' o '''módulo''' correspondente deve ser instalado no '''Node-RED''':
'''node-red-node-serialport'''
 
Como exemplo foi utilizado um '''Arduino UNO''' ao qual foram acoplados um '''led''' para controle e um '''sensor de temperatura''' DHT22. A comunicação entre o Arduíno e o Node-RED é realizada via comunicação serial, com o Arduíno enviando periodicamente os dados de temperatura e umidade e esperando comandos para o led.
 
;Código fonte Arduino: O '''código''' Arduino abaixo descreve o cenário da aplicação .
 
<syntaxhighlight lang="c">
/*       
Comunicação com Arduino via serial com NodeRED
Transmite: Medida de temperatura e umidade (DHT22)
Rebebe: Comandos para acionamento de led
*/
 
#include "DHT.h"
#define DHTPIN 2    // Digital pin connected to the DHT sensor
#define DHTTYPE DHT22  // DHT 22  (AM2302), AM2321
DHT dht(DHTPIN, DHTTYPE);
 
const int ledPin = 13; // the pin that the LED is attached to
int incomingByte;      // a variable to read incoming serial data into
 
unsigned long lastMsg;
 
void setup() {
  Serial.begin(57600);
  pinMode(ledPin, OUTPUT);
  dht.begin();
 
}
 
void loop() {
  //Verifica se há dados chegando na porta serial para controle do led
  if (Serial.available() > 0) {
    incomingByte = Serial.read();
    if (incomingByte == 'H') {
      digitalWrite(ledPin, HIGH);
    }
    if (incomingByte == 'L') {
      digitalWrite(ledPin, LOW);
    }
  }
  //A cada 2s realiza leitura do sensor DHT22 e imprime dados na serial
  unsigned long now = millis();
  if (now - lastMsg > 2000) {
    lastMsg = now;
    //Lê sensor DHT22
    float h = dht.readHumidity();
    float t = dht.readTemperature();
    if (isnan(h) || isnan(t)) {
      Serial.println(F("Failed to read from DHT sensor!"));
      return;
      }
    //Dados de umidade e temperatura são impressos separados por ","
    Serial.print(h);
    Serial.print(F(","));
    Serial.print(t);
    }
}
</syntaxhighlight>
 
;Programação em blocos no Node-RED
 
[[Arquivo:NodeRED-serial.png|800px]]
 
Os dados de '''umidade''' e '''temperatura''' recebidos pela '''entrada serial''' são separados na forma de vetor pelo nó '''split''', convertidos para números pelo nó '''to number''' e  separados em duas saídas pelo nó '''switch'''.
 
Os comandos para '''acionamento do led''' enviam pela serial os caracteres H ou L.
 
==Node-RED e Arduino via brocker Moquitto ==
 
Veja exemplo descrito em [[MQTT_e_Arduino_ou_ESP#Experimento:_MQTT_e_Arduino|Experimento: MQTT e Arduino]]
 
;Programação em blocos no Node-RED
 
[[Arquivo:NodeRED-Arduino-MQTT.png|800px]]
 
==Node-RED e ESP8266 via brocker Moquitto ==
 
Veja exemplo descrito em [[MQTT_e_Arduino_ou_ESP#Experimento:_MQTT_e_ESP8266|Experimento: MQTT e ESP8266]]
 
;Programação em blocos no Node-RED
 
[[Arquivo:NodeRED-ESP8266-MQTT.png|800px]]
 
==Node-RED e Firebase==
 
Permite a interação do '''Node-RED''' com a '''plataforma de computação em nuvem Firebase''' mantida pela '''Google'''. Para tal o '''módulo''' correspondente deve ser instalado no '''Node-RED''':
'''node-red-contrib-firebase'''
 
'''Dados''' manuseados pelo '''Node-RED''' podem ser salvos no '''Firebase Realtime database''', o qual implementa um '''banco de dados''' '''NoSQL''' que fornece as aplicações clientes atualizações em tempo real (“''realtime''” ''updates'') quando os dados mudam na base de dados. As '''operações básicas''' no '''banco de dados''' são:
*set() - Salva dado em uma referência específica, substituindo o valor anterior.
*push() - Adiciona dado em uma lista de valores.
*once() - Lê dado de uma referência e acompanha qualquer mudança no mesmo.
 
O nó '''firebase modify''' permite '''modificar''' ou '''adicionar dados''' no banco de dados do '''Firebase'''.
 
;Exemplos de uso:
*[[Node-RED#Node-RED_e_ESP8266_via_brocker_Moquitto|Node-RED e ESP8266 via brocker Moquitto]]
*[[Node-RED#Node-RED_e_Arduino_via_brocker_Moquitto|Node-RED e Arduino via brocker Moquitto]]
*[[Node-RED#Node-Node-RED_e_Raspberry_Pi|Node-RED e Raspberry Pi]]
 
==Node-RED e Raspberry Pi==
 
Com um '''Raspberry Pi''' rodando o '''Node-RED''' e fácil de interagir com '''sensores''' e '''atuadores''' conectados as '''portas GPIO''' através da '''Web'''.
 
Este laboratório foi inspirado no post <ref>https://www.filipeflop.com/blog/sensor-dht11-com-node-red-e-raspberry-pi/</ref>, que mostra coletar dados de umidade e temperatura através do sensor DHT11 conectados a um Raspberry Pi através do Node-RED.
 
;Instalação do Node-RED: Pode ser instalado diretamente pela interface gráfica do Raspberry Pi no caminho:
Preferências/Recommended Software/Programming/Node-RED
:ou via terminal de comandos, como sugerido em <ref>https://nodered.org/docs/getting-started/raspberrypi</ref>
bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
:este comando instala o '''Node.js''', '''npm''' e '''Node-RED''' no Raspberry Pi e também pode ser usado para realizar a atualização de uma instalação existente.
 
;Inicialização do Node-RED:O Node-RED é iniciado no Raspberry Pi diretamente pelo terminal com o comando:
node-red-start
:e pode ser parado com CTRL-C.
 
;Acesso via Web do Node-RED: Através de um navegador pode-se acessar diretamente o Node-RED rodando no Raspberry Pi através da URL:
<Endereço IP>:1880
 
===Acionamento de led===
 
;Hardware:
*Para acionamento de um '''led''', ou outro dispositivo comandado por '''saída digital''', conectar o dispositivo na '''porta GPIO''' escolhida, utilizando um resistor limitador de corrente no caso do led.
 
;Node-RED:
*Utilizar blocos '''inject''' para enviar os comandos ao '''led''', um configurado para enviar o comando numérico 0 e o outro 1, pois as saídas digitais aceitam somente comandos numéricos 0 e 1.
*Conectar ambos os blocos '''inject''' em um bloco '''rpi gpio out''' e configurar com a porta na qual o led for conectado.
 
===Sensor de temperatura e umidade DHT22===
 
;Hardware:
*Conectar os pinos do sensor '''DHT22''' ao '''Raspberry Pi''' conforme a figura. Conectar um '''resistor''' de '''10 K&Omega;''' entre a saída de dados do sensor e a alimentação 5 V ('''resistor pull up''').
            ________
            |        |
            | DHT 22 |
            |________|
              | | | |
    (5 V) ----+ |  +---- (terra)
                +---(gpio)
 
;Node-RED:
*Instalar blocos para interação com sensor DHT22: Manage Palette/Install
'''node-red-contrib-dht-sensor'''
*Utilizar um bloco '''inject'''  configurado para enviar '''timestamp''' em intervalos de 15 segundos ao sensor.
*Conectar a saída do bloco '''inject''' a um bloco '''rpi dht22''' e configurar com a porta na qual o sensor for conectado.
*Conectar a saída do bloco '''rpi dht22''' a um bloco '''debug''' para acompanhar as informações enviadas pelo sensor.
 
===Programação em blocos no Node-RED===


[[Arquivo:NodeRED-RaspberryPi.png|800px]]
;[[Node-RED Laboratorios: Firmata, Serial e Ethernet]]
;[[Node-RED Laboratorios: MQTT]]
;[[Raspberry Pi: Laboratorios Node-RED|Node-RED Laboratorios: Raspberry Pi]]


==Referências==
==Referências==

Edição atual tal como às 12h32min de 8 de agosto de 2023

Node-RED

O Node-RED é uma ferramenta de programação Low Code, voltada para Internet das Coisas, que permite interligar dispositivos físicos, ambientes de desenvolvimento de software online e serviços em nuvem.

Site: knolleary: Words and things by Nick O'Leary

Execução e utilização do Node-RED

Execução
Uma vez instalado no ambiente do Ubuntu, o Node-RED pode ser executado a partir de um terminal com o comando:
node-red
Utilização
O Node-RED provê um editor de programação a partir de um navegador, permitindo a construção de fluxos de programação Low Code a partir de um grande número de nós disponíveis na paleta de opções.
Se instalado em uma máquina local, o acesso ao Node-RED é realizado pela URL:
localhost:1880
Instalação de módulos Node-RED
Além dos nós básicos, diversos módulos podem ser instalados na paleta de opções do Node-RED.
Menu -> Manage palette -> Install -> Search

Instalação no Ubuntu

Instalando com npm (comando do node.js)[1]

sudo npm install -g --unsafe-perm node-red

Se o npm não tiver instalado, deve ser instalado antes o nodejs:

sudo apt install nodejs
verificar versão:
nodejs -v
instalar npm:
sudo apt install npm

Instalação com Docker

Necessita instalação prévia do Docker [2].

docker run -it -p 1880:1880 --name node-red nodered/node-red
Detalhando o comando [2]:
docker run              - run this container... initially building locally if necessary
-it                     - attach a terminal session so we can see what is going on
-p 1880:1880            - connect local port 1880 to the exposed internal port 1880
--name node-red         - give this machine a friendly local name
nodered/node-red        - the image to base it one
Navegar normalmente:
http://{host-ip}:1880
Para sair do terminal Docker:
Ctrl-p Ctrl-q - the container will keep running in the background.
Voltar ao terminal:
docker attach node-red
Parar o contêiner com Node-Red
docker stop node-red
Reiniciar o contêiner:
docker start node-red

Preservação dos Dados do Usuário

Com o Node-RED rodando em um contêiner Docker, caso o contêiner seja destruído os dados com os fluxos construídos pelo usuário serão perdidos. Para preservar estes dados é possível montar um diretório em um local externo ao contêiner [2].

Dentro do contêiner Node-RED usa o diretório /data para armazenar os dados do usuário. Para salvar este diretório em um local externo pode-se utilizar o comando abaixo. Neste caso, para acesso a este diretório externo, o usuário do Node-RED dentro do contêiner (default UID 1000) deve ter o mesmo UID do usuário no hospedeiro.

docker run -d -u 1000:1000 -p 1880:1880 -v /home/$USER/node-red-backup:/data --name node-red nodered/node-red
Detalhando o comando:
docker run              - run this container... initially building locally if necessary
-d                      - run in background and print container ID
-u                      - uid 
-p 1880:1880            - connect local port 1880 to the exposed internal port 1880
-v                      - bind mount volume
--name node-red         - give this machine a friendly local name
nodered/node-red        - the image to base it one

Acesso as portas seriais USB

Referência [3]

O acesso as portas seriais USB é necessário para integração com Arduíno, ou outros dispositivos, via serial usando o módulo node-red-node-serialport.

Por padrão as portas seriais são montadas pelo root, portanto com acesso privilegiado, e são efêmeras, existindo apenas quando o dispositivo está plugado no computador.

Para que outros usuários, e no caso o Docker, possam acessar as portas devemos incluir uma regra para acesso ao udev, criando um arquivo no diretório:

/etc/udev/rules.d/99-serial.rules

e adicionar as linhas:

KERNEL=="ttyUSB[0-9]*",MODE="0666" 
KERNEL=="ttyACM[0-9]*",MODE="0666" 

Para que o Docker possa acessar os dispositivos conectados a serial, devemos montar todo o diretório /dev quando rodarmos o Docker, usando o parâmetro

-v /dev:/dev

e atribuir permissão para acesso com

--privileged

O comando completo para rodar o Docker é:

docker run -it -p 1880:1880 -v /dev:/dev --privileged --name node-red nodered/node-red
Dispositivo permanentemente conectado
Caso o dispositivo fique permanentemente conectado pode-se explicitar a porta serial usada pelo dispositivo. Por exemplo, o Arduíno UNO usa a porta /dev/ttyACM0:
docker run -it -p 1880:1880 --device=/dev/ttyACM0:/dev/ttyACM0 --user=root --name node-red nodered/node-red
ou, para outro dispositivo, deve-se verificar a porta utilizada, por exemplo:
docker run -it -p 1880:1880 --device=/dev/ttyUSB0:/dev/ttyUSB0 --user=root --name node-red nodered/node-red


Laboratórios com Node-RED

Node-RED Laboratorios: Firmata, Serial e Ethernet
Node-RED Laboratorios: MQTT
Node-RED Laboratorios: Raspberry Pi

Referências

Evandro.cantu (discussão) 13h47min de 1 de junho de 2020 (-03)