Proyecto IoT con Power BI y Raspberry Pi

El IoT (Internet of Things) es una realidad y la mayoría de dispositivos están conectados a internet para enviar datos o relacionarse entre ellos. Pero esta revolución está llegando a las empresas, con la interconexión de sensores en plantas productivas, o en instalaciones con dispositivos que mejoran el mantenimiento preventivo o servicio post-venta.
En este post os mostraré un ejemplo paso-a-paso para monitorizar un sensor en tiempo real y veremos también como escalarlo para que funcione con cientos o miles de sensores enviando información a la vez. Así que pongámonos manos a la obra.
¿Qué vamos a construir?
Como si de un capítulo de Bricomanía se tratase, os presento primero el proyecto que vamos a plantear. La idea es conectar un sensor de humedad y temperatura a una Raspberry Pi (un microordenador del tamaño de una tarjeta de crédito que tiene un precio inferiro a 40€).
Este será nuestro emisor de señal, que podremos enviar online a nuestro panel de Power BI gracias a la funcionalidad de Streaming Data Set. Así podremos ver en tiempo real las mediciones que hace nuestro sensor….y sí, le haremos algunas trastadas al sensor para que varíe más de lo habitual.
Al final del tutorial deberíamos ver un panel como este:

Materiales para nuestro Proyecto
Si fuésemos el verdadero MacGyver, sólo necesitaríamos un chicle, un clip, papel de aluminio y una pila de petaca…..pero en este caso vamos a necesitar algo más. Pero no os preocupéis porque no necesitaremos un gran presupuesto. Los materiales son:
- Una cuenta de Power BI
- Una Raspberry Pi (en este caso hemos usado la versión 3 modelo B)
- Un sensor de humedad y temperatura DHT22
- 3 cables macho-hembra
- Una protoboard
- Una resistencia de 10K ohms
Si en vez de comprar la Raspberry Pi de manera individual os compráis un kit, los cables, resistencias y la protoboard suelen venir incluidas y es más económico que comprarlo por separado.

Configurando nuestro Streaming Data Set en Power BI
El primer paso es posicionarse sobre “Mi área de Trabajo” una vez logueados en powerbi.com. De esta manera nos aparecerá el botón de “Crear“, para poder escoger la opción de “Conjunto de Datos en Streaming“:

Indicamos que deseamos un conjunto de datos en streaming tipo “API“:

En la siguiente pantalla, debemos escoger un nombre para nuestro nuevo Conjunto de Datos, y los campos que espera recibir. Debéis elegir los mismos nombres de campos y tipos de datos que veis en la imagen, porque luego los enviaremos con este formato desde la Raspberry Pi. No olvidéis marcar la opción “Análisis de historial de datos“:

Al pulsar en “Siguiente”, veremos una pantalla que nos confirma que ya tenemos el conjunto de datos creado, y una “URL de inserción” que tenéis que apuntar porque luego la necesitaremos:

Una vez finalizado el proceso ya veréis el nuevo conjunto de datos creado. Pasemos al siguiente punto del tutorial.
Montaje del sensor DHT22 en la Raspberry Pi
Suponemos que ya tenéis la Rasperry Pi con su sistema operativo Raspberian y conectado a vuestra wifi. No nos pararemos mucho en como realizar el cableado en este post, pero os dejo un vídeo que explica paso-a-paso como realizarlo en este link.
Al final os debería quedar algo similar a esto:

