Il semblerai que la fonction scenarioExpression::wait($condition,300);n’accepte pas une chaine de caractère reconstitué. ($condition = "#".$contOpen."#==0")
Ensuite dans ton code actuel, tu ne contrôle pas le retour de la fonction wait, donc ta commande $cmdVolet->execCmd(); sera exécuté dans tous les cas.
Voici un code qui devrait fonctionner :
// récup tags
$tags = $scenario->getTags();
$tagVolet = trim($tags['#tagAction#'],'\"');
$cmdVolet = cmd::byString('#'.$tagVolet.'#');
$contOpen = trim($tags['#tagDo#'],'\"');
$id_contOpen = cmd::byString('#'.$contOpen.'#')->getId(); // id de la commande
// attendre que le DO se ferme...
$condition = '#'.$id_contOpen.'# == 0'; // pour log
$condition_log = '#'.$contOpen.'# == 0'; // pour fonction wait
$scenario->setLog('Attente de '.$condition_log);
if (scenarioExpression::wait($condition,300)) {
$scenario->setLog('[OK] la condition a été remplie, exécution de la commande #'.$tags['#tagAction#'].'#');
$cmdVolet->execCmd();
}
else $scenario->setLog('[NOK] Timeout dépassé !!!');
Dans l’exemple ci-dessus, j’ai contourné le problème (1), en envoyant plutôt l’id que le nom de commande. if (scenarioExpression::wait($condition,300)) ici j’attend que la fonction renvoie « true » pour exécuter la commande $cmdVolet->execCmd();
J’ai la modification en parallèle, la condition est bien remplie mais la boucle ne sort pas.
@Bison@Jeandhom
Ce sont de très bonnes idées mais dommage de réimplémenter la roue … La fonction est utilisée dans Jeedom via « wait » ca m’embête de tout refaire.
@Phpvarious
Ah oui super top ça merci beaucoup, excellentes idées. Je vais essayer d’implémenter avec ce bloc.
Encore merci à tous (je reviens dans la semaine confirmer que ca roule comme ça)
Oui mais ce que vous ne comprenez pas c’est que en quelques sorte la condition est évaluée une seule fois dans votre bloc code…
extrait:
$condition = '#'.$id_contOpen.'# == 0'; // pour log
$condition_log = '#'.$contOpen.'# == 0'; // pour fonction wait
$scenario->setLog('Attente de '.$condition_log);
if (scenarioExpression::wait($condition,300)) {
$scenario->setLog('[OK] la condition a été remplie, exécution de la commande #'.$tags['#tagAction#'].'#');
$cmdVolet->execCmd();
}
La première ligne ci-dessus est « composée » une seule fois, au début. Donc le wait va toujours évaluer le même test.
Hum, je ne vois pas tellement pourquoi, pour moi $condition n’est ni vrai ni false c’est une chaine de char.
Comment faudrait-il faire pour passer la référence à la condition sans qu’elle soit évaluée ?
A priori ca fonctionne correctement chez moi avec le code de @Phpvarious , merci !
J’ai même pu utiliser une condition telle que scenario(#18#) == 0 pour m’assurer que le scenario à l’ID 18 est bien arrêté.
# equiv. wait("scenario(#[Volets][Bureau][Arrêter Volet Bureau]#) == 0",10) ;
$condition = 'scenario(#'.$id_scenario_arret_volet_bureau.'#) == 0';
$scenario->setLog('Attente de '.$condition);
if (scenarioExpression::wait($condition,10)) {
$scenario->setLog('[OK] la condition a été remplie');
}
else {
$scenario->setLog('[NOK] Timeout dépassé !!!');
}
EDIT confirmation aux logs :
[2021-10-11 16:43:11][SCENARIO] Attente de scenario(#164#) == 0
[2021-10-11 16:43:12][SCENARIO] [OK] la condition a été remplie
[2021-10-11 16:43:12][SCENARIO] 2458 valeur :72
[2021-10-11 16:43:12][SCENARIO] Commande : fermer-redboule
[2021-10-11 16:43:12][SCENARIO] Attente de #2458# == 50
[2021-10-11 16:43:18][SCENARIO] [OK] la condition a été remplie
[2021-10-11 16:43:18][SCENARIO] 2458 valeur :50
[2021-10-11 16:43:18][SCENARIO] Fin correcte du scénario