Ce Forum passera en lecture seule en janvier 2020
Image
Merci de vous rendre sur https://community.jeedom.com maintenant pour vos prochains postes ;)

Problème sur les warning et danger

De l'installation à l'utilisation venez discuter de JEEDOM au quotidien
Avatar de l’utilisateur
Poumi
Actif
Messages : 660
Inscription : 21 mars 2019, 22:41

Problème sur les warning et danger

Message par Poumi » 15 août 2019, 12:29

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.

Avatar de l’utilisateur
loic
Administrateur
Messages : 14865
Inscription : 01 févr. 2014, 16:21

Re: Problème sur les warning et danger

Message par loic » 15 août 2019, 12:46

Bonjour,
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

Avatar de l’utilisateur
Poumi
Actif
Messages : 660
Inscription : 21 mars 2019, 22:41

Re: Problème sur les warning et danger

Message par Poumi » 15 août 2019, 12:47

Ok, merci 👍

Avatar de l’utilisateur
Poumi
Actif
Messages : 660
Inscription : 21 mars 2019, 22:41

Re: Problème sur les warning et danger

Message par Poumi » 24 août 2019, 14:56

@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 😢

Avatar de l’utilisateur
loic
Administrateur
Messages : 14865
Inscription : 01 févr. 2014, 16:21

Re: Problème sur les warning et danger

Message par loic » 24 août 2019, 15:20

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

Avatar de l’utilisateur
Poumi
Actif
Messages : 660
Inscription : 21 mars 2019, 22:41

Re: Problème sur les warning et danger

Message par Poumi » 24 août 2019, 15:24

Ok, merci.

Avatar de l’utilisateur
Poumi
Actif
Messages : 660
Inscription : 21 mars 2019, 22:41

Re: Problème sur les warning et danger

Message par Poumi » 28 août 2019, 19:13

loic a écrit :
24 août 2019, 15:20
Oui je vois j'ai rajouté une securité en plus dans la futur 3.3.30 et v4 on verra sur ca corrige
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 ne vois pas de vérification qu’on ne soit pas déjà dans le niveau d’alerte avant de recréer le cron.

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...

Avatar de l’utilisateur
loic
Administrateur
Messages : 14865
Inscription : 01 févr. 2014, 16:21

Re: Problème sur les warning et danger

Message par loic » 28 août 2019, 19:32

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

Avatar de l’utilisateur
Poumi
Actif
Messages : 660
Inscription : 21 mars 2019, 22:41

Re: Problème sur les warning et danger

Message par Poumi » 28 août 2019, 19:47

loic a écrit :
28 août 2019, 19:32
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.
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éé)

Avatar de l’utilisateur
loic
Administrateur
Messages : 14865
Inscription : 01 févr. 2014, 16:21

Re: Problème sur les warning et danger

Message par loic » 28 août 2019, 19:50

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

Avatar de l’utilisateur
loic
Administrateur
Messages : 14865
Inscription : 01 févr. 2014, 16:21

Re: Problème sur les warning et danger

Message par loic » 29 août 2019, 11:00

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.
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

Avatar de l’utilisateur
Poumi
Actif
Messages : 660
Inscription : 21 mars 2019, 22:41

Re: Problème sur les warning et danger

Message par Poumi » 29 août 2019, 11:08

loic a écrit :
29 août 2019, 11:00
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.
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';
est-ce qu'il ne faudrait pas mettre ce niveau precedent dans une variable (par exemple $prevlevel) et rajouter cette condition dans le premier if

Code : Tout sélectionner

&& $prevlevel != $currentLevel
=> du coup, on ne passe pas dans le if, on ne créé pas le cron et on retourne le $currentlevel.

Avatar de l’utilisateur
loic
Administrateur
Messages : 14865
Inscription : 01 févr. 2014, 16:21

Re: Problème sur les warning et danger

Message par loic » 29 août 2019, 11:11

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

Avatar de l’utilisateur
Poumi
Actif
Messages : 660
Inscription : 21 mars 2019, 22:41

Re: Problème sur les warning et danger

Message par Poumi » 29 août 2019, 11:23

loic a écrit :
29 août 2019, 11:11
Effectivement alors peut etre ca :
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;
	}
edit: je peux pas mettre en couleur les modifs alors voila ce que j'ai fait:

-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 :(

Avatar de l’utilisateur
loic
Administrateur
Messages : 14865
Inscription : 01 févr. 2014, 16:21

Re: Problème sur les warning et danger

Message par loic » 29 août 2019, 11:29

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

Avatar de l’utilisateur
Poumi
Actif
Messages : 660
Inscription : 21 mars 2019, 22:41

Re: Problème sur les warning et danger

Message par Poumi » 29 août 2019, 11:33

loic a écrit :
29 août 2019, 11:29
A oui toujours renvoyer l'etat actuel, j'ai mis ca en alpha a tester (c'est quand meme pas simple...)
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.

Avatar de l’utilisateur
Poumi
Actif
Messages : 660
Inscription : 21 mars 2019, 22:41

Re: Problème sur les warning et danger

Message par Poumi » 29 août 2019, 21:09

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:

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

Par contre là je saurais mettre la logique sur papier mais pas écrire le code, ça doit faire pas mal de modifs...

Avatar de l’utilisateur
Poumi
Actif
Messages : 660
Inscription : 21 mars 2019, 22:41

Re: Problème sur les warning et danger

Message par Poumi » 30 août 2019, 22:00

@loic:
Quand je vois ça:

Code : Tout sélectionner

$status = array(
				'warning' => 0,
				'danger' => 0,
			);
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. :D

Avatar de l’utilisateur
loic
Administrateur
Messages : 14865
Inscription : 01 févr. 2014, 16:21

Re: Problème sur les warning et danger

Message par loic » 07 sept. 2019, 10:37

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

Avatar de l’utilisateur
Poumi
Actif
Messages : 660
Inscription : 21 mars 2019, 22:41

Re: Problème sur les warning et danger

Message par Poumi » 07 sept. 2019, 10:49

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...

Répondre

Revenir vers « Utilisation »

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 5 invités