Node-RED es una herramienta creada por IBM y fuertemente orientada a IOT, se trata de un software bastante sencillo de utilizar sobre todo con Raspberry Pi.
Node-RED es una herramienta muy potente que sirve para comunicar hardware y plataformas de software de una forma muy rápida y sencilla. Simplifica enormemente la tarea de programar del lado del servidor gracias a la programación visual.
Fue creada por Nick O’Leary y Dave Conway-Jones del grupo IBM. Su objetivo es dar solución a la complejidad que surge cuando queremos integrar nuestro hardware con otros servicios, básicamente es una colección de nodos cada uno con una función específica y que en si mismo es una capa de software que cubre la complejidad de su trabajo haciendo la vida del programador mas simple, estos nodos se conectan entre si lo que origina un flujo de datos entre nodos. Aparte de los nodos disponibles por defecto existen repositorios de nodos donde los usuarios desarrollan nodos de acuerdo a sus propias necesidades y los publican para que podamos agregarlos a NODE-RED.

Su funcionamiento tiene los pilares de NodeJS y la librería de JavaScript D3.js.
NodeJS proporciona la potencia suficiente para que Node-RED sea fiable y escalable. NodeJS es un software muy potente que permite la programación en JavaScript del lado del servidor.

Sus ventaja más importante es que está optimizado para poder tratar múltiples conexiones concurrentes de una manera óptima. Es el mayor ecosistema de código abierto que existe en el mundo y está siendo utilizado por empresas como PayPal y Netflix.
Por otro lado, D3.js es el encargado de la interfaz web, Node-RED es accesible a través de un navegador es decir, sólo necesitamos acceder a una página web para poder crear nuestros propios sistemas, no hace falta instalar ningún entorno de desarrollo o IDE todo se trabaja desde el navegador, podremos arrastrar y conectar nodos con diferentes funcionalidades para crear flujos de datos que hagan una determinada cosa.

Por ejemplo, podemos suscribirnos a un topic de MQTT, recibir un dato de temperatura y humedad y mostrarlo en un panel de control a través de una página web.
Si bien no es necesario tener que escribir una línea de código, esto no quiere decir que no debamos conocer la programación, al contrario.
Se requiere unos altos conocimientos de lógica y programación para desarrollar proyectos con Node-RED sobre todo si consideramos que podemos conectar con servicios de terceros como FTTT, ThingSpeak, Google Home, ThingerIO, etc.
Node-RED es de código abierto y está mantenido por IBM, se puede instalar en cualquier sistema operativo incluyendo Raspbian para Raspberry Pi.
Como no tenemos que profundizar en tecnologías complejas difíciles de implementar y programar esto permite crear prototipos muy rápidamente sin tener que invertir horas y horas programando en un lenguaje de alto nivel.

Para ver su funcionamiento vemos un ejemplo simple donde un sensor HDC1000 (Temperatura y Humedad) envía datos a un ESP32, también vamos a controlar de manera remota un LED conectado en el pin 5 de la placa con el ESP32 todo esto conectado a la red Wi-Fi funcionando mediante MQTT.

Los nodos necesarios para hacer esto son los siguientes.También se ha definido un DashBoard donde los los datos son mostrados y también podemos actuar sobre el estado del LED.

Se puede acceder a la herramienta NOD-RED desde cualquier lugar con el navegador apuntado a la dirección IP donde se encuentre y el puerto 1880, el DashBoard se encuentra en la misma dirección con el agregado 1880/ui.

 El código para el ESP32 es el siguiente.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/********************************************************* 
 *  ESP32 cumple con dos tareas: 
 *  1- Leer datos desde un sensor HDC1000.
 *  2- Controlar el encendido y apagado de LED en GPIO_5
*********************************************************/
 
#include <WiFi.h>
#include <PubSubClient.h>
#include "HDC1000.h"
HDC1000 hdc1000;
 
