Script calcul multi arguments

Bonjour,
Je cherche à faire un script pour garder en mémoire la conso totale des équipements shelly1 PM. Ne tenez pas compte du test , j’écrirais en entier quand j’aurai trouvé comment faire.
L’idée est de pouvoir passer 2 arguments au script php .
Voici mon script pour test d’après ce que j’ai compris dans les docs:

#!/usr/bin/env php
<?php


$argv[1]=$argv[1]+($argv[2]-$argv[1]);
?>

l’idée est d’utiliser une info virtuelle , et l’info de conso du shelly
quand je lance ma commande via un scénario

1ere question, peut on passer 2 arguments dans « message » ?
Autrement comment je peux faire ?

J’ai aussi de passer 2 arguments

Mais je ne sais pas comment le lancer dans un scénario pour lui passer mes 2 commandes.
merci

Tu as une raison particulière de passer par le plugin script plutôt que par un scenario ? Ça me semblerait plus simple avec un scenario et, en bonus, si tu es à l’aise avec PHP, tu pourrais écrire autant de code PHP que tu le souhaites grâce au bloc « Code ».

Salut,

  • effectivement si c’est pour faire un script php, le bloc code est plus flexible et simple
  • avec une action/message il y a #title# et #message#; n’est-ce pas écrit dans la documentation?
  • pourquoi ne pas passer les commandes infos directement?
  • dans ton script, n’assigne rien à $argv
  • à moins que je ne sois pas bien réveillé, ton calcul n’a aucun sens, en simplifiant cela fait arg1=arg2
    Les parenthèses ne servent à rien, a+(b-a)=b

Tout ca pour dire en fait qu’il n’y a aucun besoin de script ni de bloc code pour faire des aditions dans un virtuel donc faudrait repartir sur la description du besoin au lieu de décrire le problème :wink:

1 « J'aime »

Bonjour,
merci pour vos réponses, comme dit plus haut, ne tenez pas compte du test, ce n’est que pour tester le passage de 2 arguments à un script.
Le besoin : comme vous savez , les shelly 1PM quand il y a une coupure de courant réinitialise la conso.
J’en ai 9. L’idée pour pas faire 9 fois le meme calcul et le meme scénario et d’écrire un script ( qui n’a rien à voir avec le script d’exemple) en lui passant comme argument un virtuel Total_module1, et la consommation du module1 et ainsi de suite en fonction du module.

Après je ne sais pas s’il faut directement l’inclure dans le scénario, ou dans le plugin script, mais l’idée est là. Après non, je ne suis pas plus à l’aise que ça en php

du coup comment on fait par script pour récupérer une valeur calculée dans le script et l’affecter à un virtuel info ? car je sèche.Merci

Donc tu vas faire 9 scénarios ou que sais-je pour appeler un script unique qui va faire comme calcul « total = total + valeur » ?

C’est useless… ca ne sert à rien de vouloir faire une usine à gaz pour soi-disant réutiliser/partager une logique qui se résume à une simple addition

Et tout ca va être difficile à mettre en place manifestement puisque tu dis ne pas être à l’aise en php et compliqué à maintenir car dans 6 mois tu auras oublié comment le tout fonctionne.

Bref, je pense avoir répondu à la question d’origine à propos des « multi argument » (info qui était bien déjà présente dans la doc)

Et la question de ton edit est également dans la doc ainsi que répondue de multiple fois ici :wink:
Indice: le bloc code dans un scénario reste plus facile pour ça aussi bien que inutile.

Mais non :slight_smile: , il y aura aussi la gestion de la remise à 0 de la conso lors de la coupure ou là le calcul n’est plus le meme ( avec des si…)…c’est celui là que j’ai pas envi de faire 9 fois , c’est tout l’intérêt autrement …évidement pour une adition… ce n’était qu’un exemple pour comprendre comment passer les arguments
J’ai eu beau chercher , j’ai pas trouver pour l’argument en sortie

Il y a pourtant plusieurs post dans lequel je rappelle que ça n’existe pas… une commande action ne renvoi pas de valeur, elle fait des actions. Il y a toujours l’api qui peut être utilisé tant qu’à faire des choses compliquées :wink:

d’où l’intérêt du bloc code puisqu’on a accès à toutes les commandes et le core mais j’ai l’impression d’insister

Non t’insistes pas, j’’ai exploré le bloc code aussi, j’avais compris, mais je ne vois pas comment en bloc code ,je peux passer des arguments " generiques" afin de pouvoir passer des équipements en parametre , autrement appelé fonction avec parametre , qui est donc appelable ensuie avec des triggers par ex sans devoir tout reecrire.L’idee est là, pas une addition :grin:

via des tags de scénario

je vais regarder merci

j’essaie de comprendre la « logique » des tags dans mon exemple. j 'en ai déjà utilisé pour l’envoi d’alertes dans mes scénarios. mais là…
Mon besoin :
Ne pas répéter 9 fois un scénario de calcul pour avoir une remontée de conso fiable à l’année lors du reset de la conso des shelly suite à coupure de courant ( peu importe pour le moment le contenu de ce scénario ou code)
l’idée de ce que je comprend
écrire une fonction ( bloc code) ou scénario « fonction » au pire à l’exécution équivalente au scénario si dessus pour ne pas avoir à répéter.

  • En fonction du module shelly :
    - la commande info du shelly( Total_xxx) est différente
    - la commande info du shelly idem
    entrée de la fonction : la commande info du shelly
    sortie de la fonction : la commande info du virtuel actualisé avec le calcul de la fonction ( ou autre)

