Action sur valeur et delete_variable

Bonjour,

Sur jeedom, j’ai un équipement (plugin jMQTT en l’occurence mais j’ai testé sur nouvelle VM avec le plugin virtuel et même constat) où j’active la fonction « Action sur valeur » de la façon suivante :

L’équipement sur ma base test est ainsi :

J’ai beau passé le slider à X (entre 1 et 100) à 0, cela ne déclenche jamais la suppression de la variable.

En revanche, si je met comme action « Message » avec par exemple « Test message », j’ai bien le message, le déclenchement se fait donc bien.

Prérequis :

Rencontrez-vous ce problème également ?
Est-ce que je rate quelque chose ?

Bonjour,

Une variable supprimée a quelle valeur? Est ce 0

Peux tu essayer par action sur valeur « différent » de 0? pour voir si 0 est forcé

Merci pour ta lecture

Ma variable est ainsi :

J’ai mis différent à la place de égal et j’ai fait varié le slider mais cela ne change rien : la variable n’est jamais supprimée

Salut,

Ca serait bien de donner ta version de jeedom ou idélament la page santé pour voir dans quelle conf tu est exactement.

Perso je n’utilise jamais le delete_variable.

En workaround je dirais de passer par un scénario mais bon clairement ça fait usine à gaz déja que je trouve que c’est un peu le cas la …

C’est quoi le besoin fonctionnel de faire cette suppression de variable ?

Bonjour Aurel

Merci
C’est mis dans mon premier message, prérequis d’un bon jeedomien :wink:

Je te la remet si tu ne l’as pas vu :

Oui j’ai viré le scénario pour faire du ménage il y a plus d’1 an pour utiliser les fonctionnalités natives du core.

Le besoin c’est de ne conserver les variables que lorsqu’elles servent (et ça permet de tester les fonctions). Rien de bien méchant en soi, si elle ne se supprime pas, cela ne me gène pas du tout.
C’était surtout pour remonter le point, si cela permet de corriger un bug à quelqu’un qui en a besoin, autant en parler.

Oups désolé c’est la fin de la semaine :face_with_spiral_eyes:

Non en fait ma question c’était plus pourquoi supprimer une variable dans ce cas précis ?

En fait si tu veux c’est juste que si tu supprime la variable à chaque fois que le slider revient à 0 je suis pas sur que stocker cette info sous forme de variable soit le plus adapté.

La création et la suppression d’une variable va faire des lectures/écritures sur le disque, si c’est quelque chose qui bouge très fréquemment je pense que le mieux est de stocker l’info dans une commande d’un virtuel qui à l’avantage d’utiliser le cache de jeedom.

Enfin tout dépend du besoin fonctionnel précis qui peut confirmer ou infirmer ce que je viens de dire :wink:

Pas de soucis

