Calcul du COP via bloc code

Bonjour à tous,

Je souhaiterais m’inspirer de bout de code venant de HA pour calculer le COP de ma PAC Daikin

Voici le bout de code HA

      espaltherma_cop:
        friendly_name: "COP"
        unit_of_measurement: 'COP'
        value_template: "{% if is_state_attr('sensor.althermasensors','Operation Mode', 'Heating') and is_state_attr('sensor.althermasensors','Freeze Protection', 'OFF')  %} 
{{ 
  ((state_attr('sensor.althermasensors','Flow sensor (l/min)')| float * 0.06 * 1.16 * (state_attr('sensor.althermasensors','Leaving water temp. before BUH (R1T)') | float - state_attr('sensor.althermasensors','Inlet water temp.(R4T)')|float) )
    /
  (state_attr('sensor.althermasensors','INV primary current (A)') | float * state_attr('sensor.althermasensors','Voltage (N-phase) (V)')|float / 1000))
  |round(2)
}}
{% else %} 0 {%endif%}"```

N’étant pas du tout dev je me suis grandement aidé de Google mais la je coince

Mon bloc code est construit comme ceci

$Flow_sensor = $scenario->getData("Flow_sensor", $value);
$Leaving_water_temp_before_BUH = $scenario->getData("Leaving_water_temp_before_BUH", $value);
$Inlet_water_temp = $scenario->getData("Inlet_water_temp", $value);
$INV_primary_current= $scenario->getData("INV_primary_current", $value);
$Voltage = $scenario->getData("Voltage", $value);

$COPCOP = ($Flow_sensor * 0.06 * 1.16 * ($Leaving_water_temp_before_BUH - $Inlet_water_temp)) / ($INV_primary_current * $Voltage / 1000);
  
$scenario->setData("COP", $COPCOP);

J’obtient comme log

[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

Le scénario en lui meme est comme ceci

La variable COP ne ce créer pas.

Merci pour votre aide

Bonsoir,

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.

Enfin pour bien apprendre à utiliser ça : Jeedom v4 | Petits codes entre amis | Jeedom by KiboOst

Bonjour
La mauvaise nouvelle :
Je ne code pas / je sais pas (encore… :slight_smile: ) 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.
:slight_smile:
Bonne journée !

Salut,

Les tag ne son pas utilisable en bloc code d’apres la doc Jeedom
image

Merci pour ton lien :slight_smile:

J’obtiens bien à resultat après modification du code pour avoir un « log »
Ca donne ceci

Code

$Flow_sensor = $scenario->getData("Flow_sensor");
$Leaving_water_temp_before_BUH = $scenario->getData("Leaving_water_temp_before_BUH");
$Inlet_water_temp = $scenario->getData("Inlet_water_temp");
$INV_primary_current= $scenario->getData("INV_primary_current");
$Voltage = $scenario->getData("Voltage");

$COPCOP = ($Flow_sensor * 0.06 * 1.16 * ($Leaving_water_temp_before_BUH - $Inlet_water_temp)) / (($INV_primary_current * $Voltage) / 1000);

$scenario->setLog($message = "Le résultat de la variable COPCOP donne > $COPCOP");

$scenario->setData("COP",$COPCOP);

Log

[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

Salut,

Merci !

Je vais essayer de ce pas ta solution en espérant que cela fonctionne :slight_smile:

1 « J'aime »

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.

Bon je dois louper un truc car ca passe en erreur

[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

quand je passe la meme chose en bloc code j’obtien ceci

$D= $scenario->getTags("D");
$Ts = $scenario->getTags("Ts");
$Te = $scenario->getTags("Te");
$A= $scenario->getTags("A");
$V = $scenario->getTags("V");
$P = $scenario->getTags("P");

//$COPCOP = ($Flow_sensor * 0.06 * 1.16 * ($Inlet_water_temp - $Leaving_water_temp_before_BUH)) / (($INV_primary_current * $Voltage) / 1000);
//tag(D)*0.06*1.16*(tag(Te)-Tag(Ts))/(tag(A)*tag(V))

$COPCOP = ($D * 0.06 * 1.16 * ($Te - $Ts)) / (($A * $V) / 1000);

$scenario->setLog($message = "Le résultat de la variable COPCOP donne > $COPCOP");


$scenario->setData("COP",$COPCOP);

Log :

[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

Bonjour,

Ce n’est pas la même façon de faire avec les tags. L’exemple sur le site était :

$tags = $scenario->getTags();
$tags['#monTag#'] = 'Hello';
$scenario->setTags($tags);

Donc il faut faire :

$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

image

Salut,

Après avoir lu quelques interrogations, voici mon retour et interprétations après lecture du code de Jeedom pour certains points :slight_smile:

  • On peut bien sûr utiliser les tags dans un scénario (heureusement, je m’en sers tous les jours :wink: ). 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)

Alors, j’avoue que je n’ai pas tout lu…

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…

Mais du coup, pourquoi ne pas faire directement une commande info numérique virtuelle ?!
Genre :

Avec la formule :

(#[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.

4 « J'aime »

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 :wink:

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 :grinning_face_with_smiling_eyes:

3 « J'aime »

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 :stuck_out_tongue:

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.)

cf old forum : [Tuto] Petites Commandes PHP utiles en Scénario Jeedom - Forum Communauté Jeedom

2 « J'aime »

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 :crazy_face:

C’était si simple mais j’avais du faire une faute de frappe du coup je pensais que ce n’était pas réalisable.

Du coup cela m’aura permis de me prendre la tete avec du code que j’aimerais tellement savoir pratiquer :slight_smile:

Un grand merci a tous les intervenants.

Je n’ai plus cas finir la mise en forme de tout ca !

Merci encore

1 « J'aime »

Oui, je pense que tu as un espace de trop dans la commande :
#[RdC][Daikin ESP][Capteur de débit ]#

J’essaye de garder des noms de commande courts et sans espace ou accent, par exemple, j’appellerai sobrement cette commande : #[RdC][Daikin][Debit]#

Merci pour la solution en passant :heart:

Yes mais c’est quand même mieux d’y aller petit à petit et de découvrir au fur et à mesure les possibilités :wink:

Parce que sinon on pouvait aussi faire un plugin pour ça :rofl:

Et avec Jeedom, il y a 1000 façon de tromper 1000 scenarios :crazy_face:

2 « J'aime »

J’ai encore appris des choses ce soir!

A qu’est ce que je suis content :face_vomiting:.

:joy::joy:

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.