Scénarios : Petits codes entre amis

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 …

Rebonjour …
Alors j’ai encore un petit problème :

voici mon code :

// fonctions locales 
function filtre_on() {
    global $id_filtre_on, $id_filtre_puissance;
    $cmd = cmd::byId($id_filtre_puissance);
    $filtre_puissance = $cmd->execCmd();
  	while ($filtre_puissance < 10) {
        $cmd = cmd::byId($id_filtre_on);
        $cmd->execCmd();
        sleep(2);
        $cmd = cmd::byId($id_filtre_puissance);
        $filtre_puissance = $cmd->execCmd();
    };
};

filtre_on();

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 :wink: … elle est pour l’instant sauvée par un timeout du scénario …

Bon, pour faire fonctionner j’ai du remettre dans la routine les valeurs des variables …

function filtre_on() {
    $id_filtre_on = '2892';
    $id_filtre_puissance = '2894';
  
    $cmd = cmd::byId($id_filtre_puissance);
    $filtre_puissance = $cmd->execCmd();
  	while ($filtre_puissance < 10) {
        $cmd = cmd::byId($id_filtre_on);
        $cmd->execCmd();
        sleep(2);
        $cmd = cmd::byId($id_filtre_puissance);
        $filtre_puissance = $cmd->execCmd();
    };
};

Citation
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

Citation

Bonjour seb821, je suis intéressé par tes exemples, mais les liens sont KO.

Merci

L’ancien forum a été déplacé, j’ai mis à jour les liens. Bon « codage » :smile:

Hello romu044

Tes 4 premiers liens sont morts aussi :grinning:

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 :

$tags = $scenario->getTags();
if ($tags['#action_volet_rhas#']=="up")
	{
		$tags['#VoletActionTag#']="Monter";
}
if ($tags['#action_volet_rhas#']=="down")
	{
		$tags['#VoletActionTag#']="Descendre";
  		}
$tags['#monTag#'] = ("#[Maison][Volet ".$tags['#piece_volet_rhas#']."][Volet ".$tags['#piece_volet_rhas#']." - ".$tags['#VoletActionTag#']."]#");
cmd::byString($tags['#monTag#'])->execCmd();

Chez moi c’est opérationnel et ça fonctionne plutôt pas mal !

ps j’avais gardé les slots UP et DOWN, que je vais surement modifier par monter et descendre pour éviter le if dans le code.

a toutes fins utiles

Merci pour ce code, mais illisible sans les balises </>.

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é! :grin:
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;

Merci pour la modification de ton post, le code est maintenant beaucoup plus lisible.
Et facilement copiable pour quelqu’un qui voudrait l’utiliser.

Exactement

Hello @kiboost

Tu voudrais pas ajouter comment récupérer les valeurs d’une commande action/couleur et action/curseur sur ta petite page sympathique ?

J’ai un peu galéré avant de trouver qu’il fallait utiliser le getConfiguration('lastCmdValue') :sweat_smile:

Bonjour,

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 !

Pas à ma connaissance. Vue ton code tu est sur que tes id ne commedes n’ont pas changé ?

J’avais eu aussi ce doute quand je me suis aperçu que cela ne marchait plus, mais après vérifs ils sont bien ok…
Du coup je ne comprend pas…

1 « J'aime »

Pourtant il ne trouve pas ta &cmd byid

1 « J'aime »

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 ) … :wink:

Bonjour @Caelion et @ManuJ71,

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)