Commandes simples avec 1 applet IFTTT

Salut a tous,

Mise a jour du 1er Fevrier 2021 suite a des demandes:
- Utilisation de Tags a la place de Variables dans le scenario, corrigeant le probleme des accents dans les mots et le plantage MySQL.

Ci-apres un petit resume de mes bidouilles du jour afin d’utiliser IFTTT avec 1 seul applet pour commander les equipemets / scenarios / etc …
Desole, j’ecris depuis un PC anglais et je n’ai donc pas de touche avec nos caracteres francais …

Comme deja trouve sur la toile, il existe des methodes pour utiliser IFTTT avec 1 seul applet et faire la liaison avec Jeedom par les interractions, ceci je ne souhaitais pas le faire.

Petite demonstration:

1) Creer son unique applet IFTTT


→ Applet Google Assistant + Webhook de type ‹ Say a phrase with a text ingredient ›
→ Mots clefs : ‹ peux-tu › ou ‹ jeedom › ou ‹ s’il te plait › (bref, ce qui vous chante)
→ URL : https://VotreUrlVersJeedom.com/core/api/jeeApi.php
→ Method : Post
→ Content Type : application/x-www-form-urlencoded
→ Body : apikey=VotreKeyApiJeedom&type=scenario&id=VotreScenarioID&action=start&tags=IFTTT:« {{TextField}} »

Donc des qu’on va dire ‹ OK GOOGLE, peux-tu allumer la lumiere de la cuisine ›, le signe $ va etre utilise en tant que TextField et j’appelle le scenario avec ce Tag en argument que j’utiliserai alors dans le scenario pour interragir avec Jeedom.

2) Construction du scenario dans Jeedom

On va creer un scenario qui n’aura aucun declencheur!

Voici comment vous devrez adapter votre code:

$tags = $scenario->getTags();

(empty($tags['#IFTTT#'])) ? $tags['#IFTTT#'] = "" : null;
(empty($tags['#IFTTTMessage#'])) ? $tags['#IFTTTMessage#'] = "" : null;
(empty($tags['#IFTTTNumber#'])) ? $tags['#IFTTTNumber#'] = "" : null;

$arg = $tags['#IFTTT#'];

$message = $arg;
$number = -1;

if (strpos($arg, '%')  !== false || strpos($arg, 'pourcents')  !== false) {
	$pos = my_ofset($arg);
  	$number = substr($arg, $pos, strlen($arg)-$pos);
  	$number = substr($number, 0, strpos($number, ' ')); 
	$message = substr($arg, 0, $pos);
}

$message = trim(strtolower($message));
$number = trim(strtolower($number));

$tags['#IFTTTNumber#'] = $number;

function my_ofset($text){
    preg_match('/^\D*(?=\d)/', $text, $m);
    return isset($m[0]) ? strlen($m[0]) : false;
}

function contains_words($string, $array_of_words)
{
   if (!$array_of_words) return false;
 
   $i = 0;
 
   foreach ($array_of_words as $words)
   {
        if (strpos($string, $words) !== FALSE) $i++;
   }
 
   return ($i == count($array_of_words)) ? true : false;
}

$tags['#IFTTTMessage#'] = "";

if(contains_words($message, array("allum", "bouill")))
{
  $tags['#IFTTTMessage#'] = "Le bouilloire va s'allumer";
}

if(contains_words($message, array("étein", "lumi", "rez")))
{
  $tags['#IFTTTMessage#'] = "Les lumières du rez-de-chaussée vont s'éteindre";
}

if(contains_words($message, array("allum", "lumi", "cuisine")))
{
  $tags['#IFTTTMessage#'] = "Lumière cuisine allumée";
}

if(contains_words($message, array("étein", "lumi", "cuisine")))
{
  $tags['#IFTTTMessage#'] = "Lumière cuisine éteinte";
}

if(contains_words($message, array("lumi", "bar")) && $number != -1)
{
  $tags['#IFTTTMessage#'] = "Lumière du bar à " .$number. " %";
}

if(contains_words($message, array("allum", "lumi", "bar")))
{
  $tags['#IFTTTMessage#'] = "Lumière du bar allumée";
}

if(contains_words($message, array("étein", "lumi", "bar")))
{
  $tags['#IFTTTMessage#'] = "Lumière du bar éteinte";
}

Bref, vous y mettez tout pour controler vos equipements comme vous le souhaitez et comment votre Google Home doit repondre a l’ordre recu/identifie.

Et a la fin du code PHP on ENREGISTRE les Tags:

$scenario->setTags($tags);

Voila c’est tout :slight_smile:

Sebastien

2 « J'aime »

Encore mieux… la tout y est, on peut meme gerer la puissance des lampes …

Petit CODE a rajouter dans le scenario.
Ainsi le message SIMPLE venant de IFTTT est analyse par le script et le decoupe:
En gros, si on veut regler l’intensite d’une lampe on dirait ceci:

OK GOOGLE, Jeedom lumiere du salon a 60 %

