Créer un binaire avec seuil Hystérésis

Hello,

Je cherche en vain un moyen de créer une info binaire qui passe à un lorsque qu’une valeur dépasse un seuil puis repasse à zéro lorsque la valeur tombe sous le seuil - delta. Cela pour créer un hystérésis.

Donc :
Statut = 1 si Valeur > seuil, reste à 1 tant que valeur > seuil, puis passe à 0 que quand valeur < (seuil - delta).

Pour cela, je dispose d’une info seuil, d’une info valeur et d’une info delta.

Qui pourrait m’aider ? Pour tester et illustrer la fonction, je cherche à créer un équipement virtuel.

Merci pour vos idées.

Bruno.

Bonjour,

Opération ternaire :

N = A > B ? 1 : 0

Chercher « ternaire » sur le forum pour plein d’exemples

2 « J'aime »

Bonjour

Comme l’a mentionné @Bonjour le plus simple est le ternaire.
C’est en quelque sorte un si, alors, sinon.

Merci à tous les deux.

En fait c’est plus compliqué que cela en a l’air. J’ai besoin d’avoir de l’hystérésis. Je connais l’opérateur ternaire qui permet de simplifier l’écriture d’un conditionnel. mais dans ce cas précis, il faut certainement tenir compte de la tendance de la valeur. Je peux créer un virtuel qui utilise du code php mais je ne suis pas assez calé et autonome par y arriver tout seul.

Voici mon souci actuel :

J’ai une action sur un volet en fonction d’une condition météo et de la température de la pièce. Si la météo est dégagée et que dans la pièce il fait 25°C ou plus, alors je ferme partiellement le volet. Lorsque la Temp de la pièce arrive à 25°C, le volet se baisse. Cela fait baisser la température intérieur de la pièce et dès que celle-ci descend en dessous de 25°C, le volet s’ouvre. Et hop, 5 minutes plus tard, rebelote, le volet se ferme pour s’ouvrir 5 minutes après, et ainsi de suite.

Pour éviter ce va et vient, comme dans toute régulation (ce n’est pas mon but), il faut mettre en place de l’hystérésis. Je souhaite mettre un delta de 2°C (par exemple). Dans ce cas, dès que la temp dépasse 25°C, le volet se ferme. Si la temp baisse, alors je garde le volet baissé jusqu’à ce que la temp descend en dessous de 23°C (et non 25°C, sans hystérésis). Si la temp remonte, alors il faudra qu’elle dépasse de nouveau 25°C pour que le volet se baisse. Et aussi, si la température oscille entre 23 et 25, le volet doit rester dans son état.

Je ne trouve pas la solution pour obtenir une logique conditionnelle qui inclus de l’hystérésis. Je sais qu’il faut utiliser la tendance, mais je bloque.

Un simple scénario avec la température comme déclencheur ne fait pas l’affaire ?
Si > 25 volet baissé
Si < 23 volet remonte
Auquel j’ajouterai une variable pour connaître l’état du volet si ce n’est pas géré.

Je ferai comme ça en tout cas

Bonjour @Bonjour / @dan_73
pour moi ça ne fonctionnera pas avec un ternaire seul (une seule commande de type information)…:slight_smile:
Car, dans un test logique, il n’y a pas de notion de précédent & Suivant…
Notion qu’il y a dans l’hystérésis.
Mais je me trompe peut-être !?

Bref, je suis le fil car curieux d’avoir la réponse final !

PS @noBru77 : A chaud, je dirai que vous ne pourrez pas y arriver sans un scénario dédié, qui lui pourra faire appel à l’historique de l’information.
(Ou avec plusieurs virtuel, mais à l’instant, je ne vois pas…)

Mais surtout, autant partir direct sur un scénario, qui lui pourra gérer plein d’autre chose, comme vous permettre de choisir quand le volet est piloter en automatique (heure, mode, etc.) mais également de ne pas faire du tout ou rien…
Si T° < 22 alors volet fermé à 0 %
Si T° > 23 alors volet fermé à 20 %

