Unsupported operand types: int + string

Bonjour,

J’ai remarqué que depuis quelques jours (j’ai effacé mes logs avant de déterminer depuis quand), j’ai cette erreur avec le plugin script en milliers d’exemplaires (au moins une par minute puisque le script tourne toutes les minutes):
Unsupported operand types: int + string

Ce genre d’erreur n’est pas inconnu sur le forum mais je n’ai rien trouvé qui m’aidait. Je sais exactement quel objet en est la cause, mais en créant un nouvel objet similaire, j’arrive au même résultat.

Un peu d’info sur ma config:

  • J’utilise la version Docker sur un processeur ARM
  • C’est la version 4.4.17 qui est installée
  • L’erreur provient du plugin script qui télécharge un JSON depuis un compteur d’énergie:

Et le log correspondant:

0456|[2024-09-13 19:04:07] DEBUG  : Mise à jour des valeurs pour : [Énergie][P1meter]
0457|[2024-09-13 19:04:07] DEBUG  : tags : total_power_import_t1_kwh
0458|[2024-09-13 19:04:07] DEBUG  : json : {"wifi_ssid":"XXXXXXXX","wifi_strength":100,"smr_version":50,"meter_model":"Fluvius 253769484_A","unique_id":"XXXXXXXX","active_tariff":1,"total_power_import_kwh":13665.118,"total_power_import_t1_kwh":6518.224,"total_power_import_t2_kwh":7146.894,"total_power_export_kwh":10819.026,"total_power_export_t1_kwh":8000.754,"total_power_export_t2_kwh":2818.272,"active_power_w":1180,"active_power_l1_w":121,"active_power_l2_w":815,"active_power_l3_w":242,"active_voltage_l1_v":232.3,"active_voltage_l2_v":232.2,"active_voltage_l3_v":232.7,"active_current_l1_a":1.09,"active_current_l2_a":3.9,"active_current_l3_a":1.62,"active_power_average_w":709,"montly_power_peak_w":8237,"montly_power_peak_timestamp":240909191500,"external":[]}
0459|[2024-09-13 19:04:07] DEBUG  : tag : total_power_import_t1_kwh
0460|[2024-09-13 19:04:07] DEBUG  : json : 6518.224
0461|[2024-09-13 19:04:07] ERROR  : Erreur sur script::cronUpdate() : Unsupported operand types: int + string

Petite finesse, il y a une formule sur la valeur (mais le résultat est le même avec ou sans la formule):

Toute aide serait appréciée :slightly_smiling_face:

Bonjour
C’est du à Debian 12 le plugin est pas tout à fait compatible. Malheureusement la version 4.4 de jeedom me permet pas un début facile sur ces soucis. Il faudra attendre le core 4.5 bien le mettre en debug et la j’aurais la ligne du soucis et pourrais corriger

1 « J'aime »

même souci ici, j’ai mis à jour vers Debian 12 (et donc PHP8?) pour être tranquille quelques temps, mais j’ai quelques effets de bord sur plusieurs plugins dont celui là.

Bonjour
Tout à fait normal Debian 12 n’est pas encore supporté et même réponse faudra attendre jeedom 4.5 pour que j’ai précisément la ligne d’erreur et que je puisse corriger

J’ai reproduis ce que fais le module script sur base d’un scénario et d’un code bloc. Voici les stacktraces que j’obtiens:

