Formation Dybee – Calculs et Formules
Introduction
Dybee offre la possibilité d’écrire des formules de tout genre et met à votre disposition une page nommée « requête/ query » le tout accessible à partir du menu « Module d’analyse », afin de les écrire et valider leurs résultats.
La page requête est l’endroit pour écrire:
- Virtuels
- Virtuels globaux
- Règles de détection de faute
- Indicateurs clés de performance (KPI)
Pour réaliser l’écriture de formules Dybee , nous devons comprendre:
- La structure de la formule
- Les opérateurs et fonctions
- La sauvegarde et l’exécution
Page requête
Le format des données
Dybee permet le calcul à différents intervalles. À la base, le calcul des formules est fait à partir de données horaires. Pour chaque donnée horaire, nous avons accès à la moyenne, le minimum, maximum et la somme totale de celle-ci.
Par défaut Dybee utilise la moyenne.
- Options ➡ retourne la valeur moyenne de l’heure, minimum, maximum ou totale de l’heure.
- .avg (par défaut)
- .max
- .min
- .tot
Structure de la formule – Choix des points
La formule Dybee s’apparente à une formule Excel, sauf qu’elle permet d’utiliser notre modèle. Une formule peut être ‘indépendante’ ou ‘ciblée’.
• Une formule indépendante utilise exclusivement des points de contrôle. Pour accéder aux points de contrôle, vous n’avez qu’à écrire une accolade { et Dybee vous proposera la liste des points disponibles. Vous pouvez filtrer les points en écrivant du texte.
• Une formule ciblée repose sur la structure du modèle du bâtiment et sur les relations entre les entités. Le choix de cette cible est important lorsqu’on utilise des éléments tels que tag, param, parent, child, source, load, car Dybee doit comprendre quelle est la source des relations. On peut sélectionner une cible via des crochets [ ] ou via un picker proposé dans la plateforme.
Assurez-vous de comprendre la modélisation de Dybee à l’aide des capsules vidéos à ce sujet.
Exemples :
Formule via des points de contrôles : {température_extérieur} – {température_local102}.max
Formule via une cible : [local102].child.Ttag.T – [local102].child.Ttag.TSP
Vous aimeriez rester informé des nouveaux développements dans Dybee ?
Abonnez-vous à notre infolettre!
Opérateurs et fonctions
Dans Dybee, notre argument « arg » peut être un nombre, un point ou une formule.
Opérateurs
Expression | Description | Exemple |
{} | Sélection d’un point de contrôle | {Point} |
[] | Sélection d’une entité | [Entité] |
– | Soustraction | arg1-arg2 |
+ | Addition | arg1+arg2 |
* | Multiplication | arg1*arg2 |
/ | Division | arg1/arg2 |
^ | Exposant | arg1 ^ arg2 |
() | Parenthèse | (arg1 – arg2)/arg3 |
AND ou && | Donne 1 si les deux parties sont vraies | arg1 AND arg2 |
OR ou || | Donne 1 si une des deux parties ou les deux sont vraies | arg1 OR arg2 |
< | Donne 1 si l’argument de gauche et inférieur à l’argument de droite | arg1 < arg2 |
> | Donne 1 si l’argument de gauche et supérieur à l’argument de droite | arg1 > arg2 |
<= | Donne 1 si l’argument de gauche et inférieur ou égal à l’argument de droite | arg1 <= arg2 |
>= | Donne 1 si l’argument de gauche et supérieur ou égal à l’argument de droite | arg1 >= arg2 |
<> | Donne 1 si les deux arguments sont différents | arg1 <> arg2 |
= | Donne 1 si les deux arguments sont égaux | arg 1 = arg 2 |
Fonctions de base
Expression | Description | Exemple |
abs( ) | Retourne la valeur positive de la valeur entre parenthèses. | abs(arg1) |
sqrt ( ) | Retourne la racine carrée de la valeur entre parenthèses | sqrt (arg1) |
ln ( ) | Retourne le logarithme népérien de la valeur entre parenthèses | ln (arg1) |
log10 ( ) | Retourne le logarithme décimal de la valeur entre parenthèses | log10(arg1) |
log2 ( ) | Retourne le logarithme binaire de la valeur entre parenthèses | log2(arg1) |
sin ( ) | Retourne le sinus de la valeur entre parenthèses | sin (arg1) |
cos ( ) | Retourne le cosinus de la valeur entre parenthèses | cos (arg1) |
tan ( ) | Retourne la tangente de la valeur entre parenthèses | tan (arg1) |
arcsin ( ) | Retourne l’arc sinus de la valeur entre parenthèses | arcsin (arg1) |
arccos ( ) | Retourne l’arc cosinus de la valeur entre parenthèses | arccos (arg1) |
arctan ( ) | Retourne l’arc tangente de la valeur entre parenthèses | arctan (arg1) |
sec ( ) | Retourne la sécante de la valeur entre parenthèses | sec (arg1) |
cosec ( ) | Retourne la cosécante de la valeur entre parenthèses | cosec (arg1) |
rad ( ) | Retourne le radiant de la valeur entre parenthèses | rad (arg1) |
deg ( ) | Retourne le degré de la valeur entre parenthèses | deg (arg1) |
Fonctions avancées
Liste des fonctions avancées disponibles
Dans Dybee, des horaires peuvent être paramétrés dans le module ‘Horaire’ et retournent 1 quand l’horaire est actif et 0 sinon.
Expression | Description | Exemple |
avg( ; ) | Moyenne d’une liste d’argument | avg(arg1 ; arg2 ; arg3…) |
max( ; ) | Maximum d’une liste d’argument | max(arg1 ; arg2 ; arg3…) |
min( ; ) | Minimum d’une liste d’argument | min(arg1 ; arg2 ; arg3…) |
Schedule.horaire | Accès aux horaires configurés dans notre projet | Exemple_Schedule |
Count(cible ; option) | Compte le nombre d’entités cibles répondant à une condition | Exemple_Count |
nb (cible) | Compte le nombre d’entités cibles | Exemple_nb |
first (arg1 ; arg2 ; …) | Retiens la première option calculable | Exemple_first |
? | Contourne l’élément s’il n’existe pas | Exemple ? |
if (condition ; valeur si vraie ; valeur si fausse) | Retourne la »valeur si vraie » ou la »valeur si fausse » dépendant de la condition | Exemple_if |
Curve (arg1; X1 ; Y1 ; X2 ; Y2 ; X3; Y3…) | Permets de calculer l’image d’un point en fonction d’une courbe préétablie | Exemple_curve |
.shift | Retourne la valeur de l’argument au temps t +- X heures | arg1.shift(-Xh) |
Exemple Schedule
Notre module horaire permet la création d’une cédule de la semaine et des heures pour l’occupation ou l’opération.
Les horaires sont créés via « Visualisation -> Mes données -> Horaires » ou « Modules d’analyse-> Horaires ». Ce sont des variables binaires :
- 1: Horaire activée
- 0: Hors horaire
Lors de sa création, on doit lui assigner un Alias. De cette façon, à l’écriture des formules, nous pouvons accéder à cette variable en tout temps via la formulation suivante :
Schedule.horaire1 Où « horaire1 » est notre alias.
Exemple Count
Count permet de retourner le nombre d’éléments ciblés répondant à une condition donnée.
count( load.ATD ; tag.F > 20 ) retourne le nombre de boites terminales connectées à notre système qui ont un débit de plus de 20 l/s
Exemple nb
nb permet de retourner le nombre d’éléments ciblés. La formule peut vous retourner le nombre d’éléments qui existent (nombre de pièce, nombre de boite terminale, etc.).
nb( load.ATD) retourne le nombre de boites terminales connectées à notre système.
nb( tag.MS ) retourne 1 si le tag MS de notre entité ciblé est bien mappé.
Exemple first
Le first permet de prendre en compte pour notre formule le 1er élément existant de la liste.
first( tag.MC ; tag.BC * 100; 0) – first( tag.MS ; tag.BS * 100; 0)
Dans ce cas, on veut regarder la différence entre la consigne et le statut de notre/nos cible(s).
Le 1er first renvoie la commande modulante (MC) si elle existe. Si elle n’existe pas, il renvoie la commande binaire (BC*100). Et si aucun des deux tags n’existe il renvoie 0. Idem pour le 2e first avec les statuts (MS, BS). Ainsi si aucun des tags n’existe notre formule renverra 0 mais si nous avons la commande modulante et le statut modulant par exemple, notre formule renverra : tag.MC – tag.MS
Exemple ?
Une formule ciblée pour une sonde de température telle que « tag.T > 5 » s’appliquera à l’ensemble de nos entités température.
Cependant, si une sonde de température n’a aucun point mappé au tag « T », la formule ne sera pas analysée par Dybee. Et si un seul élément de la formule n’existe pas, la formule globale ne sera pas analysée.
Dans certains cas, on souhaite tout de même en faire le calcul. Par exemple, si je veux calculer la moyenne de chauffage de mon système, donc de mes serpentins de chauffage (HC) et ceux de préchauffage (PHC) en tout temps, même si je n’ai pas de préchauffage, il me faut écrire :
avg( child.HC.tag.MC ; child.PHC.tag.MC? )
Le « ? » signifiant que la formule est valide même si l’élément en question n’existe pas. Dans notre cas s’il n’y a pas de préchauffage la formule nous retournera child.HC.tag.MC
Exemple if
La formule if permet de nous retourner une valeur en fonction d’une condition préalable
if( expression ; valeur si vrai ; valeur si faux)
If ( 24 > 10 ; 0 ; 100) retourne 0
if( child.HC.tag.MC > 0 AND child.CC.tag.MC > 0 ;1 ; 0 ) retourne 1 si le serpentin de chauffage et le serpentin de refroidissement d’une CTA fonctionnent en même temps et retourne 0 sinon. Cela permet de détecter un combat thermique par exemple.
Exemple curve
La fonction curve ( ) permet de créer des courbes d’interpolation à partir d’une valeur X et de couples de points :
Exemple : curve( arg1 ; 0 ; 0 ; 50 ; 70 ; 100 ; 100 ) Le résultat retourné pour arg1= 25 serait 35.
Avez-vous pensé à définir un objectif pour votre projet d’efficacité énergétique ?
Ciblez mon objectif!
Modèle
Alias
C’est l’acronyme propre à chaque famille d’équipements, de composants ou d’instruments, de tag, de paramètre ou de kpi. Ces alias sont utilisés pour pointer un ou des éléments précis dans les formules.
Exemples :
AHU = Centrale de traitement d’air (Air handling unit)
NN = Réseau thermique (Net node)
HC = Serpentin de chauffage (Heating coil)
T = Sonde de température (Temperature)
SA_T = Sonde de température d’alimentation (Supply air temperature)
Etc.
L’Alias X permet de référer à l’ensemble des familles présentes (Exemple AliasX)
All.Alias permet de référer à l’ensemble des entités de la famille dont l’alias est mentionné. Dybee fait alors la moyenne des valeurs retournées.
Élément
Chaque entité (équipement, composant et instrument) peut posséder des tags, des paramètres ou des kpi. Il est possible d’y faire appel dans les formules via la structure suivante :
- [Entité].tag
- [Entité].param
- [Entité].kpi
Les éléments de l’entité bâtiment (tags, paramètres, kpi) sont constamment disponible dans les formules, quelque soit la cible de départ en utilisant le mot clef « global » comme alias (Exemple global).
Exemple Élément/Alias
Voici un exemple d’utilisation des éléments et des alias dans une formule :
Prenons l’exemple d’une zone comprenant un thermostat, on retrouve ici différents Alias.
- Z pour notre équipement Zone
- T pour notre instrument Température (thermostat)
Pour notre instrument Température, on retrouve:
– Les alias de type tag:
- T pour la lecture de température
- TSP pour la consigne de température
– Les alias de type paramètre:
- T_H pour la température limite haute
- T_L pour la température limite basse
En ciblant l’instrument Température (alias T) qui représente un thermostat voici différentes formules permettant d’accéder et d’analyser les éléments de notre instrument
- Formule d’accès à la donnée de température : tag.T
- Vérifier si la température se trouve au-dessus de la limite haute : tag.T > param.T_H
À noter ici qu’on évaluera la moyenne de la température dans l’heure. Si l’on veut évaluer la limite haute par rapport à la température maximum de l’heure en cours, on écrira : tag.T.max > param.T_H
Exemple Alias X
Lorsqu’on utilise load, source et tous les autres dérivés, on peut parfois vouloir cibler différentes familles pour être flexible ou cibler tout simplement plusieurs familles différentes.
Si l’on souhaite savoir la température d’alimentation d’une zone, celle-ci peut être mesurée au niveau d’une CTA ou d’une distribution d’air selon l’architecture de notre bâtiment.
Si notre cible est la boite de volume#1, la formule : firstSource.X.child.SA_T.tag.T retourne la valeur de la première température d’alimentation de l’arborescence de notre boite de volume.
Cela nous permet de créer des règles ou des KPI très génériques qui peuvent s’adapter facilement à diverses architectures de modélisation.
Exemple Global
Notre bâtiment est une entité tout comme un équipement, un composant ou un instrument. Cela dit, il possède ses tags, paramètres, KPIs et règles.
Il est possible de créer nos tags ou paramètres et s’en servir dans nos formules à titre de variables globales.
Pour y accéder à partir de n’importe quelle formule, on écrit par exemple:
global.tag.OA_T : pour accéder à la température extérieure.
global.param.AREA : Pour accéder à la superficie de notre bâtiment.
Vous aimeriez rester informé des nouveaux développements dans Dybee ?
Abonnez-vous à notre infolettre!
Relation
Il faut toujours évaluer les relations à partir de la cible qui est notre entité de référence (Exemple relation)
Expression | Description | Exemple |
Parent | Vise l’équipement « contenant » la cible | Exemple_Parent |
Child | Vise les éléments qui composent la cible | Exemple_Child |
Source | Vise les éléments possédant un flux qui pointe vers la cible | Exemple_Source |
FirstSource | Vise le 1er élément listé de l’arborescence de flux qui pointe vers la cible | Exemple_FirstSource |
AnySource | Vise l’ensemble des éléments de l’arborescence de flux qui pointe vers la cible | Exemple_AnySource |
AnySourceSib | Vise l’ensemble des « frères et soeurs » des éléments de l’arborescence de flux qui pointe vers la cible | Exemple_AnySourceSib |
Load | Vise les éléments pointés par des flux partant de la cible | Exemple_Load |
FirstLoad | Vise le 1er élément listé de l’arborescence de flux pointé par la cible | Exemple_FirstLoad |
AnyLoad | Vise l’ensemble des éléments de l’arborescence de flux pointés par la cible | Exemple_AnyLoad |
AnyLoadSib | Vise l’ensemble des « frères et soeurs » des éléments de l’arborescence de flux pointés par la cible | Exemple_AnyLoadSib |
Exemples relation
Il faut toujours évaluer les relations à partir de la cible.
Dans notre exemple, la cible est « Centrale de traitement d’air #1». Les flux sont représentés par des flèches noires.
En conséquence :
• Child vise les éléments qui la composent, soit le serpentin de chauffage et la sonde de température d’alimentation
• Parent : dans ce cas-ci la CTA n’a pas de parent. Elle est le parent des childs HC et SA_T qui la compose.
• Source vise les éléments possédant un flux qui pointe cers notre cible soit ici l’unité d’air neuf
• Load vise les éléments pointés par un flux partant de notre cible. Ici les boites terminales (ATD) de chacune des zones
Exemple Child
La formule Child permet d’accéder aux sous-entités de notre équipement.
Lorsqu’on utilise child, on doit comme second paramètre, spécifier quelle famille d’enfant on regarde
Exemple 1
Ici, la cible est l’équipement Zone #1 (Alias Z)
• Pour accéder à la donnée de température, on doit spécifier child et l’alias de l’enfant :
child.T.tag.T
• Pour valider si la température de notre zone se trouve au-dessus de la limite haute on utilise la formule suivante :
child.T.tag.T > child.T.param.T_H
Exemple 2
Ici la cible est l’équipement CTA #1
Dans un premier temps, on souhaite évaluer si la température d’air alimenté dépasse sa limite supérieure. On utilise pour cela la formule suivante :
child.SA_T.tag.T > child.SA_T.param.T_H
Si l’on souhaite vérifier si le serpentin chauffe pendant que le système est à l’arrêt.
On utilise la formule suivante :
tag.BC = 0 AND child.HC.tag.MC > 0
Exemple Parent
La formule Parent permet d’accéder aux éléments de notre entité parents.
Ici la cible est notre sonde de température.
On veut vérifier si la température est plus élevée que la limite haute lorsque la CTA #1 est en marche .On veut alors accéder au tag commande binaire [BC] du parent (la centrale d’air CTA#1) de la sonde de température d’alimentation. On utilise donc cette formule :
parent.tag.BC = 1 AND tag.T > param.T_H
Selon la cible de départ, utiliser tag.T (si la cible de départ est la SA_T) ou child.SA_T.tag.T (si la cible de départ est la CTA#1) nous renverrais la même valeur.
Puisqu’on travaille avec la donnée horaire, la CTA #1 doit fonctionner pendant l’heure entière pour que parent.tag.BC=1. Si on souhaite analyser l’heure où il a fonctionné, peu importe la durée, on doit écrire parent.tag.BC > 0
Exemple Source
La formule Source permet d’accéder aux entités sources basées sur les flux énergétiques (relations). On doit spécifier l’alias de la famille de la source souhaitée. Seulement la ou les sources directement reliées sont visées.
Ici la cible est le serpentin de chauffage (HC)
Si l’on souhaite vérifier si le serpentin de chauffage est ouvert à 100% alors que la température d’alimentation du réseau de chaud rencontre sa consigne on peut utiliser la formule suivante :
tag.MC = 100 AND (Source.NN.child.SA_T.tag.TSP – Source.NN.child.SA_T.tag.T) < 5
Ici on tolère une différence entre la consigne et la valeur réelle de maximum 5 degrés)
Il est possible de définir préalablement des KPI (indices de performance) dans DYBEE. De base nous vous en mettons plusieurs à disposition. Il existe par exemple pour les réseaux thermiques (NN) un KPI appelé PI_LS_TSP qui nous indique la déviation (en %) entre la température d’alimentation et sa consigne.
Si l’on souhaite l’utiliser, la formule précédente pourrait s’écrire comme suit :
tag.MC = 100 AND kpi.PI_LS_TSP < 10%
Ici, on accepte que cette déviation se trouve à l’intérieur de 10%.`À titre informatif, 0% signifie que la lecture est égale à la consigne.
Exemple Load
Load permet d’accéder aux entités charge basée sur les flux énergétiques (relations). On doit spécifier l’alias de la famille de la charge souhaitée. Seulement les charges directement reliées sont vis
Ici notre cible est la CTA#1. Si l’on souhaite vérifier si les boites de volume connecté à la CTA #1 sont fermées lorsque le système de ventilation est en fonction, on peut le faire via la formule suivante :
tag.BC = 1 AND load.ATD.tag.D_MC = 0
Dybee fera la moyenne des ouvertures des volets des boites terminales visées.
On peut accéder au minimum ou maximum d’ouverture en faisant: load.ATD.tag.D_MC.min ou .max
Exemple FirstSource / FirstLoad
FirstSource permet de parcourir l’arborescence entière de flux à partir de la cible et de s’arrêter à la première entité trouvée de la famille ciblée.
Ici notre cible est la boite de volume #1
Si l’on souhaite accéder à la température de la sonde de température de [AHU] CTA#1, on ne peut pas utiliser la formule Source qui ne permet d’accéder qu’à ADN qui est la relation de premier niveau.
Or la Boite de volume #1 compte dans son arborescence plusieurs centrales de traitement d’air (CTA air neuf et CTA #1).
Ainsi la formule suivante nous permet d’accéder à la température de la sonde de température de la CTA#1 :
firstSource.AHU.child.SA_T.tag.T
firstLoad fonctionne de la même façon, mais en arborescence descendante
Exemple AnySource
AnySource permet d’accéder aux éléments (kpi, tag, child, etc.) de nos sources, peu importe le niveau.
Celles-ci se trouvent dans l’arborescence et retournent la moyenne des résultats trouvés.
Ici notre cible est la boite de volume #1. Elle compte dans son arborescence plusieurs centrales de traitement d’air (CTA air neuf et CTA #1).
Ainsi la formule : anySource.AHU.child.SA_T.tag.T
Retourne la moyenne des températures des SA_T de CTA#1 et CTA Air neuf
Exemple AnyLoad
AnyLoad permet d’accéder aux éléments (kpi, tag, child, etc.) de nos charges, peu importe à quel niveau.
Celles-ci se trouvent dans l’arborescence, et retournent la moyenne des résultats trouvés.
Ici notre cible est la CTA#1. Si l’on souhaite connaitre la moyenne des ouvertures des volets des boites terminales on peut utiliser la formule suivante :
anyLoad.ATD.tag.D_MC
Dybee fera la moyenne des ouvertures des volets des boites terminales se trouvant dans l’arborescence de la CTA#1
Exemple AnyLoadSib / AnySouceSib
AnyLoadSib permet d’accéder aux sous-entités qui ont un lien de parenté sans être connectées directement par un flux énergétique à notre cible. AnySourceSib fonctionne de la même façon.
Ici notre cible est la CTA#1
Exemple 1 :
On souhaite créer un kpi qui nous indiquera si les pièces connectées à notre CTA #1 sont en moyenne trop chaude ou trop froide. On doit accéder aux températures des zones [T] et ces sondes ne sont pas connectées à notre cible.
On utilise alors AnyLoadSib :
( AnyLoadSib.T.tag.T – AnyLoadSib.T.tag.TSP ) / AnyLoadSib.T.tag.TSP
Le résultat sera un pourcentage de déviation entre les lectures de température des zones et leur consigne. Un % positif signifie que les pièces sont trop chaudes et à l’inverse, un % négatif signifie qu’elles sont trop froides.
Exemple 2 :
On souhaite déterminer si on a du chauffage dans les zones alimentées par la CTA#1.
Les plinthes (HT) ne sont pas reliées directement au CTA#1, donc ne sont pas des charges (load). Par contre, elles ont un effet sur les zones.
La formule : anyLoadSib.HT.tag.MC > 0 retourne 1 si la moyenne des commandes modulantes (MC) des plinthes (HT) de l’ensemble de nos locaux desservis par CTA#1 est supérieur à 0.
Exemple Chaine de relation
Il est évidemment possible de combiner des relations pour accéder à tout ce dont vous souhaitez.
Ainsi, si notre cible est la CTA#1, la formule suivante :
load.ATD.parent.child.HT.tag.MC retourne la moyenne des commandes modulantes (MC) des plinthes (HT) de l’ensemble de nos locaux desservis par CTA#1.