Comme annoncé, ce forum est passé en lecture seule au 1er janvier 2020. Désormais nous vous invitons à vous rendre sur notre nouvelle page communauté :
Image

A très bientôt !

[TUTO] IFTTT : Puissance 10 V2

Pour parler de tout, et surtout de rien !
meute
Actif
Messages : 1102
Inscription : 26 août 2017, 11:07
Localisation : Belgique

[TUTO] IFTTT : Puissance 10 V2

Message par meute » 04 nov. 2018, 22:14

Hello,

Edit 06/01/2019 : :!: :!: :!: Pour info la première chose à faire avant de jouer avec les interactions c'est de désactiver les interactions automatiques qui sont activées par défaut dans la configuration Jeedom, ça évite ensuite beaucoup de comportements et d'actions non voulues ... c'est valable pour l'utilisation de ce tuto mais pas seulement, à partir du moment ou vous voulez utiliser les interactions de quelque façon que ce soit il vaut mieux le désactiver. :!: :!: :!:

Voiçi une évolution du tuto "[TUTO] IFTTT : Avec et sans retour avec sécurisation des délais et astuces via 2 scénarios ..."
viewtopic.php?f=59&t=38301

Cette évolution permet de lancer maintenant des interactions multiples (Maximum 5), exemple :
- Allume la lumière du salon et éteins la cuisine
- Allume le salon et le couloir
- Ouvre les volets du salon et de la cuisine
- Ouvre les volets du salon et ferme les volets de la cuisine
- Ouvre la porte du garage et éteins le bureau
- Ferme la porte d'entrée et passe en mode nocturne et allume le salon
- Ouvre le portail et active l'alarme
- Ferme le garage et ouvre le portail
- ...

La V2 de cette évolution permet maintenant aussi de retravailler les retour lors d'interactions multiples :
J'en parle dans la deuxième partie ...

Cette évolution rassemble maintenant aussi les paramètres importants en début de code comme l'IP de votre jeedom et sa clé API, ainsi il ne faut plus aller les modifier en plein milieu du code.

Toutes les autres fonctionnalités sont évidemment encore supportées :
- Sécurisation des délais des applets IFTTT (pour qu'une demande qui n'a pas aboutie à 13H28 pour cause de perturbation des services google ou IFTTT ne s'exécute pas 3H14 plus tard, comme réouvrir la porte du garage une fois que vous êtes parti ... c'est encore arrivé à plusieurs membres il y a 2 jours)
- Correction de certains défaut de compréhension ou de syntaxe de Google ou d'IFTTT pour maximiser la reconnaissance du moteur d'interaction
- Utilisation avec retour simple IFTTT ou avec un vrai retour Jeedom
- Possibilité de choisir ou non quelle Google home doit effectuer le retour dans le cas d'un retour Jeedom
- Possibilité de s'isoler complètement d'IFTTT en désactivant simplement les scénarios

Prérequis globaux :
- Avoir un accès externe en HTTPS (très vivement conseillé) sur votre jeedom, pour ça il y a les tutos parlants de "let's encrypt" par exemple, si vous utilisez les DNS Jeedom alors pas de soucis, vous êtes déjà en HTTPS
- Avoir un compte IFTTT lié à votre compte Google Home et savoir se servir un minimum d'IFTTT, les tutos de bronche sont une merveille et restent une référence pour acquérir ces bases viewtopic.php?f=59&t=28590

Prérequis pour les retours personnalisés :
- Avoir un système TTS fonctionnel, d'autres tutos donnent toutes les infos pour mettre ça en place via l'excellent plugin "Google Cast" par exemple.

Prérequis pour adapter les commandes :
- Avoir quelques bases en "RegEx", ce format d'expression est également utilisé par jeedom dans son moteur d'interaction, la doc jeedom en parle succinctement, et on trouve des tutos plein le net, l'excellent site https://regexr.com/ permet entre autre de tester ses "RegEx" avant de les implémenter.

Donc reprenons le tuto précédent avec quelques adaptations :

Tout d'abord il faut créer un scénario "provoqué" que l'on va appeler "IFTTT" par exemple
On note l'ID du nouveau scénario car on en aura besoin plus tard pour l'IFTTT
Ensuite on ajoute un bloc de code comme ceci en y collant tout le code qui suit:
(Le code dans le screenshot ne correspond pas car par simple flemme j'ai repris ceux de l'autre tuto ...)
Capture2.PNG
Capture2.PNG (100.67 Kio) Consulté 10380 fois

Code : Tout sélectionner

// IFTTT interface V2.0
// ------- Début des paramètres utilisateur -------
$IPJeedom = "VotreIPJeedomLocale";
$APIKey = "VotreCléAPI";

// Liste des remplacements à faire dans la phrase reçue d'IFTTT
// 	afin de corriger des défauts de comprehension récurents de Google Home
// 	et de modifier tout ce que vous souhaitez avant que la phrase ne soit
// 	transmise au moteur d'interaction
$IFTTTReplaceFromTo = [];
$IFTTTReplaceFromTo += [" anvers" => " en vert"];		//Correction de comprehension de Google home
$IFTTTReplaceFromTo += [" sans" => " 100"];				//Correction de comprehension de Google home
$IFTTTReplaceFromTo += [" sens" => " 100"];				//Correction de comprehension de Google home
$IFTTTReplaceFromTo += [" la atelier" => " l'atelier"];	//Correction de comprehension de Google home
$IFTTTReplaceFromTo += [" depuis" => " via "];			//permet de dire "depuis" ou "via" pour cibler la GH de retour
$IFTTTReplaceFromTo += [" dans " => " via "];			//permet de dire "dans" ou "via" pour cibler la GH de retour

// Liste des mots clé de toutes vos interractions IFTTT au format RegEx,
//   Permet de recontruire les interractions multiples
//   !!! Ne pas utiliser les caractères accentués !!!
//   La liste est insensible à la case (majuscules/minuscules)
$keyCommandsREgEx = ("/".
                    "(allume)(s)?( (la|les) (lumiere)(s)?)?|".
                    "(etein)(s|t)?( (la|les) (lumiere)(s)?)?|".
                    "(ouvre)(s)?( (le|les) (volet)(s)?)?|".
                    "(ferme)(s)?( (le|les) (volet)(s)?)?|".
                    "(passe)(s)?|".
                    "(activite)|".
                    "(reduis)|".
                    "(augmente)(s)?|".
                    "(donne-moi l'etat)|".
                    "(donne-moi la temperature)|".
                    "(donne-moi l’hygrometrie)|".
                    "(mode)".
                    "/i"
                    );

