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

@naboleo, @Bercolly, @Mips
Pour le problème du script avec paramètre, le comportement ressemble à ceci : il semble que le script récupère la valeur du paramètre à la sauvegarde du script, et ne la met plus à jour en suite.

Si je l’exécute sans sauvegarde, j’obtiens toujours le même résultat, quelle que soit la valeur envoyée, et ce résultat correspond à la valeur de la variable ou de la commande à la dernière sauvegarde du script.

Si je sauvegarde le script avant chaque modification de la variable (ce qui n’est pas envisageable), alors le résultat est bon à chaque fois.

Si quelqu’un a une idée…
Du coup, je vais investiguer la réponse de @naboleo
Merci

@naboleo

Mes exemples de non fonctionnement sont différents :
Je parle de l’exécution de la fonction directement dans le scénario. ainsi :
Ceci fonctionne (avec une variable)

ceci ne fonctionne pas :
Avec un tag :

Avec une commande :

Ca donne l’impression que la valeur du paramètre n’est pas évaluée avant le passage du paramètre, mais dans la fonction appelée. C’est peut être un fonctionnement normal php, maisj’ai été habitué au contraire, alors…

Mais toutes dans le même fichier user.function.class.php ? Ou chacune avec un autre nom de fichier (par exemple le nom de la fonction).php dans le même répertoire ?

Merci

Pour la commande, j’ai pas testé
Pour le tag, c’est un exemple que j’évoque en parlant de mélange … En sortie le contexte d’exécution parent n’est pas mis à jour. C’est pas lié au tag, c’est lié au fonctionnement du core qui ne fait pas de setTag() automatiquement et à l’analyseur syntaxique parfois capricieux…
Mais pour une affectation directe, il y a plus simple : passer par un virtuel fera le boulot pour toi en appelant ta fonction

Comme je le disais, tu peux faire 40 fichiers avec n’importe quel nom et dedans ta fonction…
Personnellement en terme de lisibilités, je suis pas convaincu de cette solution

@naboleo
Merci. je pense que je vais m’en sortir avec ça.

Mais pour en revenir au plugin script, objet de ce post, car même si c’est mieux de faire des fonctions, j’aimerais bien compredre comment ce plugin est sensé fonctionner.

Déjà quand tu dis :

Je pensque tu fais allusion au changement de code du plugin, pour le retour de paramètre dans les commandes action, proposé par @Bercolly ici :

ça je comprends bien que ça va sauter à la moindre modif, mais ce changement de version ne va pas faire sauter tous les scripts définis dans le plugin et les commandes associées ? Juste pour être sûr, j’ai d’autres ciommandes (sans paramètres) dans le plugin .

A tous (dont @Bercolly, @Salvialf, @Mips)
Pour ce qui est du fonctionnement, j’ai beau tester au plus simple, ça ne fonctionne pas. Voici mon exemple :
Le virtuel :

Le scénario :



Le script :

Le code du cript : se contente de retourner la valeur reçue en paramètre !
MonCode

Voici quelques exemples de ce que je reçois sur Telegram :

  • duree : 50 mn pour 3000 secondes
  • duree : 50 mn pour 4000 secondes
  • duree : 50 mn pour 5000 secondes
  • duree : 50 mn pour 65000 secondes

    Je fais une sauvegarde du script…
  • duree : 18h 3 mn 20 secs pour 65000 secondes
  • duree : 18h 3 mn 20 secs pour 55000 secondes

Nouvelle sauvegarde, et je change la durée envoyée…

  • duree : 15h 16 mn 40 secs pour 40000 secondes…
    Ce qui correspond au calcul fait sur la valeur précédent la sauvegarde à 55000 !!

Je pense qu’il y a un sérieux problème. Au départ, je pense que c’est moi, puisque je n’y connais rien. Mais si c’est moi, que dois-je remplacer ? Et si ça n’est pas moi, comment le dire ?

Merci d’avance

Pour faire simple :

  • tout ce que tu as ajouté/corrigé dans les fichiers d’origine du plugin va disparaître (et donc la modif en question)
  • tous fichiers des sous-répertoires de script et qui ne sont pas ceux du plugin vont disparaitrent (sauf le contenu de /data)
  • les configurations du plugin script dans jeedom vont rester

MAIS comme le mécanisme de retour ne fonctionnera plus, par voie de conséquence, une partie de tes scripts non plus. Jusqu’à une re-correction du code du plugin de ta part… Niveau maintenant, c’est très moyen

Re,
La modif que j’ai faite ne concerne que mon cas personnel. Je ne mets plus à jour le plugin script, car j’ai utilisé une autre manière plutôt triviale d ele faire fonctionner. cela convient à mon usage. Mais ce n’est certainement pas une solution pour tout le monde.

Concernant la mise à jour de la commande info du script, il est obligatoire de faire un refresh, comme je l’ai précisé dans le code fourni.
avec par exemple :

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

Pour preuve, si tu associes par exemple un cron d’une minute à ton script tu pourras constater que la commande info est actualisée.

C’est ce qu’utilises jeedom pour mettre à jour cette commande info.

