fredokl Posté(e) le 6 décembre 2021 Signaler Posté(e) le 6 décembre 2021 (modifié) Bonjour à tous, Voici un QuickApp pour faire parler votre Google Nest Mini ou Google Nest Hub. Pour cela, il faut installer auparavant Node-red sur un NAS, un Raspberry ou autres choses. Merci à @flacon030 pour son idée de départ: Il fonctionne parfaitement. Il est libre de modification et d'amélioration. V1.1 Le code est amélioré. les messages et les liens des fichiers audios sont à mettre directement sur le QA. Deux automates Node-Red sont maintenant requis pour fonctionner (1 pour les messages et 1 pour les fichiers audios). Tuto pour les automates: Vu d'ensemble: Vous pouvez ajouter autant de Google Nest Mini ou Hub que vous le souhaitez après le node "function". AUTOMATE MESSAGES 1/ Node Http In 2/ Node Function 3/ Node Google Notify AUTOMATE AUDIOS 1/ Node Http In 2/ Node Function 3/ Node Google Notify Code: -- Google TTS pour Fibaro HC3 -- Merci à falcon030 pour son code qui a été ma base de départ (https://www.domotique-fibaro.fr/topic/14086-faire-dire-une-phrase-a-google-home/) -- Je me suis également énormément adapté du QA Free (https://www.domotique-fibaro.fr/topic/14281-quickapp-freesms/) -- Nécessite l'installation de Node-Red sur Synology, QNAP, Raspberry ou autres...(https://nodered.org) -- De fredokl pour www.domotique-fibaro.fr -- 06.12.2021 Version 1.0 -- 19.12.20221 Version 1.1 -- Amélioration du code -- Les messages et liens des fichiers audios sont mis dans le code du QA -- La partie Node-Red est grandement simplifiée -------------------------------------------------------- -- Initialisation -------------------------------------------------------- function QuickApp:onInit() __TAG = "QA_"..plugin.mainDeviceId.."GOOGLETTS" self:updateProperty("deviceIcon", 1155) -- ID Icône self:debug("onInit") end -------------------------------------------------------- -- Paramètrages des boutons -------------------------------------------------------- -- Annonces function QuickApp:user1(event) self:debug("Message user1") self:sendmsg("Bienvenue à la maison") end -- Message function QuickApp:user2(event) self:debug("Message user2") self:sendmsg("Au revoir") end -- Sirènes & Carillons function QuickApp:sirene1(event) self:debug("Message sirene1") self:sendSon("Son_Alarme_1.mp3") end -- Nom du fichier audio function QuickApp:sirene2(event) self:debug("Message sirene2") self:sendSon("Son_Alarme_2.mp3") end -------------------------------------------------------- -- Connexion HTTP POST ANNONCES -------------------------------------------------------- function QuickApp:sendmsg(message) local http = net.HTTPClient() local requestBody = { msg = message } http:request("http://192.168.1.xxx:1880/annonce", { -- Mettre votre commande http ici success = function(response) if response.status == 200 then print('OK, réponse : '.. response.data) else print("Erreur : status=" .. tostring(response.status)) end end, error = function(err) print("Erreur : " .. err) end, options = { data = json.encode(requestBody), method = "POST", headers = { ["Content-Type"] = "application/json", } }, }) end -------------------------------------------------------- -- Connexion HTTP POST CARILLONS & MP3 -------------------------------------------------------- function QuickApp:sendSon(filename) local http = net.HTTPClient() local requestBody = { url = "http://192.168.1.xxx/Sons/"..filename -- Metter le lien vers votre dossier sons ici } http:request("http://192.168.1.xxx:1880/sons", { -- Mettre votre commande http ici success = function(response) if response.status == 200 then print('OK, réponse : '.. response.data) else print("Erreur : status=" .. tostring(response.status)) end end, error = function(err) print("Erreur : " .. err) end, options = { data = json.encode(requestBody), method = "POST", headers = { ["Content-Type"] = "application/json", } }, }) end Fichier QuickApp: TTS_Google.fqa Modifié le 19 décembre 2021 par fredokl Nouvelle version 5 1
flacon030 Posté(e) le 6 décembre 2021 Signaler Posté(e) le 6 décembre 2021 (modifié) super merci je ne savais pas comment simplifier tous cela Juste une question, que mettre dans nodered a l'adresse "URL"? J'ai essayer "message", Car dans le debug j'ai une erreur 404 Modifié le 6 décembre 2021 par flacon030
fredokl Posté(e) le 6 décembre 2021 Auteur Signaler Posté(e) le 6 décembre 2021 En fait, j'ai suivi ton "tuto", j'ai juste simplifié le code pour éviter d'avoir "pleins" de lignes de requêtes http. Les messages sont créés sur Node-red. Rien ne change à part ça.
MAM78 Posté(e) le 6 décembre 2021 Signaler Posté(e) le 6 décembre 2021 Est-ce transposable sur une Alexa selon vous ?
fredokl Posté(e) le 6 décembre 2021 Auteur Signaler Posté(e) le 6 décembre 2021 Je pense que oui. Il y a une librairie pour Alexa. Alors pourquoi!? Voici le lien: https://flows.nodered.org/node/node-red-contrib-alexa-notifyme
flacon030 Posté(e) le 6 décembre 2021 Signaler Posté(e) le 6 décembre 2021 il faut juste un "English-speaking skills." pour alexa
fredokl Posté(e) le 19 décembre 2021 Auteur Signaler Posté(e) le 19 décembre 2021 Nouvelle version en début de fil. 1 1
Stillwatter Posté(e) le 7 août 2022 Signaler Posté(e) le 7 août 2022 Bonjour à tous, Je n'arrive pas à faire parler mon google home. J'ai ce message d'erreur dans nodered. J'ai installer nodered sous docker sur un Syno. Je pense qu'il n'arrive pas à créer le ficher temporaire mp3. Quelqu'un pour m'aider svp ? Merci
flacon030 Posté(e) le 7 août 2022 Signaler Posté(e) le 7 août 2022 (modifié) Bonjour Cela fonctionne pour les fichiers MP3 et pas pour les message c'est bien cela? dans la fonction tu as bien cela msg.playMessage = msg.payload.msg; return msg; tu as bien créer le QA sur la HC3, je pense que oui si non la partie sonnerie ne fonctionnerait pas tu as bien renseigner l'adresse ip et le port de ton node-res dans le QA a cette lignes http:request("http://192.168.1.231:1880/annonce", { -- Mettre votre commande http adresse ici Dans la console de debug du docker tu devrait voir cela ode-red-docker@2.1.4 start /usr/src/node-red > node $NODE_OPTIONS node_modules/node-red/red.js $FLOWS "--userDir" "/data" 7 Aug 15:22:17 - [info] Welcome to Node-RED =================== 7 Aug 15:22:17 - [info] Node-RED version: v2.1.4 7 Aug 15:22:17 - [info] Node.js version: v14.18.2 7 Aug 15:22:17 - [info] Linux 5.10.60-qnap x64 LE 7 Aug 15:22:17 - [info] Loading palette nodes 7 Aug 15:22:18 - [info] Settings file : /data/settings.js 7 Aug 15:22:18 - [info] Context store : 'default' [module=memory] 7 Aug 15:22:18 - [info] User directory : /data 7 Aug 15:22:18 - [warn] Projects disabled : editorTheme.projects.enabled=false 7 Aug 15:22:18 - [info] Flows file : /data/flows.json 7 Aug 15:22:18 - [info] Server now running at http://127.0.0.1:1880/ 7 Aug 15:22:18 - [warn] --------------------------------------------------------------------- Your flow credentials file is encrypted using a system-generated key. If the system-generated key is lost for any reason, your credentials file will not be recoverable, you will have to delete it and re-enter your credentials. You should set your own key using the 'credentialSecret' option in your settings file. Node-RED will then re-encrypt your credentials file using your chosen key the next time you deploy a change. --------------------------------------------------------------------- 7 Aug 15:22:18 - [info] Starting flows fileServer listening on ip 192.168.1.231 and port 8098 destroying media server: <ref *1> Server { maxHeaderSize: undefined, insecureHTTPParser: undefined, _events: [Object: null prototype] { request: [Function (anonymous)], connection: [Function: connectionListener] }, _eventsCount: 2, _maxListeners: undefined, _connections: 0, _handle: TCP { reading: false, onconnection: [Function: onconnection], [Symbol(owner_symbol)]: [Circular *1] }, _usingWorkers: false, _workers: [], _unref: false, allowHalfOpen: true, pauseOnConnect: false, httpAllowHalfOpen: false, timeout: 0, keepAliveTimeout: 5000, maxHeadersCount: null, headersTimeout: 60000, requestTimeout: 0, _connectionKey: '6::::8098', [Symbol(IncomingMessage)]: [Function: IncomingMessage], [Symbol(ServerResponse)]: [Function: ServerResponse], [Symbol(kCapture)]: false, [Symbol(async_id_symbol)]: 286 } destroying media server: Server { maxHeaderSize: undefined, insecureHTTPParser: undefined, _events: [Object: null prototype] { request: [Function (anonymous)], connection: [Function: connectionListener], close: [Function: bound onceWrapper] { listener: [Function (anonymous)] } }, _eventsCount: 3, _maxListeners: undefined, _connections: 0, _handle: null, _usingWorkers: false, _workers: [], _unref: false, allowHalfOpen: true, pauseOnConnect: false, httpAllowHalfOpen: false, timeout: 0, keepAliveTimeout: 5000, maxHeadersCount: null, headersTimeout: 60000, requestTimeout: 0, _connectionKey: '6::::8098', [Symbol(IncomingMessage)]: [Function: IncomingMessage], [Symbol(ServerResponse)]: [Function: ServerResponse], [Symbol(kCapture)]: false, [Symbol(async_id_symbol)]: 286 } 7 Aug 15:22:18 - [info] Started flows fileServer listening on ip 192.168.1.231 and port 8098 destroying media server: <ref *1> Server { maxHeaderSize: undefined, insecureHTTPParser: undefined, _events: [Object: null prototype] { request: [Function (anonymous)], connection: [Function: connectionListener] }, _eventsCount: 2, _maxListeners: undefined, _connections: 0, _handle: TCP { reading: false, onconnection: [Function: onconnection], [Symbol(owner_symbol)]: [Circular *1] }, _usingWorkers: false, _workers: [], _unref: false, allowHalfOpen: true, pauseOnConnect: false, httpAllowHalfOpen: false, timeout: 0, keepAliveTimeout: 5000, maxHeadersCount: null, headersTimeout: 60000, requestTimeout: 0, _connectionKey: '6::::8098', [Symbol(IncomingMessage)]: [Function: IncomingMessage], [Symbol(ServerResponse)]: [Function: ServerResponse], [Symbol(kCapture)]: false, [Symbol(async_id_symbol)]: 315 } fileServer listening on ip 192.168.1.231 and port 8098 Modifié le 7 août 2022 par flacon030
Stillwatter Posté(e) le 7 août 2022 Signaler Posté(e) le 7 août 2022 Je n'arrive pas à coller ma console de debug mais j'ai une ligne différente de toi : MediaServerUrl ne correspond pas à l'IP de nodered. Lorsque je lance le message dans le QA, google home fait "ding dong" mais pas de message. Pourquoi 172.17.0.2 et le port 8098 ? J'ai suivi le tuto scrupuleusement... http:request("http://10.0.0.16:1880/annonce", { -- Mettre votre commande http adresse ici Merci à toi ip: '10.0.0.19', playVolumeLevel: 0.2, playMessage: 'Bienvenue à la maison', language: 'fr', speakSlow: false, mediaServerUrl: 'http://172.17.0.2', mediaServerPort: '8098', cacheFolder: '/tmp' }, callback: [Function (anonymous)] } ] Queued messages [ { devicePlaySettings: { msg: [Object], sourceNode: [GoogleNotify], ip: '10.0.0.19', playVolumeLevel: 0.2, playMessage: 'Bienvenue à la maison', language: 'fr', speakSlow: false, mediaServerUrl: 'http://172.17.0.2', mediaServerPort: '8098', cacheFolder: '/tmp' }, callback: [Function (anonymous)] } ] setting up mediaPlayUrl preparing socket for connection to device connecting with device preparing player on device preparing to stop any playing media inital vol level { controlType: 'master', level: 0.20000000298023224, muted: false, stepInterval: 0.019999999552965164 } device 10.0.0.19 Vol level set to 0.2 device 10.0.0.19 preparing to play media mediaPlayUrl: http://172.17.0.2:8098/BIENVENUE_%C3%80_LA_MAISON-fr-normal.mp3 status broadcast currentPlayerState=IDLE for host 10.0.0.19 status broadcast currentPlayerState=IDLE for host 10.0.0.19 status broadcast currentPlayerState=BUFFERING for host 10.0.0.19 status broadcast currentPlayerState=BUFFERING for host 10.0.0.19 media http://172.17.0.2:8098/BIENVENUE_%C3%80_LA_MAISON-fr-normal.mp3 not available Error: Load failed at /data/node_modules/castv2-client/lib/controllers/media.js:75:23 at fn.onmessage (/data/node_modules/castv2-client/lib/controllers/request-response.js:27:7) at fn.emit (node:events:539:35) at Channel.onmessage (/data/node_modules/castv2-client/lib/controllers/controller.js:16:10) at Channel.emit (node:events:527:28) at Client.onmessage (/data/node_modules/castv2/lib/channel.js:23:10) at Client.emit (node:events:539:35) at PacketStreamWrapper.onpacket (/data/node_modules/castv2/lib/client.js:81:10) at PacketStreamWrapper.emit (node:events:527:28) at TLSSocket.<anonymous> (/data/node_modules/castv2/lib/packet-stream-wrapper.js:28:16) status broadcast currentPlayerState=IDLE for host 10.0.0.19 status broadcast currentPlayerState=IDLE for host 10.0.0.19 ^C7 Aug 19:26:44 - [info] Stopping flows 7 Aug 19:26:44 - [info] Stopped flows
Stillwatter Posté(e) le 7 août 2022 Signaler Posté(e) le 7 août 2022 C'est bon j'ai trouvé... Il faut renseigner le média server dans le google node et renseigner le port 8098 dans le container nodered et ça marche... en tout cas merci pour ton aide ça m'a permis de voir l'erreur...
flacon030 Posté(e) le 3 janvier 2023 Signaler Posté(e) le 3 janvier 2023 (modifié) Bon je me retrouve encore bêtement bloqué avec une erreur 404 dans le debug du QA Je ne me souvient plus de se que j'avais fait pour régler le probleme Erreur bête , j'ai mis méthode GET au lieu de POST Modifié le 3 janvier 2023 par flacon030
flacon030 Posté(e) le 3 janvier 2023 Signaler Posté(e) le 3 janvier 2023 Le 07/08/2022 à 21:52, Stillwatter a dit : C'est bon j'ai trouvé... Il faut renseigner le média server dans le google node et renseigner le port 8098 dans le container nodered et ça marche... en tout cas merci pour ton aide ça m'a permis de voir l'erreur... tu renseigne ou le port 8098 dans le contener nodred? Merci
Messages recommandés