Scénarios : Petits codes entre amis

pour stopper un autre scenario que celui qui est actif :
$scenario_other = scenario::byId($ID);
$scenario_other->stop();

chez moi me permet de stopper un autre scénario actif …
si ca peut aider …

Merci Manu
Est-ce que tu peux stopper le scenario lui-même (celui qui exécute le bloc code) ?
La subtilité est peut être là.

hello :slight_smile: je like ce sujet ! et j’ajoute une contribution, ce code me sert à exporter 4 valeurs dans un fichier csv, c’est des moyennes de températures quotidiennes, donc le scénario est exécuté 1 fois par jour

/* fonction moyenne d'hier */
function AverageYesterday($command){
	$result = scenarioExpression::average($command, 'Yesterday');
	return number_format($result, 1 , ',' , ' ');
}

$exterieur = AverageYesterday('#[Objet Test][Température][Extérieur]#');
$bureau = AverageYesterday('#[Objet Test][Température][Bureau]#');
$salon = AverageYesterday('#[Objet Test][Température][Salon]#');
$entree = AverageYesterday('#[Objet Test][Température][Entrée]#');

$date = new DateTime('yesterday');
/* mise en forme des data au format CSV - séparateur */
$data = $date->format('Y-m-d').';'.$exterieur.';'.$bureau.';'.$salon.';'.$entree;
/* ajout dans le fichier csv existant */
if( file_put_contents('/var/www/html/backup/ExportTemperatures.csv', $data ."\n", FILE_APPEND) === false){
  message::add('Scénario' . $scenario->getHumanName(), 'Erreur Copie Fichier des Températures', $data);
  $scenario->setLog("Erreur copie fichier:" . $data);
}else{
  $scenario->setLog($data);
}

Pour stopper le scénario en cours, peut être utiliser la fonction php exit() ?

Désolé, je viens de poster le même sujet. La fonction php exit() provoque les mêmes symptomes chez moi que ceux que tu décris.

Bonjour à tous,

Je cherche à coder l’envoie d’un ask et la récupération de la réponse dans une variable, mais rien ne semble fonctionner. Quelqu’un à une idée ?
Ca fonctionne très bien en scénario classique, mais impossible de l’intégrer dans mon code …

Merci d’avance …

Manu

Bonsoir,

J’édite mon post (même s’il est vieux) car la fonction que j’avais trouvée ne fonctionnait plus correctement depuis une MAJ du core. La fonction fonctionnait toujours avec du « oui;non » classique mais pas avec autre chose comme par exemple « oui;non;déjà fait » comme choix de réponse.

Il faut ajouter maintenant cette ligne dans le code de la fonction : $cmd->setCache(‹ ask::answer ›, $options_cmd[‹ answer ›])

$name_variable = xxxx; // nom de la variable qui stockera la réponse
$time_limit = yy; // time out pour la réponse 
$cmd_ask = '#[zzzzzzz][zzzzzzzzzzz][Notification]#'; // nom de la commande
$scenario->setData($name_variable,'');
$options_cmd = array('title' => 'Un titre à la notif', 
							'message' => 'Un message ou question ? ', 
							'answer' => explode(';', 'Oui;Non'), 
							'timeout' => $time_limit, 
							'variable' =>$name_variable);
$cmd = cmd::byString($cmd_ask);
$cmd->setCache('ask::variable', $name_variable);
$cmd->setCache('ask::answer', $options_cmd['answer']);
$cmd->setCache('ask::endtime', strtotime('now') + $time_limit);
$cmd->execCmd($options_cmd);
$scenario->setLog('Notification envoyée. Maintenant on surveille le retour...');
$occurence = 0;
$value = '';
$txt_log='';
 while (true) 
       	{
		$dataStore = dataStore::byTypeLinkIdKey('scenario', -1, $name_variable);
		if (is_object($dataStore)) 
			{
				$value = $dataStore->getValue();
 			}                          
                $txt_log += '...'.$value ;
                if ($value != '') 
                       	{
                            	break;
                         }
                if ($occurence > $time_limit) 
                         {
                                break;
                         }
                $occurence++;
                 sleep(1);
         }
$scenario->setLog($txt_log);
if ($value == '') 
	{
		$value = 'Aucune réponse';
		$cmd->setCache('ask::variable', 'none');
		$dataStore = dataStore::byTypeLinkIdKey('scenario', -1, $name_variable);
		$dataStore->setValue($value);
		$dataStore->save();
         }

Trouvé dans ce post : Intérations dans scénario via un bloc code - depuis 4.3.X (6-8)?
A+

2 « J'aime »

bonsoir, peux-tu expliquer le but de le coder en php ?
vu que tu es obligé d’utiliser ton bloc code dans un scénario ?
si c’est juste pour récupérer le contenu de la variable…

le sujet m’intéresse @ManuJ71 et @Arno44 si vous pouvez développer vos cas d’usage…

merci

Super !
Un tout grand merci Arno44 … je n’aurais jamais pu trouver tous seul !