S’il y a ‹ % › ou ‹ pourcents › a la fin du message alors le script va decouper la premiere partie comme etant la phrase (et stocker dans la variable IFTTTMessage) et la second partie comme etant le chiffre de variation a donner a l’equipement (et stocker dans la variable IFTTTNumber)

$arg = $scenario->getData('IFTTT');
$message = $arg;
$number = -1;

if (strpos($arg, '%')  !== false || strpos($arg, 'pourcents')  !== false) {
	$pos = my_ofset($arg);
  	$number = substr($arg, $pos, strlen($arg)-$pos);
  	$number = substr($number, 0, strpos($number, ' ')); 
	$message = substr($arg, 0, $pos);
}

$scenario->setData('IFTTTMessage', trim(strtolower($message)));
$scenario->setData('IFTTTNumber', trim(strtolower($number)));

function my_ofset($text){
    preg_match('/^\D*(?=\d)/', $text, $m);
    return isset($m[0]) ? strlen($m[0]) : false;
}

Pour l’action sur la commande d’un variateur ca donne ceci:

Ahhh c’est cool !

Sebastien

1 « J'aime »

C’est du génie :flushed::flushed::flushed:
Bravo, je vais tester c’est super :+1::ok_hand::pray::clap:

1 « J'aime »

Tu es un chef Sattaz !!!

Si votre Google home vous dit qu’elle ne comprend pas, faire un reset de l’enceinte, je l’ai fait et tout fonctionne à la perfection. Vérifier bien dans le popup quand une demande ne fonctionne pas ça peut être un problème de majuscule que Google a inséré à « Prise » par exemple et donc si votre phrase de comparaison est « allume la prise du salon » ça ne va pas marcher.

1 « J'aime »

@marco67660, j’ai modife le script et maintenant tout arrive uniquement en minuscule …

1 « J'aime »

Bonjour,
D’abord un grand merci à Sattaz pour l’astuce car j’avais 163 applets et je ne savais pas comment j’allais faire.
J’ai juste un petit souci avec les caractères spéciaux : é è …
Exemple : « allumer le salon » ok mais « éteindre le salon » erreur.
J’ai essayé de rajouter : « &utf8=1 » mais cela ne marche pas.

Voici ce que je reçois : [MySQL] Error code : 22007 (1366). Incorrect string value: ‹ \xE9teind… › for column jeedom.dataStore.value at row 1 : UPDATE dataStore SET id = :id, type = :type, link_id = :link_id, key = :key, value = :value WHERE id = :id

Merci d’avance

Bonjour je ne comprends pas a quoi ça sert de s’embêter a créer une action dans jeedom pour chaque phrase

Cela fonctionne très bien avec les interactions

1 « J'aime »

Bonjour bartounet,
Je suis novice mais je n’ai rien contre les interactions que j’utilisais avant.
Mais comment actionner une interaction avec la voix ?
Merci

Il y a des tutos partout
Je te laisse chercher
Tu tappes sur Google jeedom interaction Google home
Y en a des dizaines

Merci pour ta réponse.
J’avais déjà fait des recherches : DialogFlow, Goolgle SmatHome …
Mais il faut un abonnement Jeedom, ce qui ne me gêne pas en soit (12€/an), mais est-ce que les caractères spéciaux vont marcher et là je n’ai rien trouvé ?

1 « J'aime »

Effectivement, comme @bartounet, j’ai également du mal à comprendre l’intérêt de passer par des actions plutôt que des intéractions.
L’avantage des intéractions est qu’il y a une certaine tolérances aux erreurs (y compris les caractères spéciaux). Si on dit « allumer LE lumière », avec les intéractions la lumière s’allumera quand même (cf Reglages->Système->Interactions: Sensibilité). Alors qu’avec les actions, la lumière ne sera pas commandée. => Si quelqu’un peux m’expliquer si j’ai raté qqch

Pour info, dans IFTTT, je remplace « Jeedom $ » par « Peux tu $ ». Celà me donne des phrases très naturelles telles que « OK google, peux tu allumer la lumière ».

Oui,
pour moi ce fonctionnement reste « la roue de secours »
je l’utilise vraiment en dernier recours.

La famille ne pense pas à dire Ok Google, Jeedom …

Je préfère passer par le plugin GSH et avoir des vraies phrases naturelle

Oui, moi aussi je passe par « Peux tu $ ».
C’est le retour « Peux tu allumer le salon » : ça marche
mais « Peux tu éteindre le salon » : erreur à cause du « é »
Après dans mon scénario je récupère cette variable et je rajoute même des « ou » pour pas trop verrouiller la réponse.

Salut,

Tout a fait d’accord avec vos commantaires… j’ai fais ce script / test pour m’amuser a remplacer ce que j’avais avec IFTTT mais l’astuce des interractions est bien sympa aussi.
Le top c’est quand meme GSH avec le service Jeedom, on a fait le test chez un ami et c’est vraiment au point.

