Ce code sert à allumer une pompe de piscine en amont d’une pompe à chaleur … la commande d’allumage de la pompe à paarfois des ratés et je dois être certain qu’elle est allumée avant d’allumer la pompe à chaleur …
Evidemment $id_filtre_on, $id_filtre_puissance sont définits au préalable …
mais execCmd() me renvoie un erreur dès qu’il est dans un function …
Qqn a une idée ?
Merci d’avance
NB : je sais que la boucle n’est pas protégée par un break éventuel … elle est pour l’instant sauvée par un timeout du scénario …
Hello , merci @kiboost pour ses explications sur les blocs code et aussi pour son travail sur le plugin jeerhasspy !que j’utilise depuis peu. (sur un PI3 avec un matrix voice…la classe en DIY !)
Je voulais partager ce bout de code avec vous: dans un scénario rattaché à un intent de Jeerhasspy je voulais récupérer l’action ouvre/ferme le volet n°x (qui peut aller jusqu’à 20 chez moi), mais je n’avais pas envie de coder tous les IF ELSE dans un scénario, et je voulais aussi éviter de passer toutes les conditions pour arriver à la 12ème.
J’ai donc créer un scénario avec un bloc code qui récupère le numéro de volet à actionner ainsi que l’action Up/Down (merci aux partages sur les slots et sentence.ini Rhasspy : sentences.ini) et qui génère l’action directement et voila :
Merci de t’être interressé au post mais je suis pas certains de ce que tu appelles une balise après effectivement a la relecture sans contexte c’est compliqué! action_volet_rhas est le tag généré par Rhasspy qui prend la valeur up/down et pièce_volet_rhas prend dans ce cas la valeur numérique du volet (1,2,3etc…)
lorsque je dis à Rhasspy « peux tu monter le volet 1 » → Rhasspy génère les tags
« intent »–> volet pour déclencher le scénario dans le plugin Jeerhasspy
« piece_volet_rhas » → 1
« action_volet_rhas » → up
et je génère une action variable et une seule qui donne au final
#[ Maison][Volet 1].[Volet 1 - Monter]#
résultat je n’ai pas eu à coder tous les tests sur les conditions « action » et « n# de volet » et au final ajouter un volet demain sera très facile;
Depuis le passage en V4.1++, cette fonction ne fonctionne plus !
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");
Elle retourne une erreur :
[2021-01-20 19:32:17][SCENARIO] Start : Scenario lance manuellement.
[2021-01-20 19:32:17][SCENARIO] Exécution du sous-élément de type [action] : code
[2021-01-20 19:32:17][SCENARIO] Exécution d'un bloc code
[2021-01-20 19:32:17][SCENARIO] Call to a member function setCache() on bool
[2021-01-20 19:32:17][SCENARIO] Fin correcte du scénario
Je pense que la gestion du cache a dû changer…
Est ce que quelqu’un aurait une idée pour l’adapter en V4.1 ?
Merci par avance pour vos suggestions et idées !
tu as raison, je viens de voir que mes ids avaient changé suite au passage en version stable du plugin !
et je n’avais pas revérifier (car ils étaient bon avant ) …
La question a été postée il y a longtemps mais comme je viens de rencontrer ce besoin et de trouver la réponse, je la post ici.
Pour « stopper » la suite de l’exécution d’un scénario, donc stopper le scénario lui-même, il est possible que le $scenario->stop() fonctionne (pas la peine de faire le ->byId() avant par contre si on a déjà la variable $scenario assignée), je n’ai pas vérifié si les actions suivantes sont exécutées ou pas donc si cela fonctionne ou pas, mais effectivement dans tous les cas le scénario termine en erreur et on n’a pas les logs donc ce n’est pas propre. (C’est la bonne méthode pour stopper un autre scénario par contre).
La bonne méthode est $scenario->setDo(false).
C’est ce que fait le core bien sur.
Attention que cela ne stop pas instantanément le scénario, donc le bloc code en cours continuera sont exécution mais cela stop/empêche l’exécution de tous les blocs suivants (bloc code ou pas)
Il est possible de stopper le scénario ainsi que le bloc code en cours.
Le framework SC le fait très bien.
Par contre je ne sais plus comment j’ai fait, il suffit d’aller voir le code source…