Débutant php n'arrive pas à passer les paramètres à un script php et/ou récupérer le résultat

Bonjour à tous
depuis hier, j’écume les forums et les recherches Google, mais bien que la quetion ait été plusieurs fois posée, j’ai trouvé peu de réponses, et aucune que je parvienne à comprendre ou à transposer pour que ça fonctionne.
Mon but est de mettre des blocs codes de scénario dans le plugin php pour pouvoir les exécuter de n’importe où, comme des fonctions.
Je précise que ce quej’essaye de faire fonctionne parfaitement dans des blocs codes.Dans ceux ci je récupère les paramètres avec des $ scenario->gettags et les retourne avec des $scenario->settags. Mais ça ne fonctionne pas avec le plugin script.
J’ai lu qu’il fallait passer le (ou les paramètres) sans la requète après un espace. Et récupérer le résultat avec un echo.
Pour mon test, j’ai donc essaué de lancer le script avec un /var/www/html/plugins/script/data/TestH.php NbSecs (ou NbSecs représente un nombre de secondes). J’ai aussi essayé avec variable(NbSecs).
Mon php commence par :

<?php
$NbSecondes = $argv[1]

et se termine par :

echo $MaDuree
?>

Mais dans mon test, au lieu de récupérer quelque chose comme 1 jour 2h 6mn 15 secs (comme dans mon scénario), je récupère (avec la commande script) un nombre entre # (par exemple #1632#).
Du coup je ne sais pas comment faire, et les différents posts trouvés traitant un peu du sujet donnent des liens qui ne sont plus fonctionnels.
Quelqu’un pourrait me mettre le pied à l’étrier avec un exemple concret, passage d’une variable (un nombre) et récupération d’un texte ?
Merci d’avance

Bonjour,
Fais une capture de ce que tu fais.

Hello @Mips
En faiant les captures, je me dis qu’il manque une étape, que peut être le script ne s’exécute pas. En tous cas, je ne sais pas comment m’y prendre au moins pour récupérer le résultat (si résultat il y a). Les autres scripts que j’ai (récupérés de quelqu’un d’autre) étaient http et passaient par un virtuel pour s’exécuter.
Voici les captures.

Le scénario de test :


Le script

je ne remets pas le code, j’ai dit comment il commençait et finissait, et je sais que l’intérieur fonctionne

Merci d’avance

Dans ton exemple le script reçoit littéralement « nbsecs »;
Absolument pas le contenu de la variable.

