My Building - Capteurs de température et d’humidité
- Tutorial
Ce chapitre présente un cas d’usage concret de regroupement de capteurs physiques et de mise en valeur des données de température dans le jumeau numérique. Il illustre comment le scripting permet d’unifier l’affichage, de formater les valeurs et de renforcer la supervision via des défauts calculés.
Dans cet article
Dans notre cas d’usage, les capteurs de température et d’humidité sont déployés comme deux capteurs physiques distincts sur le terrain. Toutefois, du point de vue de l’utilisateur final, ces deux mesures sont intimement liées et doivent être consultées de manière unifiée.
C’est pourquoi nous faisons le choix de regrouper ces deux capteurs au sein d’un seul équipement Immersive, nommé « Room », afin de représenter une pièce de manière cohérente dans le jumeau numérique.
Pour la représentation du capteur de température dans le jumeau numérique, l’élément central est la valeur mesurée. L’objectif principal est de mettre en avant cette information clé en l’affichant directement dans la bulle de l’équipement, offrant ainsi une lecture immédiate et intuitive.
Par ailleurs, les valeurs affichées seront formatées avec leur unité afin d’améliorer la lisibilité et la compréhension des données par l’utilisateur.
Enfin, afin de renforcer la supervision, un défaut calculé sera ajouté. Celui-ci permettra de déclencher une alerte lorsque la température dépasse un seuil prédéfini, assurant ainsi une détection rapide des situations anormales.
Objectifs fonctionnels
- Regrouper deux capteurs physiques (température et humidité) au sein d’un même équipement Immersive « Room »
- Afficher la mesure de température directement dans la bulle de l’équipement
- Formatter les valeurs pour inclure l’unité de mesure
- Générer une alarme lorsque la température dépasse un seuil défini
Prérequis
- Création d’un script de comportement associé à la famille
Room - Association des Rooms dans le jumeau numérique.
Affichage de la mesure de température dans la bulle de l’équipement
Au travers du scripting JS, nous pouvons modifier les informations qui sont visibles
dans l’icône associée à l’équipement dans le jumeau (Widget3D),
pour cela il suffit d’ajouter la fonction Customize à notre script.
La propriété qui nous intéresse, est la propriété text du Widget3D
comme représenté sur le schéma suivant.
Customize est appelée dès lors qu’une variable est modifiée
et que l’interface a besoin de se mettre à jour.
L’accès à la mesure de la température se fait directement depuis l’objet equipment.
Pour cela, il suffit de récupérer la variable de température qui est référencée
par l’identifiant TEMP dans la description de notre famille.
La référence de la variable est utilisée ici, mais le nom de la propriété
Température peut aussi être utilisée.
Script JS :
function Customize(equipment, widget2d, widget3d)
{
// Récupération de la variable TEMP de l'équipement
// Astuce : Une variable peut être récupérée via son nom (Température) ou sa référence (TEMP)
let temperatureVar = equipment.GetVariable("TEMP");
// Modification du texte par la valeur de la température (1 décimale) ajout et de l’unité
widget3d.text = temperatureVar.AsFloat.toFixed(1) + "°C";
}
Une fois le script appliqué, et l’application redémarrée, on peut voir les changements.
Formatter les valeurs pour afficher les unités
Les mesures remontées du terrain représentent parfois des grandeurs physiques associées à une unité de mesure (Température °C ou °C, Vitesse, Energie …).
Ces mesures comportent souvent beaucoup de décimales, qui ne sont pas toujours pertinentes pour l’utilisateur.
Il est donc recommandé de limiter l’affichage à une seule décimale pour rendre l’information plus claire.
Comme le montre l’exemple ci-dessus :
- Les valeurs brutes (à gauche) sont difficiles à lire.
- Après formatage (à droite), les valeurs sont arrondies à une décimale et accompagnées de leur unité, ce qui facilite la lecture.
Deux méthodes complémentaires seront présentées pour y parvenir :
- La configuration en amont des unités de mesure, directement dans le fichier Excel. Cette approche permet de standardiser l’affichage des données dès leur intégration.
- Le formatage via le script de Comportement, qui offre davantage de flexibilité et permet d’adapter dynamiquement l’affichage (unité, nombre de décimales) en fonction des besoins.
Configurer l’unité d’une mesure depuis Excel
Lors de la configuration des canaux de mesure d’un équipement depuis le fichier Excel, il est possible de spécifier l’unité de mesure associée à chaque canal.
- Si aucune unité n’est précisée, les valeurs sont affichées telles quelles dans Immersive. (exemple de gauche)
- Si une unité est configurée, Immersive ajoute automatiquement cette unité à côté de la valeur et limite l’affichage à une seule décimale pour plus de lisibilité. (exemple de droite)
Dans notre cas, nous configurons les unités Celsius et Pourcent
dans la colonne Unité pour les canaux Température et Humidité.
Formatter l’affichage d’une variable depuis le Scripting
Dans certains cas, il est indispensable de modifier plus finement la façon dont une variable affiche sa valeur.
Pour pouvoir le faire, il est nécessaire d’implémenter une nouvelle méthode de scripting JS
dans le comportement de notre équipement : GetFormattedData
Exemple :
// Fonction de formatage des variables
function GetFormattedData(equipment, variable)
{
// Formatage spécifique selon la variable
// Filtre par nom : variable.Name => "Temperature", "Humidity"
// Filtre par référence : variable.NameKey => "TEMP", "HYGRO"
switch (variable.NameKey)
{
case "TEMP" : return variable.AsFloat.toFixed(1) + " °C (formattage js)";
case "HYGRO" : return variable.AsFloat.toFixed(1) + " % (formattage js)";
}
// Dans les autres cas on retourne une chaîne vide, le formattage est geré par défaut.
return "";
}
Le résultat de notre script est le suivant :
Génération d’une alarme en cas de dépassement de seuil de température
Dans la suite de notre scénario, nous souhaitons avertir l’utilisateur quand une température dépasse un certain seuil afin qu’il puisse réagir rapidement. Pour cela nous allons définir une Alerte qui sera mise en avant directement dans l’interface.
La création et la levée d’alerte se fait en 2 étapes.
- Implémentation de la fonction
SetupEquipmentpour créer l’alerte. - Implémentation de la fonction
OnEquipmentChangedpour le calcul de l’alerte.
Création de l’alerte : Température trop élevée
Afin d’enregistrer une nouvelle alerte sur un équipement, on utilise un appel à la fonction CreateStaticFault lorsque l’équipement s’initialise. Elle permet de créer un canal dans la catégorie « Défaut » de l’équipement.
Script JS :
function SetupEquipment(equipment)
{
// Création d'un nouveau défaut
equipment.CreateStaticFault('Température trop élevée');
}
Calcul de l’alerte : Température trop élevée
L’alarme de dépassement de seuil doit être calculée dés que le capteur de température reçoit une mise à jour de ses valeurs, nous rajoutons donc le calcul dans la fonction OnEquipmentChanged qui est dédié à cette tâche.
Après avoir récupéré les 2 variables (mesure et alerte) sur notre équipement, il suffit d’implémenter la règle métier de génération du défaut et de mettre à jour notre alerte. Ici nous déclenchons le défaut « Température trop élévée » si notre mesure de température a reçu une valeur du serveur (IsConnected), et si sa valeur numérique (AsFloat) est supérieure à 40.
Script JS :
function OnEquipmentChanged(equipment)
{
// Récupération de la variable de température et d'alarme.
var temperatureVar = equipment.GetVariable("TEMP");
var temperatureTooHighVar = equipment.GetVariable("Température trop élevée");
// L'alarme doit être déclenchée :
// * si la température est connectée
// * et si la valeur mesurée au dessus de 40°C.
let isAboveThreshold = temperatureVar.IsConnected
&& temperatureVar.AsFloat > 40;
// On affecte la valeur calculée (de type boolean) à la variable d'alarme.
temperatureTooHighvariable.AsBool = isAboveThreshold;
}
Une fois appliqué, les pièces dont la température dépasse la valeur de seuil configurée sont affichées avec le défaut de température trop élevée.
Dans ce second cas, lorsque l’alerte est déclarée au niveau du Connector, elle est alors connectée comme une variable classique, et non plus définie via une déclaration dans le script.
L’exemple de la porte de garage illustre ce fonctionnement.