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