Commande Jmqtt binaire ou texte

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

Par contre dans un scenario (un SI) quand je fais ce test :
#[Chauffage Maison][Shelly Radiateur Chambre][Connection]#==0

Je vais évaluer : "true"==0
Résultat : true

#[Chauffage Maison][Shelly Radiateur Chambre][Connection]#==« false »

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 :

Je vais évaluer : "true"
Résultat : true

Ma question est surtout de comprendre la différence de comportement d’une même commande dans un scenario ou dans un virtuel?

Mon autre option serait d’utiliser, celle ci ci dessous qui semble être au bon format

Merci pour votre support.


Mes infos de config
OS version: debian 11 on RPI 4 B
PHP version: 7.4.33
Python version: 3.9.2
Core version: 4.5.2 (master)
Nb lines in http.error: 512
Plugins: calendar dayinfo deconz espeasy FreeSms geotrav jeemate jMQTT mail meteofrance mobile mode Monitoring networks octoprint openvpn programmateur rflink script sshmanager thermostat virtual weather

jMQTT: 23.11.8 (2024-06-08 14:14:45) branch: stable
Nb Errors or Warnings in jMQTT logs: 0 (level is debug)
Daemon Status: Started (2026-01-06 14:55:04)
Nb eqBrokers: 1 / eqLogics: 15 / cmds: 171

Salut,

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.

Quelque chose de ce type devrait marcher :

('#value#' == 'true' ) ? 1 : 0

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 …

Non en fait dans les 2 cas j’utilise la même commande

Dans le virtuel :
#[Chauffage Maison][Shelly Radiateur Chambre][Connection]#

Dans mon scenario le test est le suivant

#[Chauffage Maison][Shelly Radiateur Chambre][Connection]#==0

ce qui donne dans le testeur d’expression

Je vais évaluer : "true"==0
Résultat : true

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 »

J’ai peut être raté quelque chose

Bonjour

Dans le testeur d’expression:
image
image
image
image

Les résultats sont bons, true et false sont des valeurs binaires.

Par contre si on met des guillemets:

image
image

Le true est considéré comme un texte mais pas comme valeur binaire.

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

Par contre la même commande dans un virtuel est bien interprétée comme un binaire :

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.

1 « J'aime »

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.

Salut,

Tu peux voir ici pour comprendre ce qu’il se passe :

Jeedom considère l’information venant de jmqtt comment une chaine de caractère

SI PHP doit comparer une chaine à un nombre il va donc convertir cette chaine en nombre avant de comparer et donner le résultat.

En PHP 7, cette conversion donnait un résultat true avec n’importe quelle chaine contenant du vrai texte, ce n’est plus le cas avec PHP 8

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.

Non ce n’est pas ça.

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

Bonjour à tous,

Ce n’est pas un « problème » venant de jMQTT.

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.

Bad

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é :grin:

Par contre le virtuel avec la même commande qui contient « true » en texte le traitement est correct il interprète bien avec un 1

J’espère que je ne suis pas trop soulant mon pb est bien résolu mais j’essaye de comprendre les subtilités.

2 « J'aime »

Pareil et c’est pour cela que j’ai ouvert un fil pour essayer de mettre au clair tout cela!