Utiliser un Daemon pour executer des commandes de refresh en dessous de 1 minute d'intervale

Bonjour a tous,

Ces derniers jours je me suis interresse a l’integration d’un Daemon dans un plugin, chose que je n’avais jamais faite et aussi debutant en python… heureusement la patience et le soutient des membres ici m’ont bien aide, encore merci.

Avant de continuer mes changements sur un de mes plugins je souhaite savoir si ce que je souhaite faire est une approche acceptable ou si vous conseillez autre chose.

  • appellons ce plugin de test ‹ template ›.
  • mon plugin a une fonction php existante dans le fichier ‹ .class.php › depuis sont debut et recupere des infos json d’un autre appareil connecte.
  • pour l’instant, j’utilise un cron 1 minute pour appeler cette fonction ‹ update › … pas assez rapide pour mon utilisation.
  • je souhaite maintenant utiliser un daemon afin d’augmenter la frequence de rafraichissement.

Ce que j’ai fait pour le moment dans un plugin de test ‹ template › avant d’appliquer sur mon ‹ vrai › plugin:

Dans la partie Python ‹ templated.py ›, j’appelle simplement un ‹ send_change_immediate › au php de callback toutes les 10 secondes:

def listen():
	try:
		while 1:
			time.sleep(10)
			send_Data()
	except KeyboardInterrupt:
		shutdown()

def send_Data():
	jeedom_com.send_change_immediate({"doUpdate" : 1})

Puis dans le php de callback (jeetemplate.php) je fais une boucle sur tous les equipements de mon plugin et j’execute la fonction ‹ uptate › ce qui va desormais me rafraichir mes donnees toutes les 10 secondes:

<?php

try {
    require_once dirname(__FILE__) . "/../../../../core/php/core.inc.php";
  
    if (!jeedom::apiAccess(init('apikey'), 'template')) {
        echo __('Vous n\'etes pas autorisé à effectuer cette action', __FILE__);
        die();
    }
    if (init('test') != '') {
        echo 'OK';
        die();
    }
  
    $result = json_decode(file_get_contents("php://input"), true);
    if (!is_array($result)) {
        die();
    }

    if (isset($result['doUpdate'])) {//'doUpdate' est envoyé par le daemon toutes les x secondes (x a definir dans le daemon Python)
      
      	foreach (eqLogic::byType('template') as $template) {//parcours tous les équipements du plugin
			if ($template->getIsEnable() == 1) {//vérifie que l'équipement est actif
				$cmd = $template->getCmd(null, 'update');//retourne la commande 'update' si elle existe
				if (is_object($cmd)) {//si la comande existe
					$cmd->execCmd();//alors on l'execute
                  	log::add('template', 'debug', 'Updated equipment '.$template->getName());
				}
            } else {
            	log::add('template', 'debug', 'Cannot update equipment '.$template->getName().', it is disabled.');
			}
		}

    } else {
        log::add('template', 'error', 'unknown message received from daemon');
    }
} catch (Exception $e) {
    log::add('template', 'error', displayException($e));
}

Ceci fonctionne tres bien mais est-ce que la methode est ok? Sinon avez-vous des suggestions?

Merci beaucoup pour tous les conseils!

Sebastien

Salut,

C’est carrément dommage de faire un démon python qui en fait ne fait que déclencher un refresh php, ca fait un peu usine à gaz qd même.

Dommage de pas avoir expliquer le but dès le départ, je t’aurais dit que le démon python n’est pas la bonne option selon moi;
faudrait plutôt un démon php ici si ta logique est déjà codée en php; parmi les plugins officiels le plugin-sonos3 a un démon php par exemple si tu veux t’en inspirer; y a pas (encore) de doc pour ca.

Merci Mips, je vais y regarder.
Je savais meme pas qu’on pouvait faire du daemon php …
Meme avec Python je trouve que c’est pas lourd a mettre en place (une fois qu’on a compris la base :slight_smile: )

Donc si vraiment je pars sur cette solution avec Python, il n’y a pas vraiment d’erreur dans la technique si j’ai bien compris.

Sebastien

Salut,

Tu as aussi Wes Control qui tourne sur un démon PHP qui peut être à la seconde selon la configuration faite par l’utilisateur :

Yes ca fonctionne!!! Yahoooo
Effectivement c’est bien plus simple pour ce dont j’ai besoin en PHP.
Merci vraiment, c’est appreciable d’avoir un support comme ici.

Il serait interressant de rajouter l’exemple de ce plugin wescontrol dans la doc pour guider les gens.
Par rapport au daemon python, le daemon php est (pour moi) bien moins complique a comprendre et a implementer.

Sebastien

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