OJC Posté(e) le 6 janvier 2018 Signaler Posté(e) le 6 janvier 2018 (modifié) VD Sonos TTS Remote v. 1.0.0 - 06/01/2018 Je vous présente le VD Sonos TTS Remote, qui requiert impérativement pour fonctionner le SONOS Remote V1.0.1 RC pour Fibaro HC2 de @Krikroff. Le but de ce VD est de disposer de favoris pour faire du TTS avec les Sonos ainsi que d'un clavier pour une utilisation dynamique : Sonos_TTS_Remote.vfib Pour le fonctionnement du clavier, il faut renseigner le champ Port du VD avec le nombre de secondes au-delà un clic sur le bouton insère un nouveau caractère. Il n'y a aucun autre paramétrage à effectuer, le VD identifie automatiquement les VD SONOS Remote V1.0.1 RC pour Fibaro HC2 présents sur la box pour interagir avec eux. Il y a deux boutons Favoris, mais vous pouvez en rajouter autant que nécessaire en faisant un copier-coller du code : local SonosTTS={credits="Sonos TTS Remote v. 1.1.0 - Copyright 2018 Olivier Meyer - GNU GPLv3",f=fibaro,global="x_sonos_tts",button="btnTransmission",language="fr-FR",duration="auto",getRemoteId=function(s)local x=s.f:getGlobalValue(s.global)if string.len(x or "")>0 then x = json.decode(x)if x and type(x)=="table" then if x.remote then return true, x.remote end end end return false,"[Sonos TTS Remote] Unable to retrieve Sonos TTS Remote ID from x_sonos_tts, please check variable" end,setTTS=function(s,i,m,v,l,d)local x=s.f:getGlobalValue(s.global)if string.len(x or "")>0 then x = json.decode(x)if x and type(x)=="table" then x.tts={};x.tts.sonos=i;x.tts.message=m;x.tts.volume=v;x.tts.language=l or s.language;x.tts.duration=d or s.duration;s.f:setGlobal(s.global,json.encode(x));return true end end return false, "[Sonos TTS Remote] Unable to set x_sonos_tts, please check variable" end,getBtn=function(s,i,n)local c,r=0,api.get("/devices/"..tostring(i))["properties"]["rows"] local x=#r for a=1,x do local y=#r[a].elements for b=1,y do c=c+1 if n==r[a].elements[b].name then return c end end end s.f:debug("[Sonos TTS Remote] Unable to locate button "..n..", check virtual device "..i);return nil end,sendTTS=function(s,i,m,v,l,d)r,c=s:setTTS(i,m,v,l,d)if r then r,c=s:getRemoteId()if r then s.f:call(tonumber(c),"pressButton",s:getBtn(c,s.button))return end end s.f:debug(c)end,} local _f = fibaro local _i = _f:getSelfId() local getSonos=function()local _c=_f:getValue(_i,"ui.lblSonos.value");local _x=_f:getGlobalValue("x_sonos_tts")if string.len(_x or "")>0 then _x=json.decode(_x)if _x and type(_x)=="table" then if _x.sonos then for i,j in ipairs(_x.sonos)do if _c==j.name then return j.id end end return nil end end end end local sid = getSonos() local message = "Votre message" local volume = _f:getValue(_i,"ui.sliderVolume.value") local language = "fr_FR" local duration = "auto" _f:call(_i, "setProperty", "ui.favo.value", message) SonosTTS:sendTTS(sid, message, volume, language, duration) A noter, bien que le VD de @Krikroff se suffise à lui-même pour cela, que ce code est du coup fonctionnel dans n'importe quelle scène ou module virtuel, de la manière suivante : local SonosTTS={credits="Sonos TTS Remote v. 1.1.0 - Copyright 2018 Olivier Meyer - GNU GPLv3",f=fibaro,global="x_sonos_tts",button="btnTransmission",language="fr-FR",duration="auto",getRemoteId=function(s)local x=s.f:getGlobalValue(s.global)if string.len(x or "")>0 then x = json.decode(x)if x and type(x)=="table" then if x.remote then return true, x.remote end end end return false,"[Sonos TTS Remote] Unable to retrieve Sonos TTS Remote ID from x_sonos_tts, please check variable" end,setTTS=function(s,i,m,v,l,d)local x=s.f:getGlobalValue(s.global)if string.len(x or "")>0 then x = json.decode(x)if x and type(x)=="table" then x.tts={};x.tts.sonos=i;x.tts.message=m;x.tts.volume=v;x.tts.language=l or s.language;x.tts.duration=d or s.duration;s.f:setGlobal(s.global,json.encode(x));return true end end return false, "[Sonos TTS Remote] Unable to set x_sonos_tts, please check variable" end,getBtn=function(s,i,n)local c,r=0,api.get("/devices/"..tostring(i))["properties"]["rows"] local x=#r for a=1,x do local y=#r[a].elements for b=1,y do c=c+1 if n==r[a].elements[b].name then return c end end end s.f:debug("[Sonos TTS Remote] Unable to locate button "..n..", check virtual device "..i);return nil end,sendTTS=function(s,i,m,v,l,d)r,c=s:setTTS(i,m,v,l,d)if r then r,c=s:getRemoteId()if r then s.f:call(tonumber(c),"pressButton",s:getBtn(c,s.button))return end end s.f:debug(c)end,} local sid = -- id du VD correspondant au Sonos à utiliser local message = -- votre message local volume = -- le volume à utiliser local language = -- la langue à utiliser, paramètre optionnel à défaut duquel "fr_FR" qui est utilisé local duration = -- la durée à utiliser, paramètre optionnel à défaut duquel "auto" qui est utilisé SonosTTS:sendTTS(sid, message, volume, [language], [duration]) Voici les icônes, respectivement l'icône principale du VD qui est aussi prévue pour aller sur les boutons du clavier et le slider du volume, l'icône pour les boutons de sélection du Sonos, l'icône pour les boutons des favoris et l'icône pour le bouton Transmission : CREDITS Outre, bien évidemment, @Krikroff et son VD Sonos Remote sans lequel le présent VD serait sans le moindre intérêt, @seiq et son VD Keyboard publié sur le forum officiel. Modifié le 6 janvier 2018 par OJC 4
pepite Posté(e) le 6 janvier 2018 Signaler Posté(e) le 6 janvier 2018 (modifié) Merci OJC, bonne idée. Encore une belle plus value pour le VD de Krikroff. Je n'ai pas l le code, ton TTS est créé par quoi ? Modifié le 6 janvier 2018 par pepite
MAM78 Posté(e) le 6 janvier 2018 Signaler Posté(e) le 6 janvier 2018 Très sympathique ton VD, même si pour le moment je n'en vois pas encore l'usage dans mon contexte, notamment la saisie via les boutons. Sauf peut-être pour envoyer à distance un message de type depuis sont smart phone qui serait diffuser sur une Sonos afin par exemple d'inviter à quitter les lieux lors d'une détection d'intrusion ou s'il l'on veux envoyer un message vocal aux personnes présentes à la maison. Tu vois d'autres usages ? Concernant les messages de type favori (fixe), je préfère utiliser les messages de type MP3 qui se diffusent beaucoup plus rapidement. Merci pour le partage
OJC Posté(e) le 6 janvier 2018 Auteur Signaler Posté(e) le 6 janvier 2018 @pepite le VD se contente de cliquer sur le bouton Process du VD Sonos Remote . Plus exactement, la fonction SonosTTS:sendTTS va renseigner une variable globale puis cliquer sur le bouton Transmission du VD qui, lui, va récupérer les données de la variable globale et exécuter le code de @Krikroff.
OJC Posté(e) le 6 janvier 2018 Auteur Signaler Posté(e) le 6 janvier 2018 @MAM78 A la base, mon idée de départ était d'avoir juste à cliquer sur un bouton pour indiquer à ma femme que je quitte le taff, et qu'elle soit prévenue de l'heure de mon arrivée. Donc c'est du moitié fixe, moitié dynamique. Bon, y'avais sûrement plus simple pour arriver à ce résultat, mais bon...
MAM78 Posté(e) le 6 janvier 2018 Signaler Posté(e) le 6 janvier 2018 (modifié) Je n'arrive pas à faire fonctionner le VD, la variable x_sonos_tts ne semble pas être alimenté ? Par ailleurs, je n'arrive pas à utiliser la fonction clavier, passage en numérique et utilisation de la deuxième lettre de chaque bouton ? Modifié le 6 janvier 2018 par MAM78
MAM78 Posté(e) le 6 janvier 2018 Signaler Posté(e) le 6 janvier 2018 il y a 1 minute, MAM78 a dit : Par ailleurs, je n'arrive pas à utiliser la fonction clavier, passage en numérique et utilisation de la deuxième lettre de chaque bouton ? Oups, mode boulet. J'avais pas lu l'indication sur le nombre de secondes. 1
OJC Posté(e) le 6 janvier 2018 Auteur Signaler Posté(e) le 6 janvier 2018 Pour la variable, je viens de retester en supprimant la mienne, pas de soucis. Tu as un message d'erreur ?
MAM78 Posté(e) le 6 janvier 2018 Signaler Posté(e) le 6 janvier 2018 (modifié) [DEBUG] 17:52:29: [Sonos TTS Remote] Unable to set x_sonos_tts, please check variable lors de l'appui sur le premier favori. La variable n'est pas créée automatiquement Modifié le 6 janvier 2018 par MAM78
OJC Posté(e) le 6 janvier 2018 Auteur Signaler Posté(e) le 6 janvier 2018 Bizarre... Essaie avec ça dans le Main Loop : --[[ Sonos TTS Remote v. 1.1.0 - Copyright 2018 Olivier Meyer This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses></http:>. --]] --[[ Versions Notes 1.0.0 Initial release --]] if not (_f) then _f = fibaro _f:debug("Starting Sonos TTS Remote...") _i = _f:getSelfId() jT = json.decode(_f:getGlobalValue("HomeTable")) icon = _f:getValue(_i, "deviceIcon") if (type(_f:getGlobalValue("x_sonos_tts")) == "nil") then api.post("/globalVariables", {name="x_sonos_tts", isEnum=0}) end local x_sonos_tts = {remote = _i, sonos = {}} local x_sonos_object = json.decode(_f:getGlobalValue("x_sonos_object")) for i,j in pairs(x_sonos_object) do table.insert(x_sonos_tts.sonos, {id = i, name = _f:getName(tonumber(i))}) end _f:setGlobal("x_sonos_tts", json.encode(x_sonos_tts)) _f:debug(json.encode(x_sonos_tts)) end local sid = jT.VD[string.gsub(string.gsub(_f:getValue(_i,"ui.lblSonos.value"),":","")," ","")] local title = _f:getValue(sid,"lblTitle") or "" if string.find(_f:getValue(_i,"log") or "","Transmission") == nil then if string.find(title,"voicerss") == nil then if _f:getValue(_i,"currentIcon") ~= icon then _f:call(_i, "setProperty", "ui.favo.value", "") _f:call(_i, "setProperty", "currentIcon", icon) end end end
OJC Posté(e) le 6 janvier 2018 Auteur Signaler Posté(e) le 6 janvier 2018 Tu as bien une variable globale x_sonos_object avec le VD de @Krikroff ? Tu as quelque chose dans le debug du main loop ? Je comprends pas, ça fait deux fois que je supprime ma VG, elle est recréée sans pb ??
MAM78 Posté(e) le 6 janvier 2018 Signaler Posté(e) le 6 janvier 2018 Oui j'ai bien x_sonos_object et le VD. Effectivement, j'ai une erreur dans le debug du main loop. [DEBUG] 18:05:02: Starting Sonos TTS Remote...[ERROR] 18:05:02: line 30: bad argument #1 to 'decode' (string expected, got nil)
OJC Posté(e) le 6 janvier 2018 Auteur Signaler Posté(e) le 6 janvier 2018 (modifié) Fait voir un print(fibaro:getGlobalValue("x_sonos_object")). C'est quelle version du VD Sonos Remote que tu as ? Modifié le 6 janvier 2018 par OJC
MAM78 Posté(e) le 6 janvier 2018 Signaler Posté(e) le 6 janvier 2018 (modifié) Version 1.0.1 [DEBUG] 18:27:15: {"174":{"stream":"","tts":"","zpStatus":{"zoneName":"Salle de bains","localUID":"RINCON_949F3E0BF25E01400","macAddress":"94:9F:3E:0B:F2:5E"},"action":"","zonePlayers":{"uuid":"RINCON_949F3E0BF25E01400","coordinator":"true","location":"","group":"RINCON_949F3E0BF25E01400:1849025896","ip":"192.168.0.102"},"radioStations":[{"title":"ABC Lounge","res":"x-rincon-mp3radio:\/\/http:\/\/listen.radionomy.com\/abc-lounge.m3u"},{"title":"Europe 1","res":"x-sonosapi-stream:s6566?sid=254&flags=8224&sn=0"},{"title":"France Inter 87.8 (Émissions-débats France)","res":"x-sonosapi-stream:s24875?sid=254&flags=8224&sn=0"},{"title":"franceinfo","res":"x-sonosapi-stream:s9948?sid=254&flags=8224&sn=0"},{"title":"RFM","res":"x-sonosapi-stream:s6616?sid=254&flags=8224&sn=0"}]},"214":{"stream":"","tts":"","zpStatus":{"zoneName":"","localUID":"","macAddress":""},"action":"","zonePlayers":{"uuid":"","coordinator":false,"location":"","group":"","ip":""},"radioStations":{}}} Modifié le 6 janvier 2018 par MAM78
OJC Posté(e) le 6 janvier 2018 Auteur Signaler Posté(e) le 6 janvier 2018 Essaie ça : Sonos_TTS_Remote.vfib
MAM78 Posté(e) le 6 janvier 2018 Signaler Posté(e) le 6 janvier 2018 Marche toujours pas : [DEBUG] 19:48:53: {"174":{"stream":"","action":"","zpStatus":{"zoneName":"Salle de bains","localUID":"RINCON_949F3E0BF25E01400","macAddress":"94:9F:3E:0B:F2:5E"},"zonePlayers":{"uuid":"RINCON_949F3E0BF25E01400","coordinator":"true","group":"RINCON_949F3E0BF25E01400:1849025896","location":"","ip":"192.168.0.102"},"tts":{"message":"Favori numéro 2.","duration":"auto","language":"fr-FR","volume":0},"radioStations":[{"title":"ABC Lounge","res":"x-rincon-mp3radio:\/\/http:\/\/listen.radionomy.com\/abc-lounge.m3u"},{"title":"Europe 1","res":"x-sonosapi-stream:s6566?sid=254&flags=8224&sn=0"},{"title":"France Inter 87.8 (Émissions-débats France)","res":"x-sonosapi-stream:s24875?sid=254&flags=8224&sn=0"},{"title":"franceinfo","res":"x-sonosapi-stream:s9948?sid=254&flags=8224&sn=0"},{"title":"RFM","res":"x-sonosapi-stream:s6616?sid=254&flags=8224&sn=0"}]},"214":{"stream":"","action":"","zpStatus":{"zoneName":"","localUID":"","macAddress":""},"zonePlayers":{"uuid":"","coordinator":false,"group":"","location":"","ip":""},"tts":"","radioStations":{}}} Mais la variable x_sonos_tts est bien crée et elle contient ça : [DEBUG] 19:51:29: {"remote":302,"sonos":[{"id":"174","name":"SONOS Remote"},{"id":"214"}]} Pour info, j'avais avant un deuxième VD Sonos Remote, que j'ai supprimer depuis, il correspondait à l'ID 214 ci-dessus. J'ai du supprimer la variable x_sonos_tts pour qu'elle soit a nouveau générée pour contenir ça : [DEBUG] 19:54:10: {"remote":302,"sonos":[{"id":"174","name":"SONOS Remote"}]} Mais ça ne fonctionne toujours pas
OJC Posté(e) le 6 janvier 2018 Auteur Signaler Posté(e) le 6 janvier 2018 (modifié) Est-ce que 'Sonos Remote' apparaît dans la première étiquette de ton VD ? Si non, clique sur un des deux boutons flèches. Je m'aperçois au passage que je n'ai pas prévu de fonction pour caler le VD sur le premier Sonos au moment de l'installation... EDIT = Oublie. Ton volume est à zéro d'après ce que je vois dans x_sonos_object : "tts":{"message":"Favori numéro 2.","duration":"auto","language":"fr-FR","volume":0} Modifié le 6 janvier 2018 par OJC
MAM78 Posté(e) le 6 janvier 2018 Signaler Posté(e) le 6 janvier 2018 Mode boulet, Effectivement c'était bien le volume, j'avais oublié de le remonter le rechargement de ta dernière version Maintenant que cela fonctionne, j'ai une petite suggestion à te faire concernant la saisie textuelle Ce serait TOP de basculer en mode numérique lorsque l'on clique sur le bouton du milieu en bas "_123" un peu comme sur nos anciens téléphones portables en mode T9
OJC Posté(e) le 6 janvier 2018 Auteur Signaler Posté(e) le 6 janvier 2018 Renommer les boutons, c'est facile. En revanche, cela veut dire actualiser la page web ou recharger les informations réseau pour les app mobiles. Pas sûr que ça en vaille le coup...
MAM78 Posté(e) le 7 janvier 2018 Signaler Posté(e) le 7 janvier 2018 Effectivement vu sous cet angle technique ça semble moins évident. Ah ces utilisateurs qui qui se mettent à rêver de fonctionnalités que la technique ne sait pas adresser
OJC Posté(e) le 7 janvier 2018 Auteur Signaler Posté(e) le 7 janvier 2018 (modifié) P... Je viens de tomber sur ce truc node-sonos-http-api que je suis en train de tester... Le TTS avec VoiceRSS sort du Sonos dans la seconde !! Et aucun souci de playlist qui saute Modifié le 7 janvier 2018 par OJC
pepite Posté(e) le 7 janvier 2018 Signaler Posté(e) le 7 janvier 2018 Ça a l'air pas mal mais ça rajoute un tiers :-)..Prend en charge spotify aussi. Et ben...ca donne envie de tester :-)Envoyé de mon Nexus 5X en utilisant Tapatalk
OJC Posté(e) le 7 janvier 2018 Auteur Signaler Posté(e) le 7 janvier 2018 Je confirme, c'est vraiment top =) Certes, ça rajoute un tiers, mais c'est là qu'on voit les limites : 1. du Lua pour gérer ce genre de truc 2. de cette foutue HC2 qui ne permet pas d'installer des services tiers Cela dit, ça marche sur n'importe quelle machine, et il y a même une image toute prête pour le Pi. Moi j'ai un serveur debian qui tourne H24, donc pas de soucis. TTS à la seconde, prise en charge avancée de spotify, apple musique... possibilité de faire une recherche deezer (ça ça m'intéresse) ou même dans la librairie (donc on peut coupler ça avec un webdav pour explorer la librairie musicale et lancer une chanson précise), etc. J'ai déjà modifié ce VD pour fonctionner avec, et je vais voir pour faire un truc plus complet similaire au VD de @Krikroff.
MAM78 Posté(e) le 7 janvier 2018 Signaler Posté(e) le 7 janvier 2018 Si ça s'instal également dans un Docker sur un Synology, ça pourrait également m'intéresser.
Messages recommandés