Transformar dados dentro do aplicativo do IoT Central para exportação

Os dispositivos IoT enviam dados em vários formatos. Para usar os dados do dispositivo em sua solução IoT, talvez seja necessário transformar os dados do dispositivo antes que eles sejam exportados para outros serviços.

Este artigo mostra como transformar dados do dispositivo como parte de uma definição de exportação de dados em um aplicativo do IoT Central.

As transformações em uma definição de exportação de dados do IoT Central permitem manipular o formato e a estrutura dos dados do dispositivo antes de eles serem exportados para um destino. É possível especificar uma transformação para cada destino em uma definição de exportação. Cada mensagem passa pela transformação para criar um registro de saída que é exportado para o destino.

Use transformações para reestruturar conteúdos JSON, renomear campos, filtrar campos e executar cálculos simples em valores de telemetria. Por exemplo, use uma transformação para converter suas mensagens em um formato tabular que corresponda ao esquema de um destino, como uma tabela do Azure Data Explorer.

O seguinte vídeo apresenta as transformações de dados do IoT Central:

Adicionar uma transformação

Para adicionar uma transformação a um destino em sua exportação de dados, selecione + Transformar, conforme mostrado na seguinte captura de tela:

Screenshot that shows how to add a transformation to a destination.

O painel Transformação de Dados permite especificar a transformação. Na seção 1. Adicionar mensagem de entrada, você pode inserir uma mensagem de exemplo a qual deseje passar pela transformação. Também é possível gerar uma mensagem de exemplo selecionando um modelo de dispositivo. Na seção 2. Criar consulta de transformação, você pode inserir a consulta que transforma a mensagem de entrada. A seção 3. Visualizar mensagens de saída mostra o resultado da transformação:

Screenshot of transformation editor in IoT Central.

Dica

Se não souber o formato da mensagem de entrada, use . como a consulta para exportar a mensagem como se fosse para um destino, como um webhook. Em seguida, cole a mensagem recebida pelo webhook em 1. Adicione sua mensagem de entrada. Por fim, crie uma consulta de transformação para processar essa mensagem no formato de saída necessário.

Criar uma consulta de transformação

O mecanismo de transformação usa o processador JSON JQ de código aberto para reestruturar e formatar conteúdos JSON. Para especificar uma transformação, escreva uma consulta JQ, a qual pode usar filtros, funções e recursos internos do JQ. Para ver alguns exemplos de consulta, confira Exemplos de consultas de transformação. Para saber mais sobre como escrever consultas JQ, confira o Manual do JQ.

Estrutura de mensagens de pré-transformação

Você pode exportar os seguintes fluxos de dados do IoT Central: telemetria, alterações de propriedade, eventos de conectividade do dispositivo, eventos do ciclo de vida do dispositivo e eventos do ciclo de vida do modelo do dispositivo. Cada tipo de dados tem uma estrutura específica, a qual inclui informações como valores de telemetria, informações de aplicativo, metadados de dispositivo e valores de propriedade.

O exemplo a seguir mostra a forma da mensagem de telemetria. Todos esses dados estão disponíveis para a transformação. A estrutura da mensagem é semelhante para outros tipos de mensagem, mas há alguns campos com tipo específico. Você pode usar o recurso Adicionar mensagem de entrada para gerar uma mensagem de exemplo com base em um modelo de dispositivo no seu aplicativo.

