Bug sur le cron de l'équipement lors d'une sauvegarde

Bonjour,

J’ai depuis le début du plugin un bug sur le lancement de cron().
Le cron se lance bien toutes les minutes, mais si je fais sauvegarder l’équipement, de temps en temps le cron n’exécute plus la commande
J’ai rajouté des logs dans le cron:

public static function cron() {
      	log::add('hottoh', 'debug', 'Cron');
      	if ($_eqLogic_id == null) { // La fonction n’a pas d’argument donc on recherche tous les équipements du plugin
			$eqLogics = self::byType('hottoh', true);
		} else {// La fonction a l’argument id(unique) d’un équipement(eqLogic)
			$eqLogics = array(self::byId($_eqLogic_id));
		}
    	foreach ($eqLogics as $hottoh) {//parcours tous les équipements du plugin hottoh
			  if ($hottoh->getIsEnable() == 1) {//vérifie que l'équipement est actif
				  $cmd = $hottoh->getCmd(null, 'refresh');//retourne la commande "refresh si elle existe
                  log::add('hottoh', 'debug', 'Cron_refresh');
				  if (!is_object($cmd)) {//Si la commande n'existe pas
				  	continue; //continue la boucle
				  }
                	log::add('hottoh', 'debug', 'Cron_refresh execution commande');
				  $cmd->execCmd(); // la commande existe on la lance
			  }
		  }	
    }	
[2019-11-04 08:35:12][DEBUG] : Cron
[2019-11-04 08:35:12][DEBUG] : Cron_refresh
[2019-11-04 08:35:12][DEBUG] : Cron_refresh execution commande
[2019-11-04 08:35:12][DEBUG] : Lecture_parametre
[2019-11-04 08:35:12][DEBUG] : Connection au serveur 192.168.0.250:5001
[2019-11-04 08:35:12][DEBUG] : Requete_1#00001A---0002DATR0;EEC2
[2019-11-04 08:35:12][DEBUG] : Reponse_1#00001A---0059DATR0;65;0;1;12;0;0;0;0;205;220;50;350;-435;0;0;0;-435;0;0;0;462;0;1;1;5;0;5;5;5;1;1;5;5;5;5;B8BC
[2019-11-04 08:35:12][DEBUG] : Requete_2#00002A---0002DATR2;6B85
[2019-11-04 08:35:12][DEBUG] : Reponse_2#00002A---0032DATR2;1;0;0;0;0;-435;0;0;0;-435;0;0;0;0;0;0;0;0;0;0;0;D7D8
[2019-11-04 08:35:12][DEBUG] : Requete_3#00003A---0002DATR1;902A
[2019-11-04 08:35:12][DEBUG] : Reponse_3#00003A---0027DATR1;0;185;50;350;200;100;350;220;100;350;FBA9
[2019-11-04 08:35:12][DEBUG] : test etat stove0:36
[2019-11-04 08:35:12][DEBUG] : Rafraichissement des informations du poele
[2019-11-04 08:35:12][DEBUG] : postsave
[2019-11-04 08:35:13][DEBUG] : t2
[2019-11-04 08:35:13][DEBUG] : postsaveFIN
[2019-11-04 08:36:04][DEBUG] : Cron
[2019-11-04 08:36:04][DEBUG] : Cron_refresh
[2019-11-04 08:36:40][DEBUG] : presave
[2019-11-04 08:36:40][DEBUG] : postupdate
[2019-11-04 08:36:40][DEBUG] : Cron
[2019-11-04 08:36:40][DEBUG] : Cron_refresh
[2019-11-04 08:36:40][DEBUG] : postsave
[2019-11-04 08:36:40][DEBUG] : t2
[2019-11-04 08:36:40][DEBUG] : postsaveFIN
[2019-11-04 08:37:03][DEBUG] : Cron
[2019-11-04 08:37:03][DEBUG] : Cron_refresh
[2019-11-04 08:37:03][DEBUG] : Cron_refresh execution commande
[2019-11-04 08:37:03][DEBUG] : Lecture_parametre
[2019-11-04 08:37:03][DEBUG] : Connection au serveur 192.168.0.250:5001
[2019-11-04 08:37:03][DEBUG] : Requete_1#00001A---0002DATR0;EEC2
[2019-11-04 08:37:03][DEBUG] : Reponse_1#00001A---0059DATR0;65;0;1;12;0;0;0;0;205;220;50;350;-435;0;0;0;-435;0;0;0;457;0;1;1;5;0;5;5;5;1;1;5;5;5;5;1785
[2019-11-04 08:37:03][DEBUG] : Requete_2#00002A---0002DATR2;6B85
[2019-11-04 08:37:03][DEBUG] : Reponse_2#00002A---0032DATR2;1;0;0;0;0;-435;0;0;0;-435;0;0;0;0;0;0;0;0;0;0;0;D7D8
[2019-11-04 08:37:03][DEBUG] : Requete_3#00003A---0002DATR1;902A
[2019-11-04 08:37:03][DEBUG] : Reponse_3#00003A---0027DATR1;0;185;50;350;200;100;350;220;100;350;FBA9
[2019-11-04 08:37:03][DEBUG] : test etat stove0:36
[2019-11-04 08:37:04][DEBUG] : Rafraichissement des informations du poele

