Transforme os dados dentro da sua aplicação IoT Central para exportação

Os dispositivos IoT enviam dados em vários formatos. Para utilizar os dados do dispositivo na sua solução IoT, poderá ter de transformar os dados do seu dispositivo antes de serem exportados para outros serviços.

Este artigo mostra como transformar dados do dispositivo como parte de uma definição de exportação de dados numa aplicação IoT Central.

As transformações numa definição de exportação de dados da IoT Central permitem manipular o formato e estrutura dos dados do dispositivo antes de ser exportado para um destino. Pode especificar uma transformação para cada destino numa definição de exportação. Cada mensagem passa pela transformação para criar um registo de saída que é exportado para o destino.

Use transformações para reestruturar cargas JSON, renomear campos, filtrar campos e executar cálculos simples sobre valores de telemetria. Por exemplo, utilize uma transformação para converter as suas mensagens num formato tabular que corresponda ao esquema de um destino como uma tabela Data Explorer Azure.

O seguinte vídeo apresenta-o às transformações de dados da IoT Central:

Adicione uma transformação

Para adicionar uma transformação para um destino na sua exportação de dados, selecione + Transform como mostrado na imagem seguinte:

Screenshot que mostra como adicionar uma transformação a um destino.

O painel de Transformação de Dados permite especificar a transformação. No 1. Adicione a sua secção de mensagem de entrada , pode introduzir uma mensagem de amostra que deseja passar através da transformação. Também pode gerar uma mensagem de amostra selecionando um modelo de dispositivo. No 2. Construa a secção de consulta de transformação , pode introduzir a consulta que transforma a mensagem de entrada. O 3. A secção de mensagens de saída de pré-visualização mostra o resultado da transformação:

Screenshot do editor de transformação na IoT Central.

Dica

Se não souber o formato da sua mensagem de entrada, utilize . como consulta para exportar a mensagem como é para um destino como um Webhook. Em seguida, cole a mensagem recebida pelo webhook em *1. Adicione a sua mensagem de entrada. Em seguida, crie uma consulta de transformação para processar esta mensagem no seu formato de saída requerido.

Construir uma consulta de transformação

O motor de transformação utiliza o processador JQ JSON de código aberto para reestruturar e formatar cargas JSON. Para especificar uma transformação, você escreve uma consulta JQ, que pode usar os filtros, funções e características incorporadas do JQ. Para alguns exemplos de consulta, consulte consultas de transformação de exemplo. Para saber mais sobre a escrita de consultas JQ, consulte o manual JQ.

Estrutura de mensagem pré-transformação

Pode exportar os seguintes fluxos de dados da IoT Central: telemetria, alterações de propriedade, eventos de conectividade do dispositivo, eventos de ciclo de vida do dispositivo e eventos de ciclo de vida do modelo do dispositivo. Cada tipo de dados tem uma estrutura específica que inclui informações como valores de telemetria, informação de aplicação, metadados do dispositivo e valores de propriedade.

O exemplo a seguir mostra a forma da mensagem de telemetria. Todos estes dados estão disponíveis para a sua transformação. A estrutura da mensagem é semelhante para outros tipos de mensagens, mas existem alguns campos específicos do tipo. Pode utilizar a função Adicionar a sua mensagem de entrada para gerar uma mensagem de amostra baseada num modelo de dispositivo na sua aplicação.

