Edit, nouveau tuto pour une version grandement amméliorée basée sur celle-ci : viewtopic.php?f=59&t=40578
Faisant suite à une petite expérience désagréable vécue à plusieurs reprises avec IFTTT et que j'ai exposée ici :
viewtopic.php?f=59&t=37944#p626028
Et comme j'utilise déjà depuis plusieurs mois mes interactions IFTTT au travers d'un scénario suivant un tuto exposé ici :
viewtopic.php?f=59&t=32182#p555834
J'ai donc pu mettre au point assez facilement une solution permettant de ne pas exécuter un webhooks IFTTT si il est trop ancien ...
Pour cela on va donc ajouter dans nos Webhooks IFTTT un "TimeStamp" grace à l'ingredient "createdat" que l'on va ensuite contrôler à la réception sous jeedom pour vérifier qu'il n'est pas plus ancien que 90 secondes, sinon on exécute tout simplement pas la demande.
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:
Code : Tout sélectionner
$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
//Correction de la phrase IFTTT pour aider les interaction
$tags["#phrase#"]=strtolower($tags["#phrase#"]); //tout en minuscules
$tags["#phrase#"]=str_replace('"',"",$tags["#phrase#"]); //suppression des "" en trop
$tags["#phrase#"]=str_replace(" ' ","'",$tags["#phrase#"]); //remplace " ' " par "'" correction de l'IFTTT
$tags["#phrase#"]=str_replace(" - ","-",$tags["#phrase#"]); //remplace " - " par "-" correction de l'IFTTT
$tags["#phrase#"]=str_replace(" anvers"," en vert",$tags["#phrase#"]); //remplace "anvers" par "en vert" correction de l'IFTTT
$tags["#phrase#"]=str_replace(" sans"," 100",$tags["#phrase#"]); //remplace pour correction de l'IFTTT
$tags["#phrase#"]=str_replace(" sens"," 100",$tags["#phrase#"]); //remplace pour correction de l'IFTTT
$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
$tags["#phrase#"]=urlencode($tags["#phrase#"]); //encodage au format URL
//url d'appel interaction
$url="http://VotreIPJeedom/core/api/jeeApi.php?apikey=VotreCléAPI&type=interact&query=".$tags["#phrase#"];
//Exécution et récupération de la réponse des intéractions
$scenario->setLog("Send sentence to interact engine"); //Log
$reponse_intraction=file_get_contents($url);
$reponse_intraction=str_replace(".","virgule",$reponse_intraction); //remplace le "." par le mot "virgule" pour le retour TTS de valeurs décimales
$scenario->setLog("Received response : ".$reponse_intraction); //Log
//stockage dans la variable
$scenario->setData("retour_interac",$reponse_intraction ,false) ;
}
}
Ensuite voici une simple applet IFTTT pour allumer n'importe quoi : Et son webhooks : 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
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}}"
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 et envoyer la phrase au moteur pour que l'interaction soit exécutée par jeedom.