Tutorial de Node-RED: Cómo trabajar con MQTT y Raspberry PLC

Prueba la mensajería de publicación-suscripción en la automatización industrial y Raspberry Pi.
7 de septiembre de 2021 por
Tutorial de Node-RED: Cómo trabajar con MQTT y Raspberry PLC
Boot & Work Corp. S.L., Fernandez Queralt Martinez

Introducción

MQTT (o Message Queuing Telemetry Transport) es un protocolo de red ligero de publicación-suscripción que transporta mensajes entre dispositivos. 

MQTT es un protocolo de publicación/suscripción que permite a los dispositivos del borde de la red publicar en un intermediario. Los clientes se conectan a este intermediario, que media la comunicación entre los dispositivos. Cuando otro cliente publica un mensaje en un tema suscrito, el broker reenvía el mensaje a cualquier cliente que se haya suscrito.

En este post, aprenderás cómo leer la temperatura de un sensor de temperatura Dallas DS18B20 conectado a un Raspberry Pi industrial PLC. Si el valor es inferior a 25ºC, el mensaje se enviará a un tema MQTT, en caso contrario se enviará a otro tema MQTT que activará una salida de un segundo PLC basado en Raspberry Pi.

Enlaces relacionados

Cómo

Conectar un Raspberry PLC al Wi-Fi

Leer 

Raspberry PLC

Familia de productos para monitorización industrial

Ver 

Cómo

Programar las salidas de interrupción del Raspberry PLC con Python

Leer 

Conceptos básicos

Salidas Analógicas del Raspberry Pi PLC

Leer 

Touchberry Pi

Familia de productos para automatización industrial

Ver 

Cómo

Encontrar tu controlador lógico programable industrial perfecto

Leer 


Requisitos

Explicación

1. En primer lugar, vamos a conectar nuestro sensor Dallas al primer controlador PLC Raspberry Pi, que será nuestro MQTT-Broker.
 See how >

2. Conecta el PLC de código abierto Raspberry Pi a la fuente de alimentación y enciéndelo. A continuación,
configurarlo como MQTT-Broker e instalar Mosquitto >>>

3. Open Node-RED and make sure you can get the temperature from your Raspberry PLC. >>>

4. Añade un nodo de cambio y establece msg.payload a $number($trim(payload))/1000 para obtener el valor como un número flotante.

5. Con un nodo interruptor, cambia el valor en función de lo que sea. Si es mayor o igual a 25, irá a la primera salida. Si no, irá a la segunda salida.

6. Ahora, añade dos nodos mqtt-out, con el servidor como localhost. Si el valor de la temperatura es igual o superior a 25, añade un nodo mqtt con el tema: room/alert. En caso contrario, conecta el segundo nodo mqtt-out a la segunda salida con el tema room/temp

Por el momento, tu flujo debería ser algo así:

[{"id":"f5e89d62.2ca78","type":"tab","label":"Flow 1","disabled":false,"info":""},{"id":"c9ecc9ac.009798","type":"mqtt-broker","name":"","broker":"localhost","port":"1883","clientid":"","usetls":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willPayload":"","willMsg":{},"sessionExpiry":""},{"id":"d69df81e.392788","type":"exec","z":"f5e89d62.2ca78","command":"sudo cat /sys/bus/w1/devices/28-0000072b7724/temperature","addpay":"","append":"","useSpawn":"false","timer":"","oldrc":false,"name":"","x":480,"y":60,"wires":[["e1579f20.1edb1"],[],[]]},{"id":"b26300b2.c2a8b","type":"inject","z":"f5e89d62.2ca78","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":60,"wires":[["d69df81e.392788"]]},{"id":"e1579f20.1edb1","type":"change","z":"f5e89d62.2ca78","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"$number($trim(payload))/1000","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":140,"y":280,"wires":[["75f0962f.1f1808"]]},{"id":"58c5589c.439da8","type":"debug","z":"f5e89d62.2ca78","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":570,"y":240,"wires":[]},{"id":"11ed5da7.c7b502","type":"mqtt out","z":"f5e89d62.2ca78","name":"","topic":"room/temp","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"c9ecc9ac.009798","x":570,"y":320,"wires":[]},{"id":"75f0962f.1f1808","type":"switch","z":"f5e89d62.2ca78","name":">= 24? 1 : 2","property":"payload","propertyType":"msg","rules":[{"t":"gte","v":"24","vt":"num"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":350,"y":280,"wires":[["d5cffb1b.6c3d98","58c5589c.439da8"],["11ed5da7.c7b502","1892cf07.c2ea91"]]},{"id":"d5cffb1b.6c3d98","type":"mqtt out","z":"f5e89d62.2ca78","name":"","topic":"room/alert","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"c9ecc9ac.009798","x":560,"y":180,"wires":[]},{"id":"1892cf07.c2ea91","type":"debug","z":"f5e89d62.2ca78","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":570,"y":380,"wires":[]}]
Flujo 1 - Tutorial de Node-RED: Cómo trabajar con MQTT y Raspberry PLC

7. Toma el segundo PLC Raspberry y enciéndelo, conectándolo a la fuente de alimentación. Además, instala Mosquitto.

8. Ve a Node-RED, añade tres nodos MQTT-in, y establece el servidor a la dirección IP del primer PLC Raspberry, que es el MQTT-Broker.

9. Después del primer nodo mqtt-in con el tema: room/temp, cablea un nodo switch sólo para asegurarte de que el msg.payload que recibes no es nulo.

10. Después, cablea un nodo de escritura digital Industrial Shieldsy selecciona tu modelo de PLC Raspberry, la salida y pon el valor en LOW.

11. En el segundo nodo mqtt-in, establece el topic como room/alert para suscribirte a los mensajes. Además, cablea un nodo switch para asegurarte de que el msg.payload que obtenemos no es nulo. 

12. Finalmente, añade un nodo de escritura digital Industrial Shields, selecciona tu modelo de Raspberry PLC, the same output as in step number 10 and set the value to HIGH.

En MQTT, puedes suscribirte a:
- Cualquier tema: Y no recibir nada.
Un tema específico: Para suscribirse y recibir el mensaje específico que el MQTT-Broker está publicando.
- Todos los temas: Para recibir todo de todos los temas.

Ahora, vamos a suscribirnos a todos los temas para obtener el valor de todos modos.

13. Por lo tanto, añada el siguiente tema: room/#,  lo que significa que te suscribes a todos los mensajes que siguen de room/.

14.  A continuación, cablea el mismo nodo interruptor que en el paso número 9.

15. Sigue con un nodo de cambio y establece el msg.payload a $number(payload) para convertirlo en un número.

16. Ahora, añade un nodo gauge para mostrar siempre la temperatura en un Dashboard.

Por último, tu flujo en tu segundo PLC Raspberry debería ser algo así:

[{"id":"f5e89d62.2ca78","type":"tab","label":"Flow 1","disabled":false,"info":""},{"id":"2abd1e97.1e3de2","type":"ui_base","theme":{"name":"theme-light","lightTheme":{"default":"#0094CE","baseColor":"#0094CE","baseFont":"-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif","edited":true,"reset":false},"darkTheme":{"default":"#097479","baseColor":"#097479","baseFont":"-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif","edited":false},"customTheme":{"name":"Untitled Theme 1","default":"#4B7930","baseColor":"#4B7930","baseFont":"-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif"},"themeState":{"base-color":{"default":"#0094CE","value":"#0094CE","edited":false},"page-titlebar-backgroundColor":{"value":"#0094CE","edited":false},"page-backgroundColor":{"value":"#fafafa","edited":false},"page-sidebar-backgroundColor":{"value":"#ffffff","edited":false},"group-textColor":{"value":"#1bbfff","edited":false},"group-borderColor":{"value":"#ffffff","edited":false},"group-backgroundColor":{"value":"#ffffff","edited":false},"widget-textColor":{"value":"#111111","edited":false},"widget-backgroundColor":{"value":"#0094ce","edited":false},"widget-borderColor":{"value":"#ffffff","edited":false},"base-font":{"value":"-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif"}},"angularTheme":{"primary":"indigo","accents":"blue","warn":"red","background":"grey","palette":"light"}},"site":{"name":"Node-RED Dashboard","hideToolbar":"false","allowSwipe":"false","lockMenu":"false","allowTempTheme":"true","dateFormat":"DD/MM/YYYY","sizes":{"sx":48,"sy":48,"gx":6,"gy":6,"cx":6,"cy":6,"px":0,"py":0}}},{"id":"370a3367.6410fc","type":"ui_tab","name":"Home","icon":"dashboard","disabled":false,"hidden":false},{"id":"df66a3f1.c107","type":"ui_group","name":"Default","tab":"370a3367.6410fc","order":1,"disp":false,"width":"6","collapse":false},{"id":"bb36aa61.597e38","type":"mqtt-broker","name":"","broker":"192.168.1.206","port":"1883","clientid":"","usetls":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willPayload":"","willMsg":{},"sessionExpiry":""},{"id":"47c3bdde.cc7cf4","type":"rpiplc-config","model":"RPIPLC_57R","name":""},{"id":"4732b096.00a9d","type":"ui_gauge","z":"f5e89d62.2ca78","name":"","group":"df66a3f1.c107","order":1,"width":"6","height":"6","gtype":"gage","title":"Q0.0","label":"units","format":"{{value}}","min":"0","max":"50","colors":["#00b500","#e6e600","#ca3838"],"seg1":"","seg2":"","x":610,"y":400,"wires":[]},{"id":"6950738a.41f41c","type":"mqtt in","z":"f5e89d62.2ca78","name":"","topic":"room/temp","qos":"2","datatype":"auto","broker":"bb36aa61.597e38","nl":false,"rap":true,"rh":0,"x":100,"y":100,"wires":[["cd8a743c.2d6668","149042d1.e6fd8d"]]},{"id":"c3e5d6be.ca1878","type":"mqtt in","z":"f5e89d62.2ca78","name":"","topic":"room/alert","qos":"2","datatype":"auto","broker":"bb36aa61.597e38","nl":false,"rap":true,"rh":0,"x":100,"y":240,"wires":[["19d046ab.66fa69","ef036036.18be"]]},{"id":"de985da3.5608a","type":"mqtt in","z":"f5e89d62.2ca78","name":"","topic":"room/#","qos":"2","datatype":"auto","broker":"bb36aa61.597e38","nl":false,"rap":true,"rh":0,"x":110,"y":340,"wires":[["8a0835b2.7f2258"]]},{"id":"1cb1497a.3de287","type":"rpiplc-digital-write","z":"f5e89d62.2ca78","rpiplc":"47c3bdde.cc7cf4","pin":"Q0.0","value":"1","name":"","x":650,"y":240,"wires":[]},{"id":"6b24e566.f74a5c","type":"rpiplc-digital-write","z":"f5e89d62.2ca78","rpiplc":"47c3bdde.cc7cf4","pin":"Q0.0","value":"0","name":"","x":640,"y":100,"wires":[]},{"id":"cd8a743c.2d6668","type":"switch","z":"f5e89d62.2ca78","name":"if msg.payload is not null","property":"payload","propertyType":"msg","rules":[{"t":"nnull"}],"checkall":"true","repair":false,"outputs":1,"x":330,"y":100,"wires":[["6b24e566.f74a5c"]]},{"id":"19d046ab.66fa69","type":"switch","z":"f5e89d62.2ca78","name":"if msg.payload is not null","property":"payload","propertyType":"msg","rules":[{"t":"nnull"}],"checkall":"true","repair":false,"outputs":1,"x":330,"y":240,"wires":[["1cb1497a.3de287"]]},{"id":"149042d1.e6fd8d","type":"debug","z":"f5e89d62.2ca78","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":290,"y":60,"wires":[]},{"id":"ef036036.18be","type":"debug","z":"f5e89d62.2ca78","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":290,"y":200,"wires":[]},{"id":"bc0fe967.7c5da8","type":"debug","z":"f5e89d62.2ca78","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":630,"y":340,"wires":[]},{"id":"8a0835b2.7f2258","type":"switch","z":"f5e89d62.2ca78","name":"if msg.payload is not null","property":"payload","propertyType":"msg","rules":[{"t":"nnull"}],"checkall":"true","repair":false,"outputs":1,"x":330,"y":340,"wires":[["f025681e.e3cf68"]]},{"id":"f025681e.e3cf68","type":"change","z":"f5e89d62.2ca78","name":"set msg.payload to number","rules":[{"t":"set","p":"payload","pt":"msg","to":"$number(payload)\t","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":340,"y":400,"wires":[["4732b096.00a9d","bc0fe967.7c5da8"]]}]
Flujo 2 - Tutorial de Node-RED: Cómo trabajar con MQTT y Raspberry PLC
Dashboard - Tutorial de Node-RED: Cómo trabajar con MQTT y Raspberry PLC

Haciendo esto, podrás publicar diferentes tipos de mensajes MQTT como valores de temperatura, humedad, etc. a cualquier tema, ¡y suscribirte a ellos desde cualquier PLC Raspberry!

Buscar en nuestro blog

Tutorial de Node-RED: Cómo trabajar con MQTT y Raspberry PLC
Boot & Work Corp. S.L., Fernandez Queralt Martinez 7 de septiembre de 2021
Compartir

¿Estás buscando tu Controlador Lógico Programable ideal?

Echa un vistazo a esta comparativa de producto de varios controladores industriales basados en Arduino.

Comparamos entradas, salidas, comunicaciones y otras especificaciones con las de los equipos de otras marcas destacadas.


Industrial PLC comparison >>>