darkmoon :
j’ai besoin ponctuellement de cette variables dans mon code ($variable) pour une condition ‹ if › mais pas de la stocker en variable globale (setData).
C’est plus facile à relire en un bloc code que de faire « bloc code » puis « bloc ask » et fixer variable en global puis de nouveau « bloc code » pour l’exploiter …
Le cas concret chez moi est la gestion d’une piscine hors sol, avec un filtre et une pompe à chaleur …
La pompe ne peut pas être allumée si le filtre ne l’est pas … Le filtre s’allume tous les matins … Le tout s’éteint la nuit sauf si la pompe est en mode Boost (me permettant de chauffer en 36-48 heures la piscine) …
Avec le ask, jeedom me demande le matin, si il doit passer en mode boost uniquement si la météo prévue est favorable (Et oui, en Belgique ce n’est pas constant).

Encore merci !

ça ressemble bien à un tag ton besoin : global au scenario et pas stocké…

Oui.
Mais le scénario est programmé, pas appelé par un autre … et en code $variable = ‹ xx ›; est qd meme plus simple …

Je ne connaissais pas la class dataStore … je vais chercher …
Merci.

Programmé, je vois pas bien la différence, un scénario est tout à fait en mesure de se créer son propre tag s’il le faut… La fonction est justement là


Tu peux tout à fait coller ça dans un if qui va bien…

Après c’est une question d’habitude de programmation

J’ai lu en diagonale mais avec un $scenario->getTags() et $scenario-> setTags() ?

1 « J'aime »

Effectivement habitudes de programmation …

Pour le dataStore si qqn comme moi ne connais pas … J’ai trouvé que c’était la class de base du stockage … donc qd on utilise setData, en fait derrière il y a :

public function setData($_key, $_value) {
$dataStore = new dataStore();
$dataStore->setType('scenario');
$dataStore->setKey($_key);
$dataStore->setValue($_value);
$dataStore->setLink_id(-1);
$dataStore->save();
return true;
}

Tiens j’ai vu une demande là dessus, mais je ne retrouve pas le post

Donc comment récupérer la programmation d’un scénario

on trouve l’info avec ça

$scenar=scenario::byId(46);
if ($scenar->getMode() != "provoke") {
   $scheduled = $scenar->calculateScheduleDate();
   $avant = $scheduled['prevDate']; //2020-04-16 00:15:00
   $apres = $scheduled['nextDate']; //2020-04-17 00:15:00
}

Super, grace à l’aide de Arno44, j’ai exactement ce qu’il me fallait …
Je l’ai replacé dans une ‹ function › … si ca peu aider qqn …

function ask_oui_non ($msg, $time_limit = '120', $who = 'Manu'){
    $id_cmd_ask = array( // id des Telegram
        'Manu'=>'2904',
        'Chrys'=>'2905',
        'Sophie'=>'4986',
    );
    if (!isset($id_cmd_ask[$who])) { // si personne mal définie
        $who = 'Manu';
    };
    $msg .= " ? (Oui / Non)";
  	
  	// crée setData depuis fonction
  	$variable = 'Ask Temporaire';
	$dataStore = dataStore::byTypeLinkIdKey('scenario', -1, $variable);
	if (!is_object($dataStore)) {
		$dataStore = new dataStore();
		$dataStore->setKey($variable);
		$dataStore->setType('scenario');
		$dataStore->setLink_id(-1);                                  
	}	
	$dataStore->setValue('');
	$dataStore->save();	
  	
  	// définit le Ask
    $options_cmd = array(
        'title' => 'Demande de Jeedom', 
        'message' => $msg, 
        'answer' => explode(';', 'Oui;Non'), 
        'timeout' => $time_limit, 
        'variable' => $variable,
    );
    $cmd = cmd::byId($id_cmd_ask[$who]);
    $cmd->setCache('ask::variable', $variable);
    $cmd->setCache('ask::endtime', strtotime('now') + $time_limit);
    $cmd->execCmd($options_cmd);
  
  	// récupère la réponse
    $occurence = 0;
    $value = '';
    while (true) {
        $dataStore = dataStore::byTypeLinkIdKey('scenario', -1, $variable);
        if (is_object($dataStore)) {
            $value = $dataStore->getValue();
        };                         
        if ($value != '' or $occurence > $time_limit) {
            break;
        };
        $occurence++;
        sleep(1);
    };
  	
  	// efface la variable et retourne la réponse
  	$dataStore = dataStore::byTypeLinkIdKey('scenario', -1, $variable);
  	$dataStore->remove();
    return $value;
};

$valeur = ask_oui_non ('Question posée');
$scenario->setLog("valeur receuillie : $valeur");


Sympa la fonction en effet !
Je mettrais plutôt, même si le résultat est le même :

while ($value == ‹  › and $occurence < $time_limit) {

}

Elle n’est pas bloquante cette boucle sinon ?

un remove_inat depuis un autre scénario avec un bloc code.

Excellent! Merci d’avoir pris le temps de regrouper ces astuces, c’est parfait, une vraie mine d’or!

Non, elle ne bloque pas (break si $occurence > $time limit) …
Je l’ai depuis installée dans les user.function.class comme méthode …