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] Annonce de la température pour chaque pièce

Sous forum pour les plugins Dialogflow et Google Assistant
Avatar de l’utilisateur
noodom
Actif
Messages : 982
Inscription : 13 juil. 2014, 17:25
Contact :

[TUTO] Annonce de la température pour chaque pièce

Message par noodom » 22 avr. 2019, 02:04

Salut,

Suite à ce post : viewtopic.php?f=59&t=39162 ,
pour une maintenance/évolution plus simple à gérer et des recherches futures plus efficaces, j'ai préféré créer ce post pour faire un tuto sur la demande de température de chaque pièce de la maison à partir de Google Home,
sous la forme : "OK Google, quelle est la température du salon ?"

Sans modifications, avec l'implémentation de ce tuto, on peut demander la température pour toutes les pièces comprenant une commande de température (il suffit de respecter le même nommage de son choix mais identique pour chaque pièce : [Nom de la pièce][Thermostat][Température])

Le principe est le suivant :
- Demander à une Google Home "Quelle est la température du salon ?"
- L'applet IFTTT créée par ce tuto sera appelée avec le nom de la pièce demandée (ici salon, mais fonctionne avec toute pièce comprenant une commande de température au bon format de nommage)
- L'applet appelle alors un scénario Jeedom (voir ci-dessous)
- Ce scénario va récupérer la pièce concernée et donc en déduire la température de la pièce.
- Il suffit ensuite de compléter le scénario pour retourner la réponse (Utilisation du plugin Google Cast par exemple pour un retour vocal, plugin Telegram pour un retour par Telegram, ...)