{
  "applicationId": "93d68c98-9a22-4b28-94d1-06625d4c3d0f",
  "device": {
    "id": "31edabe6-e0b9-4c83-b0df-d12e95745b9f",
    "name": "Scripted Device - 31edabe6-e0b9-4c83-b0df-d12e95745b9f",
    "cloudProperties": [],
    "properties": {
      "reported": [
        {
          "id": "urn:smartKneeBrace:Smart_Vitals_Patch_wr:FirmwareVersion:1",
          "name": "FirmwareVersion",
          "value": 1.0
        }
      ]
    },
    "templateId": "urn:sbq3croo:modelDefinition:nf7st1wn3",
    "templateName": "Smart Knee Brace"
  },
  "telemetry": [
      {
        "id": "urn:continuousPatientMonitoringTemplate:Smart_Knee_Brace_6wm:Acceleration:1",
        "name": "Acceleration",
        "value": {
          "x": 19.212770659918583,
          "y": 20.596296675217335,
          "z": 54.04859440697045
        }
      },
      {
        "id": "urn:continuousPatientMonitoringTemplate:Smart_Knee_Brace_6wm:RangeOfMotion:1",
        "name": "RangeOfMotion",
        "value": 110
      }
  ],
  "enqueuedTime": "2021-03-23T19:55:56.971Z",
  "enrichments": {
      "your-enrichment-key": "enrichment-value"
  },
  "messageProperties": {
      "prop1": "prop-value"
  },
  "messageSource": "telemetry"
}

Dica

Use o recurso Adicionar mensagem de entrada na interface do usuário do aplicativo IoT Central para ver estruturas de mensagem de exemplo para outros tipos de exportação de dados, como alterações de propriedade.

Exemplos de consultas de transformação

Os exemplos de consulta a seguir usam a mensagem de telemetria exibida na seção anterior.

Exemplo 1: a consulta JQ a seguir gera cada parte da telemetria a partir da mensagem de entrada como uma mensagem de saída separada:

.telemetry[]

Saída do JSON:

{
  "id": "urn:continuousPatientMonitoringTemplate:Smart_Knee_Brace_6wm:Acceleration:1",
  "name": "Acceleration",
  "value": {
    "x": 19.212770659918583,
    "y": 20.596296675217335,
    "z": 54.04859440697045
  }
},
{
  "id": "urn:continuousPatientMonitoringTemplate:Smart_Knee_Brace_6wm:RangeOfMotion:1",
  "name": "RangeOfMotion",
  "value": 110
}

Dica

Para alterar a saída para uma única mensagem com uma matriz de tipos de telemetria, use a consulta .telemetry.

Exemplo 2: a seguinte consulta JQ converte a matriz de telemetria de entrada em um objeto com nomes de telemetria como as chaves:

.telemetry | map({ key: .name, value: .value }) | from_entries

Saída do JSON:

{
  "Acceleration": {
    "x": 19.212770659918583,
    "y": 20.596296675217335,
    "z": 54.04859440697045
  },
  "RangeOfMotion": 110
}

Exemplo 3: a consulta JQ a seguir localiza o valor de telemetria RangeOfMotion e o converte de graus para radianos usando a fórmula rad = degree * pi / 180. Essa consulta também mostra como importar e usar o módulo iotc:

import "iotc" as iotc;
{
  rangeOfMotion: (
    .telemetry
    | iotc::find(.name == "RangeOfMotion").value
    | . * 3.14159265358979323846 / 180
  )
}

Saída do JSON:

{
  "rangeOfMotion": 1.9198621771937625
}

Exemplo 4: para manipular a mensagem de entrada em um formato tabular, você pode mapear cada mensagem exportada em uma ou mais linhas. A saída de linha é representada logicamente como um objeto JSON no qual o nome da coluna é a chave e o valor da coluna é o valor:

{
    "<column 1 name>": "<column 1 value>",
    "<column 2 name>": "<column 2 value>",
    ...
}

Dica

Use um formato tabular ao exportar para o Azure Data Explorer.

A consulta JQ a seguir grava linhas em uma tabela que armazena a telemetria rangeOfMotion em diferentes dispositivos. A consulta mapeia a identidade do dispositivo, o tempo enfileirado e o intervalo de movimento em uma tabela com estas colunas:

import "iotc" as iotc;
{
    deviceId: .deviceId,
    timestamp: .enqueuedTime,
    rangeOfMotion: .telemetry | iotc::find(.name == "RangeOfMotion").value
}