Au début la commande refresh s’execute, si je lance une sauvegarde
Je n’ai plus Cron_refresh execution commande dans les logs et la commande ne s’exécute pas
Si je relance une sauvegarde, j’ai a nouveau l’exécution de la commande!
Bref une fois sur 2 l’appuie sur le bouton sauvegarder, j’ai bug sur la commande:

if (!is_object($cmd)) {//Si la commande n'existe pas

EDIT> Je me demande si il ne faut arrêter le cron avant la sauvegarde et le relancer après la sauvegarde?

Salut,

Non, ce n’est pas nécessaire normalement.

Mais donc que fais-tu lors de la sauvegarde de ton équipement?
Est-ce que tu recréés tes commandes systématiquement? (perso je ne fais pas cela quand c’est possible, je trouve que ca ralenti trop le save) Si tu fais cela, n’oublie pas de d’abord rechercher la commande et ne la re-créer que si elle n’existe pas.
Il y a manifestement quelque chose qui fait que ta commande n’existe plus (temporairement ou pas, difficile à dire sans plus de vue sur le code)

Encore merci Mips pour toutes tes réponses :wink:
Normalement je ne recréer pas toutes les commandes car j’ai une condition sur chaque commande:

 if (!is_object($hottohCmd)) {
        	$hottohCmd = new hottohCmd();
            $hottohCmd->setName(__('Fabriquant', __FILE__));
    	}

Code complet sur github:

C’est vrai que dans postsave() j’ai mis toutes les commandes, j’ai suivi sur un modèle existant.
C’est mon premier plugin :slight_smile:
Il y a la sauvegardes des commandes:
$hottohCmd->save();
Mis a part cette méthode qui me permet d’enregistrer à chaque clique sur sauvegarder!

Salut,

J’ai installé en beta pour vérifier et ca confirme mon idée; je suspecte la chose suivante:
je vois que tu as beaucoup de tab avec des commandes listées mais sur aucun n’apparaît la commande « refresh »;
du coup au save cette commande est supprimée par jeedom (car elle n’est pas/plus listée) et à la fin de ton postSave elle est recrée; à chaque fois ou une fois sur deux je ne sais pas dire comme ça.

Une solution, si cela se confirme, serait d’utiliser la méthode « dontRemoveCmd » de la class hottohCmd avec un bout de code ressemblant à ceci de sorte à empêcher la suppression de cette commande refresh:

if ($this->getId() == 'refresh') {
     return true;
}

Merci Mips, j’ai pas trop le temps de regardé en ce moment. Surement plus de temps le week end prochain.
J’ai compris ce qu’il faut faire.
Encore merci

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