// Liste des mots clé au format RegEx à toujours supprimer des retours lors d'interactions multiples.
//   !!! Les caractères accentués ont leur importance !!! car le code ne supprime pas les accents pour que le TTS les reçoivent. 
//   La liste est insensible à la case (majuscules/minuscules).
//   Il vous suffit de reprendre les différents mots clé que vous utilisez généralement pour marquer le début du retour de vos interactions.
$keyResponsesRemoveRegEx = ("/".
                            "(ok, )|".
                            "(très bien, )|".
                            "(d'accord, )".
                            "/i"
                           );
                            
// Liste des mots clé de vos retours IFTTT au format RegEx que vous ne souhaitez pas voir répétés si l'interaction précédente utilisait déjà le même.
//   !!! Les caractères accentués ont leur importance !!! car le code ne supprime pas les accents pour que le TTS les reçoivent. 
//   La liste est insensible à la case (majuscules/minuscules).
//   Il vous suffit de reprendre les différentes clé de réponses que vous avez définies dans vos interactions.
$keyResponsesRegEx = ("/".
                    "(j'allume )( (la|les) (lumiere)(s)?)?|".
                    "(j'éteins )( (la|les) (lumiere)(s)?)?|".
                    "(j'ouvre )( (le|les) (volet)(s)?)?|".
                    "(je ferme )( (le|les) (volet)(s)?)?|".
                    "(la température )|".
                    "(il fait )|".
                    "(l’hygrométrie )".
                    "/i"
                    );

// ------- Fin des paramètres utilisateurs-------

$delimiterREgEx = "/ et /i"; // Délimiteur pour interractions multiples au format RegEx

$tags = $scenario->getTags(); // Récupération des tags passés en paramètre.

$scenario->setData("retour_interac","" ,false); //Vide la variable de retour

