Scénarios : Petits codes entre amis

ça ressemble bien à un tag ton besoin : global au scenario et pas stocké…

Oui.
Mais le scénario est programmé, pas appelé par un autre … et en code $variable = ‹ xx ›; est qd meme plus simple …

Je ne connaissais pas la class dataStore … je vais chercher …
Merci.

Programmé, je vois pas bien la différence, un scénario est tout à fait en mesure de se créer son propre tag s’il le faut… La fonction est justement là


Tu peux tout à fait coller ça dans un if qui va bien…

Après c’est une question d’habitude de programmation

J’ai lu en diagonale mais avec un $scenario->getTags() et $scenario-> setTags() ?

1 « J'aime »

Effectivement habitudes de programmation …

Pour le dataStore si qqn comme moi ne connais pas … J’ai trouvé que c’était la class de base du stockage … donc qd on utilise setData, en fait derrière il y a :

public function setData($_key, $_value) {
$dataStore = new dataStore();
$dataStore->setType('scenario');
$dataStore->setKey($_key);
$dataStore->setValue($_value);
$dataStore->setLink_id(-1);
$dataStore->save();
return true;
}

Tiens j’ai vu une demande là dessus, mais je ne retrouve pas le post

Donc comment récupérer la programmation d’un scénario

on trouve l’info avec ça

$scenar=scenario::byId(46);
if ($scenar->getMode() != "provoke") {
   $scheduled = $scenar->calculateScheduleDate();
   $avant = $scheduled['prevDate']; //2020-04-16 00:15:00
   $apres = $scheduled['nextDate']; //2020-04-17 00:15:00
}

Super, grace à l’aide de Arno44, j’ai exactement ce qu’il me fallait …
Je l’ai replacé dans une ‹ function › … si ca peu aider qqn …

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");


Sympa la fonction en effet !
Je mettrais plutôt, même si le résultat est le même :

while ($value == ‹  › and $occurence < $time_limit) {

}

Elle n’est pas bloquante cette boucle sinon ?

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;