Si T° > 25 alors volet fermé à 80 %
Si T° > 26 alors volet fermé à 95 %
etc.

Enfin, pour que le scénario ne travail pas tout le temps, vous lancer le scénario toute les 10 minutes.
Vous commencé par
SI : Condition horaire / jours / mode etc … alors Stop
SI : T<20 et T>30 alors Stop
Si… blabla alors
puis votre scénario de pilotage qui s’exécutera que dans les conditions attendu, toute les 10 minutes !

Apres, si c’est pour la beauté du geste de réussir avec un virtuel… c’est une autre histoire !
Et ça me dit bien de chercher moi aussi ! Car Jeedom c’est aussi ça « se trouver des petits casse têtes logique à résoudre »…
:face_with_head_bandage:

A presque bientot si je trouve et sinon Bonne recherche !

Merci à tous pour vos bonnes idées.

En réalité, j’utilise l’excellent plugin Gestion de volet de mikant28. Le mode Azimute permet de gérer la hauteur du volet en fonction de la position du soleil. Mais il est possible de créer une ou des conditions qui autorisent la fermeture par le mode Azimute. Mon besoin est que si le soleil est dans la fenêtre et que donc le mode Azimute souhaite de baisser le volet, je ne veux l’autoriser que quand le ciel est peu nuageux (donc ensoleillé) et que la température intérieur est supérieure à 25°C. La condition d’autorisation est donc : #[salon][Sonde][Temp]# > 25 ET #[Meteo][MF][Couverture]# < 20. De ce fait j’ai besoin d’une info binaire avec hysteresis qui surveille la temp intérieur au lieu de faire juste Temp > 25.
Je pourrais utiliser un scénario. Je ne suis pas contre. Mais comment identifier la tendance sur l’info température pour géré l’hystéresis ? Car si temp augmente, alors il me faut un TRUE quand Temp > 25. Ensuite il faut rester a TRUE tout le temps sauf si la temp baisse et tombe sous le seuil de 23°.

Je vais faire un essai avec un scénario comme proposé ci-dessus sans prendre en compte la tendance. Cela semble une bonne solution.

J’aime bien réfléchir et trouver la solution la plus élégante possible. Un peu comme un challenge.

Salut

À chaque nouveau message, tu précises ton besoin exact. Je me demande pourquoi tu ne l’as pas fait dans le premier message, cela aurait évité des réponses inadaptées, et donc perte de temps pour toi et ceux qui ont répondu.

Antoine

Salut Tonio,

Eh bien tout simplement parce que j’aurai besoin d’une fonction binaire de gestion de seuil à hysteresis généralisée et fonctionnelle pour d’autres applications. Et je me demande si quelqu’un n’aurait pas une idée de génie pour répondre à ce besoin. Mon histoire de volet n’est qu’un exemple factuel. En vue des premières réponses obtenues, que je remercie par ailleurs, je m’aperçois que la notion d’hysteresis n’a pas été compris du premier coup. Alors j’ai donné un exemple que j’ai précisé par la suite. Comme je l’ai indiqué, je recherche une solution élégante et utilisable partout où j’aurai besoin d’hystéresis. Une formule algorithmique que pourrai utiliser dans une commande info ou quelque chose de ce genre. J’ai parcouru en long et en large le Community sans succès.

1 « J'aime »

Je pense avoir trouvé !
Mais… dans ma tête :slight_smile:
Je test ce soir, si ça fonctionne
Bonne journée à tous

1 « J'aime »

Bonjour,

Alors je sais pas si c’est élégant (et il n’y a pas de notion de tendance parce que tu l’as indiqué rapidement mais au final ce n’est pas ce que tu indiques en exemple).

Toujours basé sur une opération ternaire mais en poussant un peu plus loin :
Une commande info numérique que tu bornes entre 0 (valeur min) et 1 (valeur max)

#[X][X][valeur]# > 25 ? 1 : #[X][X][valeur]# < 23 ? 0 : 2

La grosse difficulté c’est de conserver la valeur de la commande virtuelle puisqu’on ne peut pas la réutiliser sur elle même (problème de boucle). L’astuce est de partir sur une valeur (2) qui ne sera pas prise en compte grace à la valeur max.

2 « J'aime »

Bonjour,

en automatisme, on utilise le même principe qu’en électricité : l’auto-maintien

N = (T > S) OU (N ET (T > S - H))

ou alors, selon comment on raisonne :

N = (T + H > S) OU (N ET (T > S))

T : Température
S : Seuil
H : Hystérésis

En réalité l’expression ternaire
N = A > B ? 1 : 0
Peut se simplifier par
N = A > B
Si N est un entier, sinon N sera un booléen et pourra être utilisé en php comme un entier 0 ou 1.

L’idée est bonne, mais justement, la difficulté est dans la gestion de l’hystérésis, c’est à dire entre 23 et 25. le résultat doit être conservé si on augmente et qu’on passe au dessus de 23 ou qu’on baisse et on passe sous 25.
Effectivement Jeedom interdit de réutiliser le résultat pour risque de boucle infinie.

Citation
en automatisme, on utilise le même principe qu’en électricité : l’auto-maintien
N = (T > S) OU (N ET (T > S - H))
ou alors, selon comment on raisonne :
N = (T + H > S) OU (N ET (T > S))
T : Température
S : Seuil
H : Hystérésis
En réalité l’expression ternaire
N = A > B ? 1 : 0
Peut se simplifier par
N = A > B
Si N est un entier, sinon N sera un booléen et pourra être utilisé en php comme un entier 0 ou 1.

Le Pb est que Jeedom interdit de réutiliser N pour éviter les boucles infinies.

Peut-on programmer ceci en php en le mettre dans le plugin script ?

C’est possible en php, ça c’est sûr. Si c’est possible dans un bloc code php, je ne peux que le supposer.

Et voici la reponse !
Toujours aussi fort le Bison…

J’avais pensé au même ternaire mais…
Je comptais interdire la valeur 2 dans les reglages de l’information.
J’avais pas pensé à utiliser plus simplement le max, ce qui est bien plus élégant (et surtout facile à comprendre quand on se repenchera dessus 3 ans plus tard :slight_smile: )

Je viens de tester plusieurs idées que vous m’avez suggérez.

Pour le moment, seul l’utilisation d’un scénario associé à une variable fonctionne.

Mon virtuel :

et le scénario, déclenché sur changement de la valeur :

Je l’ai testé tout à l’heure et cela ne fonctionne pas. Pas d’hystérésis. On obteint :

  • 0 si Valeur < 23
  • 2 si 23 < Valeur < 25
  • 1 si Valeur > 25

Or je veux :

  • 0 si valeur < 23
  • 1 si Valeur > 25
  • Inchangé si 23 < Valeur < 25 (qui garde sa valeur, c.à.d 1 si on a dépassé 25 et 0 si on était en dessous de 23)

à tester en bloc code php

// Lecture température
$cmd_temperature = cmd::byString("#[Ta][Commande][Température]#");
$temperature = $cmd_temperature.execCmd();

// Lecture condition
$cmd_condition = cmd::byString("#[Ta][Commande][Condition]#");
$condition = $cmd_condition.execCmd();

// Définition des seuil et hystérésis
$seuil = 25;
$hysteresis = 2;

// Logique
$condition = ($temperature > $seuil) || ($condition && ($temperature > $seuil - $hysteresis));

// Sauvegarde de la valeur de la condition
$equipement = $cmd_condition->getEqLogic();
$equipement->checkAndUpdateCmd($cmd_condition, $condition);

J’ai pas testé, mais ça doit être pas loin de ça

Bonjour,

Il faut faire 2 commandes virtuelles pour contourner l’interdiction de la récursivité :