// Test si le TimeStamp est fourni en tag pour continuer.
if ($tags["#createdat#"]=="") {	
    $scenario->setLog("Exit, No TimeStamp"); //Log
} else {
  // TimeStamp Fourni, on continue
  $createdAtString=str_replace('"',"",$tags["#createdat#"]); //Suppression des "" en trop dans le tag
  $createdAtTime=DateTime::createfromformat("M d, Y * h:ia", $createdAtString); //Convertion de la chaine IFTTT en DateTime
  $scenario->setLog("IFTTT request Created at : ".$createdAtTime->format('Y-m-d H:i:s')); //Log
  
  $actualDateTime=new DateTime(); //Récupération de la date et heure courante
  $scenario->setLog("IFTTT request Received at : ".$actualDateTime->format('Y-m-d H:i:s')); //Log
  
  $deltaSecs=$actualDateTime->getTimestamp() - $createdAtTime->getTimestamp(); //Calcul la différence entre les deux DateTime
  $scenario->setLog("Elapsed : ".$deltaSecs." sec");//Log
  
  // Test si la requête IFTTT a été faite dans les 90s précédentes
  //    90s car IFTTT ne fourni pas les secondes, donc une requète créée à la 59ème seconde et reçue la seconde suivante
  //    donnera déjà un delta de 60s, +30s de tolérance = 90s
  if ($deltaSecs>90) {
    $scenario->setLog("IFTTT request too old"); //Log
  } else {
    // Délai OK, on continue
    $scenario->setLog("IFTTT request time OK"); //Log
    
    $scenario->setLog("Received Sentence : ".$tags["#phrase#"]); //Log
    
    //Remplacement des caractères accentués
    $a = array('À', 'Á', 'Â', 'Ä', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Î', 'Ï', 'Ô', 'Ö', 'Ù', 'Ú', 'Û', 'Ü', 'à', 'â', 'ç', 'è', 'é', 'ê', 'î', 'ï', 'ô', 'õ', 'ö', 'ù', 'ú', 'û', 'ü');
    $b = array('A', 'A', 'A', 'A', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'O', 'O', 'U', 'U', 'U', 'U', 'a', 'a', 'c', 'e', 'e', 'e', 'i', 'i', 'o', 'o', 'o', 'u', 'u', 'u', 'u');
    $tags["#phrase#"]=str_replace($a, $b, $tags["#phrase#"]);
    
    
    // Ajout des corrections indispensables en plus des corrections definies par l'utilisateur
    $IFTTTReplaceFromTo += ['"' => ""];			//suppression des "" en trop
	$IFTTTReplaceFromTo += [" ' " => "'"];		//remplace " ' " par "'" correction de l'IFTTT
	$IFTTTReplaceFromTo += [" - " => "-"];		//remplace " - " par "-" correction de l'IFTTT
    
    // Correction de la phrase IFTTT pour aider les interaction
    $tags["#phrase#"]=strtolower($tags["#phrase#"]); //tout en minuscules
    $tags["#phrase#"]=str_ireplace(array_keys($IFTTTReplaceFromTo),$IFTTTReplaceFromTo,$tags["#phrase#"]); //effectue tous les remplacements
        
    $scenario->setLog("Corrected Sentence : ".$tags["#phrase#"]); //Log
        
    $scenario->setData("phrase",$tags["#phrase#"] ,false) ; //sauvegarde de la phrase dans une variable pour la suite avant urlencode
    
    $interactArray = preg_split($delimiterREgEx,$tags["#phrase#"],5); //découpe de la phrase pour gerer les interactions multiples, maximum 5 interactions successives
    
    $InteractCount = 0;
    $KeyCommandMatches = [];
    $LastKeyCommand = "";
    $KeyResponsesMatches = [];
    $LastKeyResponse = "";
    
    // Traite les interactions multiples
    foreach($interactArray as $interact) {
      ++$InteractCount; 
      $scenario->setLog("[Interact ".$InteractCount."] : ".$interact); //Log
      
      // Trouve et mémorise la commande clé de l'interaction
      if (preg_match ($keyCommandsREgEx, $interact, $KeyCommandMatches)) {
      	$LastKeyCommand = $KeyCommandMatches[0];
      	$scenario->setLog("[Interact ".$InteractCount."] - Key command found : ".$LastKeyCommand); //Log
      } else {
        // Aucune commande clé trouvée, complète avec la dernière commande clé connue 
      	// Cela permet de dire "allume le salon et la cuisine" et de reconstruire deux interractions complètes "allume le salon" et "allume la cuisine"
        if ($LastKeyCommand != "")  {
            $interact = $LastKeyCommand." ".$interact;
            $scenario->setLog("[Interact ".$InteractCount."] - Reconstructed with last key command : ".$interact); //Log
        }
      }
  		
      $interactURLFormated=urlencode($interact); //encodage au format URL

      //url d'appel interaction
      $url="http://".$IPJeedom."/core/api/jeeApi.php?apikey=".$APIKey."&type=interact&query=".$interactURLFormated;

      //Exécution et récupération de la réponse des intéractions
      $scenario->setLog("[interact ".$InteractCount."] - Send sentence to interact engine"); //Log
      $reponseInteract=file_get_contents($url);
    
      $reponseInteract = preg_replace( "/\r|\n/", "", $reponseInteract ); //supprime les CR/LF issus du file_get_contents
      $reponseInteract = preg_replace('/\s+/', " ", $reponseInteract ); //supprime les multiples espaces superflus issus du file_get_contents
      $reponseInteract = ltrim(rtrim($reponseInteract)); //supprime les espaces en début et fin issus du file_get_contents
      $scenario->setLog("[interact ".$InteractCount."] - Received response : ".$reponseInteract); //Log
      
      $reponseInteract=str_replace(".","virgule",$reponseInteract); //remplace le "." par le mot "virgule" pour le retour TTS de valeurs décimales
      
      // Recherhce des réponses clé
      $SameKeyResponse = FALSE;
      // Trouve et mémorise la réponse clé dans le retour de l'interaction
      if (preg_match ($keyResponsesRegEx, $reponseInteract, $KeyResponsesMatches)) {
        if ($KeyResponsesMatches[0] == $LastKeyResponse) {
            // Réponse clé identique à la précédente
        	$SameKeyResponse = TRUE;
          	$scenario->setLog("[Interact ".$InteractCount."] - Same key response found : ".$LastKeyResponse); //Log
        } else {
          // Réponse clé différente de la précédente
          $LastKeyResponse = $KeyResponsesMatches[0];
          $SameKeyResponse = FALSE;
          $scenario->setLog("[Interact ".$InteractCount."] - New key response found : ".$LastKeyResponse); //Log
        }   	
      } else {
        // Pas de réponse clé trouvée, on efface la dernière mémorisée
        $SameKeyResponse = FALSE;
        $LastKeyResponse = "";
        $scenario->setLog("[Interact ".$InteractCount."] - No key response found"); //Log
      }
      
      // Traitement des strings de réponse
      if ($InteractCount == 1) {
      	$responseString = $reponseInteract; //Ajout de la première réponse à la string de réponse
        $responseStringCorrected = $responseString; //Ajout de la première réponse à la string de réponses corrigées
      }else {
        //Ajout des réponses suivantes à la string de réponse sans traiter les réponses clé
        $responseString = $responseString." et ".$reponseInteract;
        
        // Suppression des mots clés à toujours supprimer des réponses suivantes
        $reponseInteractCorrected = preg_replace($keyResponsesRemoveRegEx, "", $reponseInteract );
        
        // Vérifie si il faut supprimer aussi la réponse clé
        if ($SameKeyResponse == TRUE) {
          //Ajoute la réponse suivante à la réponse corrigée en retirant la réponse clé
          $responseStringCorrected = $responseStringCorrected." et ".str_replace($LastKeyResponse,"",$reponseInteractCorrected);
          $scenario->setLog("[Interact ".$InteractCount."] - key response removed : ".$LastKeyResponse); //Log
        }else {
          //Ajoute la réponse suivante à la réponse corrigée sans supprimer la réponse clé
          $responseStringCorrected = $responseStringCorrected." et ".$reponseInteractCorrected;
        }        
      }
      
      $reponseArray[] = $reponseInteract; //Ajout de la réponse au array de réponses
      
    } //end foreach
    
    
    //stockage des réponses dans une variable au format string pour post-traitement TTS par le scenario
    $scenario->setData("retour_interac",$responseString ,false) ;
    $scenario->setLog("All received responses : ".$responseString); //Log
    
    //stockage des réponses corrigées dans une variable au format string pour post-traitement TTS par le scenario
    $scenario->setData("retour_interac_corrige",$responseStringCorrected ,false) ;
    $scenario->setLog("All received responses corrected : ".$responseStringCorrected); //Log
    
    //stockage des réponses dans une variable au format "array de string" pour post-traitement TTS par le scenario
    $scenario->setData("retour_interac_array",$reponseArray ,false) ;
  }
}
Les paramètres que l'utilisateur est susceptible de devoir adapter sont tous rassemblés en début de script.

Dans cette partie paramètres il ne faut pas oublier de remplacer "VotreIPJeedomLocale" et "VotreCléAPI" par les vôtres sur les deux premières lignes de paramètres .

Ensuite comme la compréhension de google n'est pas toujours parfaite et que certaines incompréhensions sont récurrentes, une liste des remplacements à faire dans la phrase reçue d'IFTTT pour corriger tout ça avant de l'envoyer au moteur d'interaction jeedom est disponible, vous pouvez y ajouter ou y supprimer des éléments en ajoutant des lignes à la suite ou en les commentant avec "//"
Respectez simplement le format

Code : Tout sélectionner

$IFTTTReplaceFromTo += ["texte à remplacer" => "texte de remplacement"];
Ensuite pour donner une certaine "intelligence" aux interactions multiples je n'avais pas d'autre choix que de connaitres les principales commandes clés qui vont être utilisée par vos IFTTT et interactions, elles doivent donc être définies aussi en début de code dans la variable $keyCommandsREgEx.

C'est la partie la plus compliquée de ce tuto car comme expliqué dans les prérequis il faut avoir quelques bases en syntaxes RegEx (bases que je n'avais pas moi-même il y a encore 2 heures quand j'ai attaqué cette évolution sur mon installation ...)

Le code est assez largement commenté, et comme les commentaires le stipulent, connaître les commandes clé permet au script de reconstruire 2 ou plusieurs interactions à partir d'une interaction et d'une ou plusieurs autres incomplètes.

En effet, le script va chercher le mot " ET " pour découper une demande en plusieurs interactions et donc une demande du style "allume le salon et la cuisine" résulterait en une demande "allume le salon" et une deuxième demande "la cuisine", et évidemment la deuxième ne marcherais pas. Ce qui marcherait sans ça c'est "allume le salon et allume la cuisine" mais ce n'est pas une façon très naturelle de le demander ...

C'est donc là que les commandes clé au format RegEx entrent en jeux, le script va rechercher une des commandes clé connues dans la première partie de la demande d'interaction pour la mémoriser et l'utiliser ensuite pour reconstruire les interactions suivantes qui elles n'en comporteraient pas.

Évidemment cela n'empêche pas de dire "allume le salon et eteins la cuisine" vu qu'après la découpe en 2 demandes elles ont toutes les deux leur propre commande clé, pour l'une c'est "allume" et pour l'autre "eteins".

Demander "allume la cuisine et le salon et eteins les wc" marchera aussi.

Egalement il est possible de faire des demandes multiples même si leurs commandes clé ne sont pas connues comme par exemple :
"monte le son et coupe le chauffage", comme dans ce script la commande clé "monte" n'est pas connue, elle ne sera pas mémorisée et donc pas non plus utilisée pour compléter la deuxième qui n'a également pas de commande clé connue. Le résultat donnera simplement 2 demandes "monte le son" et "coupe le chauffage".

Il y a évidemment des cas particulier où le script aura du mal à s'en sortir comme par exemple "allume le salon et coupe le chauffage", comme "allume" fait partie des commandes clé connues mais que "coupe" n'en fait pas partie, le résultat va donner "allume le salon" et "allume coupe le chauffage", pour éviter celà il suffit d'ajouter "coupe" aux commandes clé connues.

Ce genre d'adaptation vous devrez les faire vous-même car ça dépend de vos habitudes et de vos propres commandes clé, je ne peux évidemment pas prévoir l'ensemble des possibilités.

Quelques détails sur la première des RegEx déjà incluses dans le code :

Code : Tout sélectionner

(allume)(s)?( (la|les) (lumiere)(s)?)?
Cette RegEx va matcher les commandes suivantes :
- allume
- allumes
- allume la lumiere
- allume les lumieres
- allumes les lumiere
- allumes la lumieres
- allume les lumiere
- allume la lumieres

On voit donc que le pluriel ou le singulier sont sans importance et qu'il est possible de dire "allume" ou "allume la lumiere".
Dans ce cas il était important d'ajouter aussi "allume la lumière" car en ne connaissant que "allume" pour une demande comme "allume les lumières du salon et de la cuisine" ça aurait donné "allume les lumières du salon" et "allume de la cuisine" ce que jeedom aurait peut-être compris quand-même grâce à sa tolérance aux interactions mais pas certain. Si vous ne dites jamais "allume la lumière de ..." mais toujours "allume le ..." cela ne vous sert à rien, une RegEx "(allume)(s)?" était suffisante

Si vous modifiez cette $keyCommandsREgEx faites attention à bien respecter le format à chaque ligne "votreRegEX|". et à conserver le "\i" à la fin qui permet de rendre le RegEx insensible à la case (majuscules/minuscules). Le pipe "|"à la fin de chaque ligne du RegEx est en faite un "ou", j'ai volontairement découpé l'écriture de la RegEx sur plusieurs lignes pour en faciliter la lecture et la manipulation mais il s'agit en fait que d'une seule et même chaîne de caractère qui pourrait être écrite sur une seule ligne mais ça serait beaucoup moins lisible et manipulable.

Je pense avoir déjà mis pas mal de possibilités de RegEx dans ce script mais qui évidemment correspondent à mes interaction habituelles et surtout que je suis susceptible de demander de façon multiple, probablement qu'à l'usage je vais me rendre compte que certaines me manquent, c'est donc une variable qui va évoluer au fur et à mesure de l'évolution de l'installation et de l'usage au jour le jour.
Pour une interaction que vous êtes certain de ne jamais demander combinée à une autre il est évidemment inutile de l'inclure dans les commandes clé.

Ensuite vous trouverez 2 autres listes, une des mots clé au format RegEx à toujours supprimer des retours lors d'interactions multiples et une deuxième des mots clé de vos retours IFTTT au format RegEx que vous ne souhaitez pas voir répétés si l'interaction précédente utilisait déjà le même mais ça j'en parlerais dans la deuxième partie du tuto car cela ne concerne que les interactions avec retour TTS personnalisé et ce n'est pas utile pour les actions avec retour unique d'IFTTT.

Ensuite voici une simple applet IFTTT pour allumer n'importe quoi :
Capture.PNG
Capture.PNG (96.05 Kio) Consulté 10164 fois
Et son webhooks :
Capture1 (2).PNG
Capture1 (2).PNG (68.48 Kio) Consulté 10380 fois
Dans l'URL on mets cela, en remplaçant le nom de domaine par celui de votre accès externe à jeedom :

Code : Tout sélectionner

https://votreNomDeDomaine/core/api/jeeApi.php
On règle la Method et le Content type comme sur l'image

Ensuite on va utiliser dans le body cette commande :

Code : Tout sélectionner

apikey=VotreCléAPI&type=scenario&id=votreIDScenario&action=start&tags=createdat%3D"{{CreatedAt}}"%20phrase%3D"allume {{TextField}}"
Egalement sans oublier de remplacer "VotreCléAPI" par la votre et "votreIDScenario" par l'ID du scénario créé précédemment.

Et c'est tout, IFTTT va maintenant envoyer la requête avec sa date et heure de création et sa phrase vers le scénario qui va analyser ces données pour éjecter les requêtes qui seraient "périmées", corriger quelques subtils détails dans la phrase pour bien aider le moteur d'interaction comme ça le faisait déjà dans le tuto viewtopic.php?f=59&t=32182#p555834, découper les demandes multiples, les compléter avec une relative intelligence et envoyer les demandes au moteur du core pour que les interaction soit exécutées par jeedom.
Dernière édition par meute le 16 mai 2019, 09:14, édité 18 fois.
Jeedom VM ESXI sur NUC
Ilot I/O Modbus Wago Z-Wave (11 volets,prises,présences) + RFXCom (sondes T°+RH, prises)
Pont Hue et une vingtaine d'ampoules,une flopée de Xiaomi aquara, Harmony Elite
8 Google Home et un PC tactile All-In accroché au mur

meute
Actif
Messages : 1102
Inscription : 26 août 2017, 11:07
Localisation : Belgique

Re: [TUTO] IFTTT : Puissance 10

Message par meute » 04 nov. 2018, 22:15

Maintenant voyons la version avec un retour personnalisé.

Comme dit dans la première partie, la V2 du scénario apporte un traitement "d'embellissement" ou de "beautification" des réponses lors d'interactions multiples.

On peut maintenant d'une part définir certains textes de retour à ne jamais répéter comme par exemple le fameux "OK, ...." que j'ai l'habitude (mauvaise surement) de mettre devant toutes les réponses à des commandes action, genre "OK, j'allume ..." ou "OK, j'ouvre ..."

Et d'autre part on peut définir certains textes clé de retour à ne pas répéter 2 ou plusieurs fois de suite.

Avant le retour de deux interactions lancées ensembles donnait donc ceci :
"OK, j'allume le salon et OK, j'allume la cuisine" ou
"OK, j'allume le salon et OK, j'éteins la cuisine" ou
"OK, je ferme les volets de la cuisine et OK, je ferme les volets du salon"

Ca donnera maintenant :
"OK, j'allume le salon et la cuisine" ou
"OK, j'allume le salon et j'éteins la cuisine" ou
"OK, je ferme les volets de la cuisine et du salon"

Pas très utile si vous n'utilisez pas le retour personnalisé en TTS pour les actions pures mais là où ça devient intéressant c'est évidemment pour les interactions avec retour TTS car :

"La température du salon est de 20 degrés et la température de la cuisine est de 25 degrés" donnera maintenant :
"La température du salon est de 20 degrés et de la cuisine de 25 degrés"

Ouai, encore pas top ... je suis d'accord ... mais pour ça merci à @romanais qui lui fait répondre son jeedom pour ce genre de demande par :
"il fait 20 degrés dans le salon et il fait 25 degrés dans la cuisine"
Et là on obtient alors en combinant les deux et après traitement :
"il fait 20 degrés dans le salon et 25 degrés dans la cuisine" et ça c'est encore mieux !!!

On peut donc voir que si on veut faire de l'interaction multiple avec un retour au top il faut, malgré le traitement fait par le script, choisir judicieusement les phrases de retour de chaque interaction unique pour qu'une fois assemblées et retravaillées ça puisse ressembler à quelque chose.

Donc question paramétrage pour arriver à ça on a besoin de deux "listes", toutes deux au format RegEx dans lesquelles on peut définir les syntaxes à ne jamais répéter et celles à ne pas répéter 2 ou plusieurs fois de suite.
Le fonctionnement de ces deux listes étant similaire à celle utilisée pour définir les commandes clé et détaillée en première partie je n'en dirais pas plus ici vu que c'est pareil à l'exception que là les accents sont importants ... on est sur une partie qui doit servir ensuite à faire du TTS donc on ne peut pas s'en passer.

Venons en maintenant à l'implémentation de ces interactions avec retour

Pour cela il faut créer un second scénario "Provoqué" nommé "IFTTT Retour" par exemple et comme précédemment noter son ID .
Et on y appel simplement le scenario "IFTTT" précédent et ensuite on traite le retour en TTS
Capture.PNG
Capture.PNG (205.66 Kio) Consulté 10322 fois
Attention de bien faire un appel de type "Start (sync)" pour que les variables de retour soient bien actualisée avant que la suite du scenario ne s'exécute et de transmettre les tags vers le scenario IFTTT avec dans la ligne tag :

Code : Tout sélectionner

createdat=#createdat# phrase=#phrase#
Les actions permettant d'envoyer le retour de l'interaction en TTS vers vos GH vient se greffer après l'appel du scenario IFTTT.
Dans mon cas j'utilise une astuce pour pouvoir choisir ou non la GH qui fera ce retour.
Donc avec ce scénario par exemple :
- Si je dis "Donne-moi l'état de la maison" tout court c'est la GH du séjour qui répond avec le retour
- Si je dis "Donne-moi l'état de la maison dans le bureau" c'est la GH du bureau qui répond avec le retour

Adaptez la logique en fonction de vos envie et GH installées, le code ne doit pas être retrouché pour ça.

Et voiçi l'IFTTT correspondant :
Capture1 11.PNG
Capture1 11.PNG (94.72 Kio) Consulté 10368 fois
Capture12.PNG
Capture12.PNG (62.76 Kio) Consulté 10368 fois
Il n'y a pas grand chose qui change d'un IFTTT sans retour si ce n'est que pour celui-ci on attaque le deuxième scénario pour avoir le retour personnalisé et on fait répondre IFTTT par "Un instant" le temps que le retour jeedom se face en TTS.

Le script met à votre disposition 3 variables pour faire votre TTS :
"retour_interac" : Tous les retours dans une seule chaîne mais sans embellissement
"retour_interac_corrige" : Tous les retours dans une seule chaîne mais avec embellissement
"retour_interac_array" : Une variable "Array" qui peut permettre aux plus téméraires d'utiliser les retours multiples séparément dans la suite du scénario en récupérant chaque retour indépendamment l'un de l'autre en adressant chaque item de l'array.

Les deux premières variables permettent de faire le retour TTS de toutes les interactions en une seule fois car un " et " est déjà intercalé entre tous les retours.

Voilà, avec ces deux scénarios vous pouvez faire ce que vous voulez d'IFTTT et attaquer vos interaction Jeedom depuis vos GH avec un peu plus de sécurité.
Évidemment la désactivation de ces deux scénarios a pour effet de vous "isoler" d'IFTTT complètement d'un coup ce qui peut être utile aussi dans certains cas ...
Dernière édition par meute le 08 nov. 2018, 12:11, édité 7 fois.
Jeedom VM ESXI sur NUC
Ilot I/O Modbus Wago Z-Wave (11 volets,prises,présences) + RFXCom (sondes T°+RH, prises)
Pont Hue et une vingtaine d'ampoules,une flopée de Xiaomi aquara, Harmony Elite
8 Google Home et un PC tactile All-In accroché au mur

meute
Actif
Messages : 1102
Inscription : 26 août 2017, 11:07
Localisation : Belgique

[TUTO] IFTTT : Puissance 10

Message par meute » 04 nov. 2018, 22:16

Voyons maintenant pour sécuriser certaines interactions en fonction de l'état de votre domicile

En effet, qui ne voudrais pas que lorsque son alarme est activée ou que la maison est en mode absence certaines interactions soient impossibles à exécuter, comme "ouvre le garage" ou "ouvre les volets" ou "ouvre la porte", on est pas à l'abris d'un petit malin qui détecte la présence de GH chez vous par scanning Bluetooth et qui a l'idée géniale de crier suffisamment fort à proximité d'une fenêtre pour qu'une des GH l'entende "OUVRE LE GARAGE" ou "OUVRE LA PORTE en votre absence ... vous voyez le résultat ...

Pour cela on va créer un troisième scénario que l'on va appeler "IFTTT Secure" dans lequel on ne fait qu'appeler le scénario "IFTTT"
Capture.PNG
Capture.PNG (24.91 Kio) Consulté 10321 fois
De la même façon qu'on l'a fait pour le scenario "IFTTT Retour" mais sans traiter les retour en TTS

Ce dernier scénario va vous permettre de faire pointer vos applets IFTTT "sensibles" vers son ID comme l"IFTTT "Ouvre $" par exemple.
Et vous l'aurez compris, en désactivant ce scenario dans certaines conditions d'état de votre domotique comme "Alarme activée" ou "Mode absence" ou encore mode "Nuit" toutes les applets IFTTT qui pointent vers l'ID de ce scenario seront neutralisées.
Dernière édition par meute le 05 nov. 2018, 07:39, édité 1 fois.
Jeedom VM ESXI sur NUC
Ilot I/O Modbus Wago Z-Wave (11 volets,prises,présences) + RFXCom (sondes T°+RH, prises)
Pont Hue et une vingtaine d'ampoules,une flopée de Xiaomi aquara, Harmony Elite
8 Google Home et un PC tactile All-In accroché au mur

olivvvv
Timide
Messages : 378
Inscription : 16 janv. 2016, 11:34

Re: [TUTO] IFTTT : Puissance 10

Message par olivvvv » 04 nov. 2018, 23:03

Je viens de parcourir ton post.
Il est excellent et très clair !

j'ai hâte de pourvoir le mettre en place, ton évolution est juste généralissime !

Merci beaucoup pour le partage !
Oliv

Avatar de l’utilisateur
breizh22
Actif
Messages : 1318
Inscription : 10 oct. 2015, 17:35

Re: [TUTO] IFTTT : Puissance 10

Message par breizh22 » 04 nov. 2018, 23:17

Bravo et merci pour le partage. C'est très clair en plus. Dès que j'aurai un peu de temps, je vais me pencher la dessus, c'est très très intéressant.
HP Gen 8 / OMV4 sur SSD / Jeedom 3.3.37 VM Debian 9
RFLink - Sondes Oregon THN 132 N / THGR 122 NX / THGR 810 / THC238 - Prises DIO/Dedra/IDK.
Orvibo AllOne et S20 - Onduleur APC Back-UPS ES 700VA
Écosystème xiaomi - Dash buttons - GHome et mini.

meute
Actif
Messages : 1102
Inscription : 26 août 2017, 11:07
Localisation : Belgique

Re: [TUTO] IFTTT : Puissance 10

Message par meute » 04 nov. 2018, 23:28

Merci,

N'hésitez pas à partager vos expériences et vos RegEx, ça peut donner plein d'idées à d'autres comme à moi.
Il est clair que "l'intelligence" du script pour reconstruire des demandes multiples dépend uniquement du soin que l'utilisateur aura apporté à définir ses commandes clé.

L'autre solution de facilité c'est de ne pas définir de commandes clé et d'accepter de les répéter lors d'actions combinées "Allume le salon et allume la cuisine" ça va marcher aussi.
Jeedom VM ESXI sur NUC
Ilot I/O Modbus Wago Z-Wave (11 volets,prises,présences) + RFXCom (sondes T°+RH, prises)
Pont Hue et une vingtaine d'ampoules,une flopée de Xiaomi aquara, Harmony Elite
8 Google Home et un PC tactile All-In accroché au mur

meute
Actif
Messages : 1102
Inscription : 26 août 2017, 11:07
Localisation : Belgique

Re: [TUTO] IFTTT : Puissance 10

Message par meute » 05 nov. 2018, 07:27

Je viens de faire un petit update :

- Amélioration de la gestion des commandes clé
- Dans la version avec retour on ne copie plus "bêtement" le même code que dans la version sans retour, on appel maintenant simplement le scenario sans retour, il n'y a donc plus qu'un seul scénario qui inclut le bloc de code et c'est donc plus simple à maintenir.
- Ajout d'un TUTO version "Secure"
Jeedom VM ESXI sur NUC
Ilot I/O Modbus Wago Z-Wave (11 volets,prises,présences) + RFXCom (sondes T°+RH, prises)
Pont Hue et une vingtaine d'ampoules,une flopée de Xiaomi aquara, Harmony Elite
8 Google Home et un PC tactile All-In accroché au mur

romanais
Actif
Messages : 1999
Inscription : 21 août 2014, 21:36
Localisation : Drôme

Re: [TUTO] IFTTT : Puissance 10

Message par romanais » 05 nov. 2018, 10:25

Génialissime ! Et l'idée de sécurisation est top.
Merci pour le partage.
Merci à toute l'équipe pour le taf

Mon matériel

Avatar de l’utilisateur
breizh22
Actif
Messages : 1318
Inscription : 10 oct. 2015, 17:35

Re: [TUTO] IFTTT : Puissance 10

Message par breizh22 » 05 nov. 2018, 10:30

Petite erreur d'incrustation d'une capture écran dans la première partie

dans

Ensuite voici une simple applet IFTTT pour allumer n'importe quoi :

Tu as mis deux fois le webhooks

Je chipote, merci encore, c'est top, j'ai hâte d'essayer cela.
HP Gen 8 / OMV4 sur SSD / Jeedom 3.3.37 VM Debian 9
RFLink - Sondes Oregon THN 132 N / THGR 122 NX / THGR 810 / THC238 - Prises DIO/Dedra/IDK.
Orvibo AllOne et S20 - Onduleur APC Back-UPS ES 700VA
Écosystème xiaomi - Dash buttons - GHome et mini.

olivvvv
Timide
Messages : 378
Inscription : 16 janv. 2016, 11:34

Re: [TUTO] IFTTT : Puissance 10

Message par olivvvv » 05 nov. 2018, 10:32

Hello,
Premiers essais et premiers retour ;)

