Zuordnen von Daten mithilfe von Dataflows
Wichtig
Diese Seite enthält Anweisungen zum Verwalten der Komponenten von „Azure IoT Einsatz“ mithilfe von Kubernetes-Bereitstellungsmanifesten. Diese Option befindet sich in der Vorschau. Dieses Feature wird mit einigen Einschränkungen bereitgestellt und darf nicht für Produktionsworkloads verwendet werden.
Die zusätzlichen Nutzungsbestimmungen für Microsoft Azure-Vorschauen enthalten rechtliche Bedingungen. Sie gelten für diejenigen Azure-Features, die sich in der Beta- oder Vorschauversion befinden oder aber anderweitig noch nicht zur allgemeinen Verfügbarkeit freigegeben sind.
Verwenden Sie die Zuordnungssprache für Dataflows, um Daten in Azure IoT Einsatz zu transformieren. Bei der Syntax handelt es sich um eine einfache und dennoch leistungsfähige Methode zum Definieren von Zuordnungen, die Daten von einem Format in ein anderes transformieren. Dieser Artikel enthält eine Übersicht über die Zuordnungssprache für Dataflows und wichtige Konzepte.
Mit der Zuordnung können Sie Daten aus einem Format in ein anderes transformieren. Betrachten Sie den folgenden Eingabedatensatz:
{
"Name": "Grace Owens",
"Place of birth": "London, TX",
"Birth Date": "19840202",
"Start Date": "20180812",
"Position": "Analyst",
"Office": "Kent, WA"
}
Vergleichen Sie diesen mit dem Ausgabedatensatz:
{
"Employee": {
"Name": "Grace Owens",
"Date of Birth": "19840202"
},
"Employment": {
"Start Date": "20180812",
"Position": "Analyst, Kent, WA",
"Base Salary": 78000
}
}
Im Ausgabedatensatz werden die folgenden Änderungen an den Eingabedaten vorgenommen:
- Felder umbenannt: Das Feld
Birth Date
heißt jetztDate of Birth
. - Felder neu strukturiert: Sowohl
Name
als auchDate of Birth
werden unter der neuen KategorieEmployee
gruppiert. - Feld gelöscht: Das Feld
Place of birth
wurde entfernt, da es in der Ausgabe nicht vorhanden ist. - Feld hinzugefügt: Das Feld
Base Salary
ist ein neues Feld in der KategorieEmployment
. - Feldwerte geändert oder zusammengeführt: Das Feld
Position
in der Ausgabe kombiniert die neuen FelderPosition
undOffice
aus der Eingabe.
Die Transformationen werden durch eine Zuordnung erreicht, die in der Regel Folgendes umfasst:
- Eingabedefinition: Identifizieren der Felder in den verwendeten Eingabedatensätzen
- Ausgabedefinition: Angeben, wo und wie die Eingabefelder in den Ausgabedatensätzen angeordnet sind
- Konvertierung (optional): Ändern der Eingabefelder, damit diese in die Ausgabefelder passen.
expression
ist erforderlich, wenn mehrere Eingabefelder in einem einzelnen Ausgabefeld kombiniert werden.
Die folgende Zuordnung ist ein Beispiel:
{
inputs: [
'BirthDate'
]
output: 'Employee.DateOfBirth'
}
{
inputs: [
'Position' // - - - - $1
'Office' // - - - - $2
]
output: 'Employment.Position'
expression: '$1 + ", " + $2'
}
{
inputs: [
'$context(position).BaseSalary'
]
output: 'Employment.BaseSalary'
}
Im Beispiel wird Folgendes zugeordnet:
- 1:1-Zuordnung: Dabei wird
BirthDate
ohne Konvertierung direktEmployee.DateOfBirth
zugeordnet. - n:1-Zuordnung: Dabei werden
Position
undOffice
in einem einzigenEmployment.Position
-Feld kombiniert. Die Konvertierungsformel ($1 + ", " + $2
) führt diese Felder in einer formatierten Zeichenfolge zusammen. - Kontextbezogene Daten: Dabei wird
BaseSalary
aus einem kontextbezogenen Dataset mit dem Namenposition
hinzugefügt.
Feldverweise
Feldverweise stellen mithilfe der Punktnotation wie Employee.DateOfBirth
oder des Zugriffs auf Daten aus einem kontextbezogenen Dataset über $context(position)
dar, wie Pfade in der Ein- und Ausgabe angegeben werden.
MQTT- und Kafka-Metadateneigenschaften
Wenn Sie MQTT oder Kafka als Quelle oder Ziel verwenden, können Sie auf verschiedene Metadateneigenschaften in der Zuordnungssprache zugreifen. Diese Benutzereigenschaften können in der Eingabe oder in der Ausgabe zugeordnet werden.
Metadateneigenschaften
- Thema: Funktioniert sowohl für MQTT als auch für Kafka. Es enthält die Zeichenfolge, wo die Nachricht veröffentlicht wurde. Beispiel:
$metadata.topic
. - Benutzereigenschaft: In MQTT bezieht sich dies auf die Freiform-Schlüssel-Wert-Paare, die eine MQTT-Nachricht tragen kann. Wenn die MQTT-Nachricht z. B. mit einer Benutzereigenschaft mit der Schlüsselpriorität und dem Wert „high“ veröffentlicht wurde, dann enthält der
$metadata.user_property.priority
-Verweis den Wert „hoch“. Benutzereigenschaftsschlüssel können beliebige Zeichenfolgen sein und erfordern möglicherweise Escapezeichen:$metadata.user_property."weird key"
verwendet den Schlüssel „seltsame Taste“ (mit einem Leerzeichen). - Systemeigenschaft: Dieser Ausdruck wird für jede Eigenschaft verwendet, die keine Benutzereigenschaft ist. Derzeit wird nur eine einzelne Systemeigenschaft unterstützt:
$metadata.system_property.content_type
, die die Inhaltstypeigenschaft der MQTT-Nachricht liest (sofern festgelegt). - Kopfzeile: Dies ist das Kafka-Äquivalent der MQTT-Benutzereigenschaft. Kafka kann einen beliebigen binären Wert für einen Schlüssel verwenden, der Datenfluss unterstützt jedoch nur UTF-8-Zeichenfolgenschlüssel. Beispiel:
$metadata.header.priority
. Diese Funktionalität ähnelt den Benutzereigenschaften.
Zuordnen von Metadateneigenschaften
Eingabezuordnung
Im folgenden Beispiel wird die MQTT-Eigenschaft topic
dem Feld origin_topic
in der Ausgabe zugeordnet:
inputs: [
'$metadata.topic'
]
output: 'origin_topic'
Wenn die Benutzereigenschaft priority
in der MQTT-Nachricht vorhanden ist, veranschaulicht das folgende Beispiel, wie sie einem Ausgabefeld zugeordnet wird:
inputs: [
'$metadata.user_property.priority'
]
output: 'priority'
Ausgabezuordnung
Sie können Metadateneigenschaften auch einem Ausgabeheader oder einer Benutzereigenschaft zuordnen. Im folgenden Beispiel wird die MQTT-Eigenschaft topic
dem Feld origin_topic
in der Benutzereigenschaft der Ausgabe zugeordnet:
inputs: [
'$metadata.topic'
]
output: '$metadata.user_property.origin_topic'
Wenn die eingehende Nutzlast ein priority
-Feld enthält, veranschaulicht das folgende Beispiel, wie sie einer MQTT-Benutzereigenschaft zugeordnet wird:
inputs: [
'priority'
]
output: '$metadata.user_property.priority'
Das gleiche Beispiel für Kafka:
inputs: [
'priority'
]
output: '$metadata.header.priority'
Selektoren für Kontextualisierungsdatasets
Diese Selektoren ermöglichen Zuordnungen die Integration zusätzlicher Daten aus externen Datenbanken, die als Kontextualisierungsdatasets bezeichnet werden.
Datensatzfilterung
Zum Filtern von Datensätzen müssen Bedingungen festgelegt werden, um auszuwählen, welche Datensätze verarbeitet oder verworfen werden sollen.
Punktnotation
Die Punktnotation wird in der Informatik häufig verwendet, um auf Felder zu verweisen, auch rekursiv. Bei der Programmierung bestehen Feldnamen in der Regel aus Buchstaben und Zahlen. Das folgende Beispiel stellt eine Standardpunktnotation dar:
inputs: [
'Person.Address.Street.Number'
]
In einem Dataflow kann ein durch Punktnotation beschriebener Pfad Zeichenfolgen und einige Sonderzeichen enthalten, ohne dass Escapezeichen benötigt werden:
inputs: [
'Person.Date of Birth'
]
In anderen Fällen sind Escapezeichen erforderlich:
inputs: [
'Person."Tag.10".Value'
]
Das vorherige Beispiel enthält Sonderzeichen wie Punkte innerhalb des Feldnamens. Ohne Escapezeichen würde der Feldname als Trennzeichen in der Punktnotation selbst dienen.
Beim Parsen eines Pfads behandelt der Dataflow lediglich zwei Zeichen als Sonderzeichen:
- Punkte (
.
) fungieren als Feldtrennzeichen. - Einzelne Anführungszeichen am Anfang oder Ende eines Segments beginnen eine Escapesequenz, in der Punkte nicht als Feldtrennzeichen behandelt werden.
Alle weiteren Zeichen werden als Teil des Feldnamens behandelt. Diese Flexibilität ist in Formaten wie JSON hilfreich, bei denen Feldnamen beliebige Zeichenfolgen sein können.
In Bicep sind alle Zeichenfolgen in einfache Anführungszeichen ('
) eingeschlossen. Die Beispiele für das korrekte Zitieren in YAML für die Verwendung in Kubernetes gelten nicht.
Escapezeichen
Die primäre Funktion von Escapezeichen in einem Pfad mit Punktnotation besteht darin, die Verwendung von Punkten als Teil von Feldnamen und nicht als Trennzeichen zu interpretieren:
inputs: [
'Payload."Tag.10".Value'
]
In diesem Beispiel besteht der Pfad aus drei Segmenten: Payload
, Tag.10
und Value
.
Regeln für Escapezeichen in der Punktnotation
Escapefunktion für einzelne Segmente: Wenn mehrere Segmente Punkte enthalten, müssen diese Segmente in doppelte Anführungszeichen eingeschlossen werden. Andere Segmente können ebenfalls in Anführungszeichen eingeschlossen werden, jedoch wirken sich diese nicht auf die Interpretation des Pfads aus:
inputs: [ 'Payload."Tag.10".Measurements."Vibration.$12".Value' ]
Ordnungsgemäße Verwendung doppelter Anführungszeichen: Doppelte Anführungszeichen müssen ein Escapesegment öffnen und schließen. Anführungszeichen in der Mitte des Segments werden als Teil des Feldnamens betrachtet:
inputs: [ 'Payload.He said: "Hello", and waved' ]
In diesem Beispiel werden zwei Felder definiert: Payload
und He said: "Hello", and waved
. Wenn unter diesen Umständen ein Punkt angezeigt wird, fungiert er weiterhin als Trennzeichen:
inputs: [
'Payload.He said: "No. It is done"'
]
In diesem Fall wird der Pfad beginnend mit einem Leerzeichen in die Segmente Payload
, He said: "No
und It is done"
aufgeteilt.
Segmentierungsalgorithmus
- Wenn das erste Zeichen eines Segments ein Anführungszeichen ist, sucht der Parser nach dem nächsten Anführungszeichen. Die zwischen diesen Anführungszeichen eingeschlossene Zeichenfolge wird als einzelnes Segment interpretiert.
- Wenn das Segment nicht mit einem Anführungszeichen beginnt, identifiziert der Parser Segmente, indem er nach dem nächsten Punkt oder nach dem Ende des Pfads sucht.
Platzhalter
In vielen Szenarios ähnelt der Ausgabedatensatz dem Eingabedatensatz, wobei lediglich geringfügige Änderungen erforderlich sind. Bei Datensätzen mit zahlreichen Feldern kann die manuelle Angabe von Zuordnungen für jedes Feld mühsam sein. Mithilfe von Platzhaltern wird dieser Prozess vereinfacht, indem generalisierte Zuordnungen zugelassen werden, die automatisch auf mehrere Felder angewendet werden können.
Das folgende Beispiel enthält ein einfaches Szenario zur Veranschaulichung der Verwendung von Sternchen in Zuordnungen:
inputs: [
'*'
]
output: '*'
Diese Konfiguration zeigt eine einfache Zuordnung, bei der jedes Feld in der Eingabe ohne Änderungen direkt demselben Feld in der Ausgabe zugeordnet ist. Das Sternchen (*
) dient als Platzhalter, der jedem Feld im Eingabedatensatz entspricht.
Funktionsweise des Sternchens (*
) in diesem Kontext:
- Musterabgleich: Das Sternchen kann mit einem einzelnen Segment oder mit mehreren Segmenten eines Pfads übereinstimmen. Es fungiert als Platzhalter für alle Segmente im Pfad.
- Feldabgleich: Während des Zuordnungsprozesses wertet der Algorithmus jedes Feld im Eingabedatensatz anhand des Musters aus, das in
inputs
angegeben ist. Das Sternchen im vorherigen Beispiel stimmt mit allen möglichen Pfaden überein und entspricht damit effektiv jedem einzelnen Feld in der Eingabe. - Erfasstes Segment: Der Teil des Pfads, dem das Sternchen entspricht, wird als
captured segment
bezeichnet. - Ausgabezuordnung: In der Ausgabekonfiguration wird
captured segment
an der Stelle platziert, an der das Sternchen angezeigt wird. Das bedeutet, dass die Struktur der Eingabe in der Ausgabe beibehalten wird, wobeicaptured segment
den vom Sternchen bereitgestellten Platzhalter auffüllt.
In einem weiteren Beispiel wird veranschaulicht, wie mithilfe von Platzhaltern Unterabschnitte zugeordnet und zusammen verschoben werden können. Bei diesem Beispiel werden geschachtelte Strukturen in einem JSON-Objekt effektiv vereinfacht.
Ursprünglicher JSON-Code:
{
"ColorProperties": {
"Hue": "blue",
"Saturation": "90%",
"Brightness": "50%",
"Opacity": "0.8"
},
"TextureProperties": {
"type": "fabric",
"SurfaceFeel": "soft",
"SurfaceAppearance": "matte",
"Pattern": "knitted"
}
}
Zuordnungskonfiguration mit Platzhaltern:
{
inputs: [
'ColorProperties.*'
]
output: '*'
}
{
inputs: [
'TextureProperties.*'
]
output: '*'
}
Resultierender JSON-Code:
{
"Hue": "blue",
"Saturation": "90%",
"Brightness": "50%",
"Opacity": "0.8",
"type": "fabric",
"SurfaceFeel": "soft",
"SurfaceAppearance": "matte",
"Pattern": "knitted"
}
Platzhalterplatzierung
Wenn Sie einen Platzhalter platzieren, müssen Sie die folgenden Regeln einhalten:
- Einzelnes Sternchen pro Datenverweis: Nur ein Sternchen (
*
) ist innerhalb eines einzelnen Datenverweises zulässig. - Abgleich vollständiger Segmente: Das Sternchen muss immer mit einem ganzen Segment des Pfads übereinstimmen. Es kann nicht wie
path1.partial*.path3
verwendet werden, um lediglich einen Teil eines Segments abzugleichen. - Positionierung: Das Sternchen kann in verschiedenen Teilen eines Datenverweises positioniert werden:
- Am Anfang:
*.path2.path3
– Das Sternchen entspricht jedem Segment bispath2.path3
. - In der Mitte:
path1.*.path3
– In dieser Konfiguration entspricht das Sternchen einem beliebigen Segment zwischenpath1
undpath3
. - Am Ende:
path1.path2.*
– Das Sternchen am Ende entspricht einem beliebigen Segment nachpath1.path2
.
- Am Anfang:
- Der Pfad, der das Sternchen enthält, muss in einfache Anführungszeichen (
'
) eingeschlossen werden.
Platzhalter mit mehreren Eingaben
Ursprünglicher JSON-Code:
{
"Saturation": {
"Max": 0.42,
"Min": 0.67,
},
"Brightness": {
"Max": 0.78,
"Min": 0.93,
},
"Opacity": {
"Max": 0.88,
"Min": 0.91,
}
}
Zuordnungskonfiguration mit Platzhaltern:
inputs: [
'*.Max' // - $1
'*.Min' // - $2
]
output: 'ColorProperties.*'
expression: '($1 + $2) / 2'
Resultierender JSON-Code:
{
"ColorProperties" : {
"Saturation": 0.54,
"Brightness": 0.85,
"Opacity": 0.89
}
}
Bei Verwendung von Platzhaltern mit mehreren Eingaben muss das Sternchen (*
) für alle Eingaben konsistent dasselbe Captured Segment
-Element darstellen. Beispiel: Wenn Saturation
im Muster *.Max
durch *
erfasst wird, erwartet der Zuordnungsalgorithmus, dass das entsprechende Saturation.Min
-Element mit Muster *.Min
übereinstimmt. Hierbei wird *
durch die Captured Segment
aus der ersten Eingabe ersetzt, woran sich der Abgleich für nachfolgende Eingaben orientiert.
Betrachten Sie dieses detaillierte Beispiel:
Ursprünglicher JSON-Code:
{
"Saturation": {
"Max": 0.42,
"Min": 0.67,
"Mid": {
"Avg": 0.51,
"Mean": 0.56
}
},
"Brightness": {
"Max": 0.78,
"Min": 0.93,
"Mid": {
"Avg": 0.81,
"Mean": 0.82
}
},
"Opacity": {
"Max": 0.88,
"Min": 0.91,
"Mid": {
"Avg": 0.89,
"Mean": 0.89
}
}
}
Anfängliche Zuordnungskonfiguration mit Platzhaltern:
inputs: [
'*.Max' // - $1
'*.Min' // - $2
'*.Avg' // - $3
'*.Mean' // - $4
]
Diese anfängliche Zuordnung versucht, ein Array zu erstellen (z. B. für Opacity
: [0.88, 0.91, 0.89, 0.89]
). Diese Konfiguration schlägt aus dem folgenden Grund fehl:
- Die erste Eingabe
*.Max
erfasst ein Segment wieSaturation
. - Die Zuordnung erwartet, dass die nachfolgenden Eingaben auf derselben Ebene vorhanden sind:
Saturation.Max
Saturation.Min
Saturation.Avg
Saturation.Mean
Da Avg
und Mean
in Mid
geschachtelt sind, erfasst das Sternchen in der anfänglichen Zuordnung diese Pfade nicht korrekt.
Korrigierte Zuordnungskonfiguration:
inputs: [
'*.Max' // - $1
'*.Min' // - $2
'*.Mid.Avg' // - $3
'*.Mid.Mean' // - $4
]
Diese überarbeitete Zuordnung erfasst die erforderlichen Felder korrekt. Die Pfade, die das geschachtelte Mid
-Objekt enthalten sollen, werden korrekt angegeben, damit die Sternchen effektiv auf verschiedenen Ebenen der JSON-Struktur funktionieren.
Zweite Regel im Vergleich mit der Spezialisierung
Berücksichtigen Sie bei Verwendung des vorherigen Beispiels aus Platzhaltern mit mehreren Eingaben die folgenden Zuordnungen, die zwei abgeleitete Werte für jede Eigenschaft generieren:
{
inputs: [
'*.Max' // - $1
'*.Min' // - $2
]
output: 'ColorProperties.*.Avg'
expression: '($1 + $2) / 2'
}
{
inputs: [
'*.Max' // - $1
'*.Min' // - $2
]
output: 'ColorProperties.*.Diff'
expression: '$1 - $2'
}
Diese Zuordnung soll unter ColorProperties
zwei separate Berechnungen (Avg
und Diff
) für jede Eigenschaft erstellen. Dieses Beispiel zeigt das Ergebnis:
{
"ColorProperties": {
"Saturation": {
"Avg": 0.54,
"Diff": 0.25
},
"Brightness": {
"Avg": 0.85,
"Diff": 0.15
},
"Opacity": {
"Avg": 0.89,
"Diff": 0.03
}
}
}
Hier fungiert die zweite Zuordnungsdefinition für dieselben Eingaben als zweite Regel für die Zuordnung.
Betrachten Sie nun ein Szenario, in dem ein bestimmtes Feld eine andere Berechnung benötigt:
{
inputs: [
'*.Max' // - $1
'*.Min' // - $2
]
output: 'ColorProperties.*'
expression: '($1 + $2) / 2'
}
{
inputs: [
'Opacity.Max' // - $1
'Opacity.Min' // - $2
]
output: 'ColorProperties.OpacityAdjusted'
expression: '($1 + $2 + 1.32) / 2'
}
In diesem Fall weist das Feld Opacity
eine eindeutige Berechnung auf. Die folgenden zwei Optionen stehen für den Umgang mit diesem überlappenden Szenario zur Verfügung:
- Schließen Sie beide Zuordnungen für
Opacity
ein. Da sich die Ausgabefelder in diesem Beispiel unterscheiden, würden sie sich gegenseitig nicht außer Kraft setzen. - Verwenden Sie die spezifischere Regel für
Opacity
, und entfernen Sie die generischere Regel.
Berücksichtigen Sie bei der Entscheidung für die korrekte Aktion einen Sonderfall für dieselben Felder:
{
inputs: [
'*.Max' // - $1
'*.Min' // - $2
]
output: 'ColorProperties.*'
expression: '($1 + $2) / 2'
}
{
inputs: [
'Opacity.Max' // - $1
'Opacity.Min' // - $2
]
output: ''
}
Ein leeres output
-Feld in der zweiten Definition impliziert nicht das Schreiben der Felder im Ausgabedatensatz, wodurch Opacity
effektiv entfernt wird. Bei diesem Setup handelt es sich mehr um ein Specialization
-Element als ein Second Rule
-Element.
Auflösung überlappender Zuordnungen durch Dataflows:
- Die Auswertung erfolgt von der obersten Regel in der Zuordnungsdefinition.
- Wenn eine neue Zuordnung zu denselben Feldern wie eine vorherige Regel aufgelöst wird, gelten die folgenden Bedingungen:
- Ein
Rank
-Element wird für jede aufgelöste Eingabe basierend auf der Anzahl der Segmente berechnet, die der Platzhalter erfasst. Wenn dieCaptured Segments
-Elemente beispielsweiseProperties.Opacity
sind, lautetRank
2. Wenn es nurOpacity
ist, lautetRank
1. Eine Zuordnung ohne Platzhalter weistRank
von 0 auf. - Wenn das
Rank
-Element der letzteren Regel gleich oder höher als die vorherige Regel ist, behandelt ein Dataflow es alsSecond Rule
. - Andernfalls wird die Konfiguration vom Dataflow als
Specialization
behandelt.
- Ein
Beispiel: Bei einer Zuordnung, die Opacity.Max
und Opacity.Min
zu einer leeren Ausgabe leitet, hat Rank
den Wert 0. Da Rank
in der zweiten Regel niedriger als bei der vorherigen Regel ist, gilt sie als Spezialisierung und setzt die vorherige Regel außer Kraft, die einen Wert für Opacity
berechnen würde.
Platzhalter in Kontextualisierungsdatasets
Sehen wir uns nun in einem Beispiel an, wie Kontextualisierungsdatasets mi Platzhaltern verwendet werden können. Betrachten Sie das Dataset mit dem Namen position
, das den folgenden Datensatz enthält:
{
"Position": "Analyst",
"BaseSalary": 70000,
"WorkingHours": "Regular"
}
In einem früheren Beispiel wurde ein bestimmtes Feld aus diesem Dataset verwendet:
inputs: [
'$context(position).BaseSalary'
]
output: 'Employment.BaseSalary'
Bei dieser Zuordnung wird BaseSalary
aus dem Kontextualisierungsdataset direkt in den Abschnitt Employment
des Ausgabedatensatzes kopiert. Wenn Sie den Prozess automatisieren und alle Felder aus dem position
-Dataset in den Abschnitt Employment
einschließen möchten, können Sie Platzhalter verwenden:
inputs: [
'$context(position).*'
]
output: 'Employment.*'
Diese Konfiguration ermöglicht eine dynamische Zuordnung, bei der jedes Feld innerhalb des position
-Datasets in den Abschnitt Employment
des Ausgabedatensatzes kopiert wird:
{
"Employment": {
"Position": "Analyst",
"BaseSalary": 70000,
"WorkingHours": "Regular"
}
}
Letzter bekannter Wert
Sie können den letzten bekannten Wert einer Eigenschaft nachverfolgen. Fügen Sie an das Eingabefeld das Suffix ? $last
an, um den letzten bekannten Wert des Feldes zu erfassen. Wenn in einer nachfolgenden Eingabe-Payload ein Wert für eine Eigenschaft fehlt, wird der letzte bekannte Wert zur Ausgabe-Payload zugeordnet.
Betrachten Sie etwa die folgende Zuordnung:
inputs: [
'Temperature ? $last'
]
output: 'Thermostat.Temperature'
In diesem Beispiel wird der letzte bekannte Wert von Temperature
nachverfolgt. Wenn eine nachfolgende Eingabe-Payload keinen Temperature
-Wert enthält, wird der letzte bekannte Wert in der Ausgabe verwendet.