Bonjour ,
J’ai un shelly qui pilote via le fil pilote un radiateur électrique, pour m’assurer que tout fonctionne correctement j’ai une supervision qui contrôle l’état de connexion de mon shelly :
Voici ma commande commande déclarée en binaire
Je vais évaluer : "true"=="false"
Résultat : false
Est ce que cela signifie que malgré la déclaration de la commande en binaire celle ci reste en texte ? par contre pourquoi « true »==0 donne true à minima je devrais avoir false car different.
A l’opposé j’ai un virtuel qui me permet de visualiser l’état de conexion et là ça fonctionne correctement :
Si je comprends bien, c’est le shelly qui renvoi true ou false.
Dans ce cas, il ne suffit pas de paramétrer la commande en binaire, il faut lui dire à quoi correspond 0 et à quoi correspond 1.
Je ne connais pas jmqtt et si il y a une autre façon de faire avec ce plugin mais avec n’importe quelle commande jeedom, tu peux paramétrer ça au niveau du paramétrage de la formule de calcul de la valeur de la commande.
Ce qui me surprend c’est la différence de comportant quand j’utilise cette commande dans un virtuel et dans un scenario
Dans un virtuel traitement de la commande comme un binaire fonctionne
Dans un test SI la même commande n’est pas considérée comme un binaire mais un texte
Ben en même temps tu as des données qui correspondent à un format autre dans un virtuel en format binaire.
A partir de la tu peux avoir des effets innatendus oui …
Sachant que dans Jmqtt cette commande est déclarée en binaire, je trouve surprenant la différence de comportement entre le virtuel qui interprète bien la commande en tant que binaire par contre dans le scenario il considère la commande comme un texte « true »
Mais en fait je n’ajoute pas les guillemets quand je fais le test avec ma condition du si voila ce que cela donne, en plus le resultat est true!! j’aurai préféré un false dans le sens ou un texte n’est pas égal à 0
Pour que cela fonctionne j’ai la solution c’est de mettre dans ma condition si #[Chauffage Maison][Shelly Radiateur Chambre][Connection]#==« false » mais ça me chagrine de ne pas comprendre la différence de traitement avec le virtuel.
Ben je t’ai proposé une solution mais tu ne veux visiblement pas la tester.
Jeedom à un certain nombre de fonctions pour être moins « strict » que le php pur : remplacer des guillemets doubles par des simples quand c’est nécessaire, les ajouter quand il pense qu’il en faut et qu’il n’y en à pas, remplacer des mots plus simples tel que ET par l’expression réelle en php &&
Au final j’ai l’impression que c’est ces « facilités » qui font que dans ton cas tu as un comportement étrange.
Bref j’en reviens à ce que je préconisais à l’origine : fait en sorte que ce soit réellement un binaire qui arrive dans une commande binaire t’évitera pas mal de soucis.
Effectivement je ne t’avais pas remercié pour ta proposition qui en soit résout le problème, mon objectif était surtout de comprendre la différence de comportement et les subtilités de Jeedom dans l’interprétation des formats de commande.
Merci Bison,
Encore une fois pour bien comprendre les subtilités de Jeedom,
Cela signifie que le traitement dans le scenario (SI) se fait via php8, donc ne sait plus traiter lorsque la comparaison se fait avec une chaine de caractère (pas de conversion auto comme php7, si je peux m’exprimer ainsi).
Par contre le virtuel sait gérer cela.
Il y a une différence de traitement dans la comparaison entre une chaine et un nombre suivant la version de PHP mais Jeedom tourne entièrement en PHP7 ou PHP8 (donc les plugins, les scenarios, etc … utilisent la même version de PHP).
Dans ton virtuel tu as un binaire dont la valeur est 1
Dans ce cas la comparaison se fait entre deux nombres (1 == 0) et aucun soucis
Avec jmqtt tu as un binaire mais la valeur n’est pas 1, elle est « true »
Au moment de la comparaison, du coup Jeedom doit comparer une chaine (« true ») à un nombre ("true" == 0). Et on tombe dans le cas de figure où avec PHP7 (la version que tu dois avoir donc), cette comparaison renvoie true.
Si tu avais un système en PHP8 pour Jeedom, cette même comparaison renverrait false
Le Core gère automatiquement la conversion de certaines valeurs en binaire (ici v4.5.2) :
Mais il faut que la commande soit de type binaire, ce qui est bien le cas de @FredD :
Je peux avoir les logs jMQTT et jMQTTd en débug quand tu reçois des infos sur cette cmd stp ?
Mon intuition est juste qu’il y a autre chose dans le champ du json (espace etc) et qu’il faut nettoyer la valeur avant de la faire manger au Core dans la commande.
Il est aussi probable que tu n’as pas reçu de nouveau message sur cette commande depuis que tu l’as passé de type autre à binaire.
OK je viens de comprendre la subtilité pour le scenario et le SI
php essaye de convertir « true » en nombre n’en trouvant pas, il met 0 donc le test 0 == 0 conduit à un true au final, c’est assez tourdu pour un non initié