J'ai créé le scénario, la règle IFTTT.

Lorsque je dis "Dis Google, allume la cuisine" (bien sur j'ai ajouté modifié le code), la règle IFTTT se lance, cela déclenche bien le scénario sur jeedom.
Mais la lumière ne s'allume pas, j'ai cela dans les logs du scénario :

[2018-11-04 23:44:17][SCENARIO] Start : Execution provoquee par un appel API . Tags : {"#createdat#":"\"November 4, 2018 at 11:44PM\"","#phrase#":"\"allume la cuisine\""}
[2018-11-04 23:44:17][SCENARIO] Exécution du sous-élément de type [action] : code
[2018-11-04 23:44:17][SCENARIO] Exécution d'un bloc code
[2018-11-04 23:44:17][SCENARIO] IFTTT request Created at : 2018-11-04 23:44:00
[2018-11-04 23:44:17][SCENARIO] IFTTT request Received at : 2018-11-04 23:44:17
[2018-11-04 23:44:17][SCENARIO] Elapsed : 17 sec
[2018-11-04 23:44:17][SCENARIO] IFTTT request time OK
[2018-11-04 23:44:17][SCENARIO] Received Sentence : "allume la cuisine"
[2018-11-04 23:44:17][SCENARIO] Corrected Sentence : allume la cuisine
[2018-11-04 23:44:17][SCENARIO] Interact 1 : allume la cuisine
[2018-11-04 23:44:17][SCENARIO] Interact 1 key command found : allume la cuisine
[2018-11-04 23:44:17][SCENARIO] Send sentence to interact engine
[2018-11-04 23:44:18][SCENARIO] Received response for interract 1 :
[2018-11-04 23:44:18][SCENARIO] All Received responses :
[2018-11-04 23:44:18][SCENARIO] Fin correcte du scénario

Rien n'est passé on dirait au moteur d'intéraction, les logs sont vides.

As-tu une idée ?

meute
Actif
Messages : 1102
Inscription : 26 août 2017, 11:07
Localisation : Belgique

Re: [TUTO] IFTTT : Puissance 10

Message par meute » 05 nov. 2018, 10:55

Premièrement c'est étrange qu'il a trouvé la clé "allume la cuisine" tu dois avoir mis ça au complet dans un regex sinon il aurait trouvé comme clé que "allume"

Deuxièmement as tu bien configuré l'IP et la clé api ?

l'IP est a mettre sous cette forme "xxx.xxx.xxx.xxx" avec les guillemets et la clé "abcdefghijklmnop..." Aussi avec les guillemets.

Sinon le scénario semble avoir "bloqué" sur l'envoie vers le moteur d'interaction d'où la vérification de l'IP et de la clé.

Pour info c'est l'IP locale qu'il faut mettre. Peut être que 127.0.0.1 marcherait aussi j'ai pas essayé.
Dernière édition par meute le 05 nov. 2018, 11:05, édité 1 fois.
Jeedom VM ESXI sur NUC
Ilot I/O Modbus Wago Z-Wave (11 volets,prises,présences) + RFXCom (sondes T°+RH, prises)
Pont Hue et une vingtaine d'ampoules,une flopée de Xiaomi aquara, Harmony Elite
8 Google Home et un PC tactile All-In accroché au mur

meute
Actif
Messages : 1102
Inscription : 26 août 2017, 11:07
Localisation : Belgique

Re: [TUTO] IFTTT : Puissance 10

Message par meute » 05 nov. 2018, 10:56

breizh22 a écrit :
05 nov. 2018, 10:30
Petite erreur d'incrustation d'une capture écran dans la première partie

dans

Ensuite voici une simple applet IFTTT pour allumer n'importe quoi :

Tu as mis deux fois le webhooks

Je chipote, merci encore, c'est top, j'ai hâte d'essayer cela.
Merci, je corrigerai ça ce soir en rentrant

Edit, c'est fait.
Dernière édition par meute le 05 nov. 2018, 21:40, édité 1 fois.
Jeedom VM ESXI sur NUC
Ilot I/O Modbus Wago Z-Wave (11 volets,prises,présences) + RFXCom (sondes T°+RH, prises)
Pont Hue et une vingtaine d'ampoules,une flopée de Xiaomi aquara, Harmony Elite
8 Google Home et un PC tactile All-In accroché au mur

olivvvv
Timide
Messages : 378
Inscription : 16 janv. 2016, 11:34

Re: [TUTO] IFTTT : Puissance 10

Message par olivvvv » 05 nov. 2018, 11:14

meute a écrit :
05 nov. 2018, 10:55
Premièrement c'est étrange qu'il a trouvé la clé "allume la cuisine" tu dois avoir mis ça au complet dans un regex sinon il aurait trouvé comme clé que "allume"

Deuxièmement as tu bien configuré l'IP et la clé api ?

l'IP est a mettre sous cette forme "xxx.xxx.xxx.xxx" avec les guillemets et la clé "abcdefghijklmnop..." Aussi avec les guillemets.

Sinon le scénario semble avoir "bloqué" sur l'envoie vers le moteur d'interaction d'où la vérification de l'IP et de la clé.

Pour info c'est l'IP locale qu'il faut mettre. Peut être que 127.0.0.1 marcherait aussi j'ai pas essayé.
Oui j'ai modifé ce code :
"(allume)(s)?( (la|les) (lumiere|cuisine)(s)?)?|".

L'IP est bien celle en local et ma clé API est correcte.
Je ferai d'autres essais ce soir.


Je pense avoir trouvé dans le code à l'appel de l'intéraction :

//url d'appel interaction
$url="http://".$IPJeedom."/core/api/jeeApi.php?apikey=".$APIKey."&type=interact&query=".$interactURLFormated;

Je suis en DYI, et mon jeedom est installé dans un répertoire jeedom donc, c'est une information à donner à ceux qui sont comme moi.
Pour ma part je dois donc modifier cet appel en :

//url d'appel interaction
$url="http://".$IPJeedom."/jeedom/core/api/jeeApi.php?apikey=".$APIKey."&type=interact&query=".$interactURLFormated;
Dernière édition par olivvvv le 05 nov. 2018, 11:20, édité 1 fois.

meute
Actif
Messages : 1102
Inscription : 26 août 2017, 11:07
Localisation : Belgique

Re: [TUTO] IFTTT : Puissance 10

Message par meute » 05 nov. 2018, 11:19

Pourquoi avoir ajouté "cuisine" ? Ce n'est pas utile, les commandes clé ne doivent être que les débuts de commande, pas les commandes complètes.
Jeedom VM ESXI sur NUC
Ilot I/O Modbus Wago Z-Wave (11 volets,prises,présences) + RFXCom (sondes T°+RH, prises)
Pont Hue et une vingtaine d'ampoules,une flopée de Xiaomi aquara, Harmony Elite
8 Google Home et un PC tactile All-In accroché au mur

olivvvv
Timide
Messages : 378
Inscription : 16 janv. 2016, 11:34

Re: [TUTO] IFTTT : Puissance 10

Message par olivvvv » 05 nov. 2018, 11:21

meute a écrit :
05 nov. 2018, 11:19
Pourquoi avoir ajouté "cuisine" ? Ce n'est pas utile, les commandes clé ne doivent être que les débuts de commande, pas les commandes complètes.
A ok !
Merci je débute ;)