Regarde dans la doc, tu peux même passer la valeur d’une commande info directement (le nom entre #), pas besoin d’une variable si celle ci vient de ta commande.

Hello @mips
Merci pour la réponse
Comme je l’ai écrit dans le post initial, j’ai aussi essayé avec variable (NbSecs). C’est même ainsi que j’ai essayé au départ, sans succès.
J’ai bien lu dans la doc que je pouvais utiliser la valeur d’une commande, mais comme le NbSecs vient d’un calcul de scénario je voulais éviter de créer un virtuel juste pour ça.
Surtout, je ne comprends toujours pas comment récupérer la valeur de retour dans le scénario ?

Merci d’avance pour tes explications

@Mips
Je viens de faire le test de la façon dont tu me l’indiques, en passant par une commande info, et j’ai le même résultat.
Voici le virtuel

Voici le script

Le début du code :
CaptureCode

Voici le scénario

et voici la log

J’ajoute que c’est le même résultat quelle que soit la manière dont je passe la valeur, donc soit le passage de la valeur n’est pas bon, soit c’est la récupération de la valeur dans le script, soit c’est le passage du résutat au scénario qui n’est pas bon.
Merci d’avance. Bonne fin de soirée

Bonjour,

En regardant le code du plugin script, il apparaît que le plugin ne renvoie pas de valeur si la commande est une action.

A+
Bernard
(Ce n’était pas le cas dans une version précédente du plugin).

@Bercolly
Bonjour
Merci pour cette réponse… Qui ne m’arrange guère !!!
J’en conclus qu’on ne peut pas (plus…) se servir de ce plugin pour exécuter du code php en tant que fonction ?
J’ai essayé de transformer mon script en info, il me renvoie bien une valeur, mais = 0, ce qui n’est pas vraiment la réponse attendue non plus !
Ca serait pourtant hyper pratique de pouvoir se créer des fonctions avec le plugin, plus propre en tous cas que de créer la fonction dans /data/php/user.function.class.php (d’autant que les fonctions créées à cet endroit ne semblent pas accepter de tag, ni de valeur de commande en paramètre - je suppose parce que la valeur du paramètre est évaluée non pas dans le scénario appelant, mais dans la fonction… bref…).
Une chance pour que ça refonctionne un jour ?
Une idée pour contourner le problème ?
Merci d’avance, bonne journée

Re,
Aucune idée pour te dire si ce comportement sera rétabli ou non.

Personnellement, j’ai modifié le code du plugin script afin qu’il retourne la valeur de la commande action.
Pour vérifier si cela corrige en partie ton problème, tu peux essaye rla modification suivante :

chercher dans la class script : script;clas.php :

case ‹ script › : c’est là qu’est traitée l’exécution de ta commande …

la fin de cette partie de code est ainsi :

     if($this->getType() == 'info'){
			return $result;
}
break;
case 'xml':

A la place faire la correction suivante :

        //if($this->getType() == 'info'){
	//	return $result;
   //}
  return $result;
break;
	case 'xml':

Puis tester.

Bon courage,

A+
Bernard

Salut,

J’ai survolé sur le tel mais je ne comprends pas pourquoi passer par une commande action? C’est bien une info que tu veux récupérer.

Quand au fait qu’une commande action ne renvoie pas de valeur c’est tout à fait normal car une commande action n’a pas de valeur mais rapatrie la valeur de la commande info liée. D’ailleurs une commande action sert à effectuer une action là où une commande info retourne une valeur justement.

1 « J'aime »

Le concept commande action/info est assez ‹ vaseux ›.

Une commande info est aussi une commande action. Une commande info execute un script et retourne une valeur. La différence entre action/info est qu’une commande info ne traite pas le remplacement des paramètres tels que slider color message ou title. Pourquoi ?

Avant la dernière version une commande action retournait une valeur. Si un développeur avait utilisé
cette possibilité avec le remplacement de paramètres ( slider, color, etc) et bein il se trouvait planter sans qu’aucune infirmation n’ait été communiquée aux développeurs/utilisateurs.

Cela pouvait signifier beaucoup de modifications à faire pour rétablir le fonctionnement. Pour ma part une petite amélioration du plugin (peu coûteuse en terme de dév) a permis de faire un contournement simplissime.

A+
Bernard

Hello @Salvialf merci pour ce retour.
Personnellement, je veux bien créer action / info, tout ce qu’on me conseillera du moment que ça fonctionne.
Au départ, pour tout dire, j’avais créé une commande info - avec ton raisonnement, c’est bien une info que je récupère. Rien ne fonctionnait. Alors j’ai essayé une commande action, en me disant que le script avait bien une action à accomplir avant de retourner l’info, un peu comme dans l’explication de @Bercolly. Après les premières réponses de @Mips, j’ai modifié le passage du paramètre en le mettant dans une info virtuelle, comme je l’ai posté hier soir. Avec le même problème.
Ce matin, suite au retour de Bercolly, j’ai testé le même code avec une commande info, et au lieu de récupérer #6557#, je récupérais 0, ce qui n’est pas vraiment mieux.
Comme je l’ai écrit, je veux bien faire comme on me l’indiquera, il suffit de me donner un exemple qui fonctionne, je devrais être capable de comprendre et de reproduire en l’adaptant si besoin.

S’il faut une commande info, OK, mais pourquoi me retourne-t-elle 0 alors que le même code en bloc code me renvoie bien une conversion de secondes en jours / heures / minutes / secondes. Dans mes exemples ci dessus, où est l’erreur qui fait qu’avec une commande info, je reçois 0 ?

merci beaucoup

Re,
Tu peux recevoir 0 si le type de la donnée retournée n’est pas du type de l’info déclarée. Mais il peut y avoir d’autres raisons.

J’ai testé un bout de code qui semble fonctionner.

J’ai codé ainsi la déclaration du script :
→ délai avant actualisation des infos : 0 on n’utilise pas le cache,
script de type info, sous-type numérique.
appel : par exemple :

/var/www/html/plugins/script/data/script_test_param.php variable(Consommation_elec_veille)

Je passe le paramètre par l’intermédiaire d’une variable. Tu ne peux pas utiliser ici, directement les fonction get/set tags car elles sont asscoiées à un scénario. Pas au plugin script.

Voilà le code (trivial) du script :

<?php $_v = $argv[1]; echo $_v * 2; ?>

Dans un scénario voici la façon d’utiliser le script :

Dans un bloc code :

$_cmd = cmd::byString(’#[Aucun][demo_parametre][test]#’); // recherche de fonction du script à exécuter,
if (is_object($_cmd) ) { // vérifgier que l’on a bien un objet …
$scenario->setlog( 'retour script : ’ . $_cmd->execCmd()); // exécuter le script
}

Pour ton exemple, si tu utilises des tags il te faudra initialiser la variable qui contient le paramètre à partir du tag et en retour, recharger le tag avec la valeur du script.

A mon sens pour faire plus simple, j’utiliserais une variable qui sert de passage de paramètre.

A+
Bernard

Bonsoir @Bercolly
Merci pour ces explications. Ça fonctionne maintenant. J’ai supprimé tout mon code du script et en ai refais un qui se contentait de m’envoyer en retour la valeur de la variable passée en paramètre. Ça marchait. Alors j’ai recollé mon code d’origine et ça a continué à fonctionner.
Probablement avais je fait tellement d’essais que le script s’était trouvé vérolé.
Pour les variables, c’est ce que j’avais imaginé de faire puisqu’il n’y a pas d’autre solution simple.
En tous cas merci de ton aide détaillée et de tes conseils sans lesquels je chercherais sûrement encore en tâtonnant.
Bonne soirée

Hello
En fait j’ai encore un souci.
Le changement de valeur de la variable passée en paramètre n’impacte pas le résultat à chaque fois. Si je lance le scénario plusieurs fois de suite, en changeant la valeur de la variable passée en paramètre, le résultat donné par le script sera semblable au 1er lancement.
J’ai vérifié la variable, elle est bien modifiée dans le scénario avant exécution du script. Mais on a l’impression que le script analyse toujours la même valeur. Ou alors qu’il conserve une sorte de cache…
Une idée ?
Merci

Re;,

En poussant les tests c’est ce que j’ai constaté.

Normalement, cela devrait marcher en appliquant la modification suivante : (par rapport à mon code exemple):

$_cmd = cmd::byString(’#[Aucun][demo_parametre][test]#’);
$scenario->setData(‹ Consommation_elec_veille ›, 3000);

if (is_object($_cmd) ) {
$_cmd->getEqLogic()->refresh();
$scenario->setlog( 'retour script : ’ . $_cmd->execCmd());
} else {
$scenario->setlog( '$_cmd KO ’ );
}

Avant d’appeler l’éxecution du script je lance la commande
$_cmd->getEqLogic()->refresh();

A+
Bernard

Bon courage.

1 « J'aime »

Hello @Bercolly
Merci de continuer à m’aider…
Je comprends à peu près ce que tu fais dans ton exemple - je ne suis pas trop certain du getEqLogic(), mais je crois comprendre que c’est une fonction Jeedom, et je suppose qu’elle récupère l’identifiant logique d’une commande.

Faire un refresh implique donc que je dois obligatoirement passer par un bloc code dans le scénario pour pouvoir le faire (ou alors j’ai loupé une marche). Mais outre le fait que mon but en faisant des fonctions scripts est justement d’éviter les blocs codes dans les scénarios (alors que je serais obligé d’en mettre un à chaque appel de la fonction), je ne comprends pas trop l’action de ce refresh avant de lancer le script puisque d’après mes tests, la variable est bien à jour avant le dit lancement.

OK pour un refresh, mais n’y aurait-il pas moyen de le lancer dans le script lui même, puisqu’il semble que ce soit lui qui se mélange les pinceaux ?

Je ne sais pas comment essayer ça - si c’est possible - puisque je suppose que le getEqLogic() ne fonctionnera pas dans le script.

Pour rappel, mon but est de définir dans des scripts des fonctions que je pourrais définir de la même façon dans /data/php/user.function.class.php. Ceci parce que, de mon point de vue, elles seront plus faciles à maintenir, et surtout listées de manière bien plus lisible qu’à la suite les unes des autres dans du code. Sans compter les mises à jour et les sauvegardes. Mais j’aimerais qu’elles soient presque aussi facile à appeler qu’un simple tag MonTag MaFonction(variable(MaVariable))

Si un jour je deviens à peu près compétent en php, j’utiliserai sans doute davantage les blocs codes, dans l’immédiat c’est plus lisible pour moi (et donc plus facile à maintenir) dans des scénarios Jeedom - contrairement à d’autres langages plus verbeux, le php n’est pas facile à lire pour le non initié.

Merci d’avance pour tes nouveaux conseils
Bonne journée

Salut,

Tu peux tout à fait appeler les fonctions de user.function.class.php en dehors des blocs codes. ça fonctionne dans les SI, dans les log, dans les attributions de variables et également directement dans des commandes des virtuels.

Justement, en ayant modifié le core de Jeedom, la prochaine mise à jour va tout casser parce que ces modifications seront écrasées. A l’inverse le fichier user.function.class.php est sauvegardé et restauré intégralement par les mécanismes de backup de jeedom.
Donc coté maintenabilité, c’est clairement pas le meilleur choix.

Tu peux aussi inclure des fichiers à partir de user.function.class.php si tu veux réorganiser le découpage

Bref la question de fond pour la valeur de retour des commandes infos reste entière (personnellement j’ai toujours réussi à faire sans) mais les arguments évoqués pour se simplifier la vie n’en sont pas vraiment à mon sens.
Chacun fait comme il veut cependant

Bonjour @naboleo
Merci pour cette réponse.

Oui, appeler les fonctions directement du scénario sans bloc code, pas de souci. Mes soucis d’appels depuis un bloc code sont liés à l’appel d’un script après un refresh.

Par contre, d’après mes tests de débutants, les appels de fonctions depuis un scénario fonctionnent avec une variable ou directeent la valeur, mais pas avec un tag, ni avec une commande. J’ai créé un post en core Jeedom/scénario/scénario pour demander si c’était normal, mais je n’ai pas eu de réponse encore.

Pardon, quelles modifications seront écrasées ? Le plugin script ?

Désolé, je suis vraiment débutant avec php, et pas compétent non plus avec Linux, hélas, alors je ne comprends pas ce que ça veut dire. Ce que j’essayais de dire, c’est que si je crée, par exemple, 40 fonctions, en retrouver le fonctionnement ou même le nom dans /data/php/user.function.class.php me parait plus difficile. Mais si ta réponse correspond à cette question, alors je ne sais pas ce que signifie « inclure des fichiers à partir de user.function.class.php ». Mais je ne demande qu’à apprendre.

Quant au fonctionnement du passage de paramètre dans un script, j’y perds mon latin (et pourtant j’ai fait beaucoup plus d’années de latin que de php). On a l’impression que le script récupère au hasard une variable qui lui a été passée au préalable et qu’il l’utilise jusqu’à ce qu’il décide d’en changer. Même chose avec la commande info d’un virtuel.
Merci

Un exemple chez moi :


Pour le refresh, celui du widget une fois activé, fonctionne très bien.
Bref ça fait exactement la même chose que toi…

Pour les tags, ça fonctionne aussi,


même si au final, je passe par le virtuel ci-dessus

Le seul truc que j’ai noté c’est quand on mélange des strings et des fonctions par exemple ça fonctionne bizarrement

Exactement, à la prochaine mise à jour toutes tes modifications des fichiers du plugins scripts seront perdues… Et donc tout ce qui dépends de cette bidouille ne fonctionnera plus

Linux, n’a pas tellement d’affluence, mais tu peux utiliser mobaxterm pour te connecter en ssh à ton jeedom. Il propose de choisir son éditeur (VSstudio, notepad++…) et donc permet d’avoir une mise en forme plus lisible…

Tu peux tout à faire 40 fichiers différents avec chacun une fonction si tu trouves ça plus facile… Un exemple d’inclusion

/* * ***************************Includes********************************* */
require_once __DIR__ . '/../../core/php/core.inc.php';