Scénarios : Petits codes entre amis

Tags: #<Tag:0x00007f3853ca2258> #<Tag:0x00007f3853ca2140>

Hello,

Comme tout le monde, j’ai galéré au début avec les bloc CODE des scénarios et ce qu’on pouvais faire avec.

Et un petit pense bête quelque part, c’est pas mal non plus.

Alors pour ceux que çà intéresse :

https://kiboost.github.io/jeedom_docs/jeedomV4Tips/CodesScenario

A compléter au fur et à mesure …
:wink:

20 J'aimes

Cool merci !!!

C’est Signet-té

Merci kiboost !

Super idée, parce que c’est absolument surpuissant. J’ai découvert il y a peu de temps, et on peut tout faire ou presque.

Quelques exemples récents que j’ai fait en m’inspirant d’exemples sur le forum :

Et j’ai amélioré un script posté sur l’ancien forum pour récupérer des données du site Infoclimat, il faut que je le poste d’ailleurs.

Edit : et voilà pour les données du site Infoclimat

Super idée merci

Super.
J’ajoute le lien du post historique.

https://forum.jeedom.com/viewtopic.php?f=32&t=20037

Retrait d’un message dans le centre de message à partir d’un scénario.

Si il a été ajouté de cette manière:

// Ajout d'un message dans le Centre de Message

message::add('Scénario ' . $scenario->getHumanName(),'Message 2','Message 3');

Il peut être retiré de cette manière, dans le même scénario :

// Retrait d'un message dans le Centre de Message

message::removeAll('Scénario ' . $scenario->getHumanName());

Hello,

Petite maj avec un exemple de user.function php :wink:

2 J'aimes

Bonjour,
Merci pour ce tuto qui va me permettre de faire le lien entre bloc code et scenario.

Avec votre paragraphe ci-dessous, je comprends mieux pourquoi la plupart du temps, vous utilisez les apostrophes pour délimiter les chaines de caractères.

“string” ou ‘string’ sont des chaînes de caractères. Toutefois, notez la différence entre les double-quote et simple-quote. Dans une “string”, php va rechercher des variables pour les traduire, ce sera donc plus lent qu’une ‘string’. Donc utilisez toujours des simple-quote dans ce cas, sauf si vous savez pourquoi. ex:

Dans les faits, ce n’est pas plus lent.
Ce code exécuté en dehors de Jeedom:

$nb = 1000000;
$a = 'TEST';
echo 'Nbre de boucles : ' .$nb .'<br/>';
$time_start = microtime(true);
for($i=0;$i<$nb;$i++)
  $b= 'Duree ' .$a .' ' .$i;
$time_end = microtime(true);
echo 'A [\'Duree \' .$a .\' \' .$i] ' .$b .' ' .round($time_end - $time_start,3).'<br/>';

$time_start = microtime(true);
for($i=0;$i<$nb;$i++)
  $b= "Duree " .$a ." " .$i;
$time_end = microtime(true);
echo 'B ["Duree " .$a ." " .$i] ' .$b .' ' .round($time_end - $time_start,3).'s<br/>';

$time_start = microtime(true);
for($i=0;$i<$nb;$i++)
  $b= "Duree $a $i";
$time_end = microtime(true);
echo 'C ["Duree $a $i"] ' .$b .' ' .round($time_end - $time_start,3).'s<br/>';

donne les résultats suivants sur ma Smart

Nbre de boucles : 1000000
A ['Duree ' .$a .' ' .$i] Duree TEST 999999 0.823
B ["Duree " .$a ." " .$i] Duree TEST 999999 0.822s
C ["Duree $a $i"] Duree TEST 999999 0.58s

Pas de différence flagrante entre ’ et " quand il y a des concaténations.
Et dès qu’il y a une variable à insérer dans un message, entre " c’est plus rapide.
Donc pas besoin de faire un paragraphe parlant de lenteur, ni de rectifier mes PRs :wink:

Tu parle de quoi là ? :roll_eyes: :thinking:
Je vais pas fouiller le code des autres et rectifier des PRs, j’ai assez avec le core et mes plugins …

Ce n’est pas vous qui rectifiez mes PR

Merci pour ces rappels Kiboost.

Après recherche sur l’ancien forum et community, je ne trouve pas de réponse sur un bloc code : comment stopper un scénario :

  • sans bloc code : ok, j’écris stop dans une action
  • dans un bloc code : j’ai trouvé la synthèse suivante :
$scenario=scenario::byId(46);
$scenario->stop();

Mais elle n’arrête pas le scénario et le met en erreur.

De même, je souhaite le relance au début (il s’agit d’un scénario ask pour gestion avec télégram) et j’ai tenté dans le bloc code :

$scenario=scenario::byId(46);
$scenario->launch();

Mais rien n’y fait.
Avez-vous vu une idée ?

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

Bonjour Manu,
Voici pour le ask :

$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::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();
         }

A+

1 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 !