Hello,
Comme certains semblent joueurs, je vous propose un petit jeux sur les soucis liés aux expressions.
Moteur d’expression de Jeedom : The ExpressionLanguage Component (Symfony Docs)
Github : https://github.com/symfony/symfony/tree/5.x/src/Symfony/Component/ExpressionLanguage
Fichiers Core : \vendor\symfony\expression-language
La fonction du Core utilisée est : core/php/utils.inc.php function evaluate()
Cette fonction intervient lors d’un scénario execute() et d’un test dans le testeur d’expression par exemple. Avant cela, l’expression passe par scenarioExpression::setTags() qui s’occupe des tag() variable() etc et par jeedom::fromHumanReadable() pour transformer les #macommand# en id puis en valeur.
Puis enfin le evaluate() de symfony. C’est çà qu’on va tester ici avec un simple scénario et un bloc code, en injectant directement une expression dans Symfony pour voir ce que çà donne.
Scenario de test, bloc code:
//load symfony expression engine:
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
//Core function calling symfony, no core parsing (tag, variable etc won't work):
//Source Core code in core/php/utils.inc.php function evaluate()
function testExpression($expr) {
global $scenario;
$expresser = new ExpressionLanguage();
try {
$result = $expresser->evaluate($expr);
return $result;
} catch (Exception $e) {
$scenario->setLog('First try ERROR: '.$e->getMessage());
}
try {
$result = $expresser->evaluate(str_replace('""', '"', $expr));
return $result;
} catch (Exception $e) {
$scenario->setLog('Second try ERROR: '.$e->getMessage());
}
return $exp;
}
//test:
$scenario->setLog(testExpression('1E-2'));
$scenario->setLog(testExpression('floatval(2.0E-6)+1'));
D’ailleurs vous allez voir que le floatval ici ne fonctionne pas. C’est parce que le core fait un pre-parsing pour que des choses comme çà fonctionne quand même.
Vous pouvez aussi mettre d’autres librairies et les tester comme çà. Également dans utils.inc.php ajouter des log de debug pour comprendre ce qu’il se passe.
Perso, je ne maitrise pas du tout ce sujet. Un exemple que je ne comprend pas, ici ils mettent que les exponent sont supportés, alors pourquoi çà passe pas, j’en sais rien …
Mais si çà peux faire avancer le schimblick(Jeedom), tout le monde en sortira gagnant. Je suis certains que pas mal de brutes en php trainent par ici, si çà peux les intéresser pour remonter dans les fonctions du core et améliorer le moteur
D’ailleurs avant de modifier des trucs, ce serait bien, peu-être, de relever tout les cas qui posent problème. Ce qui pourrait ensuite servir de test de validation à d’éventuelles améliorations.
PS: je supprimerai unilatéralement les post de personnes non constructives qui répondent juste pour râler et critiquer. Je souhaite tirer le débat vers le haut, et ceci ne m’intéresse pas, comme nombre d’entre vous
Soucis identifiés
exp : donne / devrait donner
- variable(sunset) * 1E+2 → OK SF5.1
- 2E-6 + 1 → OK SF5.1
- 1e-2 → OK SF5.1
- #mois#(-1.15#mois#+15)+5 : 19.40013 / 19.4 ( 12*(-1.15*12+15)+5 in symfony 2.6 OK)
- strlen(‹ to,to ›) : ‹ › / 5
- substr(‹ toto et titi ›, 0, 8) : toto && / toto et
- pow(2, (3+2)) : pow(2, (3+2)) / 32