Gestion des erreurs :
- Temps trop long entre la requête et le traitement par le scénario (pb réseau, ..) : pas de retour de température (évite d'avoir une réponse inutile trop tard). Merci à Meute pour son tuto IFTTT à ce sujet (viewtopic.php?f=59&t=40578) et qui permet d'aller beaucoup plus loin.
- Commande de température non trouvée : retour d'un message d'erreur expliquant le problème de récupération de température. Il suffit donc de faire lire ce message au lieu de la température attendue pour être prévenu. Je n'ai pas trouvé comment récupérer une erreur de pièce inexistante, donc une remontée d'erreur de température inexistante peut aussi être due à une demande pour une pièce inexistante.
- Commande de température inactive : retour d'un message d'erreur

Etapes du Tuto :
- Créer un scénario (et retenir son id) avec la balise CODE contenant le code ci-dessous :
Modifier la deuxième ligne pour faire correspondre le nom de ses commandes de températures de son Jeedom : $commandeTemperature = '[Thermostat][Température]';

Code : Tout sélectionner

// paramétrage
$commandeTemperature = '[Thermostat][Température]';

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

// récupération de la date de création de la requête IFTTT
$createdAt = $tags['#createAt#'];

// gestion de createdat repris du tuto de meute : [TUTO] IFTTT : Puissance 10 V2
// teste si le TimeStamp est fourni en tag pour continuer.
if ($tags["#createdat#"]=="") {	
    $scenario->setLog("Exit, No TimeStamp");
} 
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); // conversion de la chaine IFTTT en DateTime
  $scenario->setLog("IFTTT request Created at : ".$createdAtTime->format('Y-m-d H:i:s'));
  
  $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'));
  
  $deltaSecs=$actualDateTime->getTimestamp() - $createdAtTime->getTimestamp(); // calcul la différence entre les deux DateTime
  $scenario->setLog("Elapsed : ".$deltaSecs." sec");
  
  // teste si la requête IFTTT a été faite dans les 90s précédentes
  //    90s car IFTTT ne fournit 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");
  } 
  else {
    // délai OK, on continue le scénario
    $scenario->setLog("IFTTT request time OK");
    
    // gestion des erreurs
    $tags['#messageErreur#'] = "Aucune erreur";

    // récuperation de la temperature de la piece
    // récupération du nom de la piece
    (empty($tags['#piece#'])) ? $tags['#messageErreur#'] = "Erreur de paramètre : paramètre pièce vide" : null;
    if ($tags['#messageErreur#'] == "Aucune erreur") {
      $tags['#piece#'] = str_replace('"', '', $tags['#piece#']);
      if (substr($tags['#piece#'], 0, 6) == 'de la ') {
          $tags['#piece#'] = substr($tags['#piece#'], 6);
      }
      if (substr($tags['#piece#'], 0, 3) == 'de ') {
          $tags['#piece#'] = substr($tags['#piece#'], 3);
      }
      if (substr($tags['#piece#'], 0, 3) == 'du ') {
          $tags['#piece#'] = substr($tags['#piece#'], 3);
      }
     
      // récupération de la température de la pièce
      $thermostat = '#['.$tags['#piece#'].']'.$commandeTemperature.'#';
      $scenario->setLog("Commande de thermostat récupérée : ".$thermostat);
      try {
        $cmd = cmd::byString($thermostat);
      }
      catch (Exception $e) {
        $tags['#messageErreur#'] = "Erreur de récupération de la commande de température par son nom pour la pièce ".$tags['#piece#']." (le nom de la commande en erreur est ".$thermostat.")";	
      }      
    }


    if ($tags['#messageErreur#'] == "Aucune erreur") {
      $idEquipt = $cmd->getEqLogic_id();

      if (scenarioExpression::eqEnable($idEquipt) == -2) {
        $tags['#messageErreur#'] = "Erreur de récupération de la température de la pièce ".$tags['#piece#'];
      }
      else if (scenarioExpression::eqEnable($idEquipt) == 0) {
        $tags['#messageErreur#'] = "Commande de température de la pièce ".$tags['#piece#']." inactive";
      }
      else {
        $tags['#temperature#'] = $cmd->execCmd();
        // remplacement du point par le mot virgule
        $tags['#temperature#'] = str_replace('.', 'virgule', $tags['#temperature#']);
        $scenario->setLog("Température récupérée : ".$tags['#temperature#']);
      }
    }

    // MAJ des tags avant exécution de la suite du scénario.
    $scenario->setTags($tags);
    
    $scenario->setLog("Fin scénario : ".$tags['#messageErreur#']);
  }
}
- Ajouter au scénario un test vérifiant si il y a eu des erreurs (et les remonter si besoin)
- Remonter l'information de température si il n'y a pas d'erreur en ajoutant une commande pour faire parler sa Google Home (avec le plugin Google Cast par exemple) en passant en paramètre la phrase "La température de tag(piece) est tag(temperature)"

on aura alors :
SI tag(messageErreur) == "Aucune erreur"
ALORS Envoi vers Google Home/Telegram du message 'La température de tag(piece) est tag(temperature)'
SINON Envoi vers Google Home/Telegram du message 'Attention tag(messageErreur)'

- Créer une applet IFTTT pour la question : Quelle est la température de $ ?
mettre son url Jeedom dans URL de la web request (ici urlJeedom)
mettre sa clé API Jeedom et l'id du scénario créé ci-dessus dans la requête IFTTT de la web request (dans cet exemple, on a cleApiJeedom et 123)
tempGH.png
tempGH.png (52.88 Kio) Consulté 6984 fois
tempRequete.png
tempRequete.png (48.62 Kio) Consulté 6984 fois
Dernière édition par noodom le 04 nov. 2019, 22:56, édité 4 fois.

Bosquetia
Actif
Messages : 6783
Inscription : 10 mai 2016, 07:54

Re: [TUTO] Annonce de la température pour chaque pièce

Message par Bosquetia » 22 avr. 2019, 08:42

Merci pour le travail

Avatar de l’utilisateur
JohnDoe
Timide
Messages : 58
Inscription : 09 sept. 2017, 10:56

Re: [TUTO] Annonce de la température pour chaque pièce

Message par JohnDoe » 23 avr. 2019, 11:17

