Une valeur dérivée est une clé que vos appareils n’envoient pas, mais que vous calculez à partir de ce qu’ils envoient : une température dans une autre unité, un code d’état, la consommation depuis la dernière mesure, un débit. Vous la calculez dans un flux et l’enregistrez avec Save telemetry, afin qu’elle soit tracée, résumée et soumise aux alarmes comme n’importe quelle autre clé.
La règle : dériver dans le message de l’appareil lui-même
Save telemetry n’enregistre des valeurs que pour l’appareil qui a envoyé le message (l’originator du message). Il refuse tout autre message avec not_a_device. Par conséquent :
- Dérivez les valeurs dans le flux racine qui reçoit les messages de l’appareil, ou dans un flux auquel la racine transmet le message avec Run flow (le message, et son appareil, restent les mêmes).
- Un flux démarré par un déclencheur Schedule, Inject, Event ou Named timer a pour originator l’organisation (ou le flux), et non un appareil. Il ne peut pas enregistrer de télémétrie d’appareil.
- Une valeur dérivée est enregistrée par défaut à l’heure de la mesure, afin de correspondre à la mesure dont elle provient.
Où placer les étapes
Dans le flux racine par défaut, la télémétrie va du commutateur Message type (sortie telemetry) vers Save telemetry. Insérez vos blocs sur ce fil :
Device messages → Alarm rules → Message type ─ telemetry → [your blocks] → Save telemetry
Chaque message de télémétrie contient un enregistrement : msg.payload est un objet plat tel que {"temperature": 21.5, "humidity": 40}. Ajoutez vos clés à msg.payload et toutes les clés sont enregistrées ensemble.
Si les règles d’alarme doivent aussi voir la clé dérivée, placez vos blocs avant le bloc Alarm rules, et uniquement sur les messages de télémétrie (par exemple après un Switch sur msg.metadata.msgType).
Tous les appareils n’envoient pas chaque clé dans chaque message. Commencez votre branche par un contrôle (par exemple un Switch avec nempty sur msg.payload.power), sinon le bloc de calcul échoue ou écrit null.
Exemple : conversion d’unité
Enregistrer temperature_f à côté de temperature :
- Ajoutez un bloc Calculate. expr :
round(msg.payload.temperature * 1.8 + 32, 1). target :msg.payload.temperature_f. - Reliez-le avant Save telemetry.
Utilisez un bloc Scale pour une conversion linéaire d’étendue, par exemple un signal 4–20 mA vers 0–10 bar (in_min 4, in_max 20, out_min 0, out_max 10, sur le chemin propre à la clé).
Exemple : code d’état à partir de plusieurs valeurs
Enregistrer status sous forme de nombre pour les graphiques et les couleurs de site : 2 = critique, 1 = avertissement, 0 = normal.
Ajoutez un bloc Calculate avec targetmsg.payload.status_codeet expr :msg.payload.temperature > 8 ? 2 : (msg.payload.temperature > 6 ? 1 : 0)
Facultativement, un second Calculate avec targetmsg.payload.statuset exprmsg.payload.status_code == 2 ? "critical" : (msg.payload.status_code == 1 ? "warning" : "ok")pour les vues de site 2D et 3D, qui lisent une cléstatus.
Exemple : consommation à partir d’un compteur
Un compteur envoie une valeur croissante energy_kwh. Enregistrez la consommation depuis la mesure précédente sous la forme energy_delta :
- Ajoutez un bloc Delta. Input :
msg.payload.energy_kwh. Output :msg.payload.energy_delta. Period :msg.payload.period_ms. - Seed :
latest, afin que le premier message après un déploiement mesure à partir de la dernière valeur enregistrée au lieu de donner 0. - When negative (
on_negative) :zerosi le compteur peut redémarrer ; ainsi un redémarrage écrit 0 et la nouvelle valeur devient la nouvelle référence. - Reliez out à Save telemetry. Reliez aussi other (messages sans la clé) directement à Save telemetry, afin que les autres mesures continuent d’être enregistrées.
Le bloc Delta conserve une valeur précédente par appareil. Pour une consommation horaire ou journalière, vous n’avez pas besoin d’une clé dérivée : lisez le compteur brut avec l’agrégat increase. Voir Aggregates and rollups.
Exemple : un débit
À partir de l’exemple Delta, ajoutez un Calculate : target msg.payload.power_kw, expr msg.payload.period_ms > 0 ? msg.payload.energy_delta / (msg.payload.period_ms / 3600000) : 0. Il s’agit de la puissance moyenne depuis la mesure précédente.
Exemple : combiner avec une valeur enregistrée
Pour calculer une valeur à partir de ce message et d’une autre clé envoyée auparavant par l’appareil (par exemple level maintenant et capacity envoyée une fois par jour) :
- Ajoutez un bloc Latest values. keys :
capacity. target :msg.metadata.latest. When data is missing :skip. - Ajoutez un Calculate : target
msg.payload.fill_pct, exprround(msg.payload.level / msg.metadata.latest.capacity * 100, 1).
Les valeurs sous msg.metadata ne sont jamais enregistrées ; seul msg.payload l’est. Pour les valeurs qui appartiennent à l’appareil plutôt qu’à une mesure (une capacité, une limite), privilégiez un attribut serveur et lisez-le avec Device details.
Exemple : lissage
Un bloc Statistics (window count, size 10, outputs avg) remplace msg.payload par la moyenne des 10 dernières valeurs. Pour conserver l’enregistrement d’origine, utilisez un script, ou calculez la moyenne sur une branche séparée et enregistrez-la là. Les moyennes dérivées sont rarement nécessaires : les graphiques peuvent calculer la moyenne avec l’agrégat avg.
Points à garder à l’esprit
| Sujet | Détail |
|---|---|
| Limite de clés | Chaque clé dérivée est une nouvelle clé et compte dans la limite de clés de votre forfait. Voir Telemetry keys. |
| Blocs de script | Un bloc Script peut tout calculer, mais compte dans les blocs de script de votre forfait. Privilégiez Calculate, Change et Delta. |
| Mémoire | Delta, Statistics et les blocs similaires mémorisent des valeurs par appareil. Déployer une modification des réglages d’un tel bloc vide sa mémoire. |
| Données tardives | Les messages tardifs passent par le flux racine et sont enregistrés, valeurs dérivées comprises. |
| Tests | Test un flux avec un message d’exemple avant de le déployer : rien n’est enregistré lors d’un test. Voir Versions, testing and rollback. |
| Autres enregistrements | Sur l’hôte General, le bloc Save reading enregistre les mesures d’autres types d’enregistrements qui acceptent des écritures depuis les flux (par exemple les compteurs d’actifs, si votre forfait les inclut). Les données des appareils passent toujours par Save telemetry. |
Voir aussi IoT data blocks, Data transform blocks et le Flow cookbook.