Pour l’entrée dans un scénario ,sur évènement en fonction du module un trigger peut être
Je n’arrive pas à comprendre l’utilisation des tags en fait dans ce cas , je peux lui passer une commande info au tag ?
Est ce qu’un bloc code peut restituer une valeur de sortie dont le parametre est le tag ?
J’arrive pas à avoir la logique du truc, si tu peux m’éclairer stp

j’ai trouvé l’explication des tags dans le code d’un scénario, je fais un test :

$tags = $scenario->getTags();
$IdSource= $tags['#idEqS#'];
$IdTotal= $tags['#idEqT#'];

$equipementS=eqLogic::byId($idSource); 
$equipementT=eqLogic::byId($IdTotal); 
$scenario->setLog('equipement total= '. $EquipementT.'.equipement source='.$EquipementS); // Ecriture dans le log du scénario pour tracer la demande

$NomEquipementS=$equipementS->getHumanName(); // Récupération du nom complet de l'équipement
$NomEquipementT=$equipementT->getHumanName(); // Récupération du nom complet de l'équipement
$scenario->setLog('equipement total= '. $NomEquipementT.'.equipement source='.$NomEquipementS); // Ecriture dans le log du scénario pour tracer la demande

pour voir si au moins je recupere un truc dans les logs

je lance le scénario avec les tags :

log :

[2024-03-11 21:15:42][SCENARIO] -- Début : Lancement provoque par le scenario  : [Aucun][at home][Prog unique]. Tags : {"#idEqS#":"7626","#idEqT#":"42984"}
[2024-03-11 21:15:42][SCENARIO] - Exécution du sous-élément de type [action] : code
[2024-03-11 21:15:42][SCENARIO] Exécution d'un bloc code
[2024-03-11 21:15:42][SCENARIO] equipement total= .equipement source=
[2024-03-11 21:15:42][SCENARIO] Call to a member function getHumanName() on null
[2024-03-11 21:15:42][SCENARIO] Fin correcte du scénario

J’arrive pas à comprendre pourquoi je récupère aucune valeur ( la commande ).J’ai essayé avec l’id de la commande et l’id de l’équipement
merci

Salut, j’avais flag ton message pour répondre ce matin sur l’ordi mais tu as finalement avancé :wink:

$scenario->setLog('equipement total= '. $EquipementT.'.equipement source='.$EquipementS); // Ecriture dans le log du scénario pour tracer la demande

ici tu ne peux pas écrire « l’équipement » complet comme ca, trace les ID plutot
et petit tip: utilise la syntaxe suivant, je trouve ca plus lisible avec des {} qu’une succession de point et apostrophe.

$scenario->setLog("equipement total={$IdTotal} equipement source={$idSource}"); // Ecriture dans le log du scénario pour tracer la demande

et concernant les id:

ce sont des id de commande ou d’équipement?
car tu parles d’abord d’équipement et là entre parenthèse tu mentionnes commande.

eqLogic::byId()

ceci permet de récupérer un équipement, pas une commande

Salut,
Je te remercie beaucoup de ton aide.
Hier soir ,j’ai pas mal avancer et arrive à récupérer les valeurs des commandes , les affectées
Le seul truc que je ne n’arrive pas à faire , c’est à réécrire la valeur dans la commande info du virtuel, je n’arrive pas à trouver la bonne syntaxe ( avant dernière ligne)

$tags = $scenario->getTags();
$IdSource = $tags['#IdSource#'];
$IdTotal = $tags['#IdTotal#'];

$equipementS=eqLogic::byId($IdSource); 
$equipementT=eqLogic::byId($IdTotal); 


$NomEquipementS=$equipementS->getHumanName(); // Récupération du nom complet de l'équipement
$NomEquipementT=$equipementT->getHumanName(); // Récupération du nom complet de l'équipement
$cmdS='#'.$NomEquipementS.'[Consommation]'.'#'; // Définition de la commande source
$cmdT='#'.$NomEquipementT.'[Conso_Mal]'.'#';
$scenario->setLog("La commande source est{$cmdS} et le total{$cmdT}"); // Ecriture dans le log du scénario pour tracer la demande

$Source=cmd::byString($cmdS) ->execCmd();
$Total=cmd::byString($cmdT) ->execCmd();
$scenario->setLog("La valeur totale={$Total}.La conso Shelly est {$Source}"); // Ecriture dans le log du scénario pour tracer la demande
$Total=$Source;
$scenario->setLog("La nouvelle valeur totale = {$Total}"); // Ecriture dans le log du scénario pour tracer la demande

cmd::byString($cmdT)->event($Total);
$scenario->setLog("et donc La valeur totale={$Total}); 

C’est bon en fait , j’avais pas mis la majuscule à Total. Je continue la suite :slight_smile:

edit :
petite question.
Si je fais un tableau dans le bloc code d’un scénario, il ne garde pas les valeurs avitam dedans , c’est que le temps de l’execution lors de l’appel du scenario ?

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