Cuando tengamos todo conectado, debemos ejecutar una serie de comandos en el terminal bash de la Raspberry Pi para asegurarnos que todas las aplicaciones están al día y que tenemos instalados los paquetes necesarios:
sudo apt-get update
sudo apt-get install build-essential python-dev
git clone https://github.com/adafruit/Adafruit_Python_DHT.git && cd Adafruit_Python_DHT && sudo python setup.py installUna vez conectado y actualizado todo según las instrucciones, vamos a hacer una pequeña prueba para ver si todo es correcto. Os dejo un pequeño código Phyton para ejecutar en la Raspberry Pi y ver en pantalla la temperatura y humedad que va recogiendo del sensor:
#!/usr/bin/python
# Copyright (c) 2014 Adafruit Industries
# Author: Tony DiCola
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
import Adafruit_DHT
# Sensor should be set to Adafruit_DHT.DHT11,
# Adafruit_DHT.DHT22, or Adafruit_DHT.AM2302.
sensor = Adafruit_DHT.DHT22
# Example using a Beaglebone Black with DHT sensor
# connected to pin P8_11.
#pin = 'P8_11'
# Example using a Raspberry Pi with DHT sensor
# connected to GPIO4.
pin = 4
# Try to grab a sensor reading. Use the read_retry method which will retry up
# to 15 times to get a sensor reading (waiting 2 seconds between each retry).
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
# Note that sometimes you won't get a reading and
# the results will be null (because Linux can't
# guarantee the timing of calls to read the sensor).
# If this happens try again!
if humidity is not None and temperature is not None:
print('Temp={0:0.1f}*C Humidity={1:0.1f}%'.format(temperature, humidity))
else:
print('Failed to get reading. Try again!')
Si al ejecutarlo, veis en la pantalla de la Raspberry Pi como se van generando líneas con valores de temperatura y humedad, es que todo es correcto.
Enviando los datos del sensor a powerbi.com
El programa que vamos a generar en Phyton para que lea los datos del sensor y que los envíe a powerbi.com es el siguiente:
"""
Python sample for Raspberry Pi which reads temperature and humidity values from
a DHT22 sensor, and sends that data to Power BI for use in a streaming dataset.
"""
import urllib3, time
from datetime import datetime
import Adafruit_DHT as dht
# type of sensor that we're using
SENSOR = dht.DHT22
# pin which reads the temperature and humidity from sensor
PIN = 4
# REST API endpoint, given to you when you create an API streaming dataset
# Will be of the format: https://api.powerbi.com/beta/<tenant id>/datasets/< dataset id>/rows?key=<key id>
REST_API_URL = '**********pegar entre estas comillas la URL de inserción del paso anterior**************'
# Gather temperature and sensor data and push to Power BI REST API
while True:
try:
# read and print out humidity and temperature from sensor
humidity,temp = dht.read_retry(SENSOR, PIN)
#print 'Temp={0:0.1f}*C Humidity={1:0.1f}%'.format(temp, humidity)
# ensure that timestamp string is formatted properly
now = datetime.strftime(datetime.now(), "%Y-%m-%dT%H:%M:%S%Z")
# data that we're sending to Power BI REST API
data = '[{{ "timestamp": "{0}", "temperature": {1:0.1f}, "humidity": {2:0.1f} }}]'.format(now, temp, humidity)
print (data)
# make HTTP POST request to Power BI REST API
http = urllib3.PoolManager()
req = http.request('POST',REST_API_URL, body=data, headers={'Content-Type':'text/html'})
response = req.read()
print("POST request to Power BI with data:{0}".format(data))
print("Response: HTTP {0} {1}\n".format(response, response))
time.sleep(1)
except urllib3.exceptions.HTTPError as e:
print("HTTP Error: {0} - {1}".format(e.code, e.reason))
except urllib3.exceptions.RequestError as e:
print("Request Error: {0}".format(e.reason))
except Exception as e:
print("General Exception: {0}".format(e))Fijaros que en una parte del código debéis pegar la URL de inserción que obtuvimos al crear el Conjunto de Datos en Streaming.
Último paso: crear el panel de powerbi.com
Una vez que tenemos el sensor DHT22 montado en la Raspberry Pi enviando datos a nuestro Conjunto de datos en streaming en powerbi.com, ya sólo nos queda crear el panel con las visualizaciones que nos permitan ver como varían temperatura y humedad y empezar a jugar con el sensor.
Para crear el panel en tiempo real, nos situamos en “Mi espacio de trabajo” y pulsamos de nuevo el botón “Crear“, pero en esta ocasión elegiremos la opción “Panel“:

Power BI nos pedirá un nombre para el nuevo panel:

Una vez creado, nos situamos sobre él, y pulsamos el botón “Agregar Ventana” para crear una nueva visualización:

Después elegimos la opción “Datos en tiempo real“:

En el siguiente paso, elegimos el conjunto de datos en streaming que creamos al principio del tutorial:

Una vez llegado a este punto sólo debemos elegir los valores que queremos representar en el gráfico, de todas las mediciones que nos llegan desde el sensor:

Podemos repetir estos pasos para crear una visualización de la humedad.
Cómo escalar este proyecto para que sea una verdadera infraestructura de IoT
Obviamente, lo que hemos hecho hasta ahora sólo lee los datos de un dispositivo, por lo que se queda un poco pequeño para considerarlo un proyecto IoT. Si configurásemos cientos o miles de Raspberry Pi u otros dispositivos para que nos envíen del mismo modo la temperatura y humedad, ¿cómo tendría que montar la infraestructura para poder gestionarlos?
Aquí entran en escena los servicios de Azure IoT:

- Azure IoT Hub: para configurar y gestionar todos los dispositivos que nos envían información. Más información aquí.
- Azure Stream Analytics: para poder gestionar la increíble ingesta de datos que nos enviarán cientos o miles de sensores cada poco tiempo. Más información aquí.
- Azure DataLake o Azure CosmoDB: dos soluciones de almacenamiento que permiten almacenar y relacionar grandes cantidades de datos estructurados y no estructurados. Más información de DataLake aquí.
- Azure Time Series Insights: para recibir conclusiones en tiempo real de los datos de tus sensores. Más información aquí.
- Azure Event Grids y Logic Apps: para poder realizar acciones o enviar avisos cuando pase algún evento. Más información de Logic Apps aquí.
Conclusiones
Como veis, podemos empezar a dar nuestros primeros pasos en el mundo del IoT con poco presupuesto y analizar los resultados en Power BI. La solución creada la podremos ir escalando gracias a los servicios de Azure (aumentando proporcionalmente el coste de la solución). Por ello, si vuestra empresa está pensando en explorar los beneficios que les puede aportar esta tecnología IoT, no dudéis en montar un prototipo barato para validar vuestra idea y luego podréis escalarlo si conseguís buenos resultados.
¿Qué os ha parecido este artículo? ¿Habéis tenido algún problema al seguir el tutorial? No dudéis en usar los comentarios de este post o el formulario de contacto para comentarme cualquier duda, idea o aclaración que necesitéis.
Pero no creáis que se me olvidaba…al principio de este post os dije que íbamos a poner a prueba el sensor ¿no?:







Muy bueno el post. Me queda la duda de, puedo almacenar a su vez los datos que voy recibiendo en el PowerBi, es decir si quiero ver además del tiempo real, un histórico de los mismos?
Gracias
Hola!
Este sistema permite crear un cuadro de mandos en tiempo real. En paralelo, puedes ir recogiendo los datos en una base de datos adicional para analizar su histórico.
Normalmente, estas capturas para el histórico no se hacen en “real time” si no e periodos cortos de tiempo (5,10,20 o 30 min) para no saturar la base de datos.
Un saludo!