Erreur Unsupported operand types: float - string dans un fichier Symfony debian12/Php8

Bonjour, je teste mon plugin en Debian12. J’ai ces lignes de code :

 $formula = str_replace('#value#', $st, $formula);
 $print = (string) print_r( $st,true);
 log::add('wifilightV2','debug',"   eqlogic:".$eqLogic->getName());
 log::add('wifilightV2','debug',"    name:".$Cmd->getName());
 log::add('wifilightV2','debug',"          $formula :".$print);
 $st =(string)$st;
 $Cmd->event($st);

Le code a des « cast » car je pensais envoyer un type incorrect en php8.
Code qui génère ces logs (troncature car il y en a des centaines) :

[2024-09-17 00:37:29][DEBUG] :    eqlogic:6 Double Digital Meter 6
[2024-09-17 00:37:29][DEBUG] :     name:total_energy1_108_GET
[2024-09-17 00:37:29][DEBUG] :           274406/1000 :274.406
...
[2024-09-17 00:39:20][DEBUG] :     name:test_bit_21_GET
[2024-09-17 00:39:20][DEBUG] :           1 :1

[2024-09-17 00:39:20][DEBUG] :    eqlogic:Conso Climatisation
[2024-09-17 00:39:20][DEBUG] :     name:cur_voltage_20_GET
[2024-09-17 00:39:20][DEBUG] :           2303/10 :230.3
[2024-09-17 00:39:22][DEBUG] :    eqlogic:Conso Prises
[2024-09-17 00:39:22][DEBUG] :     name:cur_voltage_20_GET
[2024-09-17 00:39:22][DEBUG] :           2321/10 :232.1
[2024-09-17 00:39:22][DEBUG] :    eqlogic:Conso Prises
[2024-09-17 00:39:22][DEBUG] :     name:cur_power_19_GET
[2024-09-17 00:39:22][DEBUG] :           0/10 :0
...
[2024-09-17 00:39:57][DEBUG] :    eqlogic:6 Double Digital Meter 6
[2024-09-17 00:39:57][DEBUG] :     name:total_energy1_108_GET
[2024-09-17 00:39:57][DEBUG] :           274407/1000 :274.407
[2024-09-17 00:39:57][ERROR] : Erreur sur wifilightV2::daemonTuya() : TypeError Object (     
[message:protected] => Unsupported operand types: float - string     
[string:Error:private] =>      
[code:protected] => 0     
[file:protected] => /var/www/html/vendor/symfony/expression-language/Node/BinaryNode.php     
[line:protected] => 149     
[trace:Error:private] => Array         (             
	[0] => Array                 (                     [file] => /var/www/html/vendor/symfony/expression-language/Node/BinaryNode.php                     [line] => 95                     [function] => evaluate                     [class] => Symfony\Component\ExpressionLanguage\Node\BinaryNode                     [type] => ->                 )              
	[1] => Array                 (                     [file] => /var/www/html/vendor/symfony/expression-language/ExpressionLanguage.php                     [line] => 67                     [function] => evaluate                     [class] => Symfony\Component\ExpressionLanguage\Node\BinaryNode                     [type] => ->                 )              
	[2] => Array                 (                     [file] => /var/www/html/core/php/utils.inc.php                     [line] => 1014                     [function] => evaluate                     [class] => Symfony\Component\ExpressionLanguage\ExpressionLanguage                     [type] => ->                 )              
	[3] => Array                 (                     [file] => /var/www/html/core/class/jeedom.class.php                     [line] => 1416                     [function] => evaluate                 )              
	[4] => Array                 (                     [file] => /var/www/html/plugins/virtual/core/class/virtual.class.php                     [line] => 549                     [function] => evaluateExpression                     [class] => jeedom                     [type] => ::                 )              
	[5] => Array                 (                     [file] => /var/www/html/core/class/cmd.class.php                     [line] => 1917                     [function] => execute                     [class] => virtualCmd                     [type] => ->                 )              
	[6] => Array                 (                     [file] => /var/www/html/plugins/wifilightV2/core/class/wifilightV2.class.php                     [line] => 3731                     [function] => event                     [class] => cmd                     [type] => ->                 )              
	[7] => Array                 (                     [file] => /var/www/html/plugins/wifilightV2/core/class/wifilightV2.class.php                     [line] => 1050                     [function] => update                     [class] => wifilightV2                     [type] => ::                 )              
	[8] => Array                 (                     [file] => /var/www/html/core/php/jeeCron.php                     [line] => 87                     [function] => daemonTuya                     [class] => wifilightV2                     [type] => ::                 )          )      [previous:Error:private] =>  ) 

C’est toujours la mise à jour de la même commande :

[2024-09-17 00:39:57][DEBUG] :    eqlogic:6 Double Digital Meter 6
[2024-09-17 00:39:57][DEBUG] :     name:total_energy1_108_GET

qui provoque l’erreur. Mais avec $st =274.406 c’est ok et 274.407 donne l’erreur, ça ne dépend pas de la valeur qui est évaluée. Quand je relance le deamon, comme la valeur s’incrémente, l’erreur survient soit la 1ère fois soit la deuxième fois où cette commande info doit être mise à jour.
la ligne qui provoque l’erreur est donc dans :
/var/www/html/vendor/symfony/expression-language/Node/BinaryNode.php

                return $left - $right;

Je sèche complètement.
Merci pour votre aide.

Hello,

A ce que je vois dans les log, c’est plutôt un commande info du plugin virtual qui pose problème.
Tu doit certainement utiliser une commande de ton plugin dans un virtuel de type virtualaction avec un calcul de soustraction.

Merci pour ton retour mais pas de virtuel.
J’écris directement dans la commande d’un eqlogic créé par le plugin
Il y a bien une formule, j’ai ajouté la ligne de code evaluate et c’est une division.
de plus souvent après redémarrage du plugin ça fonctionne mais pas la 2ème fois.

J’ai nettoyé la base de données

Bonjour,

Tu peux donner absolument tous les détails de cette commande STP ?

Bonjour,

Ça ressemble à ce que j’ai dis ici : Erreur de calcul dans un scénario - #6 par Bison

Oui mais l’event met a jour toutes autres commandes qui utilise son id, et d’après tes log c’est cette info virtuel qui pose le soucis, et ce soucis est très certainement ce que cite @Bison

Je vous remercie pour vos retours et je regarde ce soir.

Merci de m’avoir mis sur la piste du virtuel.
En fait ce n’est pas une erreur d’arrondi mais ce code dans un virtuel

(#[000Test][6 Double Digital Meter 6][total_energy1_108_GET]#-variable(ConsoStudioRAZn0))*0.25

Soustraction qui correspond bien à la ligne d’erreur dans Symphony

return $left - $right;

En fait cela fait une opération entre string et float.

C’est tordu mais cela va faire beaucoup de soucis dans les scénarios en php8.

(#[000Test][6 Double Digital Meter 6][total_energy1_108_GET]#-(float)variable(ConsoStudioRAZn0))*0.25

Le cast résout le souci.

C’est effectivement un soucis qui a déja été remonté a Loic il me semble, il faudra certainement faire plus de contrôle de typage, et d’évaluer la variable comme par exemple is_numeric avant d’en extraire le resultat , et l’user devra certainement aussi être attentif lors de l’utilisation de certaines infos…

1 « J'aime »

correctif,
le cast ne fonctionne pas dans un virtuel, il faut faire :

(#[000Test][6 Double Digital Meter 6][total_energy1_108_GET]#-floatval(variable(ConsoStudioRAZn0)))*0.25