static char Temperatura[7];
static char Humedad[7];
static char cadena[14];
static char cadena_old[14];
 
const char* ssid     = "Local_RED_Ing";
const char* password = "eDiSoN_2020";
 
// IP del servidor MQTT
const char* mqtt_server = "192.168.0.124";
 
float t = 0.0, h = 0.00;
boolean bandera = false;
 
// Crea una instancia del cliente PubSubClient
WiFiClient espClient;
PubSubClient client(espClient);
 
// GPIO_5 pin del LED
const char led = 5;
 
// Se definen los topicos o temas
#define TEMP_TOPIC   "firtec/dato1/temp"
#define HUM_TOPIC    "firtec/dato1/hum"
#define LED_TOPIC    "firtec/dato1/led" // 1 SI 0 NO
 
long lastMsg = 0;
char msg[20];
 
// Decodifica el mensaje publicado desde el movil
void receivedCallback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Recibido: ");
  Serial.println(topic);
 
  Serial.print("payload: ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
 
  if ((char)payload[0] == '1') {
    digitalWrite(led, HIGH);  // Si es 1 encender el LED
  } else {
   
    digitalWrite(led, LOW);  // Si es 0 apagar el LED
  }
 
}
 
void mqttconnect() {
  // Bucle de conexión
  while (!client.connected()) {
    Serial.print("MQTT conectando ...");
    // ID del cliente
    String clientId = "ESP32Client";
   
    if (client.connect(clientId.c_str())) {
      Serial.println("conectado!!");
      // Subscribir al tipico con QoS 0
      client.subscribe(LED_TOPIC);
    } else {
      Serial.print("Error, status code =");
      Serial.print(client.state());
      Serial.println("Intentar de nuevo en 5 segundos");
      delay(5000);
    }
  }
}
 
void setup() {
  Serial.begin(115200);
  Serial.println();
  Serial.print("Conectando con ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print("*");
  }
  // Configura el pin del LED como salida
  pinMode(led, OUTPUT);
 
  Serial.println("");
  Serial.println("WiFi conectado");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
 
  // Configura le IP del servidor y el puerto MQTT
  client.setServer(mqtt_server, 1883);
  /* Funcion receivedCallback que sera invocada cuando 
     el cliente reciba info de un subscripto */
  client.setCallback(receivedCallback);
  hdc1000.begin();
  
}
void loop() {
  // Si un cliente se desconecta esperar hasta que reconecte
  if (!client.connected()) {
    mqttconnect();
  }
  
  client.loop();
  /* Medir cada dos segundos, NO usar delay() puesto que esta es
     una funcion bloqueante */
  long now = millis();
  if (now - lastMsg > 2000) {
    if(bandera == false) {
    lastMsg = now;
    t = hdc1000.getTemperature();     
         if (t == HDC1000_ERROR_CODE) {
                hdc1000.begin();
                t = hdc1000.getTemperature();
          }
    
     snprintf (msg, 20, "%2.1f", t);   
     //Serial.println(msg);
     client.publish(TEMP_TOPIC, msg); 
     bandera = true; 
    }
    else {
      lastMsg = now;
      h = hdc1000.getHumidity();
 
          if (h== HDC1000_ERROR_CODE) {
           do{    
                hdc1000.begin(); 
                 h = hdc1000.getHumidity();
           }while(h > 100);       
          }
      snprintf (msg, 20, "%3.1f%%", h);    
      client.publish(HUM_TOPIC, msg);
      bandera = false;
      }
     } 
    }

 El servidor MQTT usado en este ejemplo se ejecuta en una Raspberry PI al igual que NODE-RED que se conecta a ese servidor y todo el conjunto es subido a la red Wi-Fi desde donde es accedido por cualquier navegador.
Como se puede ver en el vídeo una vez que los datos están publicados se los puede consultar incluso desde cualquier móvil en cualquier lugar del mundo.

Mas info en Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.