Mise à jour quelques secondes après la dernière action

Bonjour,

Je m’adresse aux développeurs.

Dans le cadre du développement de mon pluging, je voudrais que suite à l’exécution d’une action (implémentée dans function execute($_options = array())), certains équipement soient « rafraichis » mais seulement après quelques secondes, le temps que le système cible nous fasse un retour d’état en conséquence. Je ne souhaite pas bloquer l’exécution des commandes avec un sleep dans execute. Je préfèrerais également que cela passe par un mécanisme interne au plugin plutôt que programmer une post-action à partir de la configuration de mon action via l’interface jeedom.

Comment me suggérez-vous d’opérer ?

Bonne journée à tous !

Hello,

Vu que le système cible te fait un retour, c’est ce retour qui doit lancer la mise à jour des valeurs.

Si tu nous en dit plus sur ce système on peut probablement te donner une réponse plus précise, mais habituellement les retours sont sous forme de « callback » (le système informe l’appelant que quelque chose à changé), donc une page dans ton plugin doit exister pour recevoir ce callback et lancer les actions de mise à jour que tu attends.

Ça répond à ta question ?

Bad

1 « J'aime »

En fait le système cible n’implémente pas de callback mais il faut lui laisser deux trois secondes pour mettre à jour son état donc c’est bien une petite pause que je souhaite faire avant de consulter à nouveau l’état.

Si le plugin a un daemon, c’est le bon endroit pour faire ça.
Sinon, il faudra probablement lancer un cron exécuté immédiatement et faire le rafraîchissement dedans.

Dans le plugin script, il y a quelque temps avait été ajouté l’option « Délai avant d’actualiser les infos suite à une action (en secondes) ». Il doit être possible de s’inspirer du code.

Tu as raison c’est une bonne idée. Voici ce que l’on trouve :

if($this->getEqLogic()->getConfiguration('delayBeforeRefrehInfo') != ''){
	usleep($this->getEqLogic()->getConfiguration('delayBeforeRefrehInfo') * 1000000);
}
$this->getEqLogic()->refresh();

Autrement dit un simple sleep à la sortie, de la durée demandée. Je vais partir la dessus. Je vais aussi vérifier que le code d’exécution des commandes est ré-entrant de sorte que ça ne bloque pas l’exécution d’autres commandes en parallèle.

@Bad, @seb821 Merci beaucoup pour vos suggestions !

1 « J'aime »

Salut,

En lançant un cron « unique » il est possible d’executer une méthode de sa class de façon « async » (exécutée dans un autre thread Php) même si le cron est lancé immédiatement.
Dans la méthode en question on peut alors faire le sleep que l’on veut (moins d’une minute sinon c’est mieux de faire un cron schedule) sans impacter la suite de l’action original.

Si on fait un sleep dans l’action de base faut bien penser que ça va bloquer de autant la personne qui fait un clic dans le dashboard, et attendre 2s quand on clic sur un bouton c’est vite casse pied.

Le code est ici: GitHub - Mips2648/jeedom-tools: Tools and helper class for plugin development

Super intéressant. Merci @Mips de partager tout ça. Je vais expérimenter dès que je trouve un peu de temps.

Encore merci !

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