Mini-Tuto pour faire parler Gladys sur GoogleHome (via node-red)

Gladys est déjà capable de parler sur des enceintes Sonos, mais à la maison c’est du matériel Google que j’ai : un google Nest audio et un Google mini. Je vous explique comment j’utilise ces enceintes depuis des scènes pour donner vie à Gladys :wink:

Le fonctionnement n’est pas que local, par contre : je m’appuie sur Google Cloud pour générer le fichier audio à partir d’un texte. Je m’appuie également sur node-red intégré dans Gladys. Et je recommande de fixer l’adresse IP de l’enceinte dans les paramètres de la box, pour être sûr qu’elle ne change pas et que l’enceinte soit donc toujours joignable.

Pour éviter que les scènes soient trop monotones, le fonctionnement que j’ai mis en place permet de définir différentes phrases possibles, et un tirage aléatoire détermine celle qui est envoyée sur l’enceinte. Le volume est déterminé en fonction de l’heure (pour être plus discret en soirée ou la nuit), avec un mécanisme pour forcer un certain volume en cas de besoin (une alerte qui doit être entendue quelle que que soit l’heure).

Voici les étapes de configuration:

  1. Fixer l’IP de l’enceinte

De mon côté, je suis derrière une Freebox Revolution. Sur cet appareil, il faut se connecter sur la page http://mafreebox.freebox.fr/, puis ouvrir le menu « Périphérique réseau » pour repérer votre appareil Google (il a pour constructeur « Google Inc. »), et faire un clic droit sur cet appareil en choisissant l’action « Configurer un bail DHCP ». Choisissez une adresse IP, et notez-la. Elle servira à l’étape 4 de ce tuto. Chez moi, il s’agit de http://192.168.1.130

Sur les autres box de Free, je crois que la page http://mafreebox.freebox.fr/ existe aussi, mais je n’en suis pas certain… Quelqu’un peut peut-être confirmer ?

Si vous êtes chez un autre opérateur, je ne sais pas s’il est possible de fixer l’IP… Et si vous ne pouvez pas fixer l’adresse, on va faire l’hypothèse qu’elle ne bougera pas trop souvent :wink: Il faut en tout cas que vous trouviez dans votre box l’adresse IP de l’appareil Google…

  1. Créer un compte Google Cloud et récupérer la clé

Il faut d’abord se rendre sur https://console.cloud.google.com et s’y connecter avec un compte Google. Il faut ensuite créer un nouveau projet sur la page https://console.cloud.google.com/projectcreate. Quand le projet est créé, allez sur la page https://console.cloud.google.com/apis/credentials pour créer un identifiant d’API avec le menu « + Créer des identifiants » et le choix « Clé API ». Conservez cette clé API qui servira à l’étape 4 de ce tuto. Dans la suite de tuto, je la noterai GOOGLE-API-KEY

  1. Créer un appareil MQTT dans Gladys

Dans Gladys, je fais l’hypothèse que vous avez déjà configuré l’intégration MQTT (MQTT | Gladys Assistant). Dans la page ‹ configuration › de cette intégration, relevez l’identifiant et le mot de passe. Vous en aurez besoin à l’étape 4.
Dans la page ‹ Appareils ›, ajoutez un nouvel appareil, puis une fonctionnalité de type « Texte ». Laissez cochée la case « Oui, ce capteur ne fait qu’envoyer des données à Gladys ». Notez le topic MQTT, il servira à l’étape 4 de ce tuto. Chez moi, il s’agit de « gladys/master/device/mqtt:annonce-google-home/feature/mqtt:annonce-google-home/text »

  1. Mettre en place le flux Node-red

Dans Gladys, je fais l’hypothèse que vous avez déjà configuré l’intégration Node-red (Node-RED | Gladys Assistant).

Utilisez le menu « Gérer la palette » pour ajouter le module ‹ node-red-contrib-castv2 ›.

Utilisez le menu « Importer », et copiez-collez la configuration JSON suivante :

