Chaque niveau de gravité d’une règle de seuil a une seule condition. Une condition est soit une comparaison unique (une feuille), soit un groupe de conditions. Cette page décrit la façon dont Hermetry les évalue, afin que vous puissiez prévoir quand une alarme s’ouvre.
Forme
Condition = { "key": …, "op": …, "value": …, "topic"?: … }
| { "all": [ Condition, … ] }
| { "any": [ Condition, … ] }
Le formulaire modifie une comparaison par niveau de gravité. Les groupes s’écrivent en mode JSON.
Opérateurs
op | Vrai lorsque |
|---|---|
> | la valeur est supérieure au seuil |
>= | supérieure ou égale |
< | inférieure |
<= | inférieure ou égale |
== | égale |
!= | différente |
Il n’existe pas de « entre » : utilisez all avec >= et <=. Il n’y a pas de calcul arithmétique : une condition ne peut pas exprimer « consigne + 10 » ou « plus que l’autre capteur ». Pour cela, calculez une clé dérivée dans un flux (voir Valeurs dérivées) ou utilisez une formule de la carte Règles.
Comparaison des valeurs
| Valeur et seuil | Comparaison |
|---|---|
Les deux sont des nombres, ou du texte lisible comme un nombre ("23.5", "1e3") | En tant que nombres. "80" et 80 sont égaux. |
Tout autre cas avec == ou != | En tant que texte : true est égal à "true". |
Tout autre cas avec >, >=, <, <= | Toujours faux. |
L’appareil a envoyé null | == est faux et != est vrai. |
Ainsi, un état signalé sous forme de texte fonctionne avec == : { "key": "state", "op": "==", "value": "fault" }. Les booléens fonctionnent aussi : { "key": "door_open", "op": "==", "value": true } correspond également à un appareil qui envoie "true".
Seuils par appareil issus des attributs
Au lieu d’un nombre, la valeur peut désigner un attribut de l’appareil :
{ "key": "temperature", "op": ">", "value": { "attribute": "max_temp" } }
Dans le formulaire, saisissez attribute:max_temp dans Valeur.
- Hermetry reads the device’s server attribute of that name, then its shared attribute. Client attributes are not used.
- Un appareil qui ne possède pas cet attribut n’est pas contrôlé pour cette comparaison : la feuille est fausse. Donnez l’attribut à tous les appareils, ou ajoutez un second niveau de gravité avec un nombre fixe.
- Un attribut modifié est pris en compte dans un délai d’environ 30 secondes.
Cela permet à une seule règle de servir des appareils aux limites différentes. Définissez les attributs dans l’onglet Attributes des appareils, par import ou via l’API. Voir Attributs.
Groupes : all et any
{
"all": [
{ "key": "door_open", "op": "==", "value": true },
{ "key": "pressure", "op": "<", "value": 1.2 }
]
}
allest vrai lorsque chaque partie est vraie ;anylorsqu’au moins une l’est.- Les groupes peuvent être imbriqués sur 4 niveaux au maximum.
- La condition d’un niveau de gravité peut contenir au maximum 16 comparaisons au total.
Règles portant sur plusieurs clés
Les appareils envoient souvent leurs clés dans des messages séparés. Une règle est évaluée sur les dernières valeurs connues de l’appareil, et non uniquement sur le message qui vient d’arriver :
- Une règle n’est évaluée que sur un message contenant au moins une de ses clés (provenant d’un topic correspondant). Un message sans aucune de ses clés ne l’ouvre ni ne la ferme, et ne compte pas comme un échantillon pour le debounce.
- Pour une clé absente du message, la comparaison utilise la dernière valeur de cette clé que la règle a vue sur cet appareil.
- Une comparaison dont la clé n’a jamais été vue par la règle sur l’appareil est fausse.
Exemple : l’état de la porte arrive chaque minute et la pression toutes les dix secondes. La règle all ci-dessus s’ouvre dès que les deux sont vraies, quel que soit le message arrivé en dernier.
Les valeurs mémorisées sont conservées avec l’état de la règle. Un appareil silencieux pendant 30 jours perd cet état et repart de zéro.
Filtres de topic
Pour les appareils qui publient sur leurs propres topics MQTT, une feuille peut être limitée à un seul topic :
topic | La feuille s’applique à |
|---|---|
| absent | les messages de n’importe quel topic |
"factory/line1/temp" | les messages provenant exactement de ce topic |
null | les messages des topics par défaut uniquement |
La même clé sur deux topics compte comme deux valeurs différentes. Dans le formulaire, définissez-la sous Avancé > Uniquement depuis le topic. Voir Topics et charges utiles MQTT.
Clés
Une clé est une clé de télémétrie : sans espaces, pas un simple nombre, 128 caractères au maximum. Les clés sont sensibles à la casse : Temperature et temperature sont deux clés différentes. Une clé que le profil ne déclare pas est acceptée avec un avertissement ; une clé de type nombre seulement si le profil la déclare.
Niveaux de gravité
Avec plusieurs niveaux de gravité, toutes les conditions sont évaluées sur chaque message et la gravité vraie la plus élevée l’emporte :
"severities": [
{ "severity": "CRITICAL", "condition": { "key": "temperature", "op": ">", "value": 90 } },
{ "severity": "MAJOR", "condition": { "key": "temperature", "op": ">", "value": 80 } },
{ "severity": "WARNING", "condition": { "key": "temperature", "op": ">", "value": 70 } }
]
À 85, l’alarme est Major ; à 95, elle passe à Critical ; de retour à 85, elle revient à Major (après le debounce de fermeture) ; en dessous de 70 (moins l’hystérésis), elle se ferme.
Ce qu’une condition ne peut pas faire
| Impossible | Alternative |
|---|---|
| Comparer deux clés ou deux appareils | Une formule de la carte Règles, ou un flux qui écrit une clé dérivée |
| Utiliser l’heure de la journée ou un calendrier | Une règle de la carte Règles avec une fenêtre horaire |
| « N’a pas changé depuis 10 minutes » | Un flux avec un bloc watchdog ou delta |
| Calcul arithmétique dans le seuil | Une clé dérivée, ou un attribut par appareil |
| Lire un attribut client comme seuil | Stocker la limite dans un attribut server ou shared |

