[Expression] ! pour les connaisseurs!

non, le floatval() est évalué par le core avant symfony, par le setTags(). C’est bien pour çà que çà marche justement.

Je me suis sans doute mal exprimé mais ta remarque est très intéressante…

1/ floatval() est une fonction native PHP et il est donc inutile de l’ajouter comme fonction custom au testeur d’expression de symfony. Tout le monde est d’accord sur ce point ?
2/ Pourquoi faire évaluer par le core Jeedom les fonctions natives PHP en place de Symfony ?

1 « J'aime »

oui il faut faire faire le max de trucs par php. Les seules choses à traiter c’est

  • Les fonctions jeedom (stats etc)
  • Les tag/id à remplacer

Et s’il faut corriger les . et les , il vaux mieux remonter à la source que de pather sauvagement)

Ça marche déjà dans le testeur d’expression:
image

Sauf que par symfony :
The function "floatval" does not exist around position 1 for expression floatval(2.222)`

J’arrive à corriger des trucs mais çà en pète d’autres.

Mais bon si c’était simple ce serait déjà corrigé depuis longtemps …

Tu as ce message car jeedom donne une chaîne de caractère à symfony.
Dommage que tout soit chaîne de caractère pour jeedom comme j’ai cru comprendre dans un de tes précédents messages.

KO pour symfony

testExpression('floatval(2.0E-6)+1')

OK pour symfony

testExpression(floatval(2.0E-6)+1)

Non car en symfony v5.1 ce n’est pas un problème.

Et comment veut tu envoyer çà autrement qu’avec une chaine de caractère à un parser ? Si tu lui envoi déjà le nombre, donc la réponse, çà sert plus à rien de lui envoyer :thinking:

Tu dis que tu as une erreur quand tu utilises floatval dans ton précédent message puis que ce n’est plus un problème… bref pas tout compris :wink:

Etant très loin d’être un expert du core Jeedom et de toutes ses interactions, je pense donc n’être d’aucune aide ! Très bonne continuation et bon courage

Bonne soirée

Je dis que envoyer une chaine à symfony v5.6 n’est pas un problème, çà l’est en symfany v2.6 qui est celui embarqué avec le core.

Et c’était une vrai question …

excellente idée, je crois que c’est la meilleure solution :slight_smile: ajouter les fonctions du core et les qq fonctions natives php dont on aura besoin et hop le tour est joué!

Vas y fait le PR :rofl: J’ai absolument aucune idée de comment faire. Sérieux. :beers:

pas possible avec la version actuelle de symfony (je sais pas laquelle j’ai avec jeedom v4.0)

[2020-12-06 23:27:52][SCENARIO] - ERREUR PHP: Call to undefined method Symfony\Component\ExpressionLanguage\ExpressionFunction::fromPhp() à la ligne 31 !

Du coup, quelle versionde symfony pour la v4.1 ? il nous faut au moins la v5 sinon on va pas pouvoir le faire…

5.1 indique Kiboost un peu plus haut

La 4.1 a le même symfony que la 4.0 et ne bougera pas elle est freeze pour passage en stable. Et vue l’importance du truc va falloir une batterie de test pour s’assurer que ça fonctionne et que c’est bonne piste. C’est pas du bugfix la, c’est une réécriture complète de tout le moteur d’expression.

Sur mon alpha j’ai changé le répertoire vendor/symfony/components/expression… avec celui du GitHub de symfony. Faudrai récupérer la 5.2 voir la 5.3 pour tester.
Par contre il faut s’assurer avant que c’est faisable en stable donc que ça tourne sur php5. Stretch c quel php ? C’est tout le moteur d’expression de Jeedom donc scénarios etc faut que ça tourne partout. Peu être mettre à jour aussi les répertoires polyfill et qql autres. Je sais pas encore une fois je ne connais pas du tout symfony.

PS : en regardant les docs et github, symfony et ses components ne sont pas forcément dans les mêmes versions. expression-language est bien en 5.1

Bonjour,
Juste une question puisque je n’ai pas assez le niveau pour aider.
Dans un virtuel et en utilisant une expression ternaire, est-ce que c’est à cause de cela que je ne suis pas arrivé à lui faire un :
Si etat = 1 alors valeur de température
Sinon alors « — »

J’ai eu beau tenté plein d’écriture je n’ai pas trouvé la façon pour que ça ne bug pas.
J’ai fini pas construire une fonction personnalisé.

Désolé si c’est un peu HS.

Hello
Stretch c’est du php 7.0
https://wiki.debian.org/PHP

Hello
Comme pour les autres, sans exemple difficile de voir si c’est une coquille dans ta syntaxe ou un truc plus grave.
Personnellement j’ai des ternaires dans des scénario qui marchent… Pas utilisés ailleurs

Pas la peine de tester, il suffit de voir dans le composer.json du github de expression-language pour voir la version de php minimale requise, c’est php 7.2
Par contre j’ai testé en local avec succès :slight_smile:
Je suis sous docker avec une version buster-php7.3 j’ai donc juste modifié le composer.json à la racine de jeedom pour modifier les version du php et de symfony/expression-language, j’ai demandé 5.1 puis « composer update » pour mettre à jour les libs php. Et voila le résultat :

[2020-12-07 00:32:59][SCENARIO] 1E-2
[2020-12-07 00:32:59][SCENARIO] 1.000002

//load symfony expression engine:
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
use Symfony\Component\ExpressionLanguage\ExpressionFunction;
use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface;

class jeedomExpressionLanguageProvider implements ExpressionFunctionProviderInterface
{
    public function getFunctions()
    {
        return [ExpressionFunction::fromPhp('floatval')];
    }
}

//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();
  $expresser->registerProvider(new jeedomExpressionLanguageProvider());
  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('2E-6')+1"));

Concrètement çà veux dire que çà peut marcher avec un php 5.1 ?
A mon avis le require 7.2 vient de symfony complet ?

Le floatval c’est pas le soucis je pense. çà marche actuellement car le core le gère avant l’appel de symfony.
Mais çà veux quand même dire qu’il parse les fonctions et les retrouve depuis php standard.

Les soucis viennent majoritairement, on dirait, d’ici : https://github.com/jeedom/core/blob/alpha/core/php/utils.inc.php#L946
Faudrait tester de squeezer çà (les tag variable et commandes sont déjà remplacé à ce niveau là) et passer direct dans symfony.

Dans un cas comme çà t’est toujours en php 7.3 non ? Page santé ?