WikiElectronique

Wiki sur l'électronique et l'informatique

Outils pour utilisateurs

Outils du site


actions_on_google_et_domotique

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
actions_on_google_et_domotique [2018/03/07 22:38]
88.164.131.165 [Coté serveur]
actions_on_google_et_domotique [2018/03/18 09:48] (Version actuelle)
88.164.131.165 [Etapes]
Ligne 21: Ligne 21:
   * Dans "What do you want the Assistant to say in response?",​ écrivez la phrase qui sera répondu par votre Google Home (ex : Ok je monte les volets)   * Dans "What do you want the Assistant to say in response?",​ écrivez la phrase qui sera répondu par votre Google Home (ex : Ok je monte les volets)
   * Dans Language sectionner French   * Dans Language sectionner French
 +
 +{{::​trigger.png?​200|}}
 +
   * Cliquer sur +that pour créer l'​action   * Cliquer sur +that pour créer l'​action
   * Dans le choix du service sélectionner Webhook   * Dans le choix du service sélectionner Webhook
   * Dans URL, mettez l'URL de la page sur votre serveur qui sera en charge d'​actionner votre équipement   * Dans URL, mettez l'URL de la page sur votre serveur qui sera en charge d'​actionner votre équipement
   * (ex : http:​\\ip_serveur\api\volets?​montetous=1)   * (ex : http:​\\ip_serveur\api\volets?​montetous=1)
 +
 +{{::​action.png?​200|}}
  
 ==== Coté serveur === ==== Coté serveur ===
