Aller au contenu
OJC

VD Sonos TTS Remote

Recommended Posts

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

 

sonos.thumb.png.2c3c0bc0be7f7216c34643e639f9156d.png

 

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 :

 

5a50f681e48b8_VIRTUALHomeCommunicator.png.7df97b4e04fe7f1480740c1979614208.png  5a50f6895714e_VIRTUALHomeCommunicatorSonos.png.6d9f9ba6ba55010789af47305ec8ecec.png  5a50f6be4a85a_VIRTUALHomeCommunicatorFavorite.png.20295b983d289f7b6cce595d12592ec6.png  5a50f68c3e588_VIRTUALHomeCommunicatorSay.png.d46b96300758c7d41d58683ba05b8467.png

 

 

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é par OJC
  • Like 4

Partager ce message


Lien à poster
Partager sur d’autres sites

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é par pepite

Partager ce message


Lien à poster
Partager sur d’autres sites

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 :13:

Partager ce message


Lien à poster
Partager sur d’autres sites

@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.

Partager ce message


Lien à poster
Partager sur d’autres sites

@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...

Partager ce message


Lien à poster
Partager sur d’autres sites

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é par MAM78

Partager ce message


Lien à poster
Partager sur d’autres sites
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.

  • Haha 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Pour la variable, je viens de retester en supprimant la mienne, pas de soucis. Tu as un message d'erreur ?

Partager ce message


Lien à poster
Partager sur d’autres sites

 

[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é par MAM78

Partager ce message


Lien à poster
Partager sur d’autres sites

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

 

Partager ce message


Lien à poster
Partager sur d’autres sites

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 ??

Partager ce message


Lien à poster
Partager sur d’autres sites

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)

Partager ce message


Lien à poster
Partager sur d’autres sites

:huh:

Fait voir un print(fibaro:getGlobalValue("x_sonos_object")). C'est quelle version du VD Sonos Remote que tu as ?

Modifié par OJC

Partager ce message


Lien à poster
Partager sur d’autres sites

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é par MAM78

Partager ce message


Lien à poster
Partager sur d’autres sites

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 :huh: 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

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é par OJC

Partager ce message


Lien à poster
Partager sur d’autres sites

Mode boulet, Effectivement c'était bien le volume, j'avais oublié de le remonter le rechargement de ta dernière version :13:

 

Maintenant que cela fonctionne, j'ai une petite suggestion à te faire concernant la saisie textuelle :74:

 

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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...

Partager ce message


Lien à poster
Partager sur d’autres sites

Effectivement vu sous cet angle technique ça semble moins évident.:(

 

Ah ces utilisateurs qui qui se mettent à rêver :huh: de fonctionnalités que la technique ne sait pas adresser :P

Partager ce message


Lien à poster
Partager sur d’autres sites

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 :60:

Modifié par OJC

Partager ce message


Lien à poster
Partager sur d’autres sites

Ç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

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

Si ça s'instal également dans un Docker sur un Synology, ça pourrait également m'intéresser.

Partager ce message


Lien à poster
Partager sur d’autres sites

×