Page 1 sur 2

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

Publié : 22 avr. 2019, 02:04
par noodom
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é 7150 fois
tempRequete.png
tempRequete.png (48.62 Kio) Consulté 7150 fois

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

Publié : 22 avr. 2019, 08:42
par Bosquetia
Merci pour le travail

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

Publié : 23 avr. 2019, 11:17
par JohnDoe
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

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

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

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

Publié : 23 avr. 2019, 12:05
par Theking31
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] ?

:?:

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

Publié : 23 avr. 2019, 12:27
par noodom
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]
..

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

Publié : 23 avr. 2019, 12:28
par noodom
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 !

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

Publié : 23 avr. 2019, 12:52
par Theking31
Merci ;) :)

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

Publié : 05 juin 2019, 21:31
par psyko_flex
Bonjour,

ça fonctionne nikel ^^ MERCI

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

merci

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

Publié : 05 juin 2019, 22:58
par noodom
Je dirais que non car jeedom n'a pas connaissance de Google assistant.

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

Publié : 02 août 2019, 10:07
par Marcoco
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 :)

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

Publié : 27 sept. 2019, 14:19
par cparfait
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

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

Publié : 27 sept. 2019, 16:38
par noodom
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.

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

Publié : 02 nov. 2019, 18:43
par husq19
salut je trouve pas pour la google home parle ?

merci.

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

Publié : 02 nov. 2019, 23:01
par noodom
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 !’

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

Publié : 03 nov. 2019, 08:22
par husq19
Merci pour la réponse
Non j'ai juste le plugin Google home

Envoyé de mon W-V600 en utilisant Tapatalk


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

Publié : 03 nov. 2019, 09:17
par noodom
Désolé je ne l’ai jamais utilisé. Je ne saurai pas te répondre.

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

Publié : 03 nov. 2019, 09:53
par husq19
salut
dans ifttt texfiel est pas propose en appuyant sur ajouter un ingredient.

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

Publié : 03 nov. 2019, 16:00
par noodom
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.

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

Publié : 03 nov. 2019, 16:33
par husq19
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