[2022-07-08 23:17:12][SCENARIO] **-- Start :** Scenario lance manuellement.
[2022-07-08 23:17:13][SCENARIO] - Exécution du sous-élément de type [action] : action
[2022-07-08 23:17:13][SCENARIO] Affectation de la variable Flow_sensor => -0.5 = -0.5
[2022-07-08 23:17:13][SCENARIO] Affectation de la variable Leaving_water_temp_before_BUH => 24.6 = 24.6
[2022-07-08 23:17:13][SCENARIO] Affectation de la variable Inlet_water_temp => 22 = 22
[2022-07-08 23:17:13][SCENARIO] Affectation de la variable INV_primary_current => 0 = 0
[2022-07-08 23:17:13][SCENARIO] Affectation de la variable Voltage => 32 = 32
[2022-07-08 23:17:13][SCENARIO] - Exécution du sous-élément de type [action] : code
[2022-07-08 23:17:13][SCENARIO] Exécution d'un bloc code
[2022-07-08 23:17:13][SCENARIO] - Exécution du sous-élément de type [action] : action
[2022-07-08 23:17:13][SCENARIO] Pause de 2 seconde(s)
[2022-07-08 23:17:15][SCENARIO] Affectation de la variable COP => =
[2022-07-08 23:17:15][SCENARIO] Fin correcte du scénario
J’avoue que je ne sais pas trop à quoi peut bien servir le $value dans les getData.
$Var = $scenario->getData('laVariable');
Ça suffit
Et le code marche probablement (en mettant la bonne valeur dans COP) mais ta dernière ligne de scénario écrase le contenu de COP puisque tu demandes de définir COP sans aucune valeur. Retire cette action.
Et sinon si tu ne souhaites pas conserver les variables en dehors de ce scénario (sauf COP), utilise plutôt des tag.
Bonjour
La mauvaise nouvelle :
Je ne code pas / je sais pas (encore… ) coder mais…
La bonne nouvelle :
Pas besoin dans Jeedom pour faire un simple calcul !
Dans ton scénario, tu vas créer des tags :
D = mon capteur de debit d’eau
Te = Température d’entrée
Ts = T sortie
P = puissance moteur elec
Puis tu mets le calcul dans une variable
Cop = (tag(Ts)-tag(Te)) x tag(D)…… etc
(Précisons qu’il est évidemment possible de ne pas passer par les tag, de faire tout le calcul dans la variable, mais moins facile a lire)
Tu crée une info virtuel = variable(Cop)
Et tu obtiens l’histoire de ton cop.
Bref, ça répond pas vraiment à ta question, mais te permets d’arriver à tes fins.
Bonne journée !
[2022-07-09 09:04:14][SCENARIO] -- Start : Scenario lance manuellement.
[2022-07-09 09:04:14][SCENARIO] - Exécution du sous-élément de type [action] : action
[2022-07-09 09:04:14][SCENARIO] Affectation de la variable Flow_sensor => -0.5 = -0.5
[2022-07-09 09:04:14][SCENARIO] Affectation de la variable Leaving_water_temp_before_BUH => 28.7 = 28.7
[2022-07-09 09:04:14][SCENARIO] Affectation de la variable Inlet_water_temp => 28.6 = 28.6
[2022-07-09 09:04:14][SCENARIO] Affectation de la variable INV_primary_current => 0 = 0
[2022-07-09 09:04:14][SCENARIO] Affectation de la variable Voltage => 32 = 32
[2022-07-09 09:04:15][SCENARIO] - Exécution du sous-élément de type [action] : code
[2022-07-09 09:04:15][SCENARIO] Exécution d'un bloc code
[2022-07-09 09:04:15][SCENARIO] Le résultat de la variable COPCOP donne > -INF
[2022-07-09 09:04:15][SCENARIO] - Exécution du sous-élément de type [action] : action
[2022-07-09 09:04:15][SCENARIO] Affectation de la variable COP => =
[2022-07-09 09:04:15][SCENARIO] Fin correcte du scénario
Fait une petite recherche, mais je crois que oui.
J’ai pas mal de fois vu passer des codes avec au debut : un bout de code pour appeler les tags dans le bloc code, puis à la fin: un bout de code pour renvoyer les tag.
Je pense que la doc veux dire que c’est pas automatique.
Mais…. Je dis ça sans AUCUNE certitude
Ps écriture du calcul de la variable Cop / Résultat : écrit le dans un log, pour qu’il soit plis facile à lire, et avoir le détail du calcule dans tes log / se corriger plis facilement.
[2022-07-09 09:41:48][SCENARIO] -- Start : Scenario lance manuellement.
[2022-07-09 09:41:48][SCENARIO] - Exécution du sous-élément de type [action] : action
[2022-07-09 09:41:48][SCENARIO] Mise à jour du tag #D# => -0.5
[2022-07-09 09:41:48][SCENARIO] Mise à jour du tag #Ts# => 28.5
[2022-07-09 09:41:48][SCENARIO] Mise à jour du tag #Te# => 28.5
[2022-07-09 09:41:48][SCENARIO] Mise à jour du tag #A# => 0
[2022-07-09 09:41:48][SCENARIO] Mise à jour du tag #V# => 32
[2022-07-09 09:41:48][SCENARIO] Mise à jour du tag #P# => 0
[2022-07-09 09:41:48][SCENARIO] Too few arguments to function scenarioExpression::tag(), 1 passed in /var/www/html/core/class/scenarioExpression.class.php on line 1256 and at least 2 expected
[2022-07-09 09:41:48][SCENARIO] Fin correcte du scénario
[2022-07-09 09:47:35][SCENARIO] -- Start : Scenario lance manuellement.
[2022-07-09 09:47:35][SCENARIO] - Exécution du sous-élément de type [action] : action
[2022-07-09 09:47:35][SCENARIO] Mise à jour du tag #D# => -0.5
[2022-07-09 09:47:35][SCENARIO] Mise à jour du tag #Ts# => 28.6
[2022-07-09 09:47:35][SCENARIO] Mise à jour du tag #Te# => 28.5
[2022-07-09 09:47:35][SCENARIO] Mise à jour du tag #A# => 0
[2022-07-09 09:47:35][SCENARIO] Mise à jour du tag #V# => 32
[2022-07-09 09:47:35][SCENARIO] Mise à jour du tag #P# => 0
[2022-07-09 09:47:35][SCENARIO] Affectation de la variable COP => =
[2022-07-09 09:47:35][SCENARIO] - Exécution du sous-élément de type [action] : code
[2022-07-09 09:47:35][SCENARIO] Exécution d'un bloc code
[2022-07-09 09:47:35][SCENARIO] Unsupported operand types
[2022-07-09 09:47:35][SCENARIO] Fin correcte du scénario
$tags = $scenario->getTags(); // Récupération des tags dans un tableau
$D = $tags['#D#']; Récupère le tag D dans la variable PHP $D
$Ts = $tags['#Ts#'];
$Te = $tags['#Te#'];
$A = $tags['#A#'];
$V = $tags['#V#'];
$P = $tags['#P#'];
$COPCOP = ($D * 0.06 * 1.16 * ($Te - $Ts)) / (($A * $V) / 1000);
$scenario->setLog('Le résultat de la variable COPCOP donne '.$COPCOP);
$tags['#COPCOP#'] = $COPCOP; // On alimente le tableau des tags avec une nouvelle valeur venant de la variable PHP $COPCOP
$scenario->setTags($tags); // On repasse ce tableau pour exploitation dans le scénario si on en a besoin
Par exemple on pourrait imaginer enregistrer dans la variable MonCOPCOP le tag COPCOP :
Comme dit Henri tu n’as pas besoin de passer par un bloc code pour faire ces calculs
Attention à ce que contient les tags A et V car si l’un est à 0 alors tu aurais un $COPCOP avec une division par 0 ce qui est impossible et écrit ici dans l’un de tes logs : [2022-07-09 09:04:15][SCENARIO] Le résultat de la variable COPCOP donne > -INF
Après avoir lu quelques interrogations, voici mon retour et interprétations après lecture du code de Jeedom pour certains points
On peut bien sûr utiliser les tags dans un scénario (heureusement, je m’en sers tous les jours ). Je n’ai pas trouvé le texte de la doc de ta capture mais je pense que ça fait référence aux tags prédéfinis (https://doc.jeedom.com/fr_FR/core/4.2/scenario / Les tags : #seconde#, #hour#, … Les tags personnalisés sont acceptés et récupérables, modifiables sous la forme :
// Récupération des tags passés en paramètres.
$tags = $scenario->getTags();
$tags['#titreMessage#'] = "Un titre personnalisé";
$tags['#contenuMessage#'] = "Un message personnalisé";
// MAJ des tags avant exécution de la suite du scénario.
$scenario->setTags($tags);
Pour le getData() à plusieurs paramètres, le $value en 2ème paramètre n’est pas valide dans ton code en effet. Par contre, tu peux affecter une valeur par défaut (dans le cas où tu demandes à récupérer une variable qui n’existe pas). Ca correspond au variable(monNomDeVariable, valeurPardéfaut) d’une action de scénario Il faut alors l’écrire de la façon suivante (à valider, je n’ai pas testé, juste regardé le core de Jeedom) :
Dans un bloc code : $scenario->getData("monNomDeVariable", false, 10);
Dans une action de scénario : variable(monNomDeVariable,10) Renvoie la valeur de la variable monNomDeVariable ou 10 si elle est vide ou n’existe pas
La valeur false doit à priori permettre de déclarer des variables pour tout Jeedom (En mettant true, la variable sera propre au scénario : l’équivalent d’un tag du scénario mais qui dure plus que la durée de vie de l’exécution du scénario)
Mais pourquoi récup des commandes info, les passer dans des tags/variables, faire un bloc code, faire le calcul en PHP et renvoyer le vers Jeedom dans un tag/var ???
La méthode classique est de faire le calcul directement en mode bloc et de mettre ça dans un log ou d’envoyer un évent vers une commande info virtuelle…
(#[RdC][Daikin ESP][Capteur de débit ]# * 0.06 * 1.16 * (#[RdC][Daikin ESP][Temp. retour d eau]# - #[RdC][Daikin ESP][Temp. Sorti echangeur à plaque]#)) / ((#[RdC][Daikin ESP][Courant primaire INV]# * #[RdC][Daikin ESP][Tension (phase N) (V)]#) / 1000)
En plus, l’info virtuelle se met à jour toute seul à chaque changement d’une des commande info de la PAC et sinon tu peux programmer son rafraichissement toutes les x minutes directement sur le virtuel.
C’est parce que le monsieur il voulait faire un bloc code alors dans l’idée moi je commence à l’aider à faire ce qu’il veut et ça pourra toujours lui servir plus tard quand ça sera vraiment nécessaire
Maintenant clairement il y a mieux à faire et merci d’avoir pris le temps de lui montrer que l’on pouvait aussi faire ça directement dans une commande info virtuelle
Oui, dans HA, il faut tout de suite faire du code pour arriver à quelque chose.
C’est top d’être au plus proche de la machine, mais la force de Jeedom c’est qu’il n’y a pas besoin
En passant, si le but c’est de toute faire sur un scenario en bloc code, la façon Jeedom (sans tag/var) :
$D = cmd::byString('#[RdC][Daikin ESP][Capteur de débit ]#')->execCmd();
$Ts = cmd::byString('#[RdC][Daikin ESP][Temp. Sorti echangeur à plaque]#')->execCmd();
$Te = cmd::byString('#[RdC][Daikin ESP][Temp. retour d eau]#')->execCmd();
$A = cmd::byString('#[RdC][Daikin ESP][Courant primaire INV]#')->execCmd();
$V = cmd::byString('#[RdC][Daikin ESP][Tension (phase N) (V)]#')->execCmd();
$COPCOP = ($D * 0.06 * 1.16 * ($Te - $Ts)) / (($A * $V) / 1000);
$scenario->setLog($message = "Le résultat de la variable COPCOP donne > $COPCOP");
cmd::byString('#[RdC][Daikin Virtuel][COP]#')->event($COPCOP);
(Et il est évidement possible de replacer cmd::byString() par cmd::byId() avec les numéros de commande plutôt que les noms pour éviter d’être dépendant du nom des commandes dans le bloc code.)
Clairement énormément de façons de faire avec Jeedom !
Et au final, en partant d’une erreur dans son scénario, j’ai découvert une fonctionnalité des variables de scénarios différentes des tags