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:
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
hello 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() ?
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 …
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();
}
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…
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).