Coucou!
Merci pour ce super tuto et merci pour ton aide aussi!
Je viens de mettre en place le code, mais il ne récupère pas la température. Pourrais tu jeter un œil au code que j’ai inscrit, pour voir si tout va bien svp? J'ai changé simplement la deuxième ligne comme expliqué dans le tuto, et ca ne fonctionne plus. Je mets aussi des screens de mon scénario, et ifttt.
Merci!

Code : Tout sélectionner

// paramétrage
$commandeTemperature = '[Capteur de Température][Température]';

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

// récupération de la date de création de la requête IFTTT
$createdat = $tags['#createAt#'];

// gestion de createdat repris du tuto de meute : [TUTO] IFTTT : Puissance 10 V2
// teste si le TimeStamp est fourni en tag pour continuer.
if ($tags["#createdat#"]=="") {	
    $scenario->setLog("Exit, No TimeStamp");
} 
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); // conversion de la chaine IFTTT en DateTime
  $scenario->setLog("IFTTT request Created at : ".$createdAtTime->format('Y-m-d H:i:s'));
  
  $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'));
  
  $deltaSecs=$actualDateTime->getTimestamp() - $createdAtTime->getTimestamp(); // calcul la différence entre les deux DateTime
  $scenario->setLog("Elapsed : ".$deltaSecs." sec");
  
  // teste si la requête IFTTT a été faite dans les 90s précédentes
  //    90s car IFTTT ne fournit 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");
  } 
  else {
    // délai OK, on continue le scénario
    $scenario->setLog("IFTTT request time OK");
    
    // gestion des erreurs
    $tags['#messageErreur#'] = "Aucune erreur";

    // récuperation de la temperature de la piece
    // récupération du nom de la piece
    (empty($tags['#piece#'])) ? $tags['#erreur#'] = "Erreur de paramètre : paramètre piece vide" : null;
    $tags['#piece#'] = str_replace('"', '', $tags['#piece#']);
    if (substr($tags['#piece#'], 0, 6) == 'de la ') {
        $tags['#piece#'] = substr($tags['#piece#'], 6);
    }
    if (substr($tags['#piece#'], 0, 3) == 'de ') {
        $tags['#piece#'] = substr($tags['#piece#'], 3);
    }
    if (substr($tags['#piece#'], 0, 3) == 'du ') {
        $tags['#piece#'] = substr($tags['#piece#'], 3);
    }

    // récupération de la température de la pièce
    $thermostat = '#['.$tags['#piece#'].']'.$commandeTemperature.'#';
    try {
      $cmd = cmd::byString($thermostat);
    }
    catch (Exception $e) {
        $tags['#messageErreur#'] = "Erreur de récupération de la commande de température par son nom pour la pièce ".$tags['#piece#']." (le nom de la commande en erreur est ".$thermostat.")";	
    }

    if ($tags['#messageErreur#'] == "Aucune erreur") {
      $idEquipt = $cmd->getEqLogic_id();

      if (scenarioExpression::eqEnable($idEquipt) == -2) {
        $tags['#messageErreur#'] = "Erreur de récupération de la température de la pièce ".$tags['#piece#'];
      }
      else if (scenarioExpression::eqEnable($idEquipt) == 0) {
        $tags['#messageErreur#'] = "Commande de température de la pièce ".$tags['#piece#']." inactive";
      }
      else {
        $tags['#temperature#'] = $cmd->execCmd();
        // remplacement du point par le mot virgule
        $tags['#temperature#'] = str_replace('.', 'virgule', $tags['#temperature#']);
      }
    }

    // MAJ des tags avant exécution de la suite du scénario.
    $scenario->setTags($tags);
  }
}
Image

Image

Image
Nuc Intel NUC8I3BEH avec Proxmox VM, 2 antennes BLEA, RFlink, Clé Zwave Aeon Stick gen5, 2 centrales Xiaomi avec 24 capteurs, 2 modules Fibaro, 4 Nut find 3, 4 caméras.

