Berechnen Sie eine Vorhersage, indem Sie auf jede Messung eine bekannte Formel anwenden. Beispielsweise sagt weight = 2 * speed + 0.5 * temperature + 173 ein Gewicht von 203 voraus, wenn die Geschwindigkeit 10 und die Temperatur 20 beträgt. Eine eingebaute Kartentransformation führt die Berechnung durch.
Das Beispiel verwendet eine vordefinierte Formel und synthetische Werte.
Verwandte unabhängige Muster umfassen das Anpassen und die Genehmigung einer Aktualisierung sowie die Lieferung genehmigter Koeffizienten über MQTT.
Voraussetzungen
Erfüllen Sie die gemeinsamen Beispielvoraussetzungen, einschließlich des factory-mqtt Profils und des default Endpunkts. Verwenden Sie YAML zum Debuggen und Azure CLI oder Bicep für das Produktionsmanagement.
Verwenden Sie den bestehenden default Registry-Endpunkt für eingebaute Transformationen. Legen Sie für CLI-Bereitstellungen AIO_INSTANCE_NAME und RESOURCE_GROUP auf Ihre vorhandene Instanz und Ressourcengruppe fest. Für Bicep-Deployments solltest du auch CUSTOM_LOCATION_NAME auf den bestehenden benutzerdefinierten Standort der Instanz einstellen. Die Deployment-Tabs beziehen sich auf diese gemeinsamen Ressourcen; sie erstellen sie nicht.
Wählen Sie, woher die Koeffizienten kommen
| Koeffizientenquelle |
Verarbeitungspfad |
Verwenden Sie, wenn |
| In jeder Nachricht enthalten |
Lesen mit Koeffizienten → Zuordnung → Vorhersage |
Das Modell und seine Version werden bereits durch den Produzenten bereitgestellt |
| Separat nach Asset gespeichert |
Lesen → Anreicherung → Zuordnung → Vorhersage |
Eine Anwendung pflegt genehmigte Koeffizienten unabhängig von Sensornachrichten |
Wählen Sie einen der vollständigen Graphen aus. Die Anreicherung liefert gespeicherte Parameter. Die Zuordnung wertet die Formel aus. Beide Wege bewahren die Piece-ID, die Merkmale und die Modellversion.
Bewerten Sie die in der Nachricht bereitgestellten Koeffizienten
Wenn ein Datensatz die Eingaben und Koeffizienten enthält, wertet eine speed * speedCoefficient + temperature * temperatureCoefficient + intercept aus.
Die Wildcard-Regel im folgenden Beispiel bewahrt die ursprünglichen Felder. Wenn die Eingaben separat ankommen, verwenden Sie Kontextsuche oder Korrelation, um den Datensatz zusammenzustellen.
Modelle, die eine Laufzeit oder einen Algorithmus über die Ausdruckssprache hinaus benötigen, benötigen benutzerdefiniertes WASM oder einen externen Dienst.
Stellen Sie diesen Graphen mit einer der folgenden Methoden bereit. Abonnieren Sie factory/predicted-values, und veröffentlichen Sie dann die folgende Eingabe in factory/features-with-model.
Öffnen Sie in der Betriebsumgebung Ihre Instanz, und wählen Sie Datenflussgraph>Datenflussgraph erstellen aus.
Benennen Sie das Diagramm predict-with-coefficients und wählen Sie das default Profil aus.
Quelle source mit Endpunkt factory-mqtt und Thema factory/features-with-modelhinzufügen.
Fügen Sie die Map-Transformation predict hinzu, unter Verwendung von azureiotoperations/graph-dataflow-map:1.0.0 aus dem Registry-Endpunkt default. Konfigurieren Sie diese Regeln in folgender Reihenfolge:
| Eingaben (in der Reihenfolge) |
Ausgabe |
Ausdruck |
* |
* |
Leer lassen |
speed, temperature, speedCoefficient, temperatureCoefficient, , intercept |
predictedWeight |
$1 * $3 + $2 * $4 + $5 |
Fügen Sie Ziel destination mit Endpunkt factory-mqtt und Topic factory/predicted-values hinzu.
Verbinden Sie source → predict → destination und wählen Speichern.
Speichere die vollständigen Grapheigenschaften als graph.json. Transformationsregeln sind JSON-Zeichenfolgen mit Escapezeichen in configuration.value.
{
"mode": "Enabled",
"nodes": [
{
"name": "source",
"nodeType": "Source",
"sourceSettings": {
"endpointRef": "factory-mqtt",
"dataSources": ["factory/features-with-model"]
}
},
{
"name": "predict",
"nodeType": "Graph",
"graphSettings": {
"registryEndpointRef": "default",
"artifact": "azureiotoperations/graph-dataflow-map:1.0.0",
"configuration": [
{
"key": "rules",
"value": "{\"map\":[{\"inputs\":[\"*\"],\"output\":\"*\"},{\"inputs\":[\"speed\",\"temperature\",\"speedCoefficient\",\"temperatureCoefficient\",\"intercept\"],\"output\":\"predictedWeight\",\"expression\":\"$1 * $3 + $2 * $4 + $5\"}]}"
}
]
}
},
{
"name": "destination",
"nodeType": "Destination",
"destinationSettings": {
"endpointRef": "factory-mqtt",
"dataDestination": "factory/predicted-values"
}
}
],
"nodeConnections": [
{"from": {"name": "source"}, "to": {"name": "predict"}},
{"from": {"name": "predict"}, "to": {"name": "destination"}}
]
}
Wenden Sie den Graphen auf das default Profil der bestehenden Instanz an:
az iot ops dataflowgraph apply \
--name predict-with-coefficients \
--instance $AIO_INSTANCE_NAME \
--resource-group $RESOURCE_GROUP \
--config-file graph.json
Speichern Sie als main.bicep. Alle übergeordneten Ressourcen existieren bereits in der Ressourcengruppe.
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: 'predict-with-coefficients'
extendedLocation: {
name: customLocation.id
type: 'CustomLocation'
}
properties: {
mode: 'Enabled'
nodes: [
{
name: 'source'
nodeType: 'Source'
sourceSettings: {
endpointRef: 'factory-mqtt'
dataSources: ['factory/features-with-model']
}
}
{
name: 'predict'
nodeType: 'Graph'
graphSettings: {
registryEndpointRef: 'default'
artifact: 'azureiotoperations/graph-dataflow-map:1.0.0'
configuration: [
{
key: 'rules'
value: '{"map":[{"inputs":["*"],"output":"*"},{"inputs":["speed","temperature","speedCoefficient","temperatureCoefficient","intercept"],"output":"predictedWeight","expression":"$1 * $3 + $2 * $4 + $5"}]}'
}
]
}
}
{
name: 'destination'
nodeType: 'Destination'
destinationSettings: {
endpointRef: 'factory-mqtt'
dataDestination: 'factory/predicted-values'
}
}
]
nodeConnections: [
{ from: { name: 'source' }, to: { name: 'predict' } }
{ from: { name: 'predict' }, 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
Die Verwendung von Kubernetes-Bereitstellungsmanifesten wird in Produktionsumgebungen nicht unterstützt und sollte nur zum Debuggen und Testen verwendet werden.
Speichern Sie als predict-with-coefficients.yaml.
apiVersion: connectivity.iotoperations.azure.com/v1
kind: DataflowGraph
metadata:
name: predict-with-coefficients
namespace: azure-iot-operations
spec:
profileRef: default
mode: Enabled
nodes:
- name: source
nodeType: Source
sourceSettings:
endpointRef: factory-mqtt
dataSources: [factory/features-with-model]
- name: predict
nodeType: Graph
graphSettings:
registryEndpointRef: default
artifact: azureiotoperations/graph-dataflow-map:1.0.0
configuration:
- key: rules
value: |
{
"map": [
{"inputs":["*"],"output":"*"},
{
"inputs":["speed","temperature","speedCoefficient","temperatureCoefficient","intercept"],
"output":"predictedWeight",
"expression":"$1 * $3 + $2 * $4 + $5"
}
]
}
- name: destination
nodeType: Destination
destinationSettings:
endpointRef: factory-mqtt
dataDestination: factory/predicted-values
nodeConnections:
- from: { name: source }
to: { name: predict }
- from: { name: predict }
to: { name: destination }
kubectl apply -f predict-with-coefficients.yaml
Eingabe für factory/features-with-model:
{"assetId":"line-1","pieceId":"part-42","modelVersion":8,"speed":10,"temperature":20,"speedCoefficient":2,"temperatureCoefficient":0.5,"intercept":173}
Die Ausgabe auf factory/predicted-values bewahrt die Eingabefelder und fügt predictedWeight hinzu:
{"assetId":"line-1","pieceId":"part-42","modelVersion":8,"speed":10,"temperature":20,"speedCoefficient":2,"temperatureCoefficient":0.5,"intercept":173,"predictedWeight":203}
Lesen Sie Koeffizienten aus dem Zustandsspeicher
Verwenden Sie Enrichment, um den vollständigen aktiven Modell-Datensatz unter Schlüssel factory-active-models zu lesen und anschließend die Formel mit einer Map-Transformation auszuwerten.
Für eine eigenständige Demo verwenden Sie den State-Store-Writer , um den v8-Datensatz zu seeden; es ist kein Anpassungsschritt erforderlich. Die Uhren von Writer und Broker müssen synchronisiert sein. Warte auf die entsprechende +OK Antwort, bevor du die Messwerte veröffentlichst.
Stellen Sie diesen Graphen mit einer der folgenden Methoden bereit. Abonnieren Sie factory/predictions, und veröffentlichen Sie dann diese Eingabe in factory/features:
{"assetId":"line-1","pieceId":"part-43","speed":10,"temperature":20}
Beim per Seeding generierten v8-Modell weist die Ausgabe predictedWeight: 203 und modelVersion: 8 auf.
Der Graph liest den genehmigten Eintrag für jede Vorhersage aus.
Öffnen Sie in der Betriebsumgebung Ihre Instanz, und wählen Sie Datenflussgraph>Datenflussgraph erstellen aus.
Benennen Sie das Diagramm predict-with-approved-model und wählen Sie das default Profil aus.
Quelle source mit Endpunkt factory-mqtt und Thema factory/featureshinzufügen.
Fügen Sie die Map-Transformation read-model hinzu und verwenden Sie azureiotoperations/graph-dataflow-map:1.0.0 aus dem Registry-Endpunkt default. Legen Sie in der Datasetkonfiguration den Statusspeicherschlüssel factory-active-models as model, die Übereinstimmungseingaben $source.assetId, $context.assetId und den Übereinstimmungsausdruck $1 == $2 fest. Konfigurieren Sie diese Zuordnungsregeln der Reihe nach und lassen Sie Ausdrücke leer:
| Input |
Ausgabe |
* |
* |
$context(model).modelVersion |
modelVersion |
$context(model).speedCoefficient |
speedCoefficient |
$context(model).temperatureCoefficient |
temperatureCoefficient |
$context(model).intercept |
intercept |
Fügen Sie die Map-Transformation predict hinzu, wobei Sie dasselbe Artefakt und Registry-Endpunkt verwenden. Konfigurieren Sie diese Regeln in der Reihenfolge:
| Eingaben (der Reihe nach) |
Ausgabe |
Ausdruck |
* |
* |
Leer lassen |
assetId |
kind |
"prediction" |
speed, temperature, speedCoefficient, temperatureCoefficient, , intercept |
predictedWeight |
$1 * $3 + $2 * $4 + $5 |
Fügen Sie Ziel destination mit Endpunkt factory-mqtt und Topic factory/predictions hinzu.
Verbinden source → read-model → predict → destination und wählen Sie Speichern aus.
Speichere die vollständigen Grapheigenschaften als graph.json.
{
"mode": "Enabled",
"nodes": [
{
"name": "source",
"nodeType": "Source",
"sourceSettings": {
"endpointRef": "factory-mqtt",
"dataSources": ["factory/features"]
}
},
{
"name": "read-model",
"nodeType": "Graph",
"graphSettings": {
"registryEndpointRef": "default",
"artifact": "azureiotoperations/graph-dataflow-map:1.0.0",
"configuration": [
{
"key": "rules",
"value": "{\"datasets\":[{\"key\":\"factory-active-models as model\",\"inputs\":[\"$source.assetId\",\"$context.assetId\"],\"expression\":\"$1 == $2\"}],\"map\":[{\"inputs\":[\"*\"],\"output\":\"*\"},{\"inputs\":[\"$context(model).modelVersion\"],\"output\":\"modelVersion\"},{\"inputs\":[\"$context(model).speedCoefficient\"],\"output\":\"speedCoefficient\"},{\"inputs\":[\"$context(model).temperatureCoefficient\"],\"output\":\"temperatureCoefficient\"},{\"inputs\":[\"$context(model).intercept\"],\"output\":\"intercept\"}]}"
}
]
}
},
{
"name": "predict",
"nodeType": "Graph",
"graphSettings": {
"registryEndpointRef": "default",
"artifact": "azureiotoperations/graph-dataflow-map:1.0.0",
"configuration": [
{
"key": "rules",
"value": "{\"map\":[{\"inputs\":[\"*\"],\"output\":\"*\"},{\"inputs\":[\"assetId\"],\"output\":\"kind\",\"expression\":\"\\\"prediction\\\"\"},{\"inputs\":[\"speed\",\"temperature\",\"speedCoefficient\",\"temperatureCoefficient\",\"intercept\"],\"output\":\"predictedWeight\",\"expression\":\"$1 * $3 + $2 * $4 + $5\"}]}"
}
]
}
},
{
"name": "destination",
"nodeType": "Destination",
"destinationSettings": {
"endpointRef": "factory-mqtt",
"dataDestination": "factory/predictions"
}
}
],
"nodeConnections": [
{"from": {"name": "source"}, "to": {"name": "read-model"}},
{"from": {"name": "read-model"}, "to": {"name": "predict"}},
{"from": {"name": "predict"}, "to": {"name": "destination"}}
]
}
az iot ops dataflowgraph apply \
--name predict-with-approved-model \
--instance $AIO_INSTANCE_NAME \
--resource-group $RESOURCE_GROUP \
--config-file graph.json
Speichern Sie als main.bicep.
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: 'predict-with-approved-model'
extendedLocation: {
name: customLocation.id
type: 'CustomLocation'
}
properties: {
mode: 'Enabled'
nodes: [
{
name: 'source'
nodeType: 'Source'
sourceSettings: {
endpointRef: 'factory-mqtt'
dataSources: ['factory/features']
}
}
{
name: 'read-model'
nodeType: 'Graph'
graphSettings: {
registryEndpointRef: 'default'
artifact: 'azureiotoperations/graph-dataflow-map:1.0.0'
configuration: [
{
key: 'rules'
value: '{"datasets":[{"key":"factory-active-models as model","inputs":["$source.assetId","$context.assetId"],"expression":"$1 == $2"}],"map":[{"inputs":["*"],"output":"*"},{"inputs":["$context(model).modelVersion"],"output":"modelVersion"},{"inputs":["$context(model).speedCoefficient"],"output":"speedCoefficient"},{"inputs":["$context(model).temperatureCoefficient"],"output":"temperatureCoefficient"},{"inputs":["$context(model).intercept"],"output":"intercept"}]}'
}
]
}
}
{
name: 'predict'
nodeType: 'Graph'
graphSettings: {
registryEndpointRef: 'default'
artifact: 'azureiotoperations/graph-dataflow-map:1.0.0'
configuration: [
{
key: 'rules'
value: '{"map":[{"inputs":["*"],"output":"*"},{"inputs":["assetId"],"output":"kind","expression":"\\"prediction\\""},{"inputs":["speed","temperature","speedCoefficient","temperatureCoefficient","intercept"],"output":"predictedWeight","expression":"$1 * $3 + $2 * $4 + $5"}]}'
}
]
}
}
{
name: 'destination'
nodeType: 'Destination'
destinationSettings: {
endpointRef: 'factory-mqtt'
dataDestination: 'factory/predictions'
}
}
]
nodeConnections: [
{ from: { name: 'source' }, to: { name: 'read-model' } }
{ from: { name: 'read-model' }, to: { name: 'predict' } }
{ from: { name: 'predict' }, 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
Die Verwendung von Kubernetes-Bereitstellungsmanifesten wird in Produktionsumgebungen nicht unterstützt und sollte nur zum Debuggen und Testen verwendet werden.
Speichern Sie als predict-with-approved-model.yaml.
apiVersion: connectivity.iotoperations.azure.com/v1
kind: DataflowGraph
metadata:
name: predict-with-approved-model
namespace: azure-iot-operations
spec:
profileRef: default
mode: Enabled
nodes:
- name: source
nodeType: Source
sourceSettings:
endpointRef: factory-mqtt
dataSources: [factory/features]
- name: read-model
nodeType: Graph
graphSettings:
registryEndpointRef: default
artifact: azureiotoperations/graph-dataflow-map:1.0.0
configuration:
- key: rules
value: |
{
"datasets": [
{
"key":"factory-active-models as model",
"inputs":["$source.assetId","$context.assetId"],
"expression":"$1 == $2"
}
],
"map": [
{"inputs":["*"],"output":"*"},
{"inputs":["$context(model).modelVersion"],"output":"modelVersion"},
{"inputs":["$context(model).speedCoefficient"],"output":"speedCoefficient"},
{"inputs":["$context(model).temperatureCoefficient"],"output":"temperatureCoefficient"},
{"inputs":["$context(model).intercept"],"output":"intercept"}
]
}
- name: predict
nodeType: Graph
graphSettings:
registryEndpointRef: default
artifact: azureiotoperations/graph-dataflow-map:1.0.0
configuration:
- key: rules
value: |
{
"map": [
{"inputs":["*"],"output":"*"},
{"inputs":["assetId"],"output":"kind","expression":"\"prediction\""},
{
"inputs":["speed","temperature","speedCoefficient","temperatureCoefficient","intercept"],
"output":"predictedWeight",
"expression":"$1 * $3 + $2 * $4 + $5"
}
]
}
- name: destination
nodeType: Destination
destinationSettings:
endpointRef: factory-mqtt
dataDestination: factory/predictions
nodeConnections:
- from: { name: source }
to: { name: read-model }
- from: { name: read-model }
to: { name: predict }
- from: { name: predict }
to: { name: destination }
kubectl apply -f predict-with-approved-model.yaml
Die erste Zuordnung kopiert das ausgewählte Modell und die Version in den Datensatz.
Der zweite berechnet aus diesen Feldern. Zuordnungsregeln lesen die Eingabe der Transformation.
Um auch Vorhersagen vor und nach einem Update zu vergleichen, führen Sie zunächst ein Seeding für v7 durch, indem Sie modelVersion des Writers in 7 und intercept in 175 ändern. Veröffentlichen Sie den Lesevorgang, schreiben Sie v8, und veröffentlichen Sie einen Lesevorgang für ein neues Teil.
| Gespeichertes Modell |
Berechnung für Geschwindigkeit 10, Temperatur 20 |
Vorhergesagtes Gewicht |
| v7 |
10 * 2 + 20 * 0.5 + 175 |
205 |
| v8 |
10 * 2 + 20 * 0.5 + 173 |
203 |
Nachdem die Instanz v8 beobachtet hat, erzeugt ein Lesevorgang für part-44 diese Ausgabe in factory/predictions:
{"assetId":"line-1","pieceId":"part-44","speed":10,"temperature":20,"modelVersion":8,"speedCoefficient":2,"temperatureCoefficient":0.5,"intercept":173,"kind":"prediction","predictedWeight":203}
State Lookup-Caches können v7 nach erfolgreichem Schreiben aktiv halten. Überprüfen Sie die ausgegebene modelVersion, um zu sehen, wann die Instanz v8 beobachtet. Das Beispiel setzt voraus, dass ein Matching-Modell existiert; fügen Sie einen Ablehnungs- oder Wiederherstellungspfad für fehlenden oder veralteten Modellkontext hinzu.
Lookup verwendet das während der Verarbeitung verfügbare Modell. Für ein Modell, das durch den Zeitstempel des Messwerts ausgewählt wird, verwenden Sie Zeitstempelabgleich.
Verwandte Inhalte