Média por janela em Real-Time Analytics: passo a passo
Este guia mostra como calcular uma média por janela em Real-Time Analytics usando Azure Stream Analytics e enviar os resultados para o Power BI. A técnica de média por janela em Azure Stream Analytics é útil para resumir telemetria (por exemplo, temperatura) em intervalos fixos e visualizar tendências em tempo real.
Pré-requisitos
- Conta Azure com permissões para criar recursos.
- Um Event Hubs (ou IoT Hub) com eventos de telemetria.
- Um Azure Stream Analytics job criado (pode ser em modo Standard).
- Power BI com um workspace onde criar um streaming dataset.
Passo 1: Preparar a origem de eventos (Event Hubs)
Envia eventos JSON para o Event Hubs com um esquema simples: DeviceId, temperature e timestamp. Mantém o timestamp em ISO8601 ou usa o tempo do Event Hub.
{
"DeviceId": "dev01",
"temperature": 22.5,
"timestamp": "2026-07-01T12:00:00Z"
}
Se precisares de enviar eventos de teste, podes usar um pequeno script Python (instalar azure-eventhub) para empacotar e enviar um lote:
from azure.eventhub import EventHubProducerClient, EventData
conn_str = ""
eh_name = ""
producer = EventHubProducerClient.from_connection_string(conn_str, eventhub_name=eh_name)
batch = producer.create_batch()
batch.add(EventData('{"DeviceId":"dev01","temperature":22.5,"timestamp":"2026-07-01T12:00:00Z"}'))
producer.send_batch(batch)
producer.close()
Passo 2: Criar Input e Output no Azure Stream Analytics
No portal Azure, abre o teu Azure Stream Analytics job e configura:
- Input: tipo Event Hub, aponta para o namespace e o event hub em que os eventos chegam.
- Output: adiciona um Power BI output (escolhe o workspace e dá um nome ao dataset/table onde os resultados irão aparecer).
Passo 3: Escrever a query de agregação (média por janela)
Usa uma janela tumbling para calcular a média de temperatura por dispositivo em intervalos fixos (por exemplo, 1 minuto). A query abaixo faz a agregação e envia para o output configurado.
SELECT
DeviceId,
AVG(CAST(temperature AS float)) AS AvgTemp,
System.Timestamp AS WindowEnd
INTO
[PowerBIOutput]
FROM
[EventHubInput] TIMESTAMP BY EventEnqueuedUtcTime
GROUP BY
DeviceId,
TumblingWindow(minute, 1)
Explicação rápida do que faz cada parte:
- TIMESTAMP BY EventEnqueuedUtcTime: usa o tempo de chegada do evento no Event Hubs (ajusta se tiveres um campo timestamp no payload).
- TumblingWindow(minute, 1): agrupa eventos em janelas consecutivas de 1 minuto (sem sobreposição).
- AVG(...) calcula a média de temperatura por dispositivo nessa janela.
Passo 4: Mapear campos e arrancar o job
No output do Power BI, certifica-te de que fazes o mapeamento dos campos DeviceId, AvgTemp e WindowEnd para colunas do streaming dataset. Guarda a query e arranca o Stream Analytics job (Start). Enquanto o job estiver a correr, os resultados começam a ser enviados para o Power BI em cada janela.
Passo 5: Visualizar no Power BI
No Power BI, cria um dashboard com um tile que consome o streaming dataset. Exemplos úteis:
- Gráfico de linhas com WindowEnd no eixo X e AvgTemp no eixo Y (agrupar por DeviceId para múltiplas séries).
- Card para o AvgTemp mais recente de um dispositivo.
Isto permite ver actualizações minuto a minuto das médias calculadas.
Verificar o resultado
Para confirmar que está correcto:
- Envia eventos de teste e observa se aparecem no Power BI conforme as janelas (cada minuto no exemplo).
- No portal do Azure, vê o Job Diagram e as métricas do Stream Analytics (Input Events, Output Events, Watermark delay) para garantir que não há atrasos significativos.
- Se os resultados estiverem a zeros ou vazios, confirma o mapeamento de campos e se os nomes JSON coincidem com os usados na query (e se o TIMESTAMP BY está correcto).
Conclusão
Com este fluxo básico consegues calcular médias por janela em tempo real e visualizar no Power BI. Próximos passos naturais: mudar para HoppingWindow para médias móveis com sobreposição, usar um campo timestamp do payload para maior precisão, ou aplicar filtragem e deteção de anomalias. Dica: se observares latência, verifica o timestamp usado (EventEnqueuedUtcTime vs timestamp no payload) e ajusta a tolerância do job.