TypeError: Unsupported operand types: int - string in /var/www/html/vendor/symfony/expression-language/Node/BinaryNode.php:149 
Stack trace: 
#0 /var/www/html/vendor/symfony/expression-language/Node/BinaryNode.php(95): Symfony\Component\ExpressionLanguage\Node\BinaryNode->evaluate() 
#1 /var/www/html/vendor/symfony/expression-language/Node/BinaryNode.php(95): Symfony\Component\ExpressionLanguage\Node\BinaryNode->evaluate() 
#2 /var/www/html/vendor/symfony/expression-language/Node/BinaryNode.php(95): Symfony\Component\ExpressionLanguage\Node\BinaryNode->evaluate() 
#3 /var/www/html/vendor/symfony/expression-language/Node/BinaryNode.php(95): Symfony\Component\ExpressionLanguage\Node\BinaryNode->evaluate() 
#4 /var/www/html/vendor/symfony/expression-language/Node/BinaryNode.php(95): Symfony\Component\ExpressionLanguage\Node\BinaryNode->evaluate() 
#5 /var/www/html/vendor/symfony/expression-language/Node/BinaryNode.php(95): Symfony\Component\ExpressionLanguage\Node\BinaryNode->evaluate() 
#6 /var/www/html/vendor/symfony/expression-language/Node/BinaryNode.php(95): Symfony\Component\ExpressionLanguage\Node\BinaryNode->evaluate() 
#7 /var/www/html/vendor/symfony/expression-language/ExpressionLanguage.php(67): Symfony\Component\ExpressionLanguage\Node\BinaryNode->evaluate() 
#8 /var/www/html/core/php/utils.inc.php(1014): Symfony\Component\ExpressionLanguage\ExpressionLanguage->evaluate() 
#9 /var/www/html/core/class/jeedom.class.php(1416): evaluate() 
#10 /var/www/html/plugins/virtual/core/class/virtual.class.php(549): jeedom::evaluateExpression() 
#11 /var/www/html/core/class/cmd.class.php(1917): virtualCmd->execute() 
#12 /var/www/html/core/class/scenarioExpression.class.php(1987) : eval()'d code(7): cmd->event() 
#13 /var/www/html/core/class/scenarioExpression.class.php(1987) : eval()'d code(57): storeData() 
#14 /var/www/html/core/class/scenarioExpression.class.php(1987): eval() 
#15 /var/www/html/core/class/scenarioSubElement.class.php(74): scenarioExpression->execute() 
#16 /var/www/html/core/class/scenarioElement.class.php(196): scenarioSubElement->execute() 
#17 /var/www/html/core/class/scenario.class.php(949): scenarioElement->execute() 
#18 /var/www/html/core/php/jeeScenario.php(56): scenario->execute() 
#19 {main}
TypeError: Unsupported operand types: string - string in /var/www/html/vendor/symfony/expression-language/Node/BinaryNode.php:149 
Stack trace: 
#0 /var/www/html/vendor/symfony/expression-language/Node/BinaryNode.php(95): Symfony\Component\ExpressionLanguage\Node\BinaryNode->evaluate() 
#1 /var/www/html/vendor/symfony/expression-language/Node/BinaryNode.php(95): Symfony\Component\ExpressionLanguage\Node\BinaryNode->evaluate() 
#2 /var/www/html/vendor/symfony/expression-language/Node/BinaryNode.php(95): Symfony\Component\ExpressionLanguage\Node\BinaryNode->evaluate() 
#3 /var/www/html/vendor/symfony/expression-language/Node/BinaryNode.php(95): Symfony\Component\ExpressionLanguage\Node\BinaryNode->evaluate() 
#4 /var/www/html/vendor/symfony/expression-language/Node/BinaryNode.php(95): Symfony\Component\ExpressionLanguage\Node\BinaryNode->evaluate() 
#5 /var/www/html/vendor/symfony/expression-language/Node/BinaryNode.php(95): Symfony\Component\ExpressionLanguage\Node\BinaryNode->evaluate() 
#6 /var/www/html/vendor/symfony/expression-language/Node/BinaryNode.php(95): Symfony\Component\ExpressionLanguage\Node\BinaryNode->evaluate() 
#7 /var/www/html/vendor/symfony/expression-language/ExpressionLanguage.php(67): Symfony\Component\ExpressionLanguage\Node\BinaryNode->evaluate() 
#8 /var/www/html/core/php/utils.inc.php(1014): Symfony\Component\ExpressionLanguage\ExpressionLanguage->evaluate() 
#9 /var/www/html/core/class/jeedom.class.php(1416): evaluate() 
#10 /var/www/html/plugins/virtual/core/class/virtual.class.php(549): jeedom::evaluateExpression() 
#11 /var/www/html/core/class/cmd.class.php(1917): virtualCmd->execute() 
#12 /var/www/html/core/class/scenarioExpression.class.php(1987) : eval()'d code(7): cmd->event() 
#13 /var/www/html/core/class/scenarioExpression.class.php(1987) : eval()'d code(57): storeData() 
#14 /var/www/html/core/class/scenarioExpression.class.php(1987): eval() 
#15 /var/www/html/core/class/scenarioSubElement.class.php(74): scenarioExpression->execute() 
#16 /var/www/html/core/class/scenarioElement.class.php(196): scenarioSubElement->execute() 
#17 /var/www/html/core/class/scenario.class.php(949): scenarioElement->execute() #18 /var/www/html/core/php/jeeScenario.php(56): scenario->execute() #19 {main}

Est-ce que ça aide ?

Ah, aussi à la ligne 147:

