Fonction evaluate(false) retourne vide

Salut,

Jeedom 4.4.19

J’essai de debug rapidement le plugin-daikinrccloud pour un retour de commande binaire qui ne passent pas à zéro quand un json contient false

L’appel de jeedom::evaluateExpression() appel au final la fonction evaluate() et dans le testeur d’expression on voit bien le retour d’une valeur vide :

image

Alors que le résultat attendu est bon pour une valeur à true :
image

C’est quelque chose qui vous parle ?

Salut,

Oui, j’ai déjà été confronté à ce genre de cas mais je ne me rappel plus trop.
Par contre je n’utilise pas le testeur d’expression dans ces cas, ca n’est pas comparable à du code php.

Fait un cast en int ca devrait passer
Si pas faut que je retrouve le cas.

Hello,

Le contenu des éléments du json pouvant être aussi une string je ne peux pas trop forcer int.

Pour le moment j’ai ajouté une petite condition, ça m’a bien mis les commandes info à 0 :

if ($event[$logicalID] == false) {
  $value = 0;
} else {
  $value = jeedom::evaluateExpression($event[$logicalID]);
}

image

Donc visiblement pas grand chose à faire de mieux de ce que je comprends de ta réponse (je veux dire qu’il faut le prendre en compte et faire avec) ?

Bonjour,

Une chaine vide ou aucune valeur du tout est bien false donc oui il semble falloir le prendre en compte dans ton cas.

Tu peux aussi tester le résultat et le mettre à 0 s’il est vide.

Edit: @bison en oneline tu dois pouvoir faire un truc dans cette idée:

(($value = jeedom::evaluateExpression('test')) != null) ? $value : 0;

Salut Aurélien,

OK merci pour la confirmation :blush:

Je passe en résolu avec la réponse de Mips parce qu’il a répondu en premier mais on est bien tous d’accord. Faut faire avec :slight_smile:

Édit : @Aurelien je testerai ta proposition en une ligne merci.
Je connais bien l’expression ternaire mais celle-ci est assez costaud. J’aurai jamais pensé pouvoir utiliser $value dans le « sinon » vu que cette variable ne me semble pas encore définie :smile:

1 « J'aime »

La variable est définie entre les parenthèses, ça ne reste qu’un if au final :wink:

Par contre je vais ouvrir une issue à ce sujet pour que la valeur envoyée à $cmd->event soit à 0 par défaut ce qui corrigera d’office ce cas de figure car je crois comprendre que le fond du problème est là?

            foreach ($cmds as $cmd) {
                $logicalID = $cmd->getLogicalId();
                if (!isset($event[$logicalID])) continue;
              	!($value = jeedom::evaluateExpression($event[$logicalID])) ? 0 : $value;
              	log::add('daikinRCCloud', 'debug', '[' . __FUNCTION__ . '] ' . "[Bison] Data Debug => logicalID : " . $logicalID . " | Value : " . $value);
                $value = jeedom::evaluateExpression($event[$logicalID]);
              	if ($value == '') { // Bison pour pour prise en compte d'un retour false
                  $value = 0;
                }
                log::add('daikinRCCloud', 'debug', '[' . __FUNCTION__ . '] ' . "Data Debug => logicalID : " . $logicalID . " | Value : " . $value);
                $cmd->event($value);
            }

ça ne fonctionne pas avec la ligne unique :

[2024-12-03 21:00:01] DEBUG  : [handleMqttMessage] [Bison] Data Debug => logicalID : _isInErrorState | Value :
[2024-12-03 21:00:01] DEBUG  : [handleMqttMessage] Data Debug => logicalID : _isInErrorState | Value : 0

Une partie du json contient "_onOffMode":false

Le fond du problème c’est que jeedom::evaluateExpression($event[$logicalID]); renvoi une valeur vide dans ce cas de figure (false dans le json) et du coup la commande binaire devient vide aussi (Etat « Inconnu » comme par exemple) :
image

A mon avis il ne faut rien toucher dans le core parce que si l’évaluation renvoi vide ça peut très bien convenir pour une commande de type string. C’est juste problématique dans le cas d’une info binaire finalement. Du coup je pense qu’il faut mieux le gérer dans le code du plugin, qu’en penses-tu ?

Mince oui, parti dans l’élan du truc j’en ai complètement oublié les cas d’event d’une chaine d’une caractère à vide :sweat_smile: :face_with_spiral_eyes:

Edit: Mais si ça doit être bon, ce n’est pas une chaîne vide qui est retourné mais aucune valeur du tout du coup event ne fonctionne pas car la fonction attend une valeur en argument

OK, allez on touche à rien coté core et je verrais avec le dev. pour faire un PR sur son plugin :slight_smile:

Bonne soirée :slight_smile:

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.