En este artículo vamos a ver como enviar un stream de datos a PowerBi mediante un pequeño script de powershell para hacer un seguimiento en tiempo real de unos sensores (por ejemplo), también podríamos usar el script para enviar cualquier tipo de información de monitorización, como datos de un log, estadísticas de uso de una base de datos o cualquier otra métrica que queramos monitorizar en tiempo real.

En el ejemplo que nos ocupa suponemos que tenemos 2 estaciones (Front y Rear) con sensores de temperatura, Longitud, Angulo y número de elementos detectados, simularemos el envío de datos de cada estación mediante un script de PowerShell que genere los valores de los sensores de forma aleatoria.

Lo primero que debemos hacer es ver que estructura tienen nuestros datos, en este caso la información que enviaremos será una colección con 5 elementos con la siguiente información:

[
{
"Fecha" :"2019-04-30T11:37:37.846Z",
"NombreSensor" :"AAAAA555555",
"Temperatura" :98.6,
"Angulo" :98.6,
"Longitud" :98.6,
"Elementos" :98.6
}
]

Una vez que tenemos clara nuestra estructura creamos un nuevo conjunto de datos streaming en PowerBI, para ello vamos a nuestra área de trabajo y le damos a la etiqueta “Crear” en la parte superior derecha, luego seleccionamos “Conjunto de datos de streaming”:

Lo siguiente que debemos hacer es elegir qué tipo de streaming queremos analizar, en nuestro caso será mediante el api de Powerbi (Seleccionamos API):

Ahora debemos configurar el streaming, tal y como vemos en la siguiente imagen, añadiendo los 6 elementos de la colección que vamos a enviar.

Una vez creado Desde el panel de PowerBI podemos localizar la URL de inserción, en nuestro caso es:

https://api.powerbi.com/beta/35069d74-1489-4194-80c7-3a81385exxxx/datasets/0145fafxxxx

Esta es la dirección que usaremos en nuestro script de PowerShell para hacer push de los datos y alimentar el stream.

Nuestro script es el siguiente (esta comentado para que se comprenda su funcionamiento

#Establecemos un valor inicial para el Angulo, Longitud y Temperatura de cada una de las estaciones
$Angulo1 = 1
$Angulo2 = 1
$Longitud1 = 100
$Longitud2 = 100
$Temperatura1 = (Get-Random -Minimum 1000 -Maximum 3000)/100
$Temperatura2 = (Get-Random -Minimum 1000 -Maximum 3000)/100
$Elementos1 = (Get-Random -Minimum 1 -Maximum 5)
$Elementos2 = (Get-Random -Minimum 1 -Maximum 5)

#Creamo sunbucle infinito que envie la informacion de los sensores
#en nuestro ejemplo la informacion se genera de forma aleatoria, pero podriamos extraerla de una
#base de datos o de ficheros de log en formato de texto, por ejemplo.
while (1 -eq 1)
{
    #Obtenemos la feha
    $date = Get-Date -UFormat "%Y-%m-%dT%H:%M:%SZ"

    #Establecemos en una variable el endpoint en el que debemos hacer push
    $endpoint = "https://api.powerbi.com/beta/35069d74-1489-4194-80c7-3a81385exxxx/datasets/0145faf9-a501-435e-xxxx-b1a5483eb12a/rows?key=PO5kCmCzCmR5fd3muXvYpjMmsu7Tf%2F77y3rQJY3mSMecy4KO0Phg0f6MzKA%2BGhMCqZcKDpYM31UeCdIA3DSzWw%3D%3D"
    
    #Creamos la coleccion de elementos a enviar al streaming con los datos
    #de la primera estacion "Front"
    $payload1 = @{
    "Fecha" ="$date"
    "NombreSensor" ="Front"
    "Temperatura" =$Temperatura1
    "Angulo" =$Angulo1
    "Longitud" =$Longitud1
    "Elementos" =$Elementos1
    }

    #Escribimos por pantalla la informacion a enviar
    Write-Host $payload1["Fecha"].ToString() + "---" + $payload1["NombreSensor"] + "---" + $payload1["Temperatura"].ToString()+ "---" + $payload1["Angulo"].ToString()+ "---" + $payload1["Longitud"].ToString()+ "---" + $payload1["Elementos"].ToString()
    
    #enviamos la informacion mediante post, enviadno en el Body el json de la coleccion con los valores.
    Invoke-RestMethod -Method Post -Uri "$endpoint" -Body (ConvertTo-Json @($payload1))

    #Hacemos lo mismo con los datos de la segunda estacion "Rear"
    $payload2 = @{
    "Fecha" ="$date"
    "NombreSensor" ="Rear"
    "Temperatura" =$Temperatura2
    "Angulo" =$Angulo2
    "Longitud" =$Longitud2
    "Elementos" =$Elementos2
    }
    Write-Host $payload2["Fecha"].ToString() + "---" + $payload2["NombreSensor"] + "---" + $payload2["Temperatura"].ToString()+ "---" + $payload2["Angulo"].ToString()+ "---" + $payload2["Longitud"].ToString()+ "---" + $payload2["Elementos"].ToString()
    Invoke-RestMethod -Method Post -Uri "$endpoint" -Body (ConvertTo-Json @($payload2))
    
    #Esperamos un segundo
    sleep 1

    #Modificamos las variables con los datos aleatorios

    #Añadimos entre 1 y 5 grados a los angulos
    $Angulo1 += Get-Random -Minimum 1 -Maximum 5
    $Angulo2 += Get-Random -Minimum 1 -Maximum 5

    #Si el angulo de alguno de las estaciones supera los 360 grados lo reiniciamos a 1
    if($Angulo1-ge360){$Angulo1 = 1}
    if($Angulo2-ge360){$Angulo2 = 1}

    #Obtenemos un signo positivo o negativo de forma aleatoria
    $signo1 = if(((Get-Random -Minimum 1 -Maximum 10) % 2) -eq 0){-1} else {1}
    $signo2 = if(((Get-Random -Minimum 1 -Maximum 10) % 2) -eq 0){-1} else {1}

    #añadimos o restamos entre 1 o 5 unidades a la longitud
    $Longitud1 += (Get-Random -Minimum 1 -Maximum 5) * $signo1
    $Longitud2 += (Get-Random -Minimum 1 -Maximum 5) * $signo2

    #añadimos o restamos entre 1 y 2 grados a la temperatura
    $Temperatura1 += ((Get-Random -Minimum 100 -Maximum 200)/100)* $signo1
    $Temperatura2 += ((Get-Random -Minimum 100 -Maximum 200)/100)* $signo2

    #Establecemos el numeor de elementos detectados.
    $Elementos1 = (Get-Random -Minimum 1 -Maximum 5)
    $Elementos2 = (Get-Random -Minimum 1 -Maximum 5)
}

 

Para crear un panel solo tenemos que crear un panel nuevo darle a agregar ventana y seguir los siguientes pasos:

Una vez que hemos creado todas los paneles que queremos mostrar podemos probar el funcionamiento de nuestro sistema.

Si ejecutamos el script de PowerShell el resultado en PowerBI se vería del siguiente modo:

De este modo estamos simulando la lectura de varios sensores en tiempo real para ver su estado y poder reaccionar a tiempo ante posibles eventualidades adversas.

Espero que os sirva de ayuda en vuestros proyectos.