ESTUDIO DE APLICACIONES IOT PARA LA MONITORIZACIÓN Y SUPERVISIÓN DE CAMBIOS DE AGUJAS EN SISTEMAS FERROVIARIOS - UPCOMMONS
←
→
Transcripción del contenido de la página
Si su navegador no muestra la página correctamente, lea el contenido de la página a continuación
TRABAJO FINAL DE ESTUDIOS Estudio de aplicaciones IoT para la monitorización y supervisión de cambios de agujas en sistemas ferroviarios Documento: Anexos Autor: Ignacio García Dachary Director /Co-director: Álvaro Luna Alloza / Pedro Rodríguez Cortés Titulación: Grado en Ingeniería en Tecnologías Industriales Convocatòria: Primavera 2021
ÍNDICE ANEXO I CÓDIGOS PYTHON PARA LECTURA DE SENSORES ............................................. 1 1.1 SENSOR DHT22 ............................................................................................................... 1 1.2 SENSOR HC-SRF04.......................................................................................................... 2 1.3 SENSOR MLX90614......................................................................................................... 3 ANEXO II CÓDIGO COMPACTO FLOWS NODE-RED ............................................................... 5 ANEXO III CREACIÓN DE BOT DE TELEGRAM ....................................................................... 9 3.1 CREACIÓN DEL BOT ...................................................................................................... 9 3.2 CREACIÓN DE CANAL CON BOT .............................................................................. 12 3.3 OBTENCIÓN DE DATOS PARA CONEXIÓN CON GRAFANA ............................... 15 ANEXO IV ESCALABILIDAD DEL PROTOTIPO IOT .............................................................. 16 4.1 DEFINICIÓN DE SITUACIÓN ...................................................................................... 16 4.2 CONFIGURACIÓN DE AZURE IOT-HUB ................................................................... 17 4.3 CONFIGURACIÓN DE NODE-RED ............................................................................. 17 4.4 CONFIGURACIÓN DE AZURE SQL DATABASE ..................................................... 19 4.5 CONFIGURACIÓN DE AZURE STREAM ANALYTICS ........................................... 19 4.6 CONFIGURACIÓN DE GRAFANA .............................................................................. 21 4.6.1 Sistema de alertas ..................................................................................................... 21 REFERENCIAS ............................................................................................................................... 23 i
Estudio de aplicaciones IoT para la monitorización y supervisión de cambios de aguja en sistemas ferroviarios ÍNDICE DE FIGURAS Figura 1. Venta de configuración de la Raspberry Pi (Fuente: Raspberry Pi) ................................... 3 Figura 2. Matriz canales protocolo I2C (Fuente: Raspberry Pi) ........................................................ 4 Figura 3. Creación nuevo chat o canal (Fuente: Telegram) ............................................................... 9 Figura 4. Perfil BotFather (Fuente: Telegram)................................................................................. 10 Figura 5. Información sobre bots de Telegram (Fuente: Telegram) ................................................ 10 Figura 6. Introducción de comando /newbot y respuesta de BotFather (Fuente: Telegram) ........... 11 Figura 7. Introducción nombre bot y respuesta de BotFather (Fuente: Telegram) .......................... 11 Figura 8. Introducción nombre de usuario de bot y respuesta de BotFather (Fuente: Telegram) .... 12 Figura 9. Creación de nuevo canal (Fuente: Telegram) ................................................................... 13 Figura 10. Creación de canal privado (Fuente: Telegram) ............................................................... 13 Figura 11. Pasos para añadir el bot creado al canal (Fuente: Telegram) .......................................... 14 Figura 12. Usuarios dentro del canal (Fuente: Telegram) ................................................................ 14 Figura 13. Obtención ID de canal de Telegram (Fuente: Telegram) ............................................... 15 Figura 14. Creación de n dispositivos en IoT Hub (Fuente: Portal Azure) ...................................... 17 Figura 15. Nodo de definición de ID de dispositivo (Fuente: Node-Red) ....................................... 18 Figura 16. Tablas en base de datos Azure SQL para almacenamiento de datos de n dispositivos (Fuente: Portal Azure) ...................................................................................................................... 19 Figura 17. Lista de n dispositivos a visualizar en Grafana (Fuente: Grafana Cloud) ...................... 21 Figura 18. Configuración de alerta para sensor j de dispositivo i (Fuente: Grafana Cloud) ............ 21 ii
ANEXO I CÓDIGOS PYTHON PARA LECTURA DE SENSORES En el presente Anexo I se muestran los códigos de Python a ejecutar para la obtención de las lecturas de los sensores. Estos códigos se encuentran almacenados en archivos de Python en la Raspberry Pi y son los ejecutados por los nodos EXEC de Node-Red cada vez que el nodo Inject emite una marca de tiempo. Se considera que las conexiones se han realizado del mismo modo que la configuración mostrada en el apartado de desarrollo práctico de la memoria. De no ser así, sería necesario adaptar las líneas de código donde se hace referencia a pines de la placa. 1.1 SENSOR DHT22 Para poder leer la temperatura y humedad ambiente con el sensor DHT22, es necesaria la instalación de la librería de Adafruit para el DHT22 mediante la introducción del siguiente comando en la terminal de Raspberry Pi antes de ejecutar el código para la obtención de las magnitudes: sudo apt-get install python3-dev python3-pip sudo python3 -m pip install --upgrade pip setuptools wheel sudo pip3 install Adafruit_DHT Una vez instalada la librería necesaria, se debe guardar el siguiente código [1] como un archivo de Python .py en una carpeta de la placa Raspberry Pi, con ruta /home/pi/, por ejemplo: import adafruit_dht from board import * SENSOR_PIN = D14 dht22 = adafruit_dht.DHT22 (SENSOR_PIN, use_pulseio=False) temperature = dht22.temperature humidity = dht22.humidity print(temperature, end = '') print(',', end = '') print(humidity, end = '') Una vez guardado, para obtener las lecturas del sensor, debe introducirse el siguiente comando en la terminal de la Raspberry Pi, así como en el nodo Exec: python3 /home/pi//.py En este caso: python3 /home/pi/Documents/dht22_both_codev4.py Ejecutando el comando anterior se obtienen las lecturas de temperatura y humedad ambiente separadas por una coma, de la siguiente forma: 28.8,43.8 1
Estudio de aplicaciones IoT para la monitorización y supervisión de cambios de aguja en sistemas ferroviarios 1.2 SENSOR HC-SRF04 Al igual que con el sensor DHT22, para la ejecución del código en el nodo EXEC de Node-Red, es necesario guardar el código mostrado a continuación [2] como un archivo de Python .py en una carpeta de la placa Raspberry Pi, con ruta /home/pi/. import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) TRIG = 18 ECHO = 24 GPIO.setup(TRIG,GPIO.OUT) GPIO.setup(ECHO,GPIO.IN) GPIO.output(TRIG, False) time.sleep(2) GPIO.output(TRIG, True) time.sleep(0.00001) GPIO.output(TRIG, False) while GPIO.input(ECHO)==0: pulse_start = time.time() while GPIO.input(ECHO)==1: pulse_end = time.time() pulse_duration = pulse_end - pulse_start distance = pulse_duration * 17150 distance = round(distance, 1) print distance GPIO.cleanup() Mediante la ejecución del siguiente comando: python /home/pi//.py En este caso: python /home/pi/Documents/hcsr04_codev1.py Se obtiene el siguiente resultado, el cual equivale a la distancia, en cm, desde el sensor hasta el objeto situado delatante del mismo: 14.7 2
1.3 SENSOR MLX90614 Por último, la configuración del sensor MLX90614 es algo más larga, debido a que este sensor se comunica con la placa mediante protocolo I2C, lo cual requiere de pasos adicionales para su configuración. En primer lugar, es necesario introducir los siguientes comandos en la terminal de la Raspberry: wget https://files.pythonhosted.org/packages/67/8a/443af31ff99cca1e30304dba28a 60d3f07d247c8d410822411054e170c9c/PyMLX90614-0.0.3.tar.gz tar -xf PyMLX90614-0.0.3.tar.gz sudo apt-get install -y i2c-tools En segundo lugar, es necesario habilitar el protocolo I2C ya que, normalmente, viene deshabilitado por defecto al instalar el sistema operativo Raspberry Pi OS. Para ello, debe introducirse el siguiente comando en la terminal: sudo raspi-config Al introducir este comando, se muestra la ventana de configuración de la Raspberry Pi (Figura 1): Figura 1. Venta de configuración de la Raspberry Pi (Fuente: Raspberry Pi) Dentro de esta ventana deben seguirse los siguientes pasos: 3 Interface Options –> P5 I2C –> Enable -> Yes Con ello, se logra habilitar la comunicación mediante protocolo I2C. Una vez habilitada la comunicación y conectado el sensor, debe comprobarse que la placa puede comunicarse con el sensor correctamente. Para ello, debe ejecutarse el siguiente comando: 3
Estudio de aplicaciones IoT para la monitorización y supervisión de cambios de aguja en sistemas ferroviarios sudo i2cdetect -y 1 Este comando muestra una matriz 8x16 con todas las posibles conexiones I2C que se pueden producir. El sensor MLX90614 tiene, por defecto, asignado el canal 5a de esta matriz. Para comprobar que la conexión se ha realizado correctamente, al ejecutar el código debe aparecer en la matriz el valor “5a” en la posición correspondiente de la matriz (Figura 2): Figura 2. Matriz canales protocolo I2C (Fuente: Raspberry Pi) Habiéndose realizado la conexión de forma correcta, el procedimiento a seguir es equivalente al mostrado en los anteriores dos sensores. En este caso el código es el siguiente [3]: from smbus2 import SMBus from mlx90614 import MLX90614 bus = SMBus(1) sensor = MLX90614(bus, address=0x5A) print sensor.get_object_1() bus.close() De nuevo, mediante la ejecución del siguiente comando: python /home/pi//.py En este caso: python /home/pi/Documents/mlx90614_codev3_OBJ.py Se obtiene el siguiente resultado, el cual equivale a la distancia, en cm, desde el sensor hasta el objeto situado delatante del mismo: 32.72 4
ANEXO II CÓDIGO COMPACTO FLOWS NODE-RED En el presente Anexo II se muestra el código en formato compacto de los Flows creados mediante el software Node-Red. Para poder importar el código, en primer lugar, es necesario instalar los siguientes paquetes de nodos no oficiales de Node-Red, los cuales se pueden encontrar en la página oficial de Node-Red: • node-red-contrib-azure-iot-hub • node-red-node-random • node-red-contrib-key-value-store Una vez instalados los paquetes de nodos anteriores, es posible importar los Flows creados a Node- Red. Para ello, basta con copiar el código mostrado a continuación de esta página y pegarlo en el cuadro de texto de la opción Import que se encuentra en la barra de opciones desplegable de la parte derecha del editor de Node-Red. Cabe destacar que mediante la importación de los Flows es posible observar la estructura de los mismos y la configuración de los nodos. Sin embargo, el funcionamiento de estos Flows no es posible, ya que es necesario contar con los sensores y la placa Raspberry Pi para obtener las lecturas de los sensores. De igual modo, son necesarios los códigos que se encargan de obtener las lecturas de los sensores y que estén almacenados en la misma ruta que la definida en este proyecto y, por último, contar con los servicios en la nube de Azure utilizados en el proyecto. 5
Estudio de aplicaciones IoT para la monitorización y supervisión de cambios de aguja en sistemas ferroviarios [{"id":"87a3c4fb.1eafd8","type":"tab","label":"Flow 1","disabled":false,"info":""},{"id":"12e7c830.619ab8","type":"tab","label":"Flow 2","disabled":false,"info":""},{"id":"92d5edb.a2aa81","type":"key-value- store","filepath":"doors.json","namespace":"","name":""},{"id":"f46b418.76292c","type":"exec","z ":"87a3c4fb.1eafd8","command":"python /home/pi/Documents/mlx90614_codev3_OBJ.py","addpay":false,"append":"","useSpawn":"false", "timer":"","oldrc":false,"name":"MLX90614 IR TEMP","x":400,"y":380,"wires":[["51f7820.e33cd8","1e1af6f5.f1ede9"],[],[]]},{"id":"fd65ca14.e9 3188","type":"inject","z":"87a3c4fb.1eafd8","name":"","props":[{"p":"payload"}],"repeat":"20","cr ontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":170,"y":3 80,"wires":[["f46b418.76292c","21772002.0db45","c6ae6152.0f0a8"]]},{"id":"97b8e457.7588e8", "type":"debug","z":"87a3c4fb.1eafd8","name":"mlx_ir_float","active":true,"tosidebar":true,"consol e":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"aut o","x":795,"y":400,"wires":[],"l":false},{"id":"51f7820.e33cd8","type":"function","z":"87a3c4fb.1 eafd8","name":"mlx90614_parseFloat","func":"msg = {\n 'payload': parseFloat(msg.payload)\n \n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":640,"y":360,"wires":[["97b8e457.7588e 8","8b57bbec.4a16e8"]]},{"id":"8b57bbec.4a16e8","type":"change","z":"87a3c4fb.1eafd8","name" :"set.msg.topic.mlx90614","rules":[{"t":"set","p":"topic","pt":"msg","to":"mlx90614","tot":"str"}], "action":"","property":"","from":"","to":"","reg":false,"x":890,"y":360,"wires":[["885d6ca5.ada93" ]]},{"id":"a6bf1f01.f4dc7","type":"function","z":"87a3c4fb.1eafd8","name":"hcsr04_parseFloat","f unc":"msg = {\n 'payload': parseFloat(msg.payload)\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":630,"y":540,"wires":[["f2489779.f03ea 8","9759da59.d5d208"]]},{"id":"f2489779.f03ea8","type":"change","z":"87a3c4fb.1eafd8","name" :"set.msg- topic.hcsr04","rules":[{"t":"set","p":"topic","pt":"msg","to":"hcsr04","tot":"str"}],"action":"","prop erty":"","from":"","to":"","reg":false,"x":880,"y":540,"wires":[["885d6ca5.ada93"]]},{"id":"885d6c a5.ada93","type":"join","z":"87a3c4fb.1eafd8","name":"join_topics","mode":"custom","build":"obj ect","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","ac cumulate":false,"timeout":"","count":"4","reduceRight":false,"reduceExp":"","reduceInit":"","redu ceInitType":"","reduceFixup":"","x":1190,"y":360,"wires":[["29985367.8d21ac","a4c799ac.f218b8 "]]},{"id":"29985367.8d21ac","type":"debug","z":"87a3c4fb.1eafd8","name":"join_4object","activ e":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg"," statusVal":"","statusType":"auto","x":1315,"y":360,"wires":[],"l":false},{"id":"1d6d5750.996ff9"," type":"debug","z":"87a3c4fb.1eafd8","name":"to_iothub","active":true,"tosidebar":true,"console":f alse,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto"," x":1375,"y":480,"wires":[],"l":false},{"id":"8f45e343.bb6f7","type":"function","z":"87a3c4fb.1eaf d8","name":"2channel_split","func":" msg1 = {};\n msg2 = {};\n\nvar array = msg.payload.split(','),\n a = array[0], b = array[1];\n \n msg1.payload = parseFloat(a);\n msg2.payload = parseFloat(b);\n \n return [msg1,msg2];\n","outputs":2,"noerr":0,"initialize":"","finalize":"","x":600,"y":180,"wires":[["6a2a9 207.f8641c","28e4c6c6.8ac27a"],["de3c9f17.56bf2","438ebdfe.3292e4"]]},{"id":"21772002.0db45 ","type":"exec","z":"87a3c4fb.1eafd8","command":"python3 /home/pi/Documents/dht22_both_codev4.py","addpay":false,"append":"","useSpawn":"false","tim er":"","oldrc":false,"name":"Dht22 TEMP/HUM","x":390,"y":200,"wires":[["8f45e343.bb6f7","eba5fcb.63bb8"],[],[]]},{"id":"6a2a92 07.f8641c","type":"debug","z":"87a3c4fb.1eafd8","name":"dht22_temp_float","active":true,"toside bar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":""," statusType":"auto","x":755,"y":120,"wires":[],"l":false},{"id":"de3c9f17.56bf2","type":"debug","z ":"87a3c4fb.1eafd8","name":"dht22_hum_float","active":true,"tosidebar":true,"console":false,"tost atus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":755,"y 6
":240,"wires":[],"l":false},{"id":"eba5fcb.63bb8","type":"debug","z":"87a3c4fb.1eafd8","name":"d ht22_script","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","ta rgetType":"msg","statusVal":"","statusType":"auto","x":535,"y":220,"wires":[],"l":false},{"id":"28 e4c6c6.8ac27a","type":"change","z":"87a3c4fb.1eafd8","name":"set msg.topic.dht22temp","rules":[{"t":"set","p":"topic","pt":"msg","to":"dht22temp","tot":"str"}],"acti on":"","property":"","from":"","to":"","reg":false,"x":850,"y":160,"wires":[["885d6ca5.ada93"]]},{ "id":"438ebdfe.3292e4","type":"change","z":"87a3c4fb.1eafd8","name":"set.msg.topic.dht22hum", "rules":[{"t":"set","p":"topic","pt":"msg","to":"dht22hum","tot":"str"}],"action":"","property":"","fr om":"","to":"","reg":false,"x":850,"y":200,"wires":[["885d6ca5.ada93"]]},{"id":"1e1af6f5.f1ede9", "type":"debug","z":"87a3c4fb.1eafd8","name":"mlx_script","active":true,"tosidebar":true,"console ":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto ","x":555,"y":400,"wires":[],"l":false},{"id":"9759da59.d5d208","type":"debug","z":"87a3c4fb.1ea fd8","name":"hcsr04_float","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete ":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":795,"y":500,"wires":[],"l":f alse},{"id":"c6ae6152.0f0a8","type":"exec","z":"87a3c4fb.1eafd8","command":"python /home/pi/Documents/hcsr04_codev1.py","addpay":false,"append":"","useSpawn":"false","timer":"" ,"oldrc":false,"name":"HCSR04 DIST","x":420,"y":560,"wires":[["f491b640.9f3208","a6bf1f01.f4dc7"],[],[]]},{"id":"f491b640.9f3 208","type":"debug","z":"87a3c4fb.1eafd8","name":"hcsr04_script","active":true,"tosidebar":true," console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType ":"auto","x":555,"y":580,"wires":[],"l":false},{"id":"a4c799ac.f218b8","type":"function","z":"87a3 c4fb.1eafd8","name":"azure_prep","func":"msg.payload.deviceid = \"raspberrypi_real\"\n\nmsg.payload = {\n \"deviceId\": \"raspberrypi_real\",\n \"key\": \"HXgWuoZvV5Lyeylop07b0wsYbDFjnTTMWrVF9kBNKG4=\",\n \"protocol\": \"mqtt\",\n \"data\": msg.payload\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":1190,"y":420,"wires":[["1d6d5750.996f f9","caffe981.4e54c8"]]},{"id":"a5bad3bb.5a5c9","type":"debug","z":"87a3c4fb.1eafd8","name":" azure_answer","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload", "targetType":"msg","statusVal":"","statusType":"auto","x":1535,"y":420,"wires":[],"l":false},{"id" :"b8fa9475.89f798","type":"comment","z":"87a3c4fb.1eafd8","name":"DEFINIR ID DISPOSITIVO","info":"DEFINIR ID DISPOSITIVO","x":1190,"y":460,"wires":[]},{"id":"caffe981.4e54c8","type":"azureiothub","z":"8 7a3c4fb.1eafd8","name":"Azure IoT Hub","protocol":"mqtt","x":1400,"y":420,"wires":[["a5bad3bb.5a5c9"]]},{"id":"b40a0e77.310e2", "type":"function","z":"12e7c830.619ab8","name":"azure_prep","func":"msg.payload.deviceid = \"raspberrypi_sim\"\n\nmsg.payload = {\n \"deviceId\": \"raspberrypi_sim\",\n \"key\": \"MIz0D/QX4xl5f/+UKn5YCgU4STLtDj7r1Rb84fAYrWU=\",\n \"protocol\": \"mqtt\",\n \"data\": msg.payload\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":1170,"y":380,"wires":[["56862da2.2379 74","8559f110.1d39b"]]},{"id":"8559f110.1d39b","type":"azureiothub","z":"12e7c830.619ab8","n ame":"Azure IoT Hub","protocol":"mqtt","x":1360,"y":380,"wires":[["3636065.5dabbfa"]]},{"id":"3636065.5dabbfa ","type":"debug","z":"12e7c830.619ab8","name":"azure_answer","active":true,"tosidebar":true,"co nsole":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType": "auto","x":1495,"y":380,"wires":[],"l":false},{"id":"56862da2.237974","type":"debug","z":"12e7c8 30.619ab8","name":"to_iothub","active":true,"tosidebar":true,"console":false,"tostatus":false,"com plete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1295,"y":340,"wires":[ ],"l":false},{"id":"7eee9256.98fc4c","type":"inject","z":"12e7c830.619ab8","name":"","props":[{" p":"payload"},{"p":"topic","vt":"str"}],"repeat":"20","crontab":"","once":true,"onceDelay":"10","t opic":"","payload":"","payloadType":"date","x":290,"y":380,"wires":[["9149a8e2.57a6e8","56964 b10.3314c4","51f62815.682058","508094b0.71678c"]]},{"id":"9149a8e2.57a6e8","type":"random 7
Estudio de aplicaciones IoT para la monitorización y supervisión de cambios de aguja en sistemas ferroviarios ","z":"12e7c830.619ab8","name":"random_temp","low":"23","high":"25","inte":"true","property":" payload","x":520,"y":260,"wires":[["83f7628a.0ae27"]]},{"id":"83f7628a.0ae27","type":"change", "z":"12e7c830.619ab8","name":"set msg.topic.dht22temp","rules":[{"t":"set","p":"topic","pt":"msg","to":"dht22temp","tot":"str"}],"acti on":"","property":"","from":"","to":"","reg":false,"x":730,"y":260,"wires":[["cb6e7682.7cab08"]]}, {"id":"1dd87e1f.afa192","type":"change","z":"12e7c830.619ab8","name":"set.msg.topic.dht22hum ","rules":[{"t":"set","p":"topic","pt":"msg","to":"dht22hum","tot":"str"}],"action":"","property":""," from":"","to":"","reg":false,"x":730,"y":340,"wires":[["cb6e7682.7cab08"]]},{"id":"be05ac40.97f9 d","type":"change","z":"12e7c830.619ab8","name":"set.msg.topic.mlx90614","rules":[{"t":"set","p ":"topic","pt":"msg","to":"mlx90614","tot":"str"}],"action":"","property":"","from":"","to":"","reg" :false,"x":730,"y":420,"wires":[["cb6e7682.7cab08"]]},{"id":"344f932f.efd1cc","type":"change","z ":"12e7c830.619ab8","name":"set.msg- topic.hcsr04","rules":[{"t":"set","p":"topic","pt":"msg","to":"hcsr04","tot":"str"}],"action":"","prop erty":"","from":"","to":"","reg":false,"x":740,"y":500,"wires":[["cb6e7682.7cab08"]]},{"id":"cb6e7 682.7cab08","type":"join","z":"12e7c830.619ab8","name":"join_topics","mode":"custom","build": "object","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str ","accumulate":false,"timeout":"","count":"4","reduceRight":false,"reduceExp":"","reduceInit":""," reduceInitType":"","reduceFixup":"","x":990,"y":380,"wires":[["b40a0e77.310e2","51040285.28a4 bc"]]},{"id":"56964b10.3314c4","type":"random","z":"12e7c830.619ab8","name":"random_hum", "low":"50","high":"55","inte":"true","property":"payload","x":510,"y":340,"wires":[["1dd87e1f.afa 192"]]},{"id":"51f62815.682058","type":"random","z":"12e7c830.619ab8","name":"random_temp IR","low":"30","high":"35","inte":"true","property":"payload","x":520,"y":420,"wires":[["be05ac4 0.97f9d"]]},{"id":"508094b0.71678c","type":"random","z":"12e7c830.619ab8","name":"random_d ist","low":"5","high":"8","inte":"true","property":"payload","x":510,"y":500,"wires":[["344f932f.ef d1cc"]]},{"id":"51040285.28a4bc","type":"debug","z":"12e7c830.619ab8","name":"","active":true, "tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusV al":"","statusType":"auto","x":1115,"y":340,"wires":[],"l":false}] 8
ANEXO III CREACIÓN DE BOT DE TELEGRAM Para recibir alertas en Telegram desde Grafana es necesaria la creación de un bot de Telegram. Un bot de Telegram es un perfil totalmente automatizado con el cual el usuario puede interactuar mediante la introducción el envío de códigos determinados en el chat o canal en que se encuentra el bot. En este caso, el bot se encuentra dentro de un canal privado y es el que envía las alertas, provenientes de Grafana, como un mensaje. Todo ello, de forma automática. De este modo, el usuario encargado de supervisar la instalación donde se ha instalado la aplicación IoT, puede estar informado de la situación de la misma mediante la recepción de alertas basadas en valores límite, definidas en Grafana. En definitiva, es el canal de comunicación entre Grafana y el usuario. En el presente anexo IV se presenta, en primer lugar, el proceso para crear un bot en Telegram desde cero. En segundo lugar, cómo añadir este bot a un canal desde donde recibir las alertas provenientes de Grafana. Y, por último, cómo obtener los datos necesarios para la configuración del bot de Telegram desde Grafana [4]. 3.1 CREACIÓN DEL BOT La creación de un bot de Telegram se realiza desde la aplicación móvil. Una vez descargada y registrado el usuario, debe darse al botón para buscar usuarios en Telegram (Figura 3): Figura 3. Creación nuevo chat o canal (Fuente: Telegram) 9
Estudio de aplicaciones IoT para la monitorización y supervisión de cambios de aguja en sistemas ferroviarios El perfil más utilizado para la creación de bots es el llamado BotFather, que a su vez es un bot. Basta con introducir su nombre en la barra de búsqueda y aparece dicho perfil (Figura 4). Figura 4. Perfil BotFather (Fuente: Telegram) Pulsando en el nombre de este perfil, aparece una pantalla donde se explican donde se explica para qué sirve este perfil. Para proseguir con la creación del bot debe seleccionarse la opción de Start (Figura 5). Figura 5. Información sobre bots de Telegram (Fuente: Telegram) 10
Una vez comenzada la conversación con el bot, se muestran los diferentes comandos que pueden introducirse y la función de cada uno de ellos. En este caso, al querer crear un nuevo bot, se debe introducir el comando /newbot (Figura 6). Figura 6. Introducción de comando /newbot y respuesta de BotFather (Fuente: Telegram) A continuación, el bot pide la introducción del nombre que se le va a asignar al nuevo bot. En este caso, se ha optado por el nombre “Alerta Grafana” . Figura 7. Introducción nombre bot y respuesta de BotFather (Fuente: Telegram) 11
Estudio de aplicaciones IoT para la monitorización y supervisión de cambios de aguja en sistemas ferroviarios Después de definir el nombre del bot, es necesario definir el nombre de usuario del bot, mediante el cual se puede encontrar al bot y añadirlo a un canal. Es necesario que el nombre de usuario del bot termine en “bot”. Si el nombre escogido ya ha sido utilizado, es posible introducir otro nombre diferente hasta que sea válido (Figura 8). Figura 8. Introducción nombre de usuario de bot y respuesta de BotFather (Fuente: Telegram) En este momento, el bot ya está creado. 3.2 CREACIÓN DE CANAL CON BOT Para poder utilizar el bot y recibir alertas a través de él, es necesario añadirlo a un canal desde donde poder recibir las alertas provenientes de Grafana. Para ello, es necesario dirigirse al apartado para crear un nuevo canal, el mismo que el mostrado en la Figura 3. Dentro del menú que se muestra, se debe seleccionar la opción para crear un nuevo canal (Figura 9). 12
Figura 9. Creación de nuevo canal (Fuente: Telegram) A continuación, es necesario introducir el nombre del canal y, si se desea, un icono para el mismo. Una vez definidas estas opciones, es posible crear el canal como un canal público o privado. En este caso, se debe crear un canal privado al que solo tengan acceso los usuarios deseados (Figura 10). Figura 10. Creación de canal privado (Fuente: Telegram) 13
Estudio de aplicaciones IoT para la monitorización y supervisión de cambios de aguja en sistemas ferroviarios Una vez creado el canal, debe añadirse al canal el bot creado anteriormente. Para ello, se debe acceder al menú de información del canal y, en él, al apartado de Suscriptores. Dentro de este menú existe la opción de añadir a nuevos usuarios. Para añadir el bot creado es necesario introducir el nombre de usuario elegido para el bot (Figura 8). Este proceso puede observarse en la siguiente figura (Figura 11): Figura 11. Pasos para añadir el bot creado al canal (Fuente: Telegram) Siguiendo estos pasos se logra añadir el bot al canal (Figura 12). Figura 12. Usuarios dentro del canal (Fuente: Telegram) 14
3.3 OBTENCIÓN DE DATOS PARA CONEXIÓN CON GRAFANA Por último, es necesario obtener el token API del bot y el ID del chat, ambos necesarios para la conexión con el chat y bot de Telegram desde Grafana. En primer lugar, para obtener el token API del bot, se debe consultar el mensaje recibido por BotFather al definir el nombre de usuario del bot (Figura 8). Por otro lado, para obtener el ID del chat es necesario enviar un mensaje que contenga la palabra ‘bot’ al canal donde se encuentra el bot. Una vez enviado el mensaje, se puede obtener el ID del chat accediendo, desde un navegador, al siguiente enlace: https://api.telegram.org/bot/getUpdates Sustituyendo por el token API del bot obtenido en el paso anterior. Este proceso puede observarse en la siguiente figura (Figura 13): Figura 13. Obtención ID de canal de Telegram (Fuente: Telegram) Con la obtención de esto datos es posible establecer la conexión entre Grafana Cloud y Telegram para el sistema de alertas. 15
Estudio de aplicaciones IoT para la monitorización y supervisión de cambios de aguja en sistemas ferroviarios ANEXO IV ESCALABILIDAD DEL PROTOTIPO IOT A lo largo del desarrollo práctico de la creación y configuración del prototipo, se han reflejado los factores y cuestiones a tener en cuenta para la configuración de las distintas herramientas y recursos para dos dispositivos diferentes. En una solución IoT es de esperar la existencia de más de un único dispositivo. Por ello, es importante definir cómo se puede llevar a cabo la escalabilidad del prototipo, tanto de vertical (número de dispositivos) como horizontalmente (sensores por dispositivo). Para demostrar esta escalabilidad, se procede a definir cómo deberían configurarse las herramientas utilizadas, desde Node-Red hasta Grafana, para construir una solución con dispositivos, siendo > 1, contando cada uno de ellos con sensores. 4.1 DEFINICIÓN DE SITUACIÓN Para empezar, se define una lista de dispositivos que se quieres incorporar en la solución IoT: = = { 1 , 2 , … , } = (1, 2, … , ) Por otro lado, cada dispositivo cuenta con sensores. Cabe destacar que cada dispositivo no tiene por qué contar con el mismo número de sensores ni del mismo tipo. Por ello, se definen los sensores en función de cada dispositivo, de la siguiente manera: = , Siendo los distintos sensores que posee el dispositivo , donde = (1, 2, … , ) Para entender esta nomenclatura se expone el siguiente ejemplo: • Se cuenta con dos ( = 2) dispositivos 1 y 2 . • El dispositivo 1 cuenta con 3 sensores distintos, 1 = 3. Por tanto, los sensores del dispositivo 1 se identifican como 1,1 , 1,2 y 1,3 . • El dispositivo 2 cuenta con 2 sensores distintos, 2 = 2. Por tanto, los sensores del dispositivo 2 se identifican como 2,1 y 2,2 . Teniendo en cuenta este ejemplo, se presenta la representación genérica de la situación: • Se cuenta con dispositivos 1 , 2 ,…, . • El dispositivo 1 cuenta con 1 sensores distintos. Los sensores del dispositivo 1 se identifican como 1,1 , 1,2,…, 1, 1 . • El dispositivo 2 cuenta con 2 sensores distintos. Los sensores del dispositivo 2 se identifican como 2,1 , 2,2 ,…, 2, 2 . • El dispositivo cuenta con sensores distintos. Los sensores del dispositivo se identifican como ,1 , ,2 ,…, , . En base a esta situación se expone la configuración de cada una de las herramientas utilizadas en proyecto para la creación de una solución con dispositivos con sensores cada uno. 16
4.2 CONFIGURACIÓN DE AZURE IOT-HUB Como se ha visto en el desarrollo práctico, Azure IoT Hub es el servicio en la nube encargado de recibir los mensajes provenientes de cada dispositivo. Es la primera herramienta a configurar a la hora de incorporar nuevos dispositivos a la solución. En el apartado IoT Devices es necesario crear un dispositivo para cada uno de los dispositivos a conectar con IoT Hub. Se crean dispositivos (Figura 14): Figura 14. Creación de n dispositivos en IoT Hub (Fuente: Portal Azure) Cada dispositivo generará su propia clave de acceso única para la conexión desde Node-Red. 4.3 CONFIGURACIÓN DE NODE-RED Una vez creados los dispositivos en IoT Hub, debe crearse el de Node-Red para cada uno de los dispositivos . La creación de cada está sujeta al número de sensores de cada dispositivo. Para la explicación objetivo de este documento se da por hecho que el de cada dispositivo ha sido creado con los nodos necesarios para captar las lecturas de los sensores y asignarle un atributo único ( , ) a cada una de ellas para formar un objeto JSON conjunto: { "atrib( ,1 )": value, "atrib( ,2 )": value, (…), "atrib( , )": value } = (1, 2, … , ) Para cada dispositivo , antes del envío del objeto anterior a Azure, es necesario definir el id del dispositivo en el nodo en el que se prepara el mensaje para enviarlo al IoT Hub (Figura 15). 17
Estudio de aplicaciones IoT para la monitorización y supervisión de cambios de aguja en sistemas ferroviarios Figura 15. Nodo de definición de ID de dispositivo (Fuente: Node-Red) Para cada dispositivo , se realiza de la siguiente forma: msg.payload.deviceid = " " msg.payload = { "deviceId": " ", "key": " ", "protocol": "mqtt", "data": msg.payload } return msg; = (1, 2, … , ) Para cada uno de los dispositivos, debe sustituirse por el nombre del dispositivo correspondiente definido en IoT Hub (Figura 14). Por otro lado, la clave de conexión a escribir a continuación de “key”: es la clave primaria del mismo dispositivo, la cual se obtiene desde IoT Hub. Habiendo configurado IoT Hub y Node-Red, el sistema ya es capaz de recibir en un mismo servicio de IoT Hub todos los mensajes provenientes de los distintos dispositivos. Cada mensaje contendrá la información de las lecturas de sus sensores y el identificador del dispositivo en la variable “deviceid”, necesario para reconocer a qué dispositivo pertenece cada mensaje recibido. El formato de los mensajes recibidos en IoT Hub es el siguiente: : { "body": { "atrib( ,1 )": value, "atrib( ,2 )": value, (…), "atrib( , )": value, "deviceid": " " }, "enqueuedTime": "", "properties": {} } = (1, 2, … , ) 18
4.4 CONFIGURACIÓN DE AZURE SQL DATABASE Una vez Azure IoT Hub recibe los mensajes provenientes de los distintos dispositivos, debe configurarse la base de datos Azure SQL Database para el almacenamiento de todos estos mensajes de forma ordenada y accesible. Para ello, en el apartado de Query Editor se realizan las siguientes peticiones para la creación de tablas donde se va a almacenar la información: CREATE TABLE _ ( TelemetryId INT IDENTITY PRIMARY KEY, deviceid VARCHAR (25), atrib( ,1 ) DECIMAL (6,2), atrib( ,2 ) DECIMAL (6,2), (…), atrib( , ) DECIMAL (6,2), EventEnqueuedUtcTime DATETIME ) = (1, 2, … , ) Después de introducir las peticiones anteriores se cuenta con tablas en la base de datos (Figura 16). Cada tabla cuenta con las columnas de TelemetryId, deviceid, EventEnqueuedTime y de los sensores con los que cuenta el dispositivo: Figura 16. Tablas en base de datos Azure SQL para almacenamiento de datos de n dispositivos (Fuente: Portal Azure) 4.5 CONFIGURACIÓN DE AZURE STREAM ANALYTICS Con las tablas necesarias creadas en la base de datos donde se van a almacenar los datos, es necesario configurar el recurso de Stream Analytics para el direccionamiento de datos desde IoT Hub hasta la tabla correspondiente de la base de datos. Para la siguiente explicación se considera que se ha definido el input de Stream Analytics proveniente de IoT Hub, . En cuanto a los outputs, deben definirse outputs diferentes, uno para cada dispositivo. A cada output se le debe asignar un nombre y la tabla correspondiente de las creadas en la base de datos SQL, _ . El direccionamiento debe realizarse en función del id del dispositivo, mediante la expresión WHERE. 19
Estudio de aplicaciones IoT para la monitorización y supervisión de cambios de aguja en sistemas ferroviarios En el caso de Stream Analytics, al ser un proceso que, al iniciar el recurso, se ejecuta constantemente, solo es posible realizar una única petición para el direccionamiento de datos. Por ello, el formato de la petición es el siguiente: SELECT deviceid, atrib( 1,1 ), atrib( 1,2 ) , (…), atrib( 1, 1 ), EventEnqueuedUtcTime INTO 1 FROM WHERE deviceid = ' 1 ' SELECT deviceid, atrib( 2,1 ), atrib( 2,2 ) , (…), atrib( 2, 2 ), EventEnqueuedUtcTime INTO 2 FROM WHERE deviceid = ' 2 ' (…) SELECT deviceid, atrib( ,1 ), atrib( ,2 ) , (…), atrib( , ), EventEnqueuedUtcTime INTO FROM WHERE deviceid = ' ' 20
4.6 CONFIGURACIÓN DE GRAFANA Una vez los datos son almacenados en las tablas correspondientes de la base de datos, es posible su visualización en Grafana. Para visualizar dispositivos, la mejor opción es crear un dashboard con líneas, una para cada dispositivo. Esto se debe a que las líneas pueden contraerse y conseguir así una lista de todos los dispositivos a visualizar (Figura 17). Figura 17. Lista de n dispositivos a visualizar en Grafana (Fuente: Grafana Cloud) Dentro de cada línea í , se deben crear los paneles necesarios para la visualización de los datos provenientes de los sensores de cada dispositivo . Para lograrlo, al crear un panel en concreto, se debe realizar una petición del siguiente modo: SELECT EventEnqueuedUtcTime as time, atrib( , ) as ' í _ , ' FROM _ WHERE $__timeFilter(EventEnqueuedUtcTime) ORDER BY EventEnqueuedUtcTime ASC La petición anterior permite la visualización de las lecturas provenientes del sensor del dispositivo . Por tanto, mediante la creación de los paneles pertinentes, es posible visualizar los datos de los sensores de los dispositivos, es decir, de todos los sensores de cada uno de los dispositivos que forman la solución IoT. 4.6.1 Sistema de alertas Por último, para distinguir de qué sensor y dispositivo proviene una alerta determinada, basta con introducir el id del dispositivo y el nombre del sensor en el cuadro de texto que se encuentra en la pantalla de configuración de las alertas de un panel. Figura 18. Configuración de alerta para sensor j de dispositivo i (Fuente: Grafana Cloud) 21
Estudio de aplicaciones IoT para la monitorización y supervisión de cambios de aguja en sistemas ferroviarios Con esta configuración de los recursos y herramientas utilizadas se consigue un sistema IoT escalable, tanto horizontal como verticalmente, que permite la visualización en tiempo real de los distintos sensores de todos los dispositivos conectados al IoT Hub. 22
REFERENCIAS [1] «python - cannot import name “Beaglebone_Black_Driver” from “Adafruit_DHT” - Stack Overflow». https://stackoverflow.com/questions/63232072/cannot-import-name- beaglebone-black-driver-from-adafruit-dht (accedit juny 14, 2021). [2] «HC-SR04 Ultrasonic Range Sensor on the Raspberry Pi | The Pi Hut». https://thepihut.com/blogs/raspberry-pi-tutorials/hc-sr04-ultrasonic-range-sensor-on-the- raspberry-pi (accedit juny 14, 2021). [3] «IoT Based Contactless Body Temperature Monitoring using MLX90614 Infrared Temperature Sensor, Raspberry Pi with Camera and Email Alert». https://circuitdigest.com/microcontroller-projects/iot-based-contactless-body-temperature- monitoring-using-raspberry-pi-with-camera-and-email-alert (accedit juny 14, 2021). [4] «Grafana Telegram Alert · GitHub». https://gist.github.com/ilap/cb6d512694c3e4f2427f85e4caec8ad7 (accedit juny 14, 2021). 23
También puede leer