Je pense avoir trouvé dans le code à l'appel de l'intéraction :

//url d'appel interaction
$url="http://".$IPJeedom."/core/api/jeeApi.php?apikey=".$APIKey."&type=interact&query=".$interactURLFormated;

Je suis en DYI, et mon jeedom est installé dans un répertoire jeedom donc, c'est une information à donner à ceux qui sont comme moi.
Pour ma part je dois donc modifier cet appel en :

//url d'appel interaction
$url="http://".$IPJeedom."/jeedom/core/api/jeeApi.php?apikey=".$APIKey."&type=interact&query=".$interactURLFormated;

meute
Actif
Messages : 1102
Inscription : 26 août 2017, 11:07
Localisation : Belgique

Re: [TUTO] IFTTT : Puissance 10

Message par meute » 05 nov. 2018, 11:25

Ne modifie pas l'appel, ajoute ton dossier directement dans la variable comme ça tu restes standard.
"xxx.xxx.xxx.xxx/jeedom"
Jeedom VM ESXI sur NUC
Ilot I/O Modbus Wago Z-Wave (11 volets,prises,présences) + RFXCom (sondes T°+RH, prises)
Pont Hue et une vingtaine d'ampoules,une flopée de Xiaomi aquara, Harmony Elite
8 Google Home et un PC tactile All-In accroché au mur

Avatar de l’utilisateur
kenny
Timide
Messages : 26
Inscription : 01 juil. 2015, 23:21
Localisation : Toulouse

Re: [TUTO] IFTTT : Puissance 10

Message par kenny » 05 nov. 2018, 11:56

Bonjour meute,

j'ai travailler sur le même sujet, pour des actions IFTTT multiple.
j'aime le principe de sécurité avec le delais de 90S et beaucoup d'autre point de ton script.

Moi j'ai travaillé d'une façon différente et pouvoir passer des commandes mêmes sans le "Et" donc je pense que l'on devrais essayer de faire un truc en commun qui pourrait être super:
viewtopic.php?f=191&t=40515
Gen8, (VMware avec OMV, PLEX, SARAH, JEEDOM...)
Raspberry b+, 2 et 3 (Jeedom, Recalbox, Ambilight)
2 Fibaro FGMS-001,4 Fibaro FGSD-002,1 Fibaro FGFS-101
6 Milight,1 Multiprise Broadlink
GoogleHome,Mon petit Karotz

olivvvv
Timide
Messages : 378
Inscription : 16 janv. 2016, 11:34

Re: [TUTO] IFTTT : Puissance 10

Message par olivvvv » 05 nov. 2018, 12:28

meute a écrit :
05 nov. 2018, 11:25
Ne modifie pas l'appel, ajoute ton dossier directement dans la variable comme ça tu restes standard.
"xxx.xxx.xxx.xxx/jeedom"
Tout est parfaitement fonctionnel !
Merci !
Je vais maintenant recréer mes IFTTT.

Je vais aller plus loin maintenant avec les annonces multiples, si je trouve quoi que ce soit, je posterai ici

Bravo pour ton Tuto
Olivier

roxxsuxx
Timide
Messages : 183
Inscription : 14 sept. 2014, 13:36
Localisation : 30330
Contact :

Re: [TUTO] IFTTT : Puissance 10

Message par roxxsuxx » 05 nov. 2018, 17:22

Salut, merci beaucoup pour ce Tuto, je commence juste mes tests et je crois que tu as fait une erreur dans le premier post au niveau du body webhook, devant text field il y a ´allume du coup quand je dit allume la lumière le scénario reçoit allume allume la lumière.


Envoyé de mon iPhone en utilisant Tapatalk

meute
Actif
Messages : 1102
Inscription : 26 août 2017, 11:07
Localisation : Belgique

Re: [TUTO] IFTTT : Puissance 10

Message par meute » 05 nov. 2018, 17:28

roxxsuxx a écrit :
05 nov. 2018, 17:22
Salut, merci beaucoup pour ce Tuto, je commence juste mes tests et je crois que tu as fait une erreur dans le premier post au niveau du body webhook, devant text field il y a ´allume du coup quand je dit allume la lumière le scénario reçoit allume allume la lumière.


Envoyé de mon iPhone en utilisant Tapatalk
Non pas d'erreur a ce niveau, si tu reçois 2 fois allume c'est que l'applet ifttt est mal configurée.

Le allume est nécessaire dans le webhook car le textfield ifttt n'inclue que la partie $ de la demande donc on doit envoyer allume et textfield pour recevoir la demande complète.

Cette applet ne date pas d'hier en plus, elle est issue des tutos précédents donc elle est bonne, c'est juste le script PHP qui est nouveau
Jeedom VM ESXI sur NUC
Ilot I/O Modbus Wago Z-Wave (11 volets,prises,présences) + RFXCom (sondes T°+RH, prises)
Pont Hue et une vingtaine d'ampoules,une flopée de Xiaomi aquara, Harmony Elite
8 Google Home et un PC tactile All-In accroché au mur

Répondre

Revenir vers « Discussions Générales »

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 1 invité