Avatar de l’utilisateur
JohnDoe
Timide
Messages : 58
Inscription : 09 sept. 2017, 10:56

Re: [TUTO] Annonce de la température pour chaque pièce

Message par JohnDoe » 23 avr. 2019, 11:32

Arf! J'ai fait une erreur dans la partie body de l'applet iftt. Ca fonctionne impec maintenant, Désolé et merci!
Nuc Intel NUC8I3BEH avec Proxmox VM, 2 antennes BLEA, RFlink, Clé Zwave Aeon Stick gen5, 2 centrales Xiaomi avec 24 capteurs, 2 modules Fibaro, 4 Nut find 3, 4 caméras.

Avatar de l’utilisateur
Theking31
Actif
Messages : 1182
Inscription : 21 sept. 2017, 11:13
Localisation : Toulouse - Le Vernet

Re: [TUTO] Annonce de la température pour chaque pièce

Message par Theking31 » 23 avr. 2019, 12:05

Bonjour et merci pour la synthèse ;)
Modifier la deuxième ligne pour faire correspondre le nom de ses commandes de températures de son Jeedom : $commandeTemperature = '[Thermostat][Température]';
Il faut donc avoir le même nom de commande pour toutes ses sondes ?

Par exemple j'ai :

Commande : Température
Equipement : Sonde Sous Sol
Objet : Sous Sol

et

Commande : Température
Equipement : Sonde_Détecteur (4)
Objet : Maison

et

Commande : Température
Equipement : Sonde Exterieur
Objet : Jardin

Il faut que je renomme touts mes équipements en [sonde] pour faire [sonde][Température] ?

:?:
Jeedom 4.0.23 sur Intel NUC 6CAYH | Linux 4.9.0-11-amd64 | Debian 9.11
Rfxcom | Z-Wave Plus Z-Stick GEN5 | Conbee 2 | => sur hub alimenté
Blea| Brodlink | Xiaomi |ESPeasy | Wifilightv2

Avatar de l’utilisateur
noodom
Actif
Messages : 982
Inscription : 13 juil. 2014, 17:25
Contact :

Re: [TUTO] Annonce de la température pour chaque pièce

Message par noodom » 23 avr. 2019, 12:27

Theking31 a écrit :
23 avr. 2019, 12:05
Bonjour et merci pour la synthèse ;)
Modifier la deuxième ligne pour faire correspondre le nom de ses commandes de températures de son Jeedom : $commandeTemperature = '[Thermostat][Température]';
Il faut donc avoir le même nom de commande pour toutes ses sondes ?

Par exemple j'ai :

Commande : Température
Equipement : Sonde Sous Sol
Objet : Sous Sol

et

Commande : Température
Equipement : Sonde_Détecteur (4)
Objet : Maison

et

Commande : Température
Equipement : Sonde Exterieur
Objet : Jardin

Il faut que je renomme touts mes équipements en [sonde] pour faire [sonde][Température] ?

:?:
Oui, voilà, il faut que l'équipement et la commande soient identiques pour chaque pièce.
Le script ajoutera la pièce devant pour récupérer [pièce][équipement][commande].

Sinon, pour conserver tes noms d'équipements et de commandes, il faudra modifier le script pour faire une recherche de commande en fonction du nom passé par Google Home.
(Mais tu perds la "magie" de l'automatisation du processus ;) )

Code : Tout sélectionner

SI (piece==salon)
ALORS récupérer température avec [salon][sonde salon][température salon]
SINON SI (piece=chambre) 
ALORS récupérer température avec [chambre][sonde chambre][température chambre]
..
Dernière édition par noodom le 23 avr. 2019, 13:02, édité 1 fois.

Avatar de l’utilisateur
noodom
Actif
Messages : 982
Inscription : 13 juil. 2014, 17:25
Contact :

Re: [TUTO] Annonce de la température pour chaque pièce

Message par noodom » 23 avr. 2019, 12:28

JohnDoe a écrit :
23 avr. 2019, 11:32
Arf! J'ai fait une erreur dans la partie body de l'applet iftt. Ca fonctionne impec maintenant, Désolé et merci!
Cool !

Avatar de l’utilisateur
Theking31
Actif
Messages : 1182
Inscription : 21 sept. 2017, 11:13
Localisation : Toulouse - Le Vernet

Re: [TUTO] Annonce de la température pour chaque pièce

Message par Theking31 » 23 avr. 2019, 12:52

Merci ;) :)
Jeedom 4.0.23 sur Intel NUC 6CAYH | Linux 4.9.0-11-amd64 | Debian 9.11
Rfxcom | Z-Wave Plus Z-Stick GEN5 | Conbee 2 | => sur hub alimenté
Blea| Brodlink | Xiaomi |ESPeasy | Wifilightv2

