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
Requisitos
- 2x industrial Raspberry PLC
- 1x Dallas DS18B20 Sensor
- 1x Power Supply
- Cable Ethernet o HDMI con una pantalla externa para conectarse a su PLC Raspberry Pi industrial.
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":[]}]
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.
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"]]}]
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!
Tutorial de Node-RED: Cómo trabajar con MQTT y Raspberry PLC