Ligne 75: Ligne 80:
  
 ==== Dialogflow ====  ==== Dialogflow ==== 
 +
 +Actions on Google permet de développer une application pour votre Google Home. 
 +En gros, elle remplacera IFTTT que nous avions utilisé avant.
 +L'​avantage de cette solution et qu'​elle permet un paramétrage plus précis des conditions (Demandes). (Exemple, demander de monter ou descendre le volet d'une pièce en particulier sans devoir recréer une conditions pour chaque pièce et chaque état. La pièce deviendra un paramètre et l'​action monter et descendre aussi.
 +
 +Il y a néanmoins des inconvénients à cette solution : 
 +* Les applications ont vocations a être public même si vous pouvez les tester sur votre Google Home de manière privée. Lors du lancement de l'​application,​ votre Google Home vous dira "Ok je lancer la version de test de <​nom_de_votre_application>​
 +* Il faut invoquer votre application pour l'​utiliser. Vous devriez dire "Ok Google parler avec <​nom_de_votre_application>​. C'est seulement ensuite que vous pourrez l'​interroger sur l'​état de vos volets.  ​
 +
 +=== Etapes ===
 +  *  Aller sur https://​console.actions.google.com
 +  * Créer un nouveau projet puis dans Actions, sélectionner Dialogflow actions. ​
 +  * Vous allez ensuite arriver sur le site https://​console.dialogflow.com qui vous permettra de créer votre application
 +
 +2 menus sont important "​Intents"​ et Entities
 +
 +  * Intents : Ce sont les intentions/​questions/​demandes que vous allez envoyer à votre Google Home
 +  * Entities : Ce soit les parametres variables de vos Intents
 +
 +Exemple pour une demande du type "Monte les volets du salon."​ Monte les volets"​ ca sera votre demande et "du salon" sera une des valeurs possible de votre groupe d'​entities @pieces qui contiendra aussi toutes vos autres pièces. ​
 +Chaque valeur pourra avoir des synonymes. "du salon, salon, dans le salon etc ..."
 +
 +Ce qui permettra a votre Google Home de reconnaitre toutes les variantes possibles ​
 +Monte les volets du salon, monte les volets dans le salon, monte les volets salon etc ...
 +
 +* Créer dans Entities, un groupes "​pieces"​ et renseigner les noms de vos différentes pièces
 +* Créer dans Intents un nouvel intent qui s'​appellera par exemple "​demande_monte_volets"​
 +* Dans Training phrases taper "Monte les volets du salon" puis taper "​Entrer"​
 +* Sélectionner "du salon" et sélectionner dans parametre votre entities "​pieces"​
 +* Sauvegardez votre intent  ​
 +
 +Dans intents, vous trouverez deux intent par defaut "​Default Fallback intent"​ qui correspond aux phrases par defaut que vous dira votre Google Home et "​Default Welcome Intent"​ qui correspond aux phrases de lancement de l'​application. Vous pouvez personnaliser les deux et trouver des phrases plus amusantes ;)
 +
 +Maintenant que notre commande est paramétrée,​ il faut créer l'​interface avec notre serveur. ​
 +Pour cela, il faut aller dans "​Fulfillment"​ et définir l'URL de votre page qui sera en charge de traiter les commandes envoyé par votre Google Home.
 +
 +<note important>​Attention,​ votre page doit être en HTTPS.</​note>​
 +
 +Si votre serveur est héberge chez vous et que vous ne souhaitez pas payer pour avoir un certificat SSL, vous pouvez utiliser letsencrypt qui est gratuit: https://​letsencrypt.org/​
 +Le certificat n'est valable que 3 mois. Il faudra le renouveler tous les 3 mois. Il existe des systèmes de renouvellement automatique. (Faites recherche sur Google avec Letsencryt ACME). Par ma part j'​utilise WIN-ACME qui est surement la solution la plus simple d'​utilisation sous Windows https://​github.com/​PKISharp/​win-acme
 +
 +Une fois votre URL paramétré,​ retournez dans votre intent et activer "​Enable webhook call for this intent"​.
 +Dès que cette intent sera déclenché,​ par "​monter les volets ...", une requête sera faite votre page. Un POST content des données JSON vers votre page. 
 +Ce JSON contiendra plein d'​information dont deux qui nous intéressent,​ le nom de l'​intent et le paramètre.
 +
 +Il faudra que votre page, réponde à ce post en envoyant un JSON avec deux paramètres "​speech"​ qui correspondra à la phrase que votre Google Home répondra et diplayText qui sera la même phrase. ​
 +
 +La class équivalent/​serializable en C# est la suivante ​
 +
 +<code csharp> ​
 +    public class JsonReponse
 +    {
 +        public string speech { get; set; }
 +        public string displayText { get; set; }
 +    }
 +</​code>​
 +
 +Voici un exemple en ASP MCV pour le traitement du JSON envoyé par Google ​
 +
 +<code csharp> ​
 +        [HttpPost]
 +        public async Task<​JsonReponse>​ IndexAsync()
 +        {
 +            JsonReponse resp = await DecodeRequest();​
 +            return resp;
 +        }
 +        ​
 +        async Task<​JsonReponse>​ DecodeRequest()
 +        {
 +            string jsonData = await this.Request.Content.ReadAsStringAsync();​
 +            string question = (string)jObject["​result"​]["​resolvedQuery"​];​
 +            string intent = (string)jObject["​result"​]["​metadata"​]["​intentName"​];​
 +
 +            JsonReponse resp = new JsonReponse();​
 +            resp.speech = "Cette demande n'a pas pû être traitée";​
 +            resp.displayText = "Cette demande n'a pas pû être traitée";​
 +
 +            switch (intent)
 +            {
 +                case "​question_volets":​
 +                    resp = DecodeQuestionVolets(jObject);​
 +                    break;
 +                default:
 +                    break;
 +            }
 +
 +            return resp;
 +        }
 +        ​
 +        private JsonReponse DecodeQuestionVolets(Newtonsoft.Json.Linq.JObject jObject)
 +        {
 +            JsonReponse resp = new JsonReponse();​
 +            resp.speech = "​pièce inconnue";​
 +            resp.displayText = "​inconnue inconnue";​
 +
 +            Dictionary < string, string> parametres = jObject["​result"​]["​parameters"​].ToObject<​Dictionary<​string,​ string>>​();​
 +
 +            if (parametres.Count > 0)
 +            {
 +                var parametre = parametres.First();​
 +                string piece = parametre.Value;​
 +                ​
 +                if (piece.Contains("​chambre"​))
 +                {
 +                    //Monte le volet de la chambre
 +                }
 +            }
 +      }
 +</​code>​
 +
 +Il peut aussi être utile d'​enregistrer les données JSON qui sont envoyées par Google. ​
 +Pour cela vous pouvez faire une simple fonction de log pendant votre période de debuggage
 +
 +<code csharp>
 +        /// <​summary>​
 +        /// Enregistrement dans un fichier de log
 +        /// </​summary>​
 +        /// <param name="​JsonData"></​param>​
 +        void log(string JsonData)
 +        {
 +            string directory = @"​C:​\inetpub\wwwroot\webservice\log";​
 +
 +            if (!Directory.Exists(directory))
 +            {
 +                try
 +                {
 +                    Directory.CreateDirectory(directory);​
 +                }
 +                catch (Exception ex)
 +                {
 +                }
 +            }
 +            try
 +            {
 +                File.AppendAllText(directory + @"​\"​ + DateTime.Now.ToString("​yyyy-MM-dd"​) + "​.txt",​ DateTime.Now.ToString("​HH:​mm:​ss"​) + " : " + JsonData + "​\r\n\r\n"​);​
 +            }
 +            catch (Exception ex)
 +            {
 +            }
 +</​code> ​           ​
 +
 +L'​étape suivante et de publier votre application sur votre Google Home. Pour cela, aller dans le menu "​Integrations"​ cliquer sur Google Assistant puis test. 
 +Vous pourrez tester votre application sur le site mais elle sera aussi deployé sur votre Google Home. 
 +Pour la démarrer il suffira de dire "Ok google parler avec <​nom_de_votre_application>"​
 + 
 +  ​
actions_on_google_et_domotique.1520458716.txt.gz · Dernière modification: 2018/03/07 22:38 par 88.164.131.165