Saída no formato JSON:

{
  "deviceId": "31edabe6-e0b9-4c83-b0df-d12e95745b9f",
  "timestamp": "2021-03-23T19:55:56.971Z",
  "rangeOfMotion": 110
}

Módulo do IoT Central

Um módulo JQ é uma coleção de funções personalizadas. Como parte da consulta de transformação, você pode importar um módulo específico interno do IoT Central, o qual contém funções para facilitar a gravação de suas consultas. Para importar o módulo do IoT Central, use a seguinte diretiva:

import "iotc" as iotc;

O módulo do IoT Central inclui as seguintes funções:

find(expression): a função find permite encontrar um elemento de matriz específico, como um valor de telemetria ou entrada de propriedade em seu conteúdo. A entrada da função é uma matriz, e o parâmetro define um filtro JQ a ser executado em cada elemento na matriz. A função retorna cada elemento de matriz no qual o filtro é avaliado como verdadeiro:

Por exemplo, para encontrar um valor de telemetria específico chamado RangeOfMotion:

.telemetry | iotc::find(.name == "RangeOfMotion")

Cenários

Os cenários a seguir usam a funcionalidade de transformação para personalizar o formato de dados do dispositivo para um destino específico.

Cenário 1: exportar dados do dispositivo para o Azure Data Explorer

Nesse cenário, você transforma os dados do dispositivo para corresponder ao esquema fixo no Azure Data Explorer, em que cada valor da telemetria aparece como uma coluna na tabela, e cada linha representa uma única mensagem. Por exemplo:

DeviceId Carimbo de data/hora T1 T2 T3
"31edabe6-e0b9-4c83-b0df-d12e95745b9f" "2021-03-23T19:55:56.971Z 1.18898 1.434709 2.97008

Para exportar dados compatíveis com essa tabela, cada mensagem exportada deve ser semelhante ao objeto a seguir. O objeto representa uma única linha, em que as chaves são nomes de coluna, e os valores são o valor a ser colocado em cada coluna:

{
    "Timestamp": <value-of-Timestamp>,
    "DeviceId": <value-of-deviceId>,
    "T1": <value-of-T1>,
    "T2": <value-of-T2>,
    "T3": <value-of-T3>,
}

Nesse cenário, o dispositivo envia os valores de telemetria t1, t2 e t3 em uma mensagem de entrada semelhante ao seguinte exemplo:

{
  "applicationId": "c57fe8d9-d15d-4659-9814-d3cc38ca9e1b",
  "enqueuedTime": "1933-01-26T03:10:44.480001324Z",
  "messageSource": "telemetry",
  "telemetry": [
    {
      "id": "dtmi:temperaturesensor288:sensors1lr:t1;1",
      "name": "t1",
      "value": 1.1889838348731093e+308
    },
    {
      "id": "dtmi:temperaturesensor288:sensors1lr:t2;1",
      "name": "t2",
      "value": 1.4347093391531383e+308
    },
    {
      "id": "dtmi:temperaturesensor288:sensors1lr:t3;1",
      "name": "t3",
      "value": 2.9700885230380616e+307
    }
  ],
  "device": {
    "id": "oozrnl1zs857",
    "name": "haptic alarm",
    "templateId": "dtmi:modelDefinition:nhhbjotee:qytxnp8hi",
    "templateName": "hapticsensors",
    "properties": {
      "reported": []
    },
    "cloudProperties": [],
    "simulated": true,
    "approved": false,
    "blocked": false,
    "provisioned": true
  }
}

A consulta JQ a seguir gera os valores de telemetria T1, T2 e T3; o Timestamp e deviceId como uma mensagem com pares chave-valor correspondentes ao esquema da tabela do Azure Data Explorer:

import "iotc" as iotc;
{
  deviceId: .device.id,
  Timestamp: .enqueuedTime,
  T1: .telemetry | iotc::find(.name == "t1").value,
  T2: .telemetry | iotc::find(.name == "t2").value,
  T3: .telemetry | iotc::find(.name == "t3").value,
}