[
    {
        "id": "d37077f6ab6cbc16",
        "type": "tab",
        "label": "Google Home TTS",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "7e1b425bf5db62f7",
        "type": "mqtt in",
        "z": "d37077f6ab6cbc16",
        "name": "Réception d'un texte à annoncer",
        "topic": "gladys/master/device/mqtt:annonce-google-home/feature/mqtt:annonce-google-home/text",
        "qos": "2",
        "datatype": "auto-detect",
        "broker": "1b5d1d2ce48e32e1",
        "nl": false,
        "rap": true,
        "rh": 0,
        "inputs": 0,
        "x": 150,
        "y": 60,
        "wires": [
            [
                "093a1fe42d9a1c37",
                "36cebd3192c88c48"
            ]
        ]
    },
    {
        "id": "36cebd3192c88c48",
        "type": "function",
        "z": "d37077f6ab6cbc16",
        "name": "Définition du volume",
        "func": "// 3 réglages de volume en fonction des périodes de la journée. la valeur est entre 0 et 100.\nconst volumeMessagesJournee = 50;\nconst volumeMessagesNuit = 10;\nconst volumeMessagesMatinEtSoir = 30;\n\nvar parts = msg.payload.split(\"|\");\n\nmsg.payload={};\nmsg.payload.type = \"VOLUME\";\n\nif (parts.length > 1){\n    // si il y a un '|' dans le message, c'est que la première partie indique le volum à appliquer\n    var vol = parts[0].slice(3);\n    msg.payload.volume = 10 * Number(vol);\n} else {\n    // sinon on applique un volume dépendant du jour et de l'heure\n    // Lun-Ven : volNuit - 6h - volMatinEtSoir -  8h - volJournee - 20h - volMatinEtSoir - 22h - volNuit\n    // Sam-Dim : volNuit - 6h - volMatinEtSoir - 10h - volJournee - 20h - volMatinEtSoir - 22h - volNuit\n    var now = new Date();\n    var heure = now.getHours();\n    var day = now.getDay() //dimanche=0, lundi=1, ..., samedi=6\n\n    if (heure<6){\n        msg.payload.volume = volumeMessagesNuit\n    } else if ( (heure<10 && (day===0 || day===6)) || (heure<8 && day>=1 && day<=5) ) {\n    msg.payload.volume = volumeMessagesMatinEtSoir;\n    } else if (heure<20){\n        msg.payload.volume = volumeMessagesJournee;\n    } else if (heure<22){\n        msg.payload.volume = volumeMessagesMatinEtSoir;\n    } else {\n        msg.payload.volume = volumeMessagesNuit;\n    }\n}\n\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 480,
        "y": 60,
        "wires": [
            [
                "ae0fa7da259de071"
            ]
        ]
    },
    {
        "id": "093a1fe42d9a1c37",
        "type": "function",
        "z": "d37077f6ab6cbc16",
        "name": "Choix aléatoire si plusieurs phrases",
        "func": "// on ne retient que la dernière partie (la première, si elle existe, est le volume)\nvar parts = msg.payload.split(\"|\");\nvar info = parts[parts.length-1];\n\n// Si il y a plusieurs phrases (séparées par un ';'), l'une est choisie au hasard\nvar phrases = info.split(\";\");\nvar alea = Math.floor(Math.random() * phrases.length);\nmsg.payload = phrases[alea]\n\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 260,
        "y": 140,
        "wires": [
            [
                "19d1b62062ded3e5"
            ]
        ]
    },
    {
        "id": "19d1b62062ded3e5",
        "type": "function",
        "z": "d37077f6ab6cbc16",
        "name": "Ajout des paramètres TTS",
        "func": "var google_api_key = \"GOOGLE-API-KEY\"\nvar gender = \"male\"\n\nvar text = msg.payload;\n\nmsg.payload = {};\nmsg.payload.app = \"DefaultMediaReceiver\";\nmsg.payload.type = \"MEDIA\";\nmsg.payload.media = {};\nmsg.payload.media.url = \"https://www.google.com/speech-api/v1/synthesize?enc=mpeg&client=chromium&key=\"+google_api_key+\"&text=\"+text+\"&lang=fr-fr&gender=\"+gender+\"&speed=0.50&pitch=0.5\";\n\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 230,
        "y": 200,
        "wires": [
            [
                "ae6886112f208b88"
            ]
        ]
    },
    {
        "id": "ae6886112f208b88",
        "type": "delay",
        "z": "d37077f6ab6cbc16",
        "name": "Retard 200ms pour permettre modif. volume",
        "pauseType": "delay",
        "timeout": "200",
        "timeoutUnits": "milliseconds",
        "rate": "1",
        "nbRateUnits": "1",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": false,
        "allowrate": false,
        "outputs": 1,
        "x": 550,
        "y": 200,
        "wires": [
            [
                "ae0fa7da259de071"
            ]
        ]
    },
    {
        "id": "ae0fa7da259de071",
        "type": "castv2-sender",
        "z": "d37077f6ab6cbc16",
        "name": "GGH Entrée ",
        "connection": "c8c6f114a3b8515b",
        "x": 890,
        "y": 200,
        "wires": [
            []
        ]
    },
    {
        "id": "1b5d1d2ce48e32e1",
        "type": "mqtt-broker",
        "name": "Broker MQTT Gladys",
        "broker": "mqtt://192.168.1.100",
        "port": "1883",
        "clientid": "",
        "autoConnect": true,
        "usetls": false,
        "protocolVersion": "4",
        "keepalive": "60",
        "cleansession": true,
        "autoUnsubscribe": true,
        "birthTopic": "",
        "birthQos": "0",
        "birthPayload": "",
        "birthMsg": {},
        "closeTopic": "",
        "closeQos": "0",
        "closePayload": "",
        "closeMsg": {},
        "willTopic": "",
        "willQos": "0",
        "willPayload": "",
        "willMsg": {},
        "userProps": "",
        "sessionExpiry": ""
    },
    {
        "id": "c8c6f114a3b8515b",
        "type": "castv2-connection",
        "name": "GoogleHome Entrée",
        "target": "",
        "host": "192.168.1.130",
        "port": "8009"
    }
]

