Problème sur les warning et danger
Problème sur les warning et danger
Bonjour,
Je rencontre un problème avec les warning et danger sur condition pendant plus de x minutes. Ils apparaissent puis disparaissent.
J’avais un warning que je ne voyais jamais alors que sur l’historique on voyait qu’il aurait du y être.
J’ai donc fais des tests en passant par un virtuel pour voir si le problème venait du core ou du plugin qui me génère la valeur. Je reproduit le phénomène avec un virtuel.
Test 1: j’ai fait un virtuel avec une info numérique ayant pour valeur #minute# et Cron de refresh à la minute. Warning si #value#<50 pendant plus de 2 minutes et danger si >55 plus de 2 minutes.
=> je n’ai eu ni warning ni danger, je n’ai pas compris.
Test 2: j’ai enlevé le Cron de refresh et voilà ce que j’observe:
J’ai activé avec la valeur à 4
Quand il était 6, j’ai bien eu le warning. J’ai lancé un refresh, la valeur est passée à 6 mais le warning a disparu...
Pour creuser un peu plus, j’ai fait un refresh à 7.
Le warning est arrivé à 8, un autre refresh l’a enlevé.
C’est donc un refresh de la valeur quand on est en warning qui remet le compteur à 0 même si on est encore dans la condition.
J’ai testé sur l’alerte, même phénomène.
J’espere avoir était clair dans l’explication et que ça aidera à trouver le problème.
Je rencontre un problème avec les warning et danger sur condition pendant plus de x minutes. Ils apparaissent puis disparaissent.
J’avais un warning que je ne voyais jamais alors que sur l’historique on voyait qu’il aurait du y être.
J’ai donc fais des tests en passant par un virtuel pour voir si le problème venait du core ou du plugin qui me génère la valeur. Je reproduit le phénomène avec un virtuel.
Test 1: j’ai fait un virtuel avec une info numérique ayant pour valeur #minute# et Cron de refresh à la minute. Warning si #value#<50 pendant plus de 2 minutes et danger si >55 plus de 2 minutes.
=> je n’ai eu ni warning ni danger, je n’ai pas compris.
Test 2: j’ai enlevé le Cron de refresh et voilà ce que j’observe:
J’ai activé avec la valeur à 4
Quand il était 6, j’ai bien eu le warning. J’ai lancé un refresh, la valeur est passée à 6 mais le warning a disparu...
Pour creuser un peu plus, j’ai fait un refresh à 7.
Le warning est arrivé à 8, un autre refresh l’a enlevé.
C’est donc un refresh de la valeur quand on est en warning qui remet le compteur à 0 même si on est encore dans la condition.
J’ai testé sur l’alerte, même phénomène.
J’espere avoir était clair dans l’explication et que ça aidera à trouver le problème.
Re: Problème sur les warning et danger
Bonjour,
De mémoire ce bug est corrigé en v4
De mémoire ce bug est corrigé en v4
Aide nous à t'aider : mets des logs, détaille ton soucis... Vous n'aurez aucune réponse de ma part si votre demande n'est pas détaillée (log, capture d'écran lisible...) ou si vous ne postez pas dans la bonne section
Re: Problème sur les warning et danger
Ok, merci
Re: Problème sur les warning et danger
@loic: Si ca peut t’aider à valider à valider que c’est bien ça:
Si j’ai bien compris le fonctionnement:
Le problème est que lors du refresh de la valeur lorsqu’on est déjà en warning, le cron duringAlertLevel qui n’existe plus est recréé, il ne devrait pas être recréé puisqu’on n’est pas sorti de la condition.
Du coup comme le cron existe tu enlèves le warning (tu considère qu’on attend l’execution du cron pour atteindre le délai).
Par contre j’ai pas bien compris exactement où c’etait dans le code alors je sais pas aller plus loin
Si j’ai bien compris le fonctionnement:
Le problème est que lors du refresh de la valeur lorsqu’on est déjà en warning, le cron duringAlertLevel qui n’existe plus est recréé, il ne devrait pas être recréé puisqu’on n’est pas sorti de la condition.
Du coup comme le cron existe tu enlèves le warning (tu considère qu’on attend l’execution du cron pour atteindre le délai).
Par contre j’ai pas bien compris exactement où c’etait dans le code alors je sais pas aller plus loin
Re: Problème sur les warning et danger
Oui je vois j'ai rajouté une securité en plus dans la futur 3.3.30 et v4 on verra sur ca corrige
Aide nous à t'aider : mets des logs, détaille ton soucis... Vous n'aurez aucune réponse de ma part si votre demande n'est pas détaillée (log, capture d'écran lisible...) ou si vous ne postez pas dans la bonne section
Re: Problème sur les warning et danger
Ok, merci.
Re: Problème sur les warning et danger
Bonjour Loïc,
Malheureusement, le mise à jour d’aujourd’hui ne corrige pas le problème.
Pour résumer:
Alerte si valeur < seuil plus de x minutes.
Le passage sous le seuil créé un cron « duringAlertLevel »
Différents changements de valeur en restant sous le seuil ne font rien (cron déjà présent)
Le cron s’execute => passage en alerte
La valeur change (encore sous le seuil), l’alerte disparaît et le cron est recréé (=> le compteur repart).
A première vu, je pense que le soucis est la ( fichier cmd.class.php à partir de la ligne 1584 en alpha):
Code : Tout sélectionner
if ($_allowDuring && $currentLevel != 'none' && $this->getAlert($currentLevel . 'during') != '' && $this->getAlert($currentLevel . 'during') > 0) {
$cron = cron::byClassAndFunction('cmd', 'duringAlertLevel', array('cmd_id' => intval($this->getId())));
$next = strtotime('+ ' . $this->getAlert($currentLevel . 'during', 1) . ' minutes ' . date('Y-m-d H:i:s'));
if (!is_object($cron)) {
$cron = new cron();
} else {
$nextRun = $cron->getNextRunDate();
if ($nextRun !== false && $next > strtotime($nextRun) && strtotime($nextRun) > strtotime('now')) {
return 'none';
}
}
$cron->setClass('cmd');
$cron->setFunction('duringAlertLevel');
$cron->setOnce(1);
$cron->setOption(array('cmd_id' => intval($this->getId())));
$cron->setSchedule(cron::convertDateToCron($next));
$cron->setLastRun(date('Y-m-d H:i:s'));
$cron->save();
return 'none';
Je suis dans la condition de l’alerte et il y a un during de configuré => premier if est vrai. il n’y a pas de cron de présent (il s’est exécuté avant) => il est créé(2eme if) et le niveau d’alerte retourné est none.
Après je dis peut-être une grosse connerie et c’est géré ailleurs...
Re: Problème sur les warning et danger
C'est sur la fonction duringAlertLevel le test en faite le cron est créé quoi qu'il se passe. Sur mes tests je n'ai plus de soucis de mon côté avec le nouveau code. Peut être redémarrer jeedom pour être sûr que ça soit pris en compte.
Aide nous à t'aider : mets des logs, détaille ton soucis... Vous n'aurez aucune réponse de ma part si votre demande n'est pas détaillée (log, capture d'écran lisible...) ou si vous ne postez pas dans la bonne section
Re: Problème sur les warning et danger
J’ai redémarré et retesté, même problème.
Par contre, vu ta réponse je pense qu’on ne parle pas exactement de la même chose.
Le duringalertlevel met bien l’alarme, c’est le changement suivant de valeur qui réinitialise le niveau d’alerte et relance le compteur. (Je suis en alerte entre l’execution du cron et le changement de valeur suivant)
Je n’ai i Pas l’impression que duringalertlevel soit appelé dans ce cas là.
J’ai l’impression que le code appelé au changement de valeur et celui mis plus haut. En tout cas ça correspond exactement à ce que je vois (alerte retournée à none et cron recréé)
Re: Problème sur les warning et danger
Ok je pense comprends je regarde demain
Aide nous à t'aider : mets des logs, détaille ton soucis... Vous n'aurez aucune réponse de ma part si votre demande n'est pas détaillée (log, capture d'écran lisible...) ou si vous ne postez pas dans la bonne section
Re: Problème sur les warning et danger
Ok pourrais tu tester un truc dans le code que tu as copier collé au lieu de :
return 'none';
mettre :
return $this->getCache('alertLevel');
Ca renverra l'ancien status ce qui sera mieux je pense.
return 'none';
mettre :
return $this->getCache('alertLevel');
Ca renverra l'ancien status ce qui sera mieux je pense.
Aide nous à t'aider : mets des logs, détaille ton soucis... Vous n'aurez aucune réponse de ma part si votre demande n'est pas détaillée (log, capture d'écran lisible...) ou si vous ne postez pas dans la bonne section
Re: Problème sur les warning et danger
je vais tester ce soir (je suis au bureau).
mais a priori je dirais que ça posera probleme au second changement de valeur parceque comme le cron existera on passera dans ce cas là:
Code : Tout sélectionner
else {
$nextRun = $cron->getNextRunDate();
if ($nextRun !== false && $next > strtotime($nextRun) && strtotime($nextRun) > strtotime('now')) {
return 'none';
Code : Tout sélectionner
&& $prevlevel != $currentLevel
Re: Problème sur les warning et danger
Effectivement alors peut etre ca :
Code : Tout sélectionner
public function checkAlertLevel($_value, $_allowDuring = true) {
if ($this->getType() != 'info' || ($this->getAlert('warningif') == '' && $this->getAlert('dangerif') == '')) {
return 'none';
}
global $JEEDOM_INTERNAL_CONFIG;
$currentLevel = 'none';
foreach ($JEEDOM_INTERNAL_CONFIG['alerts'] as $level => $value) {
if (!$value['check']) {
continue;
}
if ($this->getAlert($level . 'if') != '') {
$check = jeedom::evaluateExpression(str_replace('#value#', $_value, $this->getAlert($level . 'if')));
if ($check == 1 || $check || $check == '1') {
$currentLevel = $level;
}
}
}
if($currentLevel == $this->getCache('alertLevel')){
return $currentLevel;
}
if ($_allowDuring && $currentLevel != 'none' && $this->getAlert($currentLevel . 'during') != '' && $this->getAlert($currentLevel . 'during') > 0) {
$cron = cron::byClassAndFunction('cmd', 'duringAlertLevel', array('cmd_id' => intval($this->getId())));
$next = strtotime('+ ' . $this->getAlert($currentLevel . 'during', 1) . ' minutes ' . date('Y-m-d H:i:s'));
if (!is_object($cron)) {
$cron = new cron();
} else {
$nextRun = $cron->getNextRunDate();
if ($nextRun !== false && $next > strtotime($nextRun) && strtotime($nextRun) > strtotime('now')) {
return 'none';
}
}
$cron->setClass('cmd');
$cron->setFunction('duringAlertLevel');
$cron->setOnce(1);
$cron->setOption(array('cmd_id' => intval($this->getId())));
$cron->setSchedule(cron::convertDateToCron($next));
$cron->setLastRun(date('Y-m-d H:i:s'));
$cron->save();
return 'none';
}
if ($_allowDuring && $currentLevel == 'none') {
$cron = cron::byClassAndFunction('cmd', 'duringAlertLevel', array('cmd_id' => intval($this->getId())));
if (is_object($cron)) {
$cron->remove(false);
}
}
return $currentLevel;
}
Aide nous à t'aider : mets des logs, détaille ton soucis... Vous n'aurez aucune réponse de ma part si votre demande n'est pas détaillée (log, capture d'écran lisible...) ou si vous ne postez pas dans la bonne section
Re: Problème sur les warning et danger
je viens de penser a un cas ou ça ne marchera pas: quand on est en warning, et que le niveau de danger a été dépassé mais pas son temps...
=> il faut créer le cron pour l'alerte danger mais rester en warning.
du coup je pense a ça:
Code : Tout sélectionner
public function checkAlertLevel($_value, $_allowDuring = true) {
if ($this->getType() != 'info' || ($this->getAlert('warningif') == '' && $this->getAlert('dangerif') == '')) {
return 'none';
}
global $JEEDOM_INTERNAL_CONFIG;
$currentLevel = 'none';
foreach ($JEEDOM_INTERNAL_CONFIG['alerts'] as $level => $value) {
if (!$value['check']) {
continue;
}
if ($this->getAlert($level . 'if') != '') {
$check = jeedom::evaluateExpression(str_replace('#value#', $_value, $this->getAlert($level . 'if')));
if ($check == 1 || $check || $check == '1') {
$currentLevel = $level;
}
}
}
if ($_allowDuring && $currentLevel != 'none' && currentLevel !=$this->getCache('alertLevel')&& $this->getAlert($currentLevel . 'during') != '' && $this->getAlert($currentLevel . 'during') > 0) {
$cron = cron::byClassAndFunction('cmd', 'duringAlertLevel', array('cmd_id' => intval($this->getId())));
$next = strtotime('+ ' . $this->getAlert($currentLevel . 'during', 1) . ' minutes ' . date('Y-m-d H:i:s'));
if (!is_object($cron)) {
$cron = new cron();
} else {
$nextRun = $cron->getNextRunDate();
if ($nextRun !== false && $next > strtotime($nextRun) && strtotime($nextRun) > strtotime('now')) {
return $this->getCache('alertLevel');
}
}
$cron->setClass('cmd');
$cron->setFunction('duringAlertLevel');
$cron->setOnce(1);
$cron->setOption(array('cmd_id' => intval($this->getId())));
$cron->setSchedule(cron::convertDateToCron($next));
$cron->setLastRun(date('Y-m-d H:i:s'));
$cron->save();
return $this->getCache('alertLevel');
}
if ($_allowDuring && $currentLevel == 'none') {
$cron = cron::byClassAndFunction('cmd', 'duringAlertLevel', array('cmd_id' => intval($this->getId())));
if (is_object($cron)) {
$cron->remove(false);
}
}
return $currentLevel;
}
-dans le if, ajout de condition sur current level different du cache
si on passe dans le if quand meme (pour le cas cité plus haut), on renvoit le level precedent dans les 2 cas.
j'ai encore un doute si c'est pas imbriqué genre warning si <10 et danger si >20 et qu'on passe de 9 en warning à 25 par exemple... je pense que je resterai en warning
Re: Problème sur les warning et danger
A oui toujours renvoyer l'etat actuel, j'ai mis ca en alpha a tester (c'est quand meme pas simple...)
Aide nous à t'aider : mets des logs, détaille ton soucis... Vous n'aurez aucune réponse de ma part si votre demande n'est pas détaillée (log, capture d'écran lisible...) ou si vous ne postez pas dans la bonne section
Re: Problème sur les warning et danger
oui, c'est pas simple.
je pense qu'il faut complexifier en verifiant que le niveau d'alerte actuel est toujours valide pour le retourner pour que ça bug pas quand on passe d'un niveau d'alerte a l'autre sans repasser par un niveau ok qui serait entre les 2...
faudra que je pose ça sur papier pour réflechir à tous les cas.
je viens de penser à un autre cas: si tu met les 2 niveau d'alerte a la meme valeur mais avec 2 temps différents...
a priori je dirais qu'il faut passer la logique dans le for each pour gérer ce cas aussi(gérer independement les cron warning et danger) .
je reflechi a tout ça, je le met sur papier.
si j'arrive a écrire le code (c'est un language que je maitrise pas bien) je te ferai un PR, sinon je te donnerai la logique à mettre pour le gérer.
Re: Problème sur les warning et danger
j’ai beau le tourner dans tous les sens, je ne vois pas bien comment le gérer sans faire 2 cron et 2 états actuels différents pour pouvoir gérer tous les cas.
Sinon je coince toujours sur un cas genre :
Warning si >70 pendant 4 minutes
Danger si >80 pendant 6 minutes
Exemple 1: tu est à 90 pendant 5 minutes > alerte
Tu repasse à 85=> tu dois repasser en warning direct (=> il ne faut pas que le niveau alerte efface le warning)
Exemple 2: tu est à 90 pendant 10 minutes => tu dois faire warning au bout de 4 minutes et alerte au bout de 6 (=> il faut 2 cron)
En dédoublant les 2, la logique est très simple parcequ’on traite les 2 indépendamment et on retourne le plus grand comme état actuel.
La logique pour chaque est:
Par contre là je saurais mettre la logique sur papier mais pas écrire le code, ça doit faire pas mal de modifs...
Sinon je coince toujours sur un cas genre :
Warning si >70 pendant 4 minutes
Danger si >80 pendant 6 minutes
Exemple 1: tu est à 90 pendant 5 minutes > alerte
Tu repasse à 85=> tu dois repasser en warning direct (=> il ne faut pas que le niveau alerte efface le warning)
Exemple 2: tu est à 90 pendant 10 minutes => tu dois faire warning au bout de 4 minutes et alerte au bout de 6 (=> il faut 2 cron)
En dédoublant les 2, la logique est très simple parcequ’on traite les 2 indépendamment et on retourne le plus grand comme état actuel.
La logique pour chaque est:
Code : Tout sélectionner
Si je suis dans la condition
Si j’etais déjà dans ce niveau où qu’il n’y a pas de during
Je suis dans ce niveau
Sinon
Si il n’y a pas de cron je le crée
je ne suis pas dans ce niveau (que le cron existais avant ou non)
Sinon
Si il y a un cron je le supprime
je ne suis pas dans ce niveau
Re: Problème sur les warning et danger
@loic:
Quand je vois ça:
Je me dis qu’il y a déjà les 2 statuts gérés indépendamment dans le code ailleurs non?
Si oui, ça simplifie vachement pour le message précédent.
Quand je vois ça:
Code : Tout sélectionner
$status = array(
'warning' => 0,
'danger' => 0,
);
Si oui, ça simplifie vachement pour le message précédent.
Re: Problème sur les warning et danger
Pas compris ya 2 status oui mais tout est géré la dans la class cmd
Aide nous à t'aider : mets des logs, détaille ton soucis... Vous n'aurez aucune réponse de ma part si votre demande n'est pas détaillée (log, capture d'écran lisible...) ou si vous ne postez pas dans la bonne section
Re: Problème sur les warning et danger
Oui, mais pour gérer tous les cas il faut gérer indépendamment les 2 statut avec la logique mise plus haut (un statut warning et un alerte différent en 2 cron différents aussi) et retourner le plus élevé des 2 qui est actif.
En gros si tu as un getcache pour le warning et un autre pour le danger et un cron duringalertlevelwarning et un duringalertleveldanger il y a moyen de gérer tous les cas en testant indépendamment les 2 avec la logique que j’ai mis plus haut dans chaque.
Je peux t’ecrire Le code si tu veux et tu me dit quoi. La seule chose que je ne saurais pas faire c’est mettre dans le cache les 2 infos pour que les 2 getcache retournent quelquechose...
En gros si tu as un getcache pour le warning et un autre pour le danger et un cron duringalertlevelwarning et un duringalertleveldanger il y a moyen de gérer tous les cas en testant indépendamment les 2 avec la logique que j’ai mis plus haut dans chaque.
Je peux t’ecrire Le code si tu veux et tu me dit quoi. La seule chose que je ne saurais pas faire c’est mettre dans le cache les 2 infos pour que les 2 getcache retournent quelquechose...
Qui est en ligne ?
Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 10 invités