Prérequis : Vous devez avoir un rôle d'administrateur fonctionnel pour la création de formules (métriques calculées).
Pour vous permettre de créer vos formules, le module Formules contient des opérateurs basiques, mais aussi la possibilité de saisir certaines fonctions.
Formules avec opérateurs basiques
Une formule peut être constituée d'un simple tag, ou d'un ensemble de tags liés entre eux par des opérateurs.
Les fonctions avancées
Les fonctions permettent la réalisation d'évaluations plus complexes. Voici la liste des fonctions qui sont gérées.
Fonction "If"
But : Permet d'évaluer l'équation passée dans le paramètre condition. La fonction retourne les valeurs passées dans les paramètres "trueValue" et "falseValue" selon le résultat de l'évaluation.
Définition : If(condition, trueValue, falseValue)
Fonction "ifthen"
But : Permet de renvoyer une valeur X si la condition est valide.
Définition : ifthen([condition], [resultat si vrai])
Fonction "rand"
But : Permet de générer un nombre pseudo-aléatoire supérieur ou égal à 0.0 et inférieur à 1.0
Définition : rand()
Fonction "watchdog"
But : Surveiller l'état des équipements émetteurs de données (Indabox, eWon etc…)
Définition : bool Watchdog(string [idMetrique], int [duration], bool [watchValueChange])
Fonctionnement :
Si la métrique [idMetrique] n'a pas été écrite depuis [duration] secondes, la fonction renvoie True.
Si le paramètre [watchValueChange] = true, on surveille aussi le changement de valeur entre deux écritures. Concrètement, si les deux dernières valeurs écrites dans [idMetrique] sont égales, la fonction renvoie True.
Sous forme d'équation : result = ( [LastRefresh]<[Now]-[Duration] ) OR ( [watchValueChange] AND [PreviousValue]=[CurrentValue])
Fonction "DateFromString"
But : Générer une date fixe et absolue, à partir d'une chaîne de caractère.
Fonctionnement :
Les formats de date acceptés sont :
2024-04-17T13:49:00Z -> timezone UTC
2024-04-17T13:49:00+02 -> timezone heures uniquement
2024-04-17T13:49:00+02:30 -> timezone heures + minutes (pour l'Australie par exemple)
La formule n'est pas valable si la date n'est pas saisie dans l'un de ces formats.
Exemple de saisie valide :
Fonction previousValue
But : Permet de renvoyer la valeur précédent la valeur actuelle d'une métrique
Définition : previousValue("[métrique]")
Fonctionnement : Il suffit de remplacer le paramètre [métrique] par la métrique souhaitée. La fonction va renvoyer la valeur qu'avait cette métrique juste avant sa valeur actuelle.
Exemple : On souhaite connaître la variation de la valeur d'une métrique "temperature" entre deux écritures.
Pour ce faire, on va prendre la valeur actuelle de la métrique ("main@temperature") à laquelle on va soustraire la valeur précédente de la métrique ("previousValue(main@temperature)").
Fonctions Indaba et opérateurs temporels
En plus des formules avancées, vous avez à votre disposition des opérateurs "Indaba" qui vont vous permettre d'affiner vos métriques calculées pour qu'elles répondent à des besoins plus précis.
Lors du paramétrage de ces opérateurs Indaba, vous allez être amenés à indiquer la période que vous souhaitez analyser.
Pour ce faire, vous devez utilisez les opérateurs temporels qui sont mis à votre disposition.
Ainsi, lorsque vous verrez des paramètres de type [date], vous devez utiliser des opérateurs temporels.
Remarque : Il n'est pas possible d'utiliser les fonctions Indaba dans une formule pour laquelle la périodicité est "en continu".
Remarque : Il n'est possible d'utiliser que 4 fonctions Indaba au maximum dans une formule.
Les opérateurs Temporels
Dans le système des opérateurs temporels, le terme "now" va représenter la date courante. Et vous avez ensuite plusieurs méthodes (ou fonctions) pour manipuler la date courante. Chaque fonction représente une valeur.
Ainsi, on a :
now.startOfDay : début de la journée en cours
now.endOfDay : fin de la journée en cours
now.startOfYear : début de l'année en cours
now.endOfYear : fin de l'année en cours
now.startOfMonth : début du mois en cours
now.endOfMonth : fin du mois en cours
now.startOfWeek : début de la semaine en cours
now.endOfWeek : fin de la semaine en cours
Concrètement, pour indiquer une période dans une fonction Indaba cela donnerait :
Ici, la période indiquée sera le début de la journée en cours (date de début) et la fin de la journée en cours (date de fin).
Fonctions Indaba
Idb.min
But : Permet de renvoyer la valeur minimum d'une métrique pour une période donnée
Définition : idb.min("[métrique]", [date de début], [date de fin])
Fonctionnement : Vous devez remplacer le paramètre [métrique] par la métrique pour laquelle vous souhaitez connaître la valeur minimum au cours d'une période.
Pour définir cette période, vous devez remplacer les paramètres [date de début] et [date de fin] par les opérateurs temporels mentionnés plus haut.
Exemple : Imaginons que vous souhaitiez connaître le taux d'humidité minimum présent dans une de vos installations au cours du mois courant.
Votre taux d'humidité est représenté par la métrique "taux_humidité".
Pour indiquer la période souhaitée, vous utilisez donc les opérateurs temporels. Ici, on veut les données du mois courant donc on va utiliser "now.startOfMonth" (début du mois) pour indiquer le début de la période et "now.endOfMonth" (fin du mois) pour indiquer la fin de la période.
Ce qui vous donne l'expression suivante :
Idb.max
But : Permet de renvoyer la valeur maximum d'une métrique pour une période donnée
Définition : idb.max("[métrique]", [date de début], [date de fin])
Fonctionnement : Même fonctionnement que pour l'opérateur Idb.min.
Vous devez remplacer le paramètre [métrique] par la métrique pour laquelle vous souhaitez connaître la valeur maximum au cours d'une période.
Pour définir cette période, vous devez remplacer les paramètres [date de début] et [date de fin] par les opérateurs temporels mentionnés plus haut.
Exemple : Imaginons que vous souhaitiez connaître le taux d'humidité maximum présent dans une de vos installations au cours du mois courant.
Votre taux d'humidité est représenté par la métrique "taux_humidité".
Pour indiquer la période souhaitée, vous utilisez donc les opérateurs temporels. Ici, on veut les données du mois courant donc on va utiliser "now.startOfMonth" (début du mois) pour indiquer le début de la période et "now.endOfMonth" (fin du mois) pour indiquer la fin de la période.
Ce qui vous donne l'expression suivante :
Idb.avg
But : Permet de renvoyer la valeur moyenne d'une métrique pour une période donnée
Définition : idb.max("[métrique]", [date de début], [date de fin])
Fonctionnement :
Vous devez remplacer le paramètre [métrique] par la métrique pour laquelle vous souhaitez connaître la valeur moyenne au cours d'une période.
Pour définir cette période, vous devez remplacer les paramètres [date de début] et [date de fin] par les opérateurs temporels mentionnés plus haut.
Exemple : Imaginons que vous souhaitiez connaître la température moyenne d'un compresseur au cours de la semaine courante.
Votre température est représentée par la métrique "temperature".
Pour indiquer la période souhaitée, vous utilisez donc les opérateurs temporels. Ici, on veut les données de la semaine en cours donc on va utiliser "now.startOfWeek" (début de la semaine) pour indiquer le début de la période et "now.endOfWeek" (fin de la semaine) pour indiquer la fin de la période.
Ce qui donne l'expression suivante :
Idb.sum
But : Permet de renvoyer la somme des valeurs d'une métrique pour une période donnée
Définition : idb.sum("[métrique]", [date de début], [date de fin])
Fonctionnement :
Vous devez remplacer le paramètre [métrique] par la métrique pour laquelle vous souhaitez connaître la somme des valeurs remontées au cours d'une période.
Pour définir cette période, vous devez remplacer les paramètres [date de début] et [date de fin] par les opérateurs temporels mentionnés plus haut.
Exemple : Imaginons que vous souhaitiez connaître la consommation en eau totale d'un compresseur au cours du mois en cours.
Votre consommation d'eau est représentée par la métrique "conso_eau".
Pour indiquer la période souhaitée, vous utilisez donc les opérateurs temporels. Ici, on veut les données du mois courant donc on va utiliser "now.startOfMonth" (début du mois) pour indiquer le début de la période et "now.endOfMonth" (fin du mois) pour indiquer la fin de la période.
Ce qui donne l'expression suivante :
Idb.count
But : Permet de connaître le nombre de fois qu'une valeur a été renvoyée pour une métrique donnée.
Définition : idb.count("[métrique]", [date de début], [date de fin])
Fonctionnement :
Vous devez remplacer le paramètre [métrique] par la métrique pour laquelle vous souhaitez connaître le nombre de valeurs renvoyées pendant une période donnée.
Pour définir cette période, vous devez remplacer les paramètres [date de début] et [date de fin] par les opérateurs temporels mentionnés plus haut.
Exemple : Vous souhaitez vérifier à quelle fréquence votre équipement renvoie des valeurs pendant la journée en cours.
Idb.firstValueBefore
But : Permet de renvoyer la dernière valeur avant une date donnée.
Définition : idb.firstValueBefore("[métrique]", [date])
Fonctionnement :
Vous devez remplacer le paramètre [métrique] par la métrique pour laquelle vous souhaitez connaître la dernière valeur avant une date donnée.
Pour définir cette date, vous devez remplacer le paramètre [date], en utilisant les opérateurs temporels mentionnés plus-haut.
Exemple : Vous souhaitez connaître la dernière valeur renvoyée par un équipement avant le début de la journée en cours.
Idb.firstValueAfter
But : Permet de renvoyer la première valeur après une date donnée.
Définition : idb.firstValueAfter("[métrique]", [date])
Fonctionnement :
Vous devez remplacer le paramètre [métrique] par la métrique pour laquelle vous souhaitez connaître la première valeur après une date donnée.
Pour définir cette date, vous devez remplacer le paramètre [date], en utilisant les opérateurs temporels mentionnés plus-haut.
Exemple : Vous souhaitez connaître la première valeur renvoyée par un équipement dans la journée en cours.
Idb.median
But : Permet de renvoyer la valeur médiane d'une plage de données.
Définition : idb.median("[métrique]", [date de début], [date de fin])
Fonctionnement :
Vous devez remplacer le paramètre [métrique] par la métrique pour laquelle vous souhaitez connaître la valeur médiane sur une période donnée.
Pour définir cette période, vous devez remplacer les paramètres [date de début] et [date de fin], en utilisant les opérateurs temporels mentionnées plus-haut.
Exemple : Vous souhaitez connaître la valeur médiane de la température d'un équipement pour la journée en cours.
Idb.stdDev
But : Permet de renvoyer l'écart-type d'une plage de données.
Définition : idb.stdDev("[métrique]", [date de début], [date de fin])
Fonctionnement :
Vous devez remplacer le paramètre [métrique] par la métrique pour laquelle vous souhaitez connaître l'écart-type sur une période donnée.
Pour définir cette période, vous devez remplacer les paramètres [date de début] et [date de fin], en utilisant les opérateurs temporels mentionnées plus-haut.
Idb.first
But : Permet de renvoyer la première valeur d'une plage de données
Définition : idb.first("[métrique]", [date de début], [date de fin])
Fonctionnement :
Vous devez remplacer le paramètre [métrique] par la métrique pour laquelle vous souhaitez connaître la première valeur sur une période donnée.
Pour définir cette période, vous devez remplacer les paramètres [date de début] et [date de fin], en utilisant les opérateurs temporels mentionnées plus-haut.
Idb.last
But : Permet de renvoyer la première valeur d'une plage de données
Définition : idb.last("[métrique]", [date de début], [date de fin])
Fonctionnement :
Vous devez remplacer le paramètre [métrique] par la métrique pour laquelle vous souhaitez connaître la dernière valeur sur une période donnée.
Pour définir cette période, vous devez remplacer les paramètres [date de début] et [date de fin], en utilisant les opérateurs temporels mentionnées plus-haut.
Fonctionnalités supplémentaires
En plus des fonctions vues précédemment, le moteur de formules permet de réaliser d'autres types de calculs.
Les calculs mathématiques
Différentes méthodes et constantes mathématiques peuvent être utilisées dans les formules.
Différentes opérations peuvent être réalisées.
Par exemple, il est possible de retourner la valeur absolue dans nombre en saisissant : Abs(Double)
Ou encore, de retourner le logarithme d'un nombre spécifié :
Log(Double)
Notez également, la possibilité d'inclure des constantes mathématiques :
exemple :
Remarque : La liste des opérateurs disponible dans l'écran de création d'une formule n'est pas exhaustive. Pour avoir une liste exhaustive de ce qu'il est possible de faire, cliquer sur "voir la documentation".
Paramétrage des dates
En complément des opérateurs temporels vus précédemment :
Vous pouvez affiner les dates que vous utilisez dans vos formules en utilisant les fonctions suivantes :
AddDays(Double) : Retourne un nouvel objet DateTimeOffset qui ajoute un nombre spécifié de jours entiers et partiels à la valeur de cette instance.
AddHours(Double) : Retourne un nouvel objet DateTimeOffset qui ajoute un nombre spécifié d’heures entières et partielles à la valeur de cette instance.
AddMinutes(Double) : Retourne un nouvel objet DateTimeOffset qui ajoute un nombre spécifié de minutes entières et partielles à la valeur de cette instance.
AddMonths(Double) : Retourne un nouvel objet DateTimeOffset qui ajoute un nombre spécifié de mois à la valeur de cette instance.
AddYears(Double) : Retourne un nouvel objet DateTimeOffset qui ajoute un nombre spécifié d’années à la valeur de cette instance.
Cette liste n'est pas exhaustive et vous pouvez retrouvez l'ensemble des possibilités en cliquant ici.
Concrètement, si on utilise l'opérateur "now.startOfDay" par exemple, il va représenter le début de la journée en cours.
Mais imaginons que l'on souhaite avoir la journée d'hier. Nous allons pouvoir compléter notre opérateur temporel avec la fonction AddDays :
now.StartOfDay.AddDays(-1).
En ajoutant .AddDays(-1), on va indiquer que l'on souhaite avec la journée courante moins un jour.
Vous pouvez ainsi ajouter/enlever des jours, heures, mois, années... à votre date.
Exemple : Nous voulons connaître la température moyenne d'une installation au cours des 3 années passées (sans compter l'année en cours, que l'on nommera n).
Il faudra paramétrer la période de sorte à ce que :
le début de la période représente le début de l'année n-3 : now.startOfYear.AddYears(-3)
la fin de la période représente la fin de l'année n-1 :
now.endOfYear.AddYears(-1)
Calculs associés aux dates
Vous avez la possibilité d'inclure des opérateurs temporels en dehors des fonctions Indaba.
Cette fonctionnalité offre divers cas d'usage possibles :
Comparaison de dates
Il est possible de comparer des dates en utilisant des opérateurs de comparaison (>, >= , <, <=, =)
Par exemple :
Ici, on compare la date actuelle (avec l'opérateur temporel "now") et une date fixe :
Calculer une durée
Une soustraction de dates (date - date) renvoie un objet de type "TimeSpan", qui représente une durée.
Cet objet peut être exploité en le combinant à d'autres fonctions.
Par exemple, il est possible de calculer le nombre d'heures qui se sont écoulées depuis le début du mois :
Ici, (now - now.StartOfMonth) représente la durée entre la date actuelle et le début du mois.
On multiplie ensuite cette durée par la fonction TotalHours, pour renvoyer le nombre d'heures passées dans le mois.
Pour consulter davantage de cas d'utilisation, cliquez ici.
Remarque : Il n'est pas possible d'additionner deux dates. Pour ajouter une durée à une date, il faut passer par les fonctions .Add[unité temporelle] vues précédemment.