Recherchez le décalage d’étalonnage d’une ressource et ajoutez-le à chaque mesure. Cet exemple ajoute un décalage de 2 à une valeur de 20, produisant correctedValue: 22.
Prerequisites
Compléter les prérequis de l’exemple partagé, y compris le factory-mqtt profil et le default point de terminaison. Utilisez YAML pour le débogage et Azure CLI ou Bicep pour la gestion de production.
Utilisez le point de terminaison intégré du registre existant nommé default. Pour les variables d’environnement, définissez AIO_INSTANCE_NAME et RESOURCE_GROUP sur le nom de votre instance existante et celui de votre groupe de ressources. Pour Bicep, définissez également CUSTOM_LOCATION_NAME sur le nom de votre emplacement personnalisé existant.
Synchronisez l’horloge du rédacteur du magasin d’état avec celle du broker. Confirmez une réponse réussie +OK lors du remplissage de l’enregistrement d’étalonnage avant de publier les lectures.
Utilisez enrichment pour lire les enregistrements d’étalonnage qu’une application conserve dans le state store. La recherche utilise le contexte disponible pendant le traitement, qui ne correspond pas nécessairement au contexte valide au moment de l’échantillonnage de la mesure. Dans ce cas, associez le contexte par horodatage.
Déploiez le graphique d’étalonnage :
Dans l’expérience d’opérations, ouvrez votre instance et sélectionnez Graphique de Data Flow>Créer un graphique de Data Flow.
Nommez le graphique add-calibration et sélectionnez le default profil.
Ajoutez une source nommée source à l’aide du point de terminaison factory-mqtt et de la rubrique factory/readings.
Ajouter une transformation de mappage nommée calibrate, en utilisant azureiotoperations/graph-dataflow-map:1.0.0 depuis le point de terminaison default du registre.
Dans la configuration de la transformation de type carte, ajoutez un jeu de données avec, dans cet ordre, Clé du magasin d’étatfactory-calibration as calibration, Faire correspondre les entrées$source.assetId et $context.assetId, puis Expression match$1 == $2.
Ajoutez ces règles de carte :
| Entrées (dans l’ordre) |
Output |
Expression |
* |
* |
Laissez ce champ vide |
value, $context(calibration).offset |
correctedValue |
$1 + $2 |
Ajoutez une destination nommée destination à l’aide du point de terminaison factory-mqtt et de la rubrique factory/calibrated.
Reliez source → calibrate → destination, puis sélectionnez Enregistrer pour déployer le graphe activé.
Sauvegarder ces propriétés complètes du graphe sous la forme graph.json. La commande utilise le profil existant 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": "{\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
Enregistrez ce modèle sous main.bicep. Il fait référence à l’instance existante, à l’emplacement personnalisé et au profil default.
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"
Important
L’utilisation des manifestes de déploiement Kubernetes n’est pas prise en charge dans les environnements de production et ne doit être utilisée que pour le débogage et le test.
Enregistrez le manifeste suivant sous le nom 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
Avant d’envoyer les mesures, écrivez cet enregistrement NDJSON synthétique sous la clé de magasin d’état factory-calibration. Utilisez la procédure de state-store SET dans Renseigner la clé du state-store.
{"assetId":"line-1","offset":2}
Publiez cette mesure sur factory/readings :
{"assetId":"line-1","value":20}
Attendez-vous à recevoir cette charge utile sur factory/calibrated. La carte préserve les champs originaux et ajoute 20 + 2:
{"assetId":"line-1","value":20,"correctedValue":22}
Ce graphique suppose un enregistrement d’étalonnage correspondant avec un décalage numérique. Avant de l’utiliser en production, définissez comment gérer le contexte manquant et surveiller les erreurs de recherche ; l’exemple n’inclut pas de route pour contexte invalide.
Contenu connexe