Exception: TypeError: Unsupported operand types: int + string in /var/www/html/vendor/symfony/expression-language/Node/BinaryNode.php:147 
Stack trace: 
#0 /var/www/html/vendor/symfony/expression-language/Node/BinaryNode.php(95): Symfony\Component\ExpressionLanguage\Node\BinaryNode->evaluate() 
#1 /var/www/html/vendor/symfony/expression-language/Node/BinaryNode.php(95): Symfony\Component\ExpressionLanguage\Node\BinaryNode->evaluate() 
#2 /var/www/html/vendor/symfony/expression-language/Node/BinaryNode.php(95): Symfony\Component\ExpressionLanguage\Node\BinaryNode->evaluate() 
#3 /var/www/html/vendor/symfony/expression-language/Node/BinaryNode.php(95): Symfony\Component\ExpressionLanguage\Node\BinaryNode->evaluate() 
#4 /var/www/html/vendor/symfony/expression-language/Node/BinaryNode.php(95): Symfony\Component\ExpressionLanguage\Node\BinaryNode->evaluate() 
#5 /var/www/html/vendor/symfony/expression-language/Node/BinaryNode.php(95): Symfony\Component\ExpressionLanguage\Node\BinaryNode->evaluate() 
#6 /var/www/html/vendor/symfony/expression-language/ExpressionLanguage.php(67): Symfony\Component\ExpressionLanguage\Node\BinaryNode->evaluate() 
#7 /var/www/html/core/php/utils.inc.php(1014): Symfony\Component\ExpressionLanguage\ExpressionLanguage->evaluate() 
#8 /var/www/html/core/class/jeedom.class.php(1416): evaluate() 
#9 /var/www/html/plugins/virtual/core/class/virtual.class.php(549): jeedom::evaluateExpression() 
#10 /var/www/html/core/class/cmd.class.php(1917): virtualCmd->execute() 
#11 /var/www/html/core/class/scenarioExpression.class.php(1987) : eval()'d code(7): cmd->event() 
#12 /var/www/html/core/class/scenarioExpression.class.php(1987) : eval()'d code(57): storeData() 
#13 /var/www/html/core/class/scenarioExpression.class.php(1987): eval() 
#14 /var/www/html/core/class/scenarioSubElement.class.php(74): scenarioExpression->execute() 
#15 /var/www/html/core/class/scenarioElement.class.php(196): scenarioSubElement->execute() 
#16 /var/www/html/core/class/scenario.class.php(949): scenarioElement->execute() 
#17 /var/www/html/core/php/jeeScenario.php(56): scenario->execute() 
#18 {main}

Pas vraiment là à mon avis c’est plus un soucis dans tes calculs ou tu as une chaîne de caractères au lieu d’un nombre.

On touche à la limite de mes compétences en PHP, mais j’ai l’impression que l’appel à floatval devrait m’en prémunir, non?

function storeData($scenario, $jsonData, $dataName, $cmdId, $factor = 1) {
  try {
    $data = floatval($jsonData[$dataName]);
    $data = floatval($data * $factor);
    cmd::byId($cmdId)->event($data);
  } catch (Exception $ex) {
    $scenario->setLog("Error saving data: $ex");
  } catch (TypeError $te) {
    $scenario->setLog("Error saving data: $te");
  } 
}

$scenario->setLog("Downloading value from P1 meter");

$data = file_get_contents("http://192.168.0.10/api/v1/data");

$jsonData = json_decode($data, true);
if (is_null($jsonData)) {
  $scenario->setLog("Failed to download data from P1 meter");
  return;
}

if (sizeof($jsonData) == 0){
  $scenario->setLog("No data in received JSON");
  return;
}

storeData($scenario, $jsonData, 'total_power_export_t1_kwh', 7647, 1000);
storeData($scenario, $jsonData, 'total_power_export_t2_kwh', 7648, 1000);
storeData($scenario, $jsonData, 'total_power_import_t1_kwh', 7646, 1000);
storeData($scenario, $jsonData, 'total_power_import_t2_kwh', 7642, 1000);
storeData($scenario, $jsonData, 'active_power_l1_w', 7650);
storeData($scenario, $jsonData, 'active_power_w', 7649);
storeData($scenario, $jsonData, 'active_power_l2_w', 7651);
storeData($scenario, $jsonData, 'active_power_l3_w', 7652);

Je sais pas trop la faire du support sur du code comme ça je sais pas trop faire. Faut que tu mettes du débug partout pour voir où le typage va pas

La ligne qui pose problème est assez claire (ligne #11 ou #12 dans les stacktraces):

cmd::byId($cmdId)->event($data);

D’ailleurs, j’ai toujours la stacktrace dans mes logs si je ne garde que cette ligne dans le try-catch et si je met directement le floatval dans l’appel (ou intval d’ailleurs).

  try {
    cmd::byId($cmdId)->event(floatval($data));
  } catch (TypeError $te) {
    $scenario->setLog("Error saving data: $te");
  } 

Par contre, je crois que j’ai trouvé mon problème. En regardant de plus près les stacktraces, je vois apparaître virtual.class.php. Quand je désactive les objects virtuels qui dépendent des valeurs mises à jour, je n’ai plus de problème. Moi qui pensait que les objets virtuels n’étaient mis à jour que sur base d’une expression cron, il semble que je me sois trompé.

Non non jeedom détecte les commandes dépendantes et peut mettre à jour les commandes virtuel.

1 « J'aime »

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