Wyszukaj przesunięcie kalibracji zasobu i dodaj go do każdego odczytu. Ten przykład dodaje do wartości 20 przesunięcie 2, dając correctedValue: 22.
Prerequisites
Ukończ wspólne przykładowe wymagania wstępne, w tym default profil i factory-mqtt punkt końcowy. Używaj YAML do debugowania oraz Azure CLI lub Bicep do zarządzania środowiskiem produkcyjnym.
Użyj istniejącego wbudowanego endpointu rejestru o nazwie default. Dla zmiennych środowiskowych ustaw wartości AIO_INSTANCE_NAME i RESOURCE_GROUP na istniejące nazwy instancji i grup zasobów. Dla Bicep ustaw także CUSTOM_LOCATION_NAME na swoją istniejącą niestandardową nazwę lokalizacji.
Zsynchronizuj zegar modułu zapisującego magazynu stanu z brokerem. Potwierdź, że odpowiedź +OK zakończyła się powodzeniem podczas wypełniania rekordu kalibracji przed publikacją odczytów.
Użyj enrichment do odczytu rekordów kalibracji przechowywanych przez aplikację w magazynie stanów. Wyszukiwanie wykorzystuje kontekst dostępny podczas przetwarzania, niekoniecznie kontekst ważny w momencie próbkowania odczytu. W takim przypadku dopasuj kontekst według znacznika czasu.
Wdróż wykres kalibracyjny:
W doświadczeniu operacyjnym otwórz swoją instancję i wybierz wykres przepływu danych>Utwórz wykres przepływu danych.
Nadaj nazwę wykresowi add-calibration i wybierz profil default.
Dodaj źródło o nazwie source używając endpoint factory-mqtt i topic factory/readings.
Dodaj transformację mapy o nazwie calibrate, używając azureiotoperations/graph-dataflow-map:1.0.0 z punktu końcowego rejestru default.
W konfiguracji transformacji mapy dodaj zbiór danych z State store keyfactory-calibration as calibration, Match inputs$source.assetId i $context.assetId w tej kolejności, oraz Match expression$1 == $2.
Dodaj następujące zasady mapy:
| Dane wejściowe (w kolejności) |
Output |
Expression |
* |
* |
Pozostaw pole puste |
value, $context(calibration).offset |
correctedValue |
$1 + $2 |
Dodaj miejsce docelowe o nazwie destination za pomocą endpointu factory-mqtt i topic factory/calibrated.
Połącz source → calibrate → destination, a następnie wybierz Zapisz, aby wdrożyć aktywny graf.
Zapisz te pełne właściwości grafu jako graph.json. Polecenie wykorzystuje istniejący default profil.
{
"mode": "Enabled",
"nodes": [
{
"name": "source",
"nodeType": "Source",
"sourceSettings": {
"endpointRef": "factory-mqtt",
"dataSources": ["factory/readings"]
}
},
{
"name": "calibrate",
"nodeType": "Graph",
"graphSettings": {
"registryEndpointRef": "default",
"artifact": "azureiotoperations/graph-dataflow-map:1.0.0",
"configuration": [
{
"key": "rules",
"value": "{\n \"datasets\": [\n {\n \"key\": \"factory-calibration as calibration\",\n \"inputs\": [\"$source.assetId\", \"$context.assetId\"],\n \"expression\": \"$1 == $2\"\n }\n ],\n \"map\": [\n {\"inputs\": [\"*\"], \"output\": \"*\"},\n {\n \"inputs\": [\"value\", \"$context(calibration).offset\"],\n \"output\": \"correctedValue\",\n \"expression\": \"$1 + $2\"\n }\n ]\n}\n"
}
]
}
},
{
"name": "destination",
"nodeType": "Destination",
"destinationSettings": {
"endpointRef": "factory-mqtt",
"dataDestination": "factory/calibrated"
}
}
],
"nodeConnections": [
{ "from": { "name": "source" }, "to": { "name": "calibrate" } },
{ "from": { "name": "calibrate" }, "to": { "name": "destination" } }
]
}
az iot ops dataflowgraph apply \
--name add-calibration \
--instance $AIO_INSTANCE_NAME \
--resource-group $RESOURCE_GROUP \
--config-file graph.json
Zapisz ten szablon jako main.bicep. Odnosi się do istniejącej instancji, niestandardowej lokalizacji i default profilu.
param aioInstanceName string
param customLocationName string
resource aioInstance 'Microsoft.IoTOperations/instances@2026-07-01' existing = {
name: aioInstanceName
}
resource customLocation 'Microsoft.ExtendedLocation/customLocations@2021-08-31-preview' existing = {
name: customLocationName
}
resource defaultDataflowProfile 'Microsoft.IoTOperations/instances/dataflowProfiles@2026-07-01' existing = {
parent: aioInstance
name: 'default'
}
resource dataflowGraph 'Microsoft.IoTOperations/instances/dataflowProfiles/dataflowGraphs@2026-07-01' = {
parent: defaultDataflowProfile
name: 'add-calibration'
extendedLocation: {
name: customLocation.id
type: 'CustomLocation'
}
properties: {
mode: 'Enabled'
nodes: [
{
name: 'source'
nodeType: 'Source'
sourceSettings: {
endpointRef: 'factory-mqtt'
dataSources: [ 'factory/readings' ]
}
}
{
name: 'calibrate'
nodeType: 'Graph'
graphSettings: {
registryEndpointRef: 'default'
artifact: 'azureiotoperations/graph-dataflow-map:1.0.0'
configuration: [
{
key: 'rules'
value: '{\n "datasets": [\n {\n "key": "factory-calibration as calibration",\n "inputs": ["$source.assetId", "$context.assetId"],\n "expression": "$1 == $2"\n }\n ],\n "map": [\n {"inputs": ["*"], "output": "*"},\n {\n "inputs": ["value", "$context(calibration).offset"],\n "output": "correctedValue",\n "expression": "$1 + $2"\n }\n ]\n}\n'
}
]
}
}
{
name: 'destination'
nodeType: 'Destination'
destinationSettings: {
endpointRef: 'factory-mqtt'
dataDestination: 'factory/calibrated'
}
}
]
nodeConnections: [
{
from: { name: 'source' }
to: { name: 'calibrate' }
}
{
from: { name: 'calibrate' }
to: { name: 'destination' }
}
]
}
}
az deployment group create \
--resource-group $RESOURCE_GROUP \
--template-file main.bicep \
--parameters aioInstanceName="$AIO_INSTANCE_NAME" customLocationName="$CUSTOM_LOCATION_NAME"
Ważna
Korzystanie z manifestów wdrożenia platformy Kubernetes nie jest obsługiwane w środowiskach produkcyjnych i powinno być używane tylko do debugowania i testowania.
Zapisz poniższy manifest jako add-calibration.yaml.
apiVersion: connectivity.iotoperations.azure.com/v1
kind: DataflowGraph
metadata:
name: add-calibration
namespace: azure-iot-operations
spec:
profileRef: default
mode: Enabled
nodes:
- name: source
nodeType: Source
sourceSettings:
endpointRef: factory-mqtt
dataSources: [factory/readings]
- name: calibrate
nodeType: Graph
graphSettings:
registryEndpointRef: default
artifact: azureiotoperations/graph-dataflow-map:1.0.0
configuration:
- key: rules
value: |
{
"datasets": [
{
"key": "factory-calibration as calibration",
"inputs": ["$source.assetId", "$context.assetId"],
"expression": "$1 == $2"
}
],
"map": [
{"inputs": ["*"], "output": "*"},
{
"inputs": ["value", "$context(calibration).offset"],
"output": "correctedValue",
"expression": "$1 + $2"
}
]
}
- name: destination
nodeType: Destination
destinationSettings:
endpointRef: factory-mqtt
dataDestination: factory/calibrated
nodeConnections:
- from: { name: source }
to: { name: calibrate }
- from: { name: calibrate }
to: { name: destination }
kubectl apply -f add-calibration.yaml
Przed wysłaniem odczytów zapisz ten syntetyczny rekord NDJSON pod kluczem magazynu stanu factory-calibration. Użyj procedury magazynu stanów SET w Wypełnij klucz magazynu stanów.
{"assetId":"line-1","offset":2}
Opublikuj tę lekturę do factory/readings:
{"assetId":"line-1","value":20}
Spodziewaj się tego ładunku danych na factory/calibrated. Mapa zachowuje oryginalne pola i dodaje 20 + 2:
{"assetId":"line-1","value":20,"correctedValue":22}
Ten wykres zakłada dopasowany rekord kalibracyjny z przesunięciem numerycznym. Przed użyciem w produkcji zdefiniuj, jak radzić sobie z brakującym kontekstem i monitorować błędy wyszukiwania; przykład nie zawiera obsługi nieprawidłowego kontekstu.
Treści powiązane