Problème de retour d'état avec Inverser les valeurs binaires

Bonjour,

J’ai un détecteur de présence que retourne 0 quand il détecte une présence. Voulant l’intégrer dans le plugin Gestion lumières, j’ai besoin d’inverser les valeurs. Le problème est que le retour d’état ne marche pas quand les valeurs sont inversées.

J’ai regardé ce qu’il se passait dans le code :

Config 1: Sans inverser les valeurs:

  1. detection de présence
  2. La fonction event (core/class/cmd.class.php)
    • reçoit $_value == 0
    • la valeur formatée $value == 0
  3. la function checkReturnState est appelé avec $_value == 0
    • $_value != $this->getConfiguration(‹ returnStateValue ›) est true vu que returnStateValue == 1
    • le cron est bien activé
  4. le cron appelle returnState qui appele event avec $_value = 1
  5. le status repasse bien a 1

Config 2: Inversion des valeurs:

  1. detection de présence
  2. La fonction event (core/class/cmd.class.php)
    • reçoit $_value == 0
    • la valeur formatée $value == 1
  3. la function checkReturnState est appelé avec $_value == 1
    • $_value != $this->getConfiguration(‹ returnStateValue ›) est false vu que returnStateValue == 1
    • le cron n’est pas activé, ça s’arrête la

=> Donc pas de retour d’état, la valeur reste à 1

Config 3: Maintenant je me suis dit que j’allais changer la valeur de retour d’état à 0

  1. detection de présence
  2. La fonction event (core/class/cmd.class.php)
    • reçoit $_value == 0
    • la valeur formatée $value == 1
  3. la function checkReturnState est appelé avec $_value == 1
    • $_value != $this->getConfiguration(‹ returnStateValue ›) est true vu que returnStateValue == 0
    • le cron est bien activé
  4. le cron appelle returnState qui appele event avec $_value = 0
    • le problème est que dans event la valeur va être inversé vu que j’ai activé l’inversion des valeurs donc la valeur appliqué va être 1 alors que la valuer de mon retour d’état est 0

=> La valeur appliqué au retour d’état est la même que la valeur de détection

Je ne sais pas quelle config est sensé marcher entre la 2 et 3 mais pour le moment aucune ne marche. J’ai peut être loupé un truc qq part…
(NOTE: La répétition des valeurs est activée sur le detecteur)

Version de jedom :

Je peux faire d’autres tests ou donner plus d’information.

En attendant j’ai inversé la valeur dans le plugin de gestion des lumières

@Loic je ne sais pas si j’aurais du ouvrir un issue sur github ou si c’est bon comme ça.

Pourquoi ne pas aller sur l’équipement detecteur directement et cocher inverser au niveau de la commande ??

C’est sur la commande que j’ai coché inverser les valeurs binaires pour faire mes tests

Voici la modal complete:

Tu parles d’une autre option @anon53349806 ? Si c’est le cas, elle se trouve ou ?

Je parle d’inverser sur la commande du module directement

De ce que j’ai compris ça inverse l’affichage mais pas la valeur. Quand j’ai essayé la valeur envoyée au plugin lumière est toujours inversée.

Si tu veux une invertion dans la valeur en base, alors tu coches juste ça :

Oui c’est bien ce que j’ai fait mais le retour d’état ne marche pas, c’est ce que j’ai expliqué dans mon premier message.

1 « J'aime »

Mais si tu inverses la valeur en base pq preciser une valeur en retour d’etat ??

Le module va renvoyer sa valeur et celle ci sera inversée en base…

Ah ok, je n’ai pas précisé mais les détecteurs de présence IKEA renvoient uniquement une valeur en cas de détection, je ne sais pas si tous les détecteurs fonctionnent de cette façon.
Donc il n’y a pas de retour de valeur par le détecteur, la seul manière de remettre le status est le retour d’état jeedom. (D’ailleurs c’est jeedom qui a fait cette conf de retour d’état après inclusion)

Bonjour,
Je vois le soucis mais je ne sais pas comment corriger la… Hormis dans returnState inverser la valeur pour qu’il la reinverse ensuite.

J’ai vraiment aucune idée de comment corriger la sans tout refaire et donc que tous les utilisateurs utilisant ce type de fonction refasse toute leur configuration… Si tu as une idée hesites pas.

Bonjour
Jamais encore fait, mais j’aurais essayé avec un virtuel…
(il ne faut pas doubler tous ses équipements par des virtuel, mais… quand on pas le choix !!
Et puis UN virtuel qui double UN capteur sur ton installation, c’est pas la fin du monde…)
Type info binaire : capteur == 0

Ensuite tu vas sur la Configuration de commande de ton virtuel (onglet Information) et tu utilises « Cette commande remplace la commande » pour remplacer partout ton détecteur par le virtuel.

PS : Je viens de lancer un test…


Bonsoir,

Avec ce workaround qui consiste a mettre true au lieu de 1 ?
il me semble avoir déja testé en alpha, mais pas en stable.

image

1 « J'aime »

Juste une idée mais je n’ai pas testé peut être qu’elle n’est pas bonne: faire le test de la valeur par rapport au retour d’état avant de faire l’inversion en base?

Autre idée, programmer le retour d’état dans tous les cas?

Je n’ai pas bien réfléchi aux impacts collatéraux qu’il pourrait y avoir. A méditer.

Tout dépend de comment on voit les choses, est-ce que la valeur de retour d’état doit être inversé ou non dans le code et donc que fait la checkbox ‹ inverser les valeurs binaires › quand elle est cochée

De ce que dit le tooltip, je m’attends a ce que la valeur stocké en DB soit inversée mais pas forcément le retour d’état. Ce serait donc a l’utilisateur d’inverser la valeur de retour d’état s’il inverse les valeurs binaires si besoin. (Pas sur que ce soit clair pour lui, faudrait peut être un autre tooltip pour expliquer)

Donc si on part sur cette solution je pense qu’il faut comme tu proposes appeler le formatValue dans le returnState pour inverser la valeur qui sera a nouveau inversé dans event(). (Avec un bon commentaire pour expliquer)

Concernant l’impacte sur les config des users existantes, je pense qu’il y a plus de personnes qui ont laissé la valeur par défaut du retour d’état donc 1. Donc si la logique marche en passant manuellement le retour à 0, ça impactera surement moins. Après je me trompe peut être je n’ai aucune expérience de ce que font les users.

Je veux bien faire des tests et proposer une solution si tu es d’accord avec ce que je propose.

@Henri je trouve dommage de faire un virtuel pour une config qui est déjà proposée. J’aime beaucoup les virtuels mais que quand c’est nécessaire, ça complexifie vite le système.

@Phpvarious je n’ai pas testé mais le formatValue est sensé faire la même chose avec 1 ou true en string, donc pas sur que ça marche

@Mips c’est une autre possibilité, pas évident de savoir sans tester, je ferais des tests si ma proposition est validée

Il me semble que sa joue sur le checkReturnState qui dans la condition comparera true a 1, se qui permet de lancer le Cron, a vérifier …

Bonjour
sans grande surprise, je confirme que ça fonctionne très bien avec un virtuel :


C’est vrai, mais…
j’ai un paquet de capteurs en tout genre (présence, ouverture, vibration) et j’ai jamais eu ce soucis. Il doit donc pas être très courant qu’un fabricant de capteur de présence est la bonne idée de donner l’absence à 1 :slight_smile: et…
à lire votre réponses (qui me passent à 4 milles, je l’avoue) , j’ai pas l’impression que ça soit simple de modifier le core pour un mouton à 5 pattes croisé à l’occasion.
Bref, le virtuel n’est pas parfait, mais dans l’état actuel des choses Jeedom possède déja une solution et ça, c’est l’essentiel (avec le retour de LeResKP car s’il revient dans 2 ans… ma réponse lui servira moins :rofl:)

Bonjour,

même souci , j’ai juste coché inverser la valeur binaire et ca fonctionne.

Bonjour

Je confirme les commentaires au dessus de @LeResKP
Je pense avoir tout essayé. ‹ Valeur retour d’état › ne s’applique pas en base donc inutilisable avec ‹ Inverser les valeurs binaires ›.

Pour ne pas impacter les utilisateurs, ne faut il pas avoir returnValue et returnTime en plus de returnSateValue et returnStateTime dans la class cmd?