Editez le noeud que j’ai appelé « GGH Entrée », et cliquez sur le stylo pour désigner dans le champ ‹ Host › l’adresse IP de votre appareil Google (récupéré à l’étape 1 de ce tuto).

Editez le noeud que j’ai appelé « Réception d’un texte à annoncer ». Cliquez sur le stylo pour configurer le lien avec le broker-MQTT : Dans l’onglet « Connexion », renseignez dans le champ ‹ Serveur › l’adresse IP de votre broker MQTT-Gladys (c’est l’adresse IP de Gladys). Dans l’onglet « Sécurité », renseignez l’identifiant et mot de passe de votre broker MQTT-Gladys (récupérés à l’étape 3). Cliquez sur « Sauver » pour revenir sur la configuration du noeud « Réception d’un texte à annoncer », et renseignez dans le champ « Sujet » le libellé du topic MQTT créé dans Gladys (c’est ce que vous avez noté à l’étape 3).

Editez le noeud que j’ai appelé « Ajout des paramètres TTS », et modifiez la valeur de la variable google_api_key pour y inscrire la valeur GOOGLE-API-KEY relevée à l’étape 2. Vous pouvez aussi modifiez la variable gender pour que sa valeur soit « male » ou « female ».

Dans le noeud « Configuration du volume », vous pourrez ajuster le choix de volume par défaut. Ce que j’ai codé applique la règle suivante : volume 5/10 en journée, volume 3 le matin et le soir, volume 1 la nuit. La nuit dure de 22h à 6h, le soir dure de 20h à 22h, le matin dure de 6h à 8h la semaine et de 6h à 10h le week-end.

  1. Faites parler Gladys depuis une scène

Dans une scène dans Gladys, pour utiliser ce qui a été configuré aux étapes précédentes, vous devez ajouter une action « Envoyer une message MQTT », renseigner le topic MQTT récupéré à l’étape 3, puis définir le message. Voici quelques valeurs possibles pour le message (notez qu’il ne faut pas saisir les «  » dans le champ):

« Je sais parler. »
=> Avec ce message, Gladys diffuser la phrase sur l’appareil Google. Le volume sera celui définit selon les plages horaires.

« Bonjour!;Comment vas-tu, cher ami!;Hello! J’espère que la nuit a été bonne… »
=> Avec ce message, Gladys va choisir une des 3 phrases au hasard et la diffuser sur l’appareil Google. Là aussi, volume par défaut.

« vol10|Vous entrez dans une maison sécurisée! »
=> Avec ce message, le message sera lu en volume maximal, quelle que soit l’heure.

« vol8|Je vais bien.;Je suis heureux! »
=> Avec ce message, l’un des deux messages sera lu en volume 8/10.


Voilà, j’espère avoir été clair. Je suis preneur de vos retours, parce que c’est mon premier tuto :wink:

3 « J'aime »

Merci pour le partage.

1 « J'aime »

Je confirme et la config dhcp également

Pour le reste j’ai pas de googleHome mais le principe est bien ! Le tuto est complet donc :+1:

1 « J'aime »