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#']);
}
}
- 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)