Power BIVandal-Lab

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:

Datos del sensor en Power BI
Datos del sensor en Power BI

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.

El joven Data de "Los Goonies", toda una inspiración.
El joven Data de “Los Goonies”, toda una inspiración.

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“:

Crear Conjunto de Datos en Streaming
Crear Conjunto de Datos en Streaming

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

Seleccionar la opción API
Seleccionar la opción 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“:

Parámetros Streaming
Parámetros Streaming

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:

URL de Inserción
URL de Inserción

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:

RaspberryPi con SensorDHT2
RaspberryPi con SensorDHT2

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 install

Una 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“:

Crear Panel
Crear Panel

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

Nombre del Panel
Nombre del Panel

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

Agregar Ventana
Agregar Ventana

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

Datos en tiempo real
Datos en tiempo real

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

Elegimos nuestro Conjunto de Datos en Streaming
Elegimos nuestro Conjunto de Datos en Streaming

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:

Parámetros a medir en la nueva visualización
Parámetros a medir en la nueva visualización

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:

Servicios Azure IoT
Servicios 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?:

¡SUSCRÍBETE YA!
Doy mi consentimiento para almacenar mis datos para envío de newsletters.
Si te suscribes a la newsletter tendrás acceso a los <b><u>ficheros Power BI originales</u></b> de nuestros tutoriales y post. <br><br>Además tendrás derecho a participar en sorteos periódicos que realizaremos en el blog.
We hate spam. Your email address will not be sold or shared with anyone else.
Mostrar más

Iván Arribas

Llevamos siglos generando, relacionando, modificando y almacenando datos....es hora de que les echemos un vistazo. Espero que este blog sirva de ayuda a los que quieran introducirse en este mundo de la Analítica de Datos, igual que me está sirviendo a mi.

Publicaciones relacionadas

2 comentarios

  1. 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

    1. 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!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Información básica sobre protección de datos Ver más

  • Responsable: Iván Arribas Delgado.
  • Finalidad:  Moderar los comentarios.
  • Legitimación:  Por consentimiento del interesado.
  • Destinatarios y encargados de tratamiento:  No se ceden o comunican datos a terceros para prestar este servicio. El Titular ha contratado los servicios de alojamiento web a Bluehost que actúa como encargado de tratamiento.
  • Derechos: Acceder, rectificar y suprimir los datos.
  • Información Adicional: Puede consultar la información detallada en la Política de Privacidad.

Botón volver arriba
Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos. Contiene enlaces a sitios web de terceros con políticas de privacidad ajenas que podrás aceptar o no cuando accedas a ellos. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Ver
Privacidad