{
  "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

Utilize a função de mensagem de entrada Na UI da aplicação IoT Central para ver estruturas de mensagens de amostra para outros tipos de exportação de dados, tais como alterações de propriedade.

Consultas de transformação de exemplo

Os exemplos de consulta a seguir utilizam a mensagem de telemetria mostrada na secção anterior.

Exemplo 1: A seguinte consulta JQ produz cada peça de telemetria a partir da mensagem de entrada como uma mensagem de saída separada:

.telemetry[]

Saída 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 série de tipos de telemetria, utilize a consulta .telemetry.

Exemplo 2: A seguinte consulta JQ converte a matriz de telemetria de entrada num objeto com nomes de telemetria como teclas:

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

Saída JSON:

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

Exemplo 3: A seguinte consulta JQ encontra o valor da telemetria RangeOfMotion e converte-a de graus em radianos utilizando a fórmula rad = degree * pi / 180. Esta consulta também mostra como importar e usar o iotc módulo:

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

Saída JSON:

{
  "rangeOfMotion": 1.9198621771937625
}

Exemplo 4: Para manipular a mensagem de entrada num formato tabular, pode mapear cada mensagem exportada para uma ou mais linhas. A saída da linha é logicamente representada como um objeto JSON onde 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

Utilize um formato tabular quando exportar para a Azure Data Explorer.

A seguinte consulta JQ escreve linhas para uma tabela que armazena gama de telemetria Demotion em diferentes dispositivos. O ID do dispositivo de consulta, o tempo e a amplitude 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 Central IoT

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

import "iotc" as iotc;

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

find(expression): A find função permite encontrar um elemento de matriz específico, como o valor da telemetria ou a entrada de propriedade na sua carga útil. A entrada da função é uma matriz e o parâmetro define um filtro JQ para correr contra cada elemento da matriz. A função devolve cada elemento de matriz onde o filtro avalia a verdade:

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

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

Cenários

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

Cenário 1: Dados do dispositivo de exportação para a Azure Data Explorer

Neste cenário, transforma-se os dados do dispositivo para corresponder ao esquema fixo em Azure Data Explorer, onde cada valor de telemetria aparece como uma coluna na tabela e cada linha representa uma única mensagem. Por exemplo:

DeviceId CarimboDeDataEHora 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 esta tabela, cada mensagem exportada deve parecer o seguinte objeto. O objeto representa uma única linha, onde as teclas são nomes de colunas e os valores são o valor a colocar em cada coluna:

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

Neste cenário, o dispositivo envia os t1valores , t2e t3 telemetria numa mensagem de entrada que se parece com o 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 seguinte consulta JQ produz os T1valores , T2 e T3 telemetria, o Timestamp e o deviceId como uma mensagem com pares de valor-chave correspondentes ao esquema de tabela 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 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 e base de dados Azure Data Explorer como destino de exportação, consulte Criar um destino Data Explorer Azure.

Cenário 2: Quebrar uma matriz de telemetria

Neste cenário, o dispositivo envia a seguinte gama de telemetria numa 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
  }
}

Pretende transformar estes dados do dispositivo de acordo com o seguinte esquema de tabela:

cicloCount deviceId tempo enqueso ParentStatus correndo subdeviceId
2315 "9xwhr7khkfri" "1909-10-10T07:11:56.078161042Z" "saudável" true "subdevice1"
824567 "9xwhr7khkfri" "1909-10-10T07:11:56.078161042Z" "saudável" false "subdevice2"

A seguinte consulta JQ cria uma mensagem de saída separada para cada entrada de subdevice na mensagem, e inclui algumas informações comuns a partir da mensagem base e dispositivo principal. Esta consulta atenua a saída e separa divisões lógicas nos seus 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 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 de POWER BI

A funcionalidade de streaming Power BI em tempo real permite-lhe visualizar dados num dashboard que é atualizado em tempo real com baixa latência. Para saber mais, consulte o streaming em tempo real no Power BI.

Para utilizar o IoT Central com Power BI Streaming, crie uma exportação webhook que envie organismos de pedido num formato específico. Este exemplo pressupõe que tem um conjunto de dados de streaming Power BI 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 webhook, você precisa do ponto final DE URL DE API REST para o seu conjunto de dados de streaming Power BI.

Neste cenário, o dispositivo envia mensagens de telemetria que se parecem 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 seguinte consulta JQ transforma a mensagem de entrada num formato adequado para o webhook enviar para o conjunto de dados de streaming Power BI. Este exemplo inclui uma condição de filtro apenas para mensagens de saída para um modelo de dispositivo específico. Pode utilizar a função 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 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: Os dados de exportação para a Azure Data Explorer e visualizá-lo no Power BI

Neste cenário, exporta dados para a Azure Data Explorer e, em seguida, utilize um conector para visualizar os dados no Power BI. Para saber mais sobre como adicionar um cluster e base de dados Azure Data Explorer como destino de exportação, consulte Criar um destino Data Explorer Azure.

Este cenário utiliza uma tabela Data Explorer Azure 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
)

Neste cenário, o dispositivo envia mensagens de telemetria que se parecem 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 seguinte consulta JQ transforma a mensagem de entrada numa mensagem de saída separada para cada valor de telemetria. Esta transformação produz uma saída que corresponde ao esquema de mesa Azure Data Explorer. A transformação utiliza um esquema de valor-atributo de entidade onde cada linha detém um único valor de telemetria e o nome da telemetria é um valor numa 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 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 seu Azure Data Explorer cluster. Para visualizar os dados exportados no Power BI, complete os seguintes passos:

  1. Instale a aplicação Power BI. Pode descarregar a aplicação Power BI do desktop de Go from data to insight to action with Power BI Desktop.
  2. Descarregue o ficheiro Power BI desktop IoT Central ADX Connector.pbit do GitHub.
  3. Utilize a aplicação Power BI Desktop para abrir o ficheiro IoT Central ADX Connector.pbit que descarregou no passo anterior. Quando solicitado, insira o cluster, base de dados e informações de Data Explorer Azure que fez anteriormente.

Agora pode visualizar os dados no Power BI:

Screenshot do relatório Power BI que mostra dados da IoT Central.

Passos seguintes

Agora que sabe como transformar dados na IoT Central, um próximo passo sugerido é aprender a usar a análise na IoT Central.