Action non exécutée sur interaction "dynamique"

Version Jeedom : 4.1.20

Bonjour,

Interaction dont l’action est bien exécutée en testant avec la phrase « test bureau »:



[2021-02-23 09:45:01][DEBUG] : Je prends : test bureau
[2021-02-23 09:45:01][INFO] : J'ai reçu : test bureau. J'ai compris : test bureau. J'ai répondu : 11.6

Maintenant si je ne fais que remplacer la demande test bureau par test #objet#, l’action ne s’exécute pas en testant avec la phrase « test bureau »

[2021-02-23 09:49:35][DEBUG] : Je prends : test bureau
[2021-02-23 09:49:35][INFO] : J'ai reçu : test bureau. J'ai compris : test bureau. J'ai répondu : 11.6

Bonjour,

Je n’ai pas testé mais avez-vous généré les phrases après?

Oui.
D’ailleurs l’interaction fonctionne. J’ai bien la réponse dans les 2 cas (cf les logs)) mais dans le second, l’action définie dans l’onglet du même nom ne s’exécute pas

ah ok j’avais loupé le problème.
j’ai testé un peu rapidement, il semble que je reproduis mais je n’ai pas de piste encore

C’est déjà une bonne chose que cela soit reproduit :wink:

Je suis en train de regarder la classe interactQuery mais je n’arrive pas encore à voir quel serait le traitement différent entre ces 2 interactions.
Dans la table interactQuery, il n’y a pas de différence (j’ai fait en sorte que cela génère la même phrase dans les 2 cas)

Il n’y a que dans la colonne query de la table interactDef qu’il y a une différence normale (test bureau pour la première et test #objet# pour la seconde)

J’ai exactement le même problème… du coup, impossible de faire une interaction générique pour plusieurs objets…
De ce fait les interactions perdent beaucoup de leur intérêt.
Merci de vos travaux pour rétablir le fonctionnement au plus vite !

Plus précisément, dès qu’il y a une indirection dans la commande à exécuter de mon interaction, genre

#[chauffage][#equipement#][On]#

La commande n’est pas exécutée.

Bonsoir,
En grattant un peu, je vois que en std dans le code de « interactQuery.class.php » il n’est pas prévu de substitution des termes #objet#, #equipement# ou #commande# dans le texte de la commande.

Pourtant la classe contient tout ce qu’il faut pour faire le job ! Pour l’exemple je me suis permis de bricoler un peu le code de la classe pour y ajouter les substitutions qui manquent, juste avant l’exécution de la commande.

Pour faire simple (je ne sais faire que du « quick and dirty ») j’ai réutilisé la fonction de recherche des synonymes des interactions automatiques (getQuerySynonym) plutôt que les synonymes décris dans l’interaction elle même. Les synonymes utilisés sont donc ceux décris dans la page du menu « système/configuration/interactions/synonymes pour les commandes »

Pour ma part j’y ai mis :
« on|allume|allumer|met en marche|mets en marche;off|eteint|eteins|eteindre|coupe|arrete|stop|stoppe|stoppes »

Pour préciser, j’ai mis 2 bouts de code perso :

-Si la commande native (sans substitution) n’est pas reconnue comme une commande existante, je positionne le flag « $mustReplace » à 1

					if (is_object($cmd)) {
						$replace['#unite#'] = $cmd->getUnite();
						$replace['#commande#'] = $cmd->getName();
						$replace['#objet#'] = '';
						$replace['#equipement#'] = '';
						$eqLogic = $cmd->getEqLogic();
						if (is_object($eqLogic)) {
							$replace['#equipement#'] = $eqLogic->getName();
							$object = $eqLogic->getObject();
							if (is_object($object)) {
								$replace['#objet#'] = $object->getName();
							}
						}
                    $mustReplace=0; // c'est une commande sans tags
					} else { //bloc Else ajouté CM
                      	$mustReplace=1; //la commande contient des tags à substituer
                    }

-qq lignes plus bas le code pour la substitution :

                    //Bloc ajouté CM                  
                    if ($mustReplace==1) {
                       $action['cmd']=self::replaceForContextual('#objet#', $options['objet'], $action['cmd']);
                       $action['cmd']=self::replaceForContextual('#equipement#', $options['tags']['#equipement#'], $action['cmd']);
                       $synonymes=self::getQuerySynonym($options['tags']['#commande#'], 'cmd');
                       $action['cmd']=self::replaceForContextual('#commande#', $synonymes[0], $action['cmd']);
                       log::add('interact','info',"substitution : " . $action['cmd']);
                    } 
                    //fin du bloc ajouté CM
                  
                    $return = scenarioExpression::createAndExec('action', $action['cmd'], $options);

...
	

J’ai fait qq tests avec l’interaction suivante :
(rappel , les synonymes ci-dessous ne sont pas pris en compte dans mon code)

La commande a exécuter est :

Et ça fonctionne !

Evidemment, pardon pour les puristes, je suis conscient que mon code est du bullshit et qu’il ya surement des implications cachées ou des manquements à toutes les subtilités de Jeedom qui ne sont pas respectées, alors messieurs (ou mesdames!) les vrais développeurs si vous pouvez nous faire qq chose de propre, merci d’avance !

je joins le fichier classe bricolé pour les curieux mais je pense qu’il est prudent de ne pas l’utiliser autrement que sur un environnement de test !
(à renommer le « gars déchéant :smile: » en « interactQuery.class.php »)

Dernière minute :
Petite amélioration qui permet de passer des commande de type
#[chauffage][#equipement#][cmde_#commande#]#

Ainsi si je dis « met le radiateur du bureau en mode eco », la commande passée sera :
#[chauffage][bureau][cmde_eco]#

Fichier modifié attaché ici
interactQuery.class.php.txt (35,8 Ko)

Edit : Une autre solution est de lancer un scenario depuis ton interaction en lui passant les tags issus de l’interaction.

Dans le scénario tu mets un bloc code et là tu en fais ce que tu veux… j’ai testé ceci :

Le scénario étant le suivant :

J’ai géré moi-même ici une notion de synonymes à travers $array et $key qui permet par exemple de d’agir aussi bien si on utilise un singulier ou un pluriel pour heures creuses/heures pleines… ya surement mieux, mais ça fonctionne.

@tomdom : as-tu eu une solution pour ta question initiale ?

Bonjour,

Non