ESTUDIO DE APLICACIONES IOT PARA LA MONITORIZACIÓN Y SUPERVISIÓN DE CAMBIOS DE AGUJAS EN SISTEMAS FERROVIARIOS - UPCOMMONS

Página creada Ezequiel Berho
 
SEGUIR LEYENDO
ESTUDIO DE APLICACIONES IOT PARA LA MONITORIZACIÓN Y SUPERVISIÓN DE CAMBIOS DE AGUJAS EN SISTEMAS FERROVIARIOS - UPCOMMONS
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
ESTUDIO DE APLICACIONES IOT PARA LA MONITORIZACIÓN Y SUPERVISIÓN DE CAMBIOS DE AGUJAS EN SISTEMAS FERROVIARIOS - UPCOMMONS
ESTUDIO DE APLICACIONES IOT PARA LA MONITORIZACIÓN Y SUPERVISIÓN DE CAMBIOS DE AGUJAS EN SISTEMAS FERROVIARIOS - UPCOMMONS
Í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 AGUJAS EN SISTEMAS FERROVIARIOS - UPCOMMONS
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
ESTUDIO DE APLICACIONES IOT PARA LA MONITORIZACIÓN Y SUPERVISIÓN DE CAMBIOS DE AGUJAS EN SISTEMAS FERROVIARIOS - UPCOMMONS
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 AGUJAS EN SISTEMAS FERROVIARIOS - UPCOMMONS
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
ESTUDIO DE APLICACIONES IOT PARA LA MONITORIZACIÓN Y SUPERVISIÓN DE CAMBIOS DE AGUJAS EN SISTEMAS FERROVIARIOS - UPCOMMONS
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 AGUJAS EN SISTEMAS FERROVIARIOS - UPCOMMONS
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
ESTUDIO DE APLICACIONES IOT PARA LA MONITORIZACIÓN Y SUPERVISIÓN DE CAMBIOS DE AGUJAS EN SISTEMAS FERROVIARIOS - UPCOMMONS
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