psyko_flex
Timide
Messages : 27
Inscription : 19 déc. 2018, 13:20

Re: [TUTO] Annonce de la température pour chaque pièce

Message par psyko_flex » 05 juin 2019, 21:31

Bonjour,

ça fonctionne nikel ^^ MERCI

Est-ce que l'on peut avoir un retour depuis le google assistant ( depuis le mobile) ?

merci
Qnap TS-251
Docker installé jeedom/jeedom
Iphone 8

Avatar de l’utilisateur
noodom
Actif
Messages : 982
Inscription : 13 juil. 2014, 17:25
Contact :

Re: [TUTO] Annonce de la température pour chaque pièce

Message par noodom » 05 juin 2019, 22:58

Je dirais que non car jeedom n'a pas connaissance de Google assistant.

Marcoco
Timide
Messages : 1
Inscription : 02 août 2019, 10:00

Re: [TUTO] Annonce de la température pour chaque pièce

Message par Marcoco » 02 août 2019, 10:07

Bonjour,

J'essaye activement de faire fonctionner le scénario mais j'ai l'impression qu'il a du mal à trouver la pièce car il ne s'agit pas d'un seul mot.
Voici mes logs :

------------------------------------
[2019-08-01 23:51:13][SCENARIO] Start : Execution provoquee par un appel API . Tags : {"#createdat#":"\"August 1, 2019 at 11:50PM\"","#piece#":"salle"}
[2019-08-01 23:51:13][SCENARIO] Exécution du sous-élément de type [action] : code
[2019-08-01 23:51:13][SCENARIO] Exécution d'un bloc code
[2019-08-01 23:51:13][SCENARIO] IFTTT request Created at : 2019-08-01 23:50:00
[2019-08-01 23:51:13][SCENARIO] IFTTT request Received at : 2019-08-01 23:51:13
[2019-08-01 23:51:13][SCENARIO] Elapsed : 73 sec
[2019-08-01 23:51:13][SCENARIO] IFTTT request time OK
[2019-08-01 23:51:13][SCENARIO] Exécution du sous-élément de type [condition] : if
[2019-08-01 23:51:13][SCENARIO] Evaluation de la condition : [SI "Erreur de récupération de la commande de température par son nom pour la pièce salle (le nom de la commande en erreur est #[salle][Capteur température][Température]#)" == "Aucune erreur"] = SI "Erreur de récupération de la commande de température par son nom pour la pièce salle (le nom de la commande en erreur est #[salle][Capteur température][Température]#)" == "Aucune erreur"
[2019-08-01 23:51:13][SCENARIO] Expression non valide : SI "Erreur de récupération de la commande de température par son nom pour la pièce salle (le nom de la commande en erreur est #[salle][Capteur température][Température]#)" == "Aucune erreur"
[2019-08-01 23:51:13][SCENARIO] Fin correcte du scénario
------------------------------------

et voici mes commandes pour mes thermostat :

[SALLE DE BAIN][Thermostat][Température]

Sauriez-vous me filer un coup de main pour me sortir de cette situation?

Merci :)

cparfait
Timide
Messages : 5
Inscription : 06 mai 2017, 15:14

Re: [TUTO] Annonce de la température pour chaque pièce