Sur ma vraie VM, la variable est créé par un scénario qui surveille l’activation de mes lumières ou prises sur lesquelles j’ai défini des durées d’activation max.
Quand le compteur arrive à 0, cela me demande si je veux couper ou non l’équipement (coupure en cas de non réponse) et sinon je repousse avec un délai de mon choix.
L’objectif ici est que :

  • si l"équipement est activé et que le compteur commence
  • mais que j’éteins l’équipement avant que le compteur n’arrive à 0
  • cela efface le compteur pour qu’à la prochaine activation, il reparte de X (par exemple 3h pour 15 minutes

Je ne sais pas si c’est clair

Au cas où
Le scénario en question (fonctionne depuis une dizaine d’année), cron à 5 minutes

require_once dirname(__FILE__) . '/../../data/php/user.function.class.php'; //Ajout des fonctions personnelles

function demande($cmd_id,$question,$reponse,$variable_reponse,$timeout) {
	$options_cmd = array('title' => '', 'message' => $question, 'answer' => explode(';', $reponse), 'timeout' => $timeout, 'variable' => $variable_reponse);
	$cmd = cmd::byString($cmd_id);
	$cmd->setCache('ask::variable', $variable_reponse);
	$cmd->setCache('ask::endtime', strtotime('now') + $timeout);
	$cmd->setCache('ask::answer', $options_cmd['answer']);
	$cmd->execCmd($options_cmd);
	$occurence = 0;
	$value = '';
	while (true){
		$dataStore = dataStore::byTypeLinkIdKey('scenario', -1, $variable_reponse);
		if (is_object($dataStore)){
			$value = $dataStore->getValue();
		}                          
		if ($value != ''){
			break;
		}
		if ($occurence > $timeout){
			break;
		}
		$occurence++;
		sleep(1);
	}
	if ($value == ''){
		$value = 'Aucune réponse';
		$cmd->setCache('ask::variable', 'none');
		$dataStore = dataStore::byTypeLinkIdKey('scenario', -1, $variable_reponse);
		$dataStore->setValue($value);
		$dataStore->save();
	}
	return $value;
}

//Récupération du demandeur
$tags = $scenario->getTags();// Récupération des tags passés
(empty($tags['#TelegramSource#'])) ? $tags['#TelegramSource#'] = '#[Communication][Telegram][Maison - -]#' : null;// Vérification de l'existance du tag, si ce dernier n'existe pas, on le crée avec la valeur souhaité.
$cmdmsg_id = $tags['#TelegramSource#'];

$surveillance = array(
	array('Commandes suivies','Libellé','Type (Singulier/Pluriel)','Seuil en minutes'),
	array('#[Bureau][FWP][Etat]#','La prise de l\'imprimante','S','#[Configuration][Lumières - Timers][Imprimante]#'),
	array('#[Salle de bain][Brosse à dents][Etat]#','La base de la brosse à dents','S','#[Configuration][Lumières - Timers][Brosse à dents]#'),
	array('#[Extérieur][Lumière][Etat]#','La lumière de dehors','S','#[Configuration][Lumières - Timers][Extérieur - Lumière]#'),
	array('#[Extérieur][Lumière Baie][Etat]#','La lumière de la baie','S','#[Configuration][Lumières - Timers][Extérieur - Lumière Baie]#'),
	array('#[Zone Nuit][Spots][Etat]#','Les spots du couloir','P','#[Configuration][Lumières - Timers][Zone Nuit - Spots]#'),
	array('#[Salon][Spots][Etat]#','Les spots du salon','P','#[Configuration][Lumières - Timers][Salon - Spots]#'),
	array('#[Cuisine][Spots][Etat]#','Les spots de la cuisine','P','#[Configuration][Lumières - Timers][Cuisine - Spots]#'),
	array('#[Cuisine][Lumière Table][Etat]#','La lumière de la table de la cuisine','S','#[Configuration][Lumières - Timers][Cuisine - Lumière Table]#'),
	array('#[Cuisine][Lumière Evier][Etat]#','La lumière de l\'évier de la cuisine','S','#[Configuration][Lumières - Timers][Cuisine - Lumière Evier]#')
);

$scenario->setLog('Lancement de la boucle de surveillance');

for($i = 0; $i < count($surveillance); $i++) {
if ($i > 0) {
	$cmd = cmd::byString($surveillance[$i][0]);
	$cmd_id = $cmd->getId();
	$cmd_name = $cmd->getHumanName();
	$cmd_subtype = $cmd->getSubType();
	$value = $cmd->execCmd();
	$eqlogic_id = $cmd->getEqLogic_id();
	$eqlogic = eqLogic::byId($eqlogic_id);
		$eqlogic_name = $eqlogic->getName();
		$eqlogic_object = substr($eqlogic->getHumanName(),1,strlen($eqlogic->getHumanName())-1-2-strlen($eqlogic_name)-1);
			$eqlogic_name2 = str_replace(' ','',$eqlogic_name);
			$eqlogic_object2 = str_replace(' ','',$eqlogic_object);
	$seuil = cmd::byString($surveillance[$i][3])->execCmd();
$scenario->setLog($i . ' - ' . $surveillance[$i][0] . ' - ' . $surveillance[$i][1] . ' - ' . $surveillance[$i][2] . ' - ' . $seuil);
	// Calcul durée On
	$duree_on = 0;
	if ($cmd_subtype == 'binary' && $value == 1) {
		$duree_on = scenarioExpression::laststateduration($cmd_id,1);
	} else if ($cmd_subtype == 'numeric' && $value >= 1) {
		$duree_on = scenarioExpression::lastChangeStateDuration($cmd_id,0) - scenarioExpression::lastStateDuration($cmd_id,0);
	}
	// Si dépassement du seuil : action
	$seuil_en_sec = $seuil*60;
	if ($duree_on > $seuil_en_sec) {
		$scenario->setLog('- Allumage de ' . $cmd_name . ' depuis ' . $duree_on . ' secondes (seuil : ' . $seuil_en_sec . ').');
		$variable_reponse = 'Suivi_'. $eqlogic_object2 . '_' . $eqlogic_name2; // nom de la variable qui stockera la réponse
		$variable_compteur = $variable_reponse . '_compteur';
		// Si compteur actif est supérieur à la dernière diminution de 5 minutes, on modifie le compteur sinon action
		if ($scenario->getData($variable_compteur) > (5 / 60)) {
			$scenario->setData($variable_compteur,round($scenario->getData($variable_compteur) - 1 * 5 / 60,4));
		} else if ($cmd_name <> '[Salle de bain][Brosse à dents][Etat]' || ($surveillance[$i][0] == '[Salle de bain][Brosse à dents][Etat]' && (date('Hi')>0620 && date('Hi')<2240))) {
			$scenario->removeData($variable_reponse);
			//Paramètres du ask
			if ($surveillance[$i][2] == 'P') {
				$question = $surveillance[$i][1] . ' sont allumés depuis plus de ' . userFunction::secondsToTime($seuil_en_sec) . '. Souhaitez-vous les éteindre ?';
			} else {
				$question = $surveillance[$i][1] . ' est allumée depuis plus de ' . userFunction::secondsToTime($seuil_en_sec) . '. Souhaitez-vous l\'éteindre ?';
            }
			$reponse = 'Oui;Non';
			$timeout = '60'; // time out pour la réponse

			$scenario->setData($variable_reponse,'');//On vide la variable
			$value = demande($cmdmsg_id,$question,$reponse,$variable_reponse,$timeout);

			//Traitement de la reponse
			if ($value == 'Aucune réponse' || $value == 'Oui'){
				$cmd = cmd::byString('#[' . $eqlogic_object . '][' . $eqlogic_name . '][Off]#');
				$cmd->execCmd();

				$msg = 'J\'ai éteint ' . strtolower($surveillance[$i][1]) . '.';
				$cmd = cmd::byString($cmdmsg_id);
				$cmd->execCmd($options=array('title'=> "empty=1",'message'=> $msg), $cache=0);
				$scenario->removeData($variable_reponse);
			} else if ($value == 'Non'){
				$scenario->removeData($variable_reponse);
				//Paramètres du ask
				$question = 'Pendant combien d\'heures souhaitez-vous reporter le suivi ?';
				$reponse = '1;2;3;4;5;6';
				$variable_reponse = $variable_compteur;
				$timeout = '60'; // time out pour la réponse 

				$scenario->setData($variable_reponse,'');//On vide la variable
				$value = demande($cmdmsg_id,$question,$reponse,$variable_reponse,$timeout);

				//Traitement de la reponse
				if ($value == 'Aucune réponse'){
					$msg = 'Mise en place d\'un délai d\'1 heure.';
					$cmd = cmd::byString($cmdmsg_id);
					$cmd->execCmd($options=array('title'=> "empty=1",'message'=> $msg), $cache=0);
				} else {
					if ($scenario->getData($variable_reponse) == 1) {
						$msg = 'Mise en place d\'un délai d\'1 heure.';
                    } else {$msg = 'Mise en place d\'un délai de ' . $scenario->getData($variable_reponse) . ' heures.';}
					$cmd = cmd::byString($cmdmsg_id);
					$cmd->execCmd($options=array('title'=> "empty=1",'message'=> $msg), $cache=0);
				}
            }
        }
	}
}
}

Bonjour,

Cherche pas il y a une erreur dans le core.

Je vais pousser une PR pour résoudre ce problème.

Edit : PR fait.

3 « J'aime »

Bonjour
Top, merci pour ton investigation et ta trouvaille :slight_smile:

EDIT @Phpvarious : je l’ai appliqué pour voir mais cela ne change rien, même après reboot