A mon avis, c’est un bug de jeedom, car sans cette opération, la commande info n’est pas mise à jour. (Peut-être que quelqu’un pourrait l’infirmer ?).

Pour moi, si tu mets en place ce refresh, le problème est résolu.

A+
Bernard

@Bercolly
Merci, je comprends bien que ça contourne le problème, mais comme écrit plus haut, il me semble que le refresh nécessite de passer par un bloc code ? Sinon, je ne sais pas comment l’appliquer.

Y a-t-il un moyen de le faire sans bloc code ?
Merci

Salut,

D’elle même une commande script ne peut pas s’actualiser toute seule.

Il faut soit la déclencher manuellement soit y configurer un cron d’actualisation

Oui,

Il suffit de le faire dans le userFunction. C’est du php donc équivalent au bloc code.
Voici un exemple pour la classe userFunction :

<?php

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

class userFunction {

	public static function exec_script($_script_name) {
	
		log::add('tst_scen','error', 'script : ' . $_script_name);
		$_cmd = cmd::byString("#" . $_script_name . "#");

		if (is_object($_cmd) ) {
			$_cmd->getEqLogic()->refresh();
			$_value = $_cmd->execCmd();
			log::add('tst_scen','error', 'retour script : ' . $_value);
			return $_value;
		} else {
			log::add('tst_scen','error', '$_cmd KO ' );
		}
	}
}

Dans le scénario, on appelle le code ainsi :

exec_script([Aucun][demo_parametre][test])

Merci de faire avancer le schmilblick !

Avec ce plugin on est dans l’impasse !:

si c’est une commande action, il n’y a pas de retour,
si c’est une commande info sans cron, il n’y a pas d’actualisation !

Comment on s’en sort ?

En mettant un cron là où c’est prévu.

Je suis en vacances là mais j’ai de nombreuses commandes script pour récupérer tout un tas de données chacune avec le cron qui va bien.

Cf la documentation du plugin:
Auto-actualisation : permet de spécifier un Cron d’actualisation automatique pour toutes les commandes de type info.

https://doc.jeedom.com/fr_FR/plugins/programming/script/

Ta réponse est hors sujet. Apparemment, phillox veut récupérer une info à la demande, aps en utilsant un cron.

L’utilisation d’un cron est tout à fait réducteur. Il y a d’autres cas d’usage. Et là pour l’instant, on est sans solution. Sauf de faire un refresh ce que le cron fait par ailleurs.

Lol ma réponse est hors sujet… bref je préfère ne pas répondre…

Bonne continuation dans vos usines à gaz pour faire ce qui peut-être fait par défaut

En terme d’usine à gaz, il y a des connaisseurs par ici.
LOL

De mieux en mieux

Perso je ne me sens pas concerné …je préfères ne pas réagir ce genre de remarque montre le niveau … comme tes autres messages.

Je te laisses avec ton nombril

@Bercolly
Ahhh… Je crois que ça y est ! Pffff… Je dois avoir la comprenette difficile.
Bon, j’ai créé la fonction LanceScript (histoire de modifier ton code :roll_eyes:) dans /data/php/user.function.class.php.
Et au lieu de récupérer ma valeur info de script avec un simple :

Je fais comme tu le suggères :

Et là, ça fonctionne !
Je ne comprenais pas comment je pouvais récupérer une valeur sans exécuter le script, mais comment l’exécuter, alors, j’étais loin d’une solution - et avec refresh en plus.

Evidemment, il faut passer par une fonction (ce que je voulais éviter en passant par les scripts). mais enfin c’est une seule !

@Salviaf dont je vois le message arriver dans sa discussion avec @Bercolly, le cron ici ne me sert à rien, car toutes les minutes maxi. Là je veux que le script me renvoie la bonne valeur chaque fois que j’en ai besoin, au moment où j’en ai besoin, et plusieurs fois dans la même seconde si besoin (j’exagère un peu, mais bien plus d’une fois pas minute est loin d’être invraisemblable)…

En tous cas maintenant, grâce à toi Bercolly, j’ai une solution faisable via les scripts, et grâce à @naboleo, j’ai une solution via les fonctions. On ne prête qu’aux riches ! Merci à tous les deux, et aussi à tous les autres qui ont participé
Bonne fin de journée.

Super !
Tu peux fermer le sujet ?

Finalement faut pas faire le cron !

A+
Bernard

Relis juste les réponses de @Salvialf:

  • d’abord tu critiques que c’est mal foutu parce qu’une commande info ne s’actualise pas toute seule; @salviaf répond que soit faut mettre un cron soit faut l’appeler manuellement pour avoir son info.
  • ensuite « c’est mal foutu le cron, c’est pas flexible, :sob::sob::sob: »
  • pour finir: « ah j’ai gagné je suis le plus fort, même pas besoin d’un cron, c’est moi qu’avait raison »

Mais c’est pitoyable comme interventions…

(Oui je sais déjà ce que tu vas répondre à ceci, ce n’est pas très grave, on a l’habitude)

1 « J'aime »

Les chiens aboient et la caravane passe !

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