Ein abgeleiteter Wert ist ein Schlüssel, den Ihre Geräte nicht senden, den Sie aber aus dem berechnen, was sie senden: eine Temperatur in einer anderen Einheit, ein Statuscode, der Verbrauch seit der letzten Messung, eine Rate. Sie berechnen ihn in einem Flow und speichern ihn mit Save telemetry, sodass er wie jeder andere Schlüssel grafisch dargestellt, zusammengefasst und alarmiert wird.
Die Regel: Ableiten in der Nachricht des Geräts selbst
Save telemetry speichert Werte nur für das Gerät, das die Nachricht gesendet hat (der originator der Nachricht). Jede andere Nachricht wird mit not_a_device abgelehnt. Daher gilt:
- Leiten Sie Werte im Root-Flow ab, der die Nachrichten des Geräts empfängt, oder in einem Flow, an den der Root-Flow die Nachricht mit Run flow übergibt (die Nachricht und ihr Gerät bleiben gleich).
- Ein Flow, der durch einen Schedule-, Inject-, Event– oder Named timer-Trigger gestartet wird, hat als originator die Organisation (oder den Flow), nicht ein Gerät. Er kann keine Gerätetelemetrie speichern.
- Ein abgeleiteter Wert wird standardmäßig zum Zeitpunkt des Datensatzes gespeichert, sodass er mit der Messung übereinstimmt, aus der er stammt.
Wo die Schritte platziert werden
Im Standard-Root-Flow führt die Telemetrie vom Message type-Switch (Ausgang telemetry) zu Save telemetry. Fügen Sie Ihre Blöcke in diese Verbindung ein:
Device messages → Alarm rules → Message type ─ telemetry → [your blocks] → Save telemetry
Jede Telemetrienachricht enthält einen Datensatz: msg.payload ist ein flaches Objekt, etwa {"temperature": 21.5, "humidity": 40}. Fügen Sie Ihre Schlüssel zu msg.payload hinzu, dann werden alle Schlüssel gemeinsam gespeichert.
Wenn die Alarmregeln auch den abgeleiteten Schlüssel auswerten sollen, platzieren Sie Ihre Blöcke vor dem Block Alarm rules und nur auf Telemetrienachrichten (zum Beispiel nach einem Switch auf msg.metadata.msgType).
Nicht jedes Gerät sendet in jeder Nachricht jeden Schlüssel. Beginnen Sie Ihren Zweig mit einer Prüfung (zum Beispiel einem Switch mit nempty auf msg.payload.power), sonst schlägt der Berechnungsblock fehl oder schreibt null.
Beispiel: Einheitenumrechnung
Speichern Sie temperature_f neben temperature:
- Fügen Sie einen Calculate-Block hinzu. expr:
round(msg.payload.temperature * 1.8 + 32, 1). target:msg.payload.temperature_f. - Verbinden Sie ihn vor Save telemetry.
Verwenden Sie einen Scale-Block für eine lineare Bereichsabbildung, zum Beispiel ein 4–20-mA-Signal auf 0–10 bar (in_min 4, in_max 20, out_min 0, out_max 10, auf dem eigenen Pfad des Schlüssels).
Beispiel: Statuscode aus mehreren Werten
Speichern Sie status als Zahl für Diagramme und Standortfarben: 2 = kritisch, 1 = Warnung, 0 = normal.
Fügen Sie einen Calculate-Block mit targetmsg.payload.status_codeund expr hinzu:msg.payload.temperature > 8 ? 2 : (msg.payload.temperature > 6 ? 1 : 0)
Optional ein zweiter Calculate mit targetmsg.payload.statusund exprmsg.payload.status_code == 2 ? "critical" : (msg.payload.status_code == 1 ? "warning" : "ok")für die 2D- und 3D-Standortansichten, die einenstatus-Schlüssel lesen.
Beispiel: Verbrauch aus einem Zähler
Ein Zähler sendet ein wachsendes energy_kwh. Speichern Sie den Verbrauch seit der vorherigen Messung als energy_delta:
- Fügen Sie einen Delta-Block hinzu. Input:
msg.payload.energy_kwh. Output:msg.payload.energy_delta. Period:msg.payload.period_ms. - Seed:
latest, damit die erste Nachricht nach einem Deployment ab dem gespeicherten letzten Wert misst statt 0 zu ergeben. - When negative (
on_negative):zero, wenn der Zähler neu starten kann; dann schreibt ein Neustart 0, und der neue Wert wird zur Basis. - Verbinden Sie out mit Save telemetry. Verbinden Sie other (Nachrichten ohne den Schlüssel) ebenfalls direkt mit Save telemetry, damit andere Messwerte weiterhin gespeichert werden.
Der Delta-Block behält pro Gerät einen vorherigen Wert. Für stündlichen oder täglichen Verbrauch brauchen Sie keinen abgeleiteten Schlüssel: Lesen Sie den Rohzähler mit dem Aggregat increase aus. Siehe Aggregates and rollups.
Beispiel: eine Rate
Fügen Sie zum Delta-Beispiel einen Calculate hinzu: target msg.payload.power_kw, expr msg.payload.period_ms > 0 ? msg.payload.energy_delta / (msg.payload.period_ms / 3600000) : 0. Dies ist die mittlere Leistung seit der vorherigen Messung.
Beispiel: Kombination mit einem gespeicherten Wert
Um einen Wert aus dieser Nachricht und einem anderen Schlüssel zu berechnen, den das Gerät früher gesendet hat (zum Beispiel level jetzt und capacity einmal täglich):
- Fügen Sie einen Latest values-Block hinzu. keys:
capacity. target:msg.metadata.latest. When data is missing:skip. - Fügen Sie einen Calculate hinzu: target
msg.payload.fill_pct, exprround(msg.payload.level / msg.metadata.latest.capacity * 100, 1).
Werte unter msg.metadata werden nie gespeichert; nur msg.payload wird gespeichert. Für Werte, die zum Gerät gehören statt zu einer Messung (eine Kapazität, ein Grenzwert), verwenden Sie besser ein Server-Attribut und lesen Sie es mit Device details aus.
Beispiel: Glättung
Ein Statistics-Block (Fenster count, Größe 10, Ausgaben avg) ersetzt msg.payload durch den Mittelwert der letzten 10 Werte. Um den ursprünglichen Datensatz zu behalten, verwenden Sie ein Skript oder berechnen Sie den Mittelwert in einem separaten Zweig und speichern Sie ihn dort. Abgeleitete Mittelwerte werden selten benötigt: Diagramme können mit dem Aggregat avg mitteln.
Dinge, die Sie beachten sollten
| Thema | Detail |
|---|---|
| Schlüssellimit | Jeder abgeleitete Schlüssel ist ein neuer Schlüssel und zählt zum Schlüssellimit Ihres Tarifs. Siehe Telemetry keys. |
| Skript-Blöcke | Ein Script-Block kann beliebige Berechnungen ausführen, zählt aber zu den Skript-Blöcken Ihres Tarifs. Bevorzugen Sie Calculate, Change und Delta. |
| Speicher | Delta, Statistics und ähnliche Blöcke merken sich Werte pro Gerät. Wenn Sie die Einstellungen eines solchen Blocks ändern und deployen, beginnt sein Speicher leer. |
| Verspätete Daten | Verspätete Nachrichten laufen durch den Root-Flow und werden gespeichert, einschließlich der abgeleiteten Werte. |
| Testen | Test Sie einen Flow mit einer Beispielnachricht, bevor Sie ihn deployen: In einem Test wird nichts gespeichert. Siehe Versions, testing and rollback. |
| Andere Datensätze | Auf dem Host General speichert der Block Save reading Messwerte anderer Datensatztypen, die Schreibzugriffe aus Flows akzeptieren (zum Beispiel Asset-Zähler, sofern Ihr Tarif sie enthält). Gerätedaten laufen immer über Save telemetry. |
Siehe auch IoT data blocks, Data transform blocks und das Flow cookbook.