Maintenant pour ceux qui mentionnent le problemes des erreurs lors de l’utilisation de caracteres speciaux, sous quelle version de Jeedom etes-vous?
Moi en 3.3.22 sous Debian lorsque IFTTT me retourne des caracteres speciaux j’ai un ‹ ? › qui se glisse dans la phrase a la place de ce caractere, exemple:
allume la lumi?re de la cuisine

Mais ceci je peux l’exploiter…

Sebastien

Bonjour,
Je suis en 4.0.61
J’aime bien aller au fond des choses, c’est pour cela que je cherchais.
Mais il faut savoir lâcher l’affaire quand on ne peut pas la résoudre.
Je vais donc me pencher sur GSH.
Merci

Poussons le bouchon un peu plus loin :slight_smile:

Par simple interret, afin d’obtenir le meme resultat qu’avec les interractions Jeedom (ou meme plus) j’ai fait appliquer ces changements:

  1. Dans le script:
$arg = $scenario->getData('IFTTT');
$message = $arg;
$number = -1;

if (strpos($arg, '%')  !== false || strpos($arg, 'pourcents')  !== false) {
	$pos = my_ofset($arg);
  	$number = substr($arg, $pos, strlen($arg)-$pos);
  	$number = substr($number, 0, strpos($number, ' ')); 
	$message = substr($arg, 0, $pos);
}

$scenario->setData('IFTTTMessage', trim(strtolower($message)));
$scenario->setData('IFTTTNumber', trim(strtolower($number)));

function my_ofset($text){
    preg_match('/^\D*(?=\d)/', $text, $m);
    return isset($m[0]) ? strlen($m[0]) : false;
}

function contains_words($string, $array_of_words)
{
   if (!$array_of_words) return false;
 
   $i = 0;
 
   foreach ($array_of_words as $words)
   {
        if (strpos($string, $words) !== FALSE) $i++;
   }
 
   return ($i == count($array_of_words)) ? true : false;
}

// On utilisera la variable IFTTTMessage pour faire parler notre Google Home, c'est la reponse a la commande execute. Je vide cette variable au debut.
$scenario->setData("IFTTTMessage", "");

// Exemples pour allumer ou eteindre une lumiere: si la phrase de du retour IFTTT dans la variable $message contient '?tein' et 'lumi' et 'rez' (lorsque je dis 'ok google peux-tu ETEINdre les LUMIeres du REZ-de-chausse') alors j'attribue la valeur 'Les lumieres du rez-de-chaussée vont s'éteindre'.
// Idem avec 'ALLUme la LUMIere de la cuisine', ici j'attribue la a la variable IFTTTMessage la valeur 'Lumière cuisine allumée'
if(contains_words(trim(strtolower($message)), array("?tein", "lumi", "rez")))
{
  $scenario->setData("IFTTTMessage", "Les lumières du rez-de-chaussée vont s'éteindre");
}

if(contains_words(trim(strtolower($message)), array("allum", "lumi", "cuisine")))
{
  $scenario->setData("IFTTTMessage", "Lumière cuisine allumée");
}

// Pour le reglage de l'intensite d'une lampe c'est pareil, je procede comme suit:
if(contains_words(trim(strtolower($message)), array("lumi", "bar")) && $number != -1)
{
  $scenario->setData("IFTTTMessage", "Lumière du bar à " .$number. " %");
}

// Pour le lancement d'un scenario c'est aussi fonctionnel: 'ok google peux-tu me dire quelle est la PROduction PHOTOvoltaique?' declanchera le scenario 73 ...
if(contains_words(trim(strtolower($message)), array("prod", "photo")) || contains_words(trim(strtolower($message)), array("prod", "?lec")))
{
  $scenario = scenario::byId(73);
  $scenario->launch();
}
  1. Les blocs d’actions:
    Puis dans le scenario je cree un bloc SI/ALORS pour chacune des actions a faire en fonction de la variable IFTTTMessage et/ou IFTTTNumber:

Pour une action simple (ex:allumer la lumiere de la cuisine):

Pour varier l’intensite sur une lumiere:

  1. On fait parler notre Google Home
    Tout a la fin du scenario on place une condition, si notre variable IFTTTMessage contient quelque chose (rappelez-vous au debut du script je la vide) c’est qu’un retour de IFTTT a ete reconnu par notre script. Alors je le fais dire par Google Home:

Pour ceux que cela interresse.
Avec ceci on n’est plus limite a dire des phrases specifiques mais il suffit d’inclure des mots clefs!

:slight_smile:

Sebastien

1 « J'aime »

Ce script a l’air super, mais dans la recette IFTTT quand je met

https://xxxxxx/jeeApi.php?apikey=xxxxxx&type=variable&name=IFTTT&value={{TextField}}

il me dit que l’ingrédient {{TextField}} n’existe pas, c’est réservé à la version payante ?

Tu as bien créé une requête de type ‹ Say a phrase with a text ingredient › ?

1 « J'aime »

Merci c’était exactement ça et ça fonctionne à merveille! j’avais édité une ancienne recette sans cette option, du coup j’en ai fait une nouvelle avec cette requête. J’adore, merci pour le partage.

1 « J'aime »

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.