Message par cparfait » 27 sept. 2019, 14:19

Bonjour,

J'ai un peu de mal à mettre en place tout ça...pourtant ça parait assez simple ;)

quelqu'un pourrait me copier son Body de IFTT svp car je pense que je fais une erreur qq part.

Par avance, merci

Avatar de l’utilisateur
noodom
Actif
Messages : 982
Inscription : 13 juil. 2014, 17:25
Contact :

Re: [TUTO] Annonce de la température pour chaque pièce

Message par noodom » 27 sept. 2019, 16:38

cparfait a écrit :Bonjour,

J'ai un peu de mal à mettre en place tout ça...pourtant ça parait assez simple ;)

quelqu'un pourrait me copier son Body de IFTT svp car je pense que je fais une erreur qq part.

Par avance, merci
Salut,

Voilà pour la partie ifttt (comme sur la capture du tuto) :


apikey=cleAPI&type=scenario&id=123&action=start&tags=createdat%3D"{{CreatedAt}}"%20piece%3D"{{TextField}}"&utf8=1

Tu dois mettre ta clé api et ton idée de scénario.

husq19
Timide
Messages : 36
Inscription : 28 août 2018, 12:18

Re: [TUTO] Annonce de la température pour chaque pièce

Message par husq19 » 02 nov. 2019, 18:43

salut je trouve pas pour la google home parle ?

merci.

Avatar de l’utilisateur
noodom
Actif
Messages : 982
Inscription : 13 juil. 2014, 17:25
Contact :

Re: [TUTO] Annonce de la température pour chaque pièce

Message par noodom » 02 nov. 2019, 23:01

husq19 a écrit :salut je trouve pas pour la google home parle ?

merci.
Salut,

Tu as le plug-in Google Cast ? Il a la commande ‘Parle !’

husq19
Timide
Messages : 36
Inscription : 28 août 2018, 12:18

Re: [TUTO] Annonce de la température pour chaque pièce

Message par husq19 » 03 nov. 2019, 08:22

Merci pour la réponse
Non j'ai juste le plugin Google home

Envoyé de mon W-V600 en utilisant Tapatalk


Avatar de l’utilisateur
noodom
Actif
Messages : 982
Inscription : 13 juil. 2014, 17:25
Contact :

Re: [TUTO] Annonce de la température pour chaque pièce

Message par noodom » 03 nov. 2019, 09:17

Désolé je ne l’ai jamais utilisé. Je ne saurai pas te répondre.

husq19
Timide
Messages : 36
Inscription : 28 août 2018, 12:18

Re: [TUTO] Annonce de la température pour chaque pièce

Message par husq19 » 03 nov. 2019, 09:53

salut
dans ifttt texfiel est pas propose en appuyant sur ajouter un ingredient.

Avatar de l’utilisateur
noodom
Actif
Messages : 982
Inscription : 13 juil. 2014, 17:25
Contact :

Re: [TUTO] Annonce de la température pour chaque pièce

Message par noodom » 03 nov. 2019, 16:00

Salut,

La présentation du site IFTTT a changé depuis le moment où j'ai écrit le tuto.

La manip pour créer l'applet est donc la suivante :
- aller sur ifttt.com
- sélectionner 'Explore' en haut à gauche
- sélectionner le bouton '+'
- cliquer sur '+This'
- dans la case 'Search services', taper 'google'
- dans les réponses, sélectionner 'Google Assistant'

=> Tu retrouves 'Say a phrase with a text ingredient', à sélectionner donc pour la suite du tuto.

husq19
Timide
Messages : 36
Inscription : 28 août 2018, 12:18

Re: [TUTO] Annonce de la température pour chaque pièce

Message par husq19 » 03 nov. 2019, 16:33

J'ai un peu avancer mais gh annonce -20.5 je sais pas où je me suis tromper

Envoyé de mon W-V600 en utilisant Tapatalk


Répondre

Revenir vers « [Plugin Officiel] Assistant vocaux »

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 2 invités