Saída do JSON:

{
  "T1": 1.1889838348731093e+308,
  "T2": 1.4347093391531383e+308,
  "T3": 2.9700885230380616e+307,
  "Timestamp": "1933-01-26T03:10:44.480001324Z",
  "deviceId": "oozrnl1zs857"
}

Para saber mais sobre como adicionar um cluster do Azure Data Explorer e um banco de dados como um destino de exportação, confira Criar um destino do Azure Data Explorer.

Cenário 2: separar uma matriz de telemetria

Nesse cenário, o dispositivo envia a seguinte matriz de telemetria em uma mensagem:

{
  "applicationId": "570c2d7b-d72e-4ad1-aaf4-ad9b727daa47",
  "enqueuedTime": "1909-10-10T07:11:56.078161042Z",
  "messageSource": "telemetry",
  "telemetry": [
    {
      "id": "dtmi:sample1:data;1",
      "name": "data",
      "value": [
        {
          "id": "subdevice1",
          "values": {
              "running": true,
              "cycleCount": 2315
          }
        },
        {
          "id": "subdevice2",
          "values": {
              "running": false,
              "cycleCount": 824567
          }
        }
      ]
    },
    {
      "id": "dtmi:sample1:parentStatus;1",
      "name": "parentStatus",
      "value": "healthy"
    }
  ],
  "device": {
    "id": "9xwhr7khkfri",
    "name": "wireless port",
    "templateId": "dtmi:hpzy1kfcbt2:umua7dplmbd",
    "templateName": "Smart Vitals Patch",
    "properties": {
      "reported": [
        {
          "id": "dtmi:sample1:prop;1",
          "name": "Connectivity",
          "value": "Tenetur ut quasi minus ratione voluptatem."
        }
      ]
    },
    "cloudProperties": [],
    "simulated": true,
    "approved": true,
    "blocked": false,
    "provisioned": false
  }
}

Você quer transformar esses dados de dispositivo para corresponder ao seguinte esquema de tabela:

cycleCount deviceId enqueuedTime parentStatus executando subdeviceId
2315 "9xwhr7khkfri" "1909-10-10T07:11:56.078161042Z" "healthy" true "subdevice1"
824567 "9xwhr7khkfri" "1909-10-10T07:11:56.078161042Z" "healthy" falso "subdevice2"

A consulta JQ a seguir cria uma mensagem de saída separada para cada entrada do subdispositivo na mensagem e inclui algumas informações comuns da mensagem de base e do dispositivo pai. Essa consulta mescla a saída e separa as divisões lógicas nos dados que chegaram como uma única mensagem:

import "iotc" as iotc;
{
    enqueuedTime: .enqueuedTime,
    deviceId: .device.id,
    parentStatus: .telemetry | iotc::find(.name == "parentStatus").value
} + (
    .telemetry
    | iotc::find(.name == "data").value[]
    | {
        subdeviceId: .id,
        running: .values.running,
        cycleCount: .values.cycleCount
    }
)

Saída do JSON:

{
    "cycleCount": 2315,
    "deviceId": "9xwhr7khkfri",
    "enqueuedTime": "1909-10-10T07:11:56.078161042Z",
    "parentStatus": "healthy",
    "running": true,
    "subdeviceId": "subdevice1"
},
{
    "cycleCount": 824567,
    "deviceId": "9xwhr7khkfri",
    "enqueuedTime": "1909-10-10T07:11:56.078161042Z",
    "parentStatus": "healthy",
    "running": false,
    "subdeviceId": "subdevice2"
}

Cenário 3: streaming do Power BI

O Power BI recurso de streaming em tempo real permite exibir dados em um painel que é atualizado em tempo real com baixa latência. Para saber mais, confira Streaming em tempo real no Power BI.

Para usar o IoT Central com o streaming do Power BI, configure uma exportação de webhook que envie corpos de solicitação em um formato específico. Esse exemplo pressupõe que você tenha um conjunto dados de streaming do Power BI fluxo com o seguinte esquema:


  {
    "bloodPressureDiastolic": 161438124,
    "bloodPressureSystolic": -966387879,
    "deviceId": "9xwhr7khkfri",
    "deviceName": "wireless port",
    "heartRate": -633994413,
    "heartRateVariability": -37514094,
    "respiratoryRate": 1582211310,
    "timestamp": "1909-10-10T07:11:56.078161042Z"
  }

Para criar o destino de exportação do webhook, você precisa do ponto de extremidade da URL da API REST para o conjunto de dados do streaming do Power BI.

Nesse cenário, o dispositivo envia mensagens de telemetria parecidas com o seguinte exemplo:

{
  "applicationId": "570c2d7b-d72e-4ad1-aaf4-ad9b727daa47",
  "enqueuedTime": "1909-10-10T07:11:56.078161042Z",
  "messageSource": "telemetry",
  "telemetry": [
    {
      "id": "dtmi:smartVitalsPatch:Smart_Vitals_Patch_37p:HeartRate;1",
      "name": "HeartRate",
      "value": -633994413
    },
    {
      "id": "dtmi:smartVitalsPatch:Smart_Vitals_Patch_37p:RespiratoryRate;1",
      "name": "RespiratoryRate",
      "value": 1582211310
    },
    {
      "id": "dtmi:smartVitalsPatch:Smart_Vitals_Patch_37p:HeartRateVariability;1",
      "name": "HeartRateVariability",
      "value": -37514094
    },
    {
      "id": "dtmi:smartVitalsPatch:Smart_Vitals_Patch_37p:BodyTemperature;1",
      "name": "BodyTemperature",
      "value": 5.323322666478241e+307
    },
    {
      "id": "dtmi:smartVitalsPatch:Smart_Vitals_Patch_37p:FallDetection;1",
      "name": "FallDetection",
      "value": "Earum est nobis at voluptas id qui."
    },
    {
      "id": "dtmi:smartVitalsPatch:Smart_Vitals_Patch_37p:BloodPressure;1",
      "name": "BloodPressure",
      "value": {
        "Diastolic": 161438124,
        "Systolic": -966387879
      }
    }
  ],
  "device": {
    "id": "9xwhr7khkfri",
    "name": "wireless port",
    "templateId": "dtmi:hpzy1kfcbt2:umua7dplmbd",
    "templateName": "Smart Vitals Patch",
    "properties": {
      "reported": [
        {
          "id": "dtmi:smartVitalsPatch:Smart_Vitals_Patch_wr:DeviceStatus;1",
          "name": "DeviceStatus",
          "value": "Id optio iste vero et neque sit."
        }
      ]
    },
    "cloudProperties": [],
    "simulated": true,
    "approved": true,
    "blocked": false,
    "provisioned": false
  }
}

A consulta JQ a seguir transforma a mensagem de entrada em um formato adequado para o webhook enviar ao conjunto de dados do streaming do Power BI. Esse exemplo inclui uma condição de filtro apenas para mensagens de saída de um modelo de dispositivo específico. Você pode usar o recurso de filtro de exportação de dados para filtrar por modelo de dispositivo:

import "iotc" as iotc;
if .device.templateId == "dtmi:hpzy1kfcbt2:umua7dplmbd" then 
    {
        deviceId: .device.id,
        timestamp: .enqueuedTime,
        deviceName: .device.name,
        bloodPressureSystolic: .telemetry | iotc::find(.name == "BloodPressure").value.Systolic,
        bloodPressureDiastolic: .telemetry | iotc::find(.name == "BloodPressure").value.Diastolic,
        heartRate: .telemetry | iotc::find(.name == "HeartRate").value,
        heartRateVariability: .telemetry | iotc::find(.name == "HeartRateVariability").value,
        respiratoryRate: .telemetry | iotc::find(.name == "RespiratoryRate").value
    }
else
    empty
end

Saída do JSON:

{
  "bloodPressureDiastolic": 161438124,
  "bloodPressureSystolic": -966387879,
  "deviceId": "9xwhr7khkfri",
  "deviceName": "wireless port",
  "heartRate": -633994413,
  "heartRateVariability": -37514094,
  "respiratoryRate": 1582211310,
  "timestamp": "1909-10-10T07:11:56.078161042Z"
}

Cenário 4: exportar dados para o Azure Data Explorer e visualizá-los no Power BI

Nesse cenário, você exporta dados para o Azure Data Explorer e depois usa um conector para visualizar os dados no Power BI. Para saber mais sobre como adicionar um cluster do Azure Data Explorer e um banco de dados como um destino de exportação, confira Criar um destino do Azure Data Explorer.

Este cenário usa uma tabela do Azure Data Explorer com o seguinte esquema:

.create table smartvitalspatch (
  EnqueuedTime:datetime,
  Message:string,
  Application:string,
  Device:string,
  Simulated:boolean,
  Template:string,
  Module:string,
  Component:string,
  Capability:string,
  Value:dynamic
)

Nesse cenário, o dispositivo envia mensagens de telemetria parecidas com o seguinte exemplo:

{
    "applicationId": "570c2d7b-d72e-4ad1-aaf4-ad9b727daa47",
    "enqueuedTime": "1909-10-10T07:11:56.078161042Z",
    "messageSource": "telemetry",
    "telemetry": [
        {
            "id": "dtmi:smartVitalsPatch:Smart_Vitals_Patch_37p:HeartRate;1",
            "name": "HeartRate",
            "value": -633994413
        },
        {
            "id": "dtmi:smartVitalsPatch:Smart_Vitals_Patch_37p:RespiratoryRate;1",
            "name": "RespiratoryRate",
            "value": 1582211310
        },
        {
            "id": "dtmi:smartVitalsPatch:Smart_Vitals_Patch_37p:HeartRateVariability;1",
            "name": "HeartRateVariability",
            "value": -37514094
        },
        {
            "id": "dtmi:smartVitalsPatch:Smart_Vitals_Patch_37p:BodyTemperature;1",
            "name": "BodyTemperature",
            "value": 5.323322666478241e+307
        },
        {
            "id": "dtmi:smartVitalsPatch:Smart_Vitals_Patch_37p:FallDetection;1",
            "name": "FallDetection",
            "value": "Earum est nobis at voluptas id qui."
        },
        {
            "id": "dtmi:smartVitalsPatch:Smart_Vitals_Patch_37p:BloodPressure;1",
            "name": "BloodPressure",
            "value": {
                "Diastolic": 161438124,
                "Systolic": -966387879
            }
        }
    ],
    "device": {
        "id": "9xwhr7khkfri",
        "name": "wireless port",
        "templateId": "dtmi:hpzy1kfcbt2:umua7dplmbd",
        "templateName": "Smart Vitals Patch",
        "properties": {
            "reported": [
                {
                    "id": "dtmi:smartVitalsPatch:Smart_Vitals_Patch_wr:DeviceStatus;1",
                    "name": "DeviceStatus",
                    "value": "Id optio iste vero et neque sit."
                }
            ]
        },
        "cloudProperties": [],
        "simulated": true,
        "approved": true,
        "blocked": false,
        "provisioned": false
    }
}

A consulta JQ a seguir transforma a mensagem de entrada em uma mensagem de saída separada para cada valor da telemetria. Essa transformação produz uma saída que corresponde ao esquema da tabela do Azure Data Explorer. A transformação usa um esquema de entidade-atributo-valor, no qual cada linha mantém um único valor de telemetria, e o nome da telemetria é um valor em uma coluna separada na mesma linha:

. as $in | .telemetry[] | {
  EnqueuedTime: $in.enqueuedTime,
  Message: $in.messageId,
  Application: $in.applicationId,
  Device: $in.device.id,
  Simulated: $in.device.simulated,
  Template: ($in.device.templateName // ""),
  Module: ($in.module // ""),
  Component: ($in.component // ""),
  Capability: .name,
  Value: .value
}

Saída do JSON:

{
  "Application": "570c2d7b-d72e-4ad1-aaf4-ad9b727daa47",
  "Capability": "HeartRate",
  "Component": "",
  "Device": "9xwhr7khkfri",
  "EnqueuedTime": "1909-10-10T07:11:56.078161042Z",
  "Message": null,
  "Module": "",
  "Simulated": true,
  "Template": "Smart Vitals Patch",
  "Value": -633994413
},
{
  "Application": "570c2d7b-d72e-4ad1-aaf4-ad9b727daa47",
  "Capability": "RespiratoryRate",
  "Component": "",
  "Device": "9xwhr7khkfri",
  "EnqueuedTime": "1909-10-10T07:11:56.078161042Z",
  "Message": null,
  "Module": "",
  "Simulated": true,
  "Template": "Smart Vitals Patch",
  "Value": 1582211310
},
{
  "Application": "570c2d7b-d72e-4ad1-aaf4-ad9b727daa47",
  "Capability": "HeartRateVariability",
  "Component": "",
  "Device": "9xwhr7khkfri",
  "EnqueuedTime": "1909-10-10T07:11:56.078161042Z",
  "Message": null,
  "Module": "",
  "Simulated": true,
  "Template": "Smart Vitals Patch",
  "Value": -37514094
},
{
  "Application": "570c2d7b-d72e-4ad1-aaf4-ad9b727daa47",
  "Capability": "BodyTemperature",
  "Component": "",
  "Device": "9xwhr7khkfri",
  "EnqueuedTime": "1909-10-10T07:11:56.078161042Z",
  "Message": null,
  "Module": "",
  "Simulated": true,
  "Template": "Smart Vitals Patch",
  "Value": 5.323322666478241e+307
},
{
  "Application": "570c2d7b-d72e-4ad1-aaf4-ad9b727daa47",
  "Capability": "FallDetection",
  "Component": "",
  "Device": "9xwhr7khkfri",
  "EnqueuedTime": "1909-10-10T07:11:56.078161042Z",
  "Message": null,
  "Module": "",
  "Simulated": true,
  "Template": "Smart Vitals Patch",
  "Value": "Earum est nobis at voluptas id qui."
},
{
  "Application": "570c2d7b-d72e-4ad1-aaf4-ad9b727daa47",
  "Capability": "BloodPressure",
  "Component": "",
  "Device": "9xwhr7khkfri",
  "EnqueuedTime": "1909-10-10T07:11:56.078161042Z",
  "Message": null,
  "Module": "",
  "Simulated": true,
  "Template": "Smart Vitals Patch",
  "Value": {
      "Diastolic": 161438124,
      "Systolic": -966387879
  }
}

Os dados de saída são exportados para o cluster do Azure Data Explorer. Para visualizar os dados exportados no Power BI, conclua as seguintes etapas:

  1. Instale o aplicativo do Power BI. Você pode baixar o aplicativo de área de trabalho do Power BI em Ir dos dados para insights e para a ação com o Power BI Desktop.
  2. Baixe o arquivo IoT Central ADX Connector.pbit do Power BI Desktop no GitHub.
  3. Use o aplicativo do Power BI Desktop para abrir o arquivo ADX Connector do IoT Central.pbit baixado na etapa anterior. Quando solicitado, insira o cluster do Azure Data Explorer, o banco de dados e as informações de tabela anotadas anteriormente.

Agora você pode visualizar os dados no Power BI:

Screenshot of Power BI report that shows data from IoT Central.

Próximas etapas

Agora que você sabe usar como transformar dados no IoT Central, sugere-se como próxima etapa aprender Como usar a análise no IoT Central.