[Expression] ! pour les connaisseurs!

Oui mais dans l’hypothèse ou il y a conflit ça peut aussi transformer un truc(arg1,arg2)
en un string qui n’est pas évaluable truc(arg1.arg2)
Mais bon comme je vois pas où on l’appelle non plus…

Ok, la fonction round de la class scenarioExpression est bien utilisée à la place de celle de php. Elle permet de corriger un bug justement, par contre on ne le voit pas car elle appelée dynamiquement par la fonction setTags(). if (method_exists(__CLASS__, $function))

C’est clair que c’est un peu complexe cette partie …

Le bug en question est surement rapport avec le fait que tous les champs de la config jeedom sont pas homogènes : certains sont de type texte qui prends . comme séparateur de la décimale. Et d’autres champs numériques qui du fait de la localisation prennent , (sujet déjà évoqué je sais plus où)

Et donc quand on appelle un round() au sens PHP, c’est celui de jeedom qui s’applique …

Par forcément çà permet de corriger un non spécialiste php qui écrirait un IF round(6,2) ou un retour d’API par exemple. Cela dit c’est accessoire par rapport au sujet je pense.

un nom ou un non ?

Oui, à condition quand même qu’il n’y ai pas d’autre surcharge de ce type ailleurs…
J’en ai pas vu cela dit

En fait le workaround floatval() ou intval() marche justement parcqu’il passe par l’évaluation du settag().

Mais à l’evaluate de symfony pourquoi il plante sur 2E-6 + 1 çà je comprend pas. Car du coup un intval() récupere l’évaluation avant le evaluate symfony donc çà marche, mais symfony devrait être capable de le gérer.

Il nous faudrait un spécialiste symfony là !

Typiquement sur ce sujet : Comment effectuer un calcul numérique dans un scénario?
Le problème ne vient pas de Jeedom mais de Symfony. Ou de son implémentation je sais pas.

Oui j’ai suivi le sujet…
Là je dirais comme ça que le 2E-6+1 il voit pas ça comme un nombre avec une puissance mais comme une chaine (forcément php ça type rien si on le force pas)
Donc faire une addition sur une chaine …

Oui mais justement symfony est sensé le gerer non ? The Expression Syntax (Symfony Docs)

Si l’argument est passé avec le type float ok… => exponential mais si on balance un string, ça risque d’être plus tendu (:sweat_smile: je devais la faire)

Arf, en python3 t’est plus embêté, y’a plus de string, c’est que des bytes …

En fait j’ai l’impression que le core gère déjà beaucoup plus de truc que symfony …

Faudrait relever des expressions comme le exponent qui ne passent pas et voir si c’est coté core ou symfony.

J’essayerai aussi avec la dernière version du github mais j’ai des doutes. Et apparemment c’est require php 7.2.5, ma smart de prod est en php7.0 donc on peux pas non plus mettre les dernières versions direct … Mais c’est dans le composer.json c’est pour docker çà non ??

Un bête env dans une VM avec php+symfony (la version de jeedom tant qu’à faire) ça permettrai de voir si ça traite bien l’exposant.
Si ça plante, pas c’est la m*** parce que symfony c’est pas léger à corriger
Si ça marche, c’est la m** aussi

Perso j’arrive pas croire vue la popularité de symfony , que cette partie soit buggée

Je ne connais pas du tout, et symfony ce n’est pas que l’expressionlanguage. Mais je vois dans le code qu’on peu setter des fonctions et passer pas mal de trucs avec le evaluate(), peu être un soucis sur l’implémentation. Faudrait qqlun qui connaisse bien et qui jette un œil, pour un habitué il doit pouvoir voir rapidement si un truc ne va pas. D’où le scenario et le bloc code qui balance direct dans symfony sans passer par jeedom, je comprend pas que çà ne marche pas !

ARG !!!

Une 4.1 stock : $scenario->setLog(testExpression('1E-2'));

[2020-12-06 17:01:57][SCENARIO] First try ERROR: Unexpected token « name » of value « E » around position 2 for expression 1E-2.
[2020-12-06 17:01:57][SCENARIO] Second try ERROR: Unexpected token « name » of value « E » around position 2 for expression 1E-2.

Mon alpha avec dernières lib à jour : $scenario->setLog(testExpression('1E-2'));

[2020-12-06 16:59:58][SCENARIO] 0.01

WTF ??

Par contre sur les deux, çà, çà passe toujours pas. Mais floatval() attend une string en effet …

$scenario->setLog(testExpression('floatval(2.0E-6)+1'));
$scenario->setLog(testExpression('round(2.222)'));

Bonsoir,

Je suis en 4.0.61 et le code suivant :

var_dump(testExpression(1E-2));
var_dump(testExpression(floatval(2.0E-6)+1));

me retourne le résultat suivant :

float(0.01)
float(1.000002)

Je ne suis pas un pro de symfony mais j’ai l’impression qu’il pose problème sur les expressions entre simple quote…

1 « J'aime »

Parce que tu le balance bien en nombre à symfony et pas en string. Mais quand çà vient du testeur ou de la db (d’une expression d’un scenario) c’est un string.

On est donc bien d’accord sur ce point :wink:

Je ne connais pas du tout les internes de Jeedom mais est-ce possible d’avoir le code suivant ?
Si oui, cela permet un cast automatique de ta string en nombre et le résultat sera alors cohérent

var_dump(testExpression('1e-2' + 0));
var_dump(testExpression(floatval('2.0E-6' + 0)+1));

[EDIT]
Je viens de faire le test directement dans le testeur d’expression de Jeedom et cela marche sans problème. Le résultat est conforme et j’obtiens bien des nombres

Requirement:

En l’état on peux pas upgrader Symfony sans mettre des milliers de Jeedom en carafe … :thinking:
Ou alors une version différente en fonction de la version de php.

Si tant est que çà résolve les soucis sans en créer d’autres …

Dans le cas d’une valorisation par calcul ça doit encore être différent… ça devrait même pas transformer le truc

ça peut être un point à tester sur la 4.2…
Y a du 7.4 à tester de toute façon

on est d’accord que exponential n’est pas un type qui existe en php … c’est une classe spécifique de symphony ? ou bien juste un ajout de jeedom ?
Ma question en gros, c’est quand on écrit cette chaine de caractère « 1E-2 » , qui l’interprète en exponential, est-ce php, symphony ou jeedom ?