Aller au contenu
Krikroff

Fibaro Hc2 Vd Sonos Remote: Télécommande Pour Diffuseur Sonos

Recommended Posts

Le matin, pour mettre en route la cafetière, allumer la lumière... et mettre la radio, je teste l'état de ma PLAY:1

Pour ce dernier point, voici trois lignes utilisées :

if (fibaro:get(id_vd_sonos,"ui.lblState.value") == "Stopped")
then
       fibaro:debug(" Radio arrêtée... Lancement ")

Je ne stocke donc pas la valeur dans une VG, je vais la chercher dans le label ad hoc

 

J'avais eu aussi le problème lié au tableau des variables : ICI + là  + La réponse de @Krikroff (@PITP2 ayant donné aussi la solution)  ;)

 

 

 
  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

ha ben oui c'était plus simple lol

mais pour GEA, il fallait faire un Get dans GEA puis une action.

 

c'est vrai que j'ai tendance à  tout faire avec les VGs, j'espère que ca n'alourdie pas trop la box. Mais quand on maitrise pas c'est tellement plus facile.

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut et merci pour cet épatant VD ! 

 

Petit question concernant le TTS, pourquoi ne pas avoir fais une variable global à  mettre à  jour puis l'appuie sur un bouton ? 

 

Du style :

fibaro:setGlobal("SonosTTSPHPvol", "40");
fibaro:setGlobal("SonosTTSPHP", "Armement de l'alarme dans une minutes");
fibaro:call(VD_SonosTTSPHP, "pressButton", "1")
 
En écrivant je viens de me rendre compte qu'il suffit de mettre le code TTS de KriKroff dans un boutton supplémentaire et de mettre en paramètre des variables global que l'on va récupérer une fois l'appuie sur ce nouveau bouton.
 
Je trouve cela plus simple dans les scènes ou il faut faire intervenir le TTS( 4 lignes au lieu d'un paragraphe), cela allège le code des scénes se servant du TTS.

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut Adn, je me posait la même question, du coup as tu testé le fonctionnement via variable ?

Partager ce message


Lien à poster
Partager sur d’autres sites

ha ben oui c'était plus simple lol

mais pour GEA, il fallait faire un Get dans GEA puis une action.

 

c'est vrai que j'ai tendance à  tout faire avec les VGs, j'espère que ca n'alourdie pas trop la box. Mais quand on maitrise pas c'est tellement plus facile.

 

 

 

Le matin, pour mettre en route la cafetière, allumer la lumière... et mettre la radio, je teste l'état de ma PLAY:1

Pour ce dernier point, voici trois lignes utilisées :

if (fibaro:get(id_vd_sonos,"ui.lblState.value") == "Stopped")
then
       fibaro:debug(" Radio arrêtée... Lancement ")

Je ne stocke donc pas la valeur dans une VG, je vais la chercher dans le label ad hoc

 

J'avais eu aussi le problème lié au tableau des variables : ICI + là  + La réponse de @Krikroff (@PITP2 ayant donné aussi la solution)  ;)

 

Perso, j'utilisais la solution de Sakkhho (modification du VD de Krikroff et variable globale) pour faire une annonce vocale, via GEA, lorsque le réveil s'allume le matin.

Ca fonctionnait impeccable, MAIS je devais modifier le VD de Krikroff et créer 2 VG => pas cool.

 

Donc j'ai trouvé une solution via GEA, sans VG et sans modifier le VD de Krikroff.

 

Voici ce que j'ai fait dans GEA :

if (SonosParents_Reveil == nil) then SonosParents_Reveil = 0 end
function SonosParents()
  if (fibaro:get(DeviceID["SONOS_PARENTS"],"ui.lblState.value") == "Radio Playing" and SonosParents_Reveil == 0)
    then return true
  end
end
GEA.add ({"Function", function() return SonosParents() end}, 31, "Annonce radio Ch Parents", {{"VirtualDevice", DeviceID["TECHNICAL"], 9}, {"Function", function() SonosParents_Reveil = 1 end}, {"Email", UserID["Vincent"], "INFO - Sonos"}})
GEA.add (true,1, "Remise à  zéro variable [SonosParents_Reveil]", {{"Time", "02:00", "02:00"}, {"Function", function() SonosParents_Reveil = 0 end}, {"Email", UserID["Vincent"], "INFO - Sonos"}})

l'instruction

{"VirtualDevice", DeviceID["TECHNICAL"], 9}

est pour lancer l'annonce TTS

La seconde ligne GEA de remise à  zéro de la variable (locale) SonosParents_Reveil, est pour que l'annonce ne passe qu'une seule fois par jour.

Partager ce message


Lien à poster
Partager sur d’autres sites

 J'ai une chose bizarre avec l'icône du module qui passe en cube bleu le temps de l'appui sur un bouton dans le module puis revient bien ensuite mais après un appui sur process, il reste en cube bleu.

En remplaçant l'icône du bouton process, j'ai réglé le soucis mais c'est juste pour savoir si c'était comme ça aussi chez vous.

Partager ce message


Lien à poster
Partager sur d’autres sites

oui @Did  

Pour contourner ce petit défaut, comme toi, j'ai intégré l'icône dans le bouton process

(NB : je l'ai signalé le 11 décembre  ;))

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

 Ah oui, j'étais passé à  côté.

Merci@i-magin.

Partager ce message


Lien à poster
Partager sur d’autres sites

idem pour moi => no stress

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut Adn, je me posait la même question, du coup as tu testé le fonctionnement via variable ?

 

Salut Fred, 

 

Voici le code à  mettre dans le nouveau bouton que tu va ajouter au VD de Krikroff  :

local _f = fibaro
local sid, bid = _f:getSelfId(), 28

-- On va récupérer la valeur de la variable TTS
messageTTS = fibaro:getGlobal("TTS")


local params = {
  -- TTS Message
  message = messageTTS,  
  duration = 'auto',	-- Duration: "auto", xx seconds
  language = "fr-FR",	-- Language: fr-FR
  volume = 35			-- Volume
}

local _x ={root="x_sonos_object",load=function(b)local c=_f:getGlobalValue(b.root)if string.len(c)>0 then local d=json.decode(c)if d and type(d)=="table"then return d else _f:debug("Unable to process data, check variable")end else _f:debug("No data found!")end end,set=function(b,e,d)local f=b:load()if f[e]then for g,h in pairs(d)do f[e][g]=h end else f[e]=d end;_f:setGlobal(b.root,json.encode(f))end,get=function(b,e)local f=b:load()if f and type(f)=="table"then for g,h in pairs(f)do if tostring(g)==tostring(e or"")then return h end end end;return nil end}
-- Make a request to the remote to process params object instantly
_x:set(tostring(sid), { tts = params })
--_f:sleep(1000);
_f:call(sid, "pressButton", bid)

Ici on récupère la valeur de la variable TTS. De ce fait après quand tu souhaite faire fonctionner le TTS dans une autre scène ou VD tu insère le code suivant :

local VD_SonosKriKroff = 255;
fibaro:setGlobal("TTS", "Armement de l'alarme");
fibaro:call(VD_SonosKriKroff, "pressButton", "29");

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci àtoi ADN, je suis un peu pris cette semaine mais je vais tacher de tester cela rapidement.

Partager ce message


Lien à poster
Partager sur d’autres sites

 

Salut Fred, 

 

Voici le code à  mettre dans le nouveau bouton que tu va ajouter au VD de Krikroff  :

local _f = fibaro
local sid, bid = _f:getSelfId(), 28

-- On va récupérer la valeur de la variable TTS
messageTTS = fibaro:getGlobal("TTS")


local params = {
  -- TTS Message
  message = messageTTS,  
  duration = 'auto',	-- Duration: "auto", xx seconds
  language = "fr-FR",	-- Language: fr-FR
  volume = 35			-- Volume
}

local _x ={root="x_sonos_object",load=function(b)local c=_f:getGlobalValue(b.root)if string.len(c)>0 then local d=json.decode(c)if d and type(d)=="table"then return d else _f:debug("Unable to process data, check variable")end else _f:debug("No data found!")end end,set=function(b,e,d)local f=b:load()if f[e]then for g,h in pairs(d)do f[e][g]=h end else f[e]=d end;_f:setGlobal(b.root,json.encode(f))end,get=function(b,e)local f=b:load()if f and type(f)=="table"then for g,h in pairs(f)do if tostring(g)==tostring(e or"")then return h end end end;return nil end}
-- Make a request to the remote to process params object instantly
_x:set(tostring(sid), { tts = params })
--_f:sleep(1000);
_f:call(sid, "pressButton", bid)

 

Malheureusement, je reçois cette erreur:

 

[DEBUG] 22:43:32: Unable to process data, check variable

[ERROR] 22:43:32: line 16: attempt to index local 'f' (a nil value)

Partager ce message


Lien à poster
Partager sur d’autres sites

Malheureusement, je reçois cette erreur:

 

[DEBUG] 22:43:32: Unable to process data, check variable

[ERROR] 22:43:32: line 16: attempt to index local 'f' (a nil value)

 

Je l'ai trouvé la solution ici: la variable généré automatiquement doit être supprimé.

Mais comment se fait-il?

Partager ce message


Lien à poster
Partager sur d’autres sites

Pour moi cela fonctionne pas de soucis avec la variable (après je l'ai créer en manu dès le départ).

Merci ADN.

Maintenant je vais voir pour gérer le volume en variable et après associé la GEA.

Partager ce message


Lien à poster
Partager sur d’autres sites

Sorry for my english, using google translate and use French makes it worse ;-).

 

First off all thanks for creating this great new VD!

 

When using this device for SONOS PLaybar and TV is playing it’s not possible to control the device in any way. It looks like the VD doesn’t understand the Playbar functions (See image).  VD state is "Not_Implemented"

Partager ce message


Lien à poster
Partager sur d’autres sites

Super grand merci pour le VD, je m'amuse comme un fou.

J'ai reçu mon play1 hier :)

Par contre je rencontre un petit problème.

J'ai une playlist en cours, je fais une annonce TTS, la musique reprend mais se termine à  la fin de la chanson, comme si ça effacé la playlist en cours.

Quelqu'un a t-il rencontrer cette situation?

 

Et aussi je cherche à  mettre en place le serveur cache, pour améliorer le souci de latence car c'est ca fait de longue pause 3-4 secondes de blanc avant le TTS et 3-4 avant la reprise de la musique.

Cependant j'ai rien trouvé sur la mise en place d'un serveur cache avec le HC2.

J'ai bien trouvé comment installé un serveur SQUID mais comment dire au VD Sonos de passer par le SQUID?

 

Merci beaucoup, en attendant je vais mettre à  jour mes scènes avec des annonces  :lol:  :lol:

Partager ce message


Lien à poster
Partager sur d’autres sites

le "problème", ou plutôt l'amélioration à  suggérer, est du même type que c-lol, je pense.

 

J'ai un Play:1 dans ma chambre à  coucher que j'utilise comme réveil. Il est configuré (au niveau de Sonos) pour s'éteindre automatiquement après 45 min.

Après 30 sec, je diffuse le message TTS ainsi :

http://www.domotique-fibaro.fr/index.php/topic/616-fibaro-hc2-vd-sonos-remote-télécommande-pour-diffuseur-sonos/?p=107563

La radio reprend bien ensuite :D

mais  elle ne s'arrête pas automatiquement après les 45 min.

Je ne sais pas s'il est possible de mémoriser ce paramètre avant la diffusion du TTS, pour qu'à  la reprise ce soit "transparent".

Merci

Partager ce message


Lien à poster
Partager sur d’autres sites

le "problème", ou plutôt l'amélioration à  suggérer, est du même type que c-lol, je pense.

 

J'ai un Play:1 dans ma chambre à  coucher que j'utilise comme réveil. Il est configuré (au niveau de Sonos) pour s'éteindre automatiquement après 45 min.

Après 30 sec, je diffuse le message TTS ainsi :

http://www.domotique...sonos/?p=107563

La radio reprend bien ensuite :D

mais  elle ne s'arrête pas automatiquement après les 45 min.

Je ne sais pas s'il est possible de mémoriser ce paramètre avant la diffusion du TTS, pour qu'à  la reprise ce soit "transparent".

Merci

Partager ce message


Lien à poster
Partager sur d’autres sites

Euh, j'ai pas compris @jojo... tu peux répéter ?   :98:

Partager ce message


Lien à poster
Partager sur d’autres sites

tu veux dire que après le TTS ton parametrage (les 45min avant extinction) sont supprimés??

 

à‡a ressemble étrangement au miens, c'est à  dire après un TTS toute la configuration/playlist actuelle disparaît. Il ne garde que la piste en cours pour moi et se termine à  la fin de la chanson et pour toi elle s'arrete jamais car pour la radio il n'y a pas de fin  :)

Partager ce message


Lien à poster
Partager sur d’autres sites

oui c-lol, tu as bien compris ce que je voulais dire

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonsoir, escusez mon francais!

 

J'ai un problème avec une station de radio. La station contient % (le nom de cette station de radio est 100% NL).

Cette radio est pas reconnu comme une station de radio, mais comme une bande sonore normale. Et le nom devient 1-2200pctnlaac

 

J'essayé permettant le débogage, mais la résultant est un erreur, que la format n'est pas compris, dans la ligne 67, parce que un seule % n'est pas permis dans un string format. Je fixe le trace avec

 

trace=function(self,value,...)

     if self.isTraceEnabled 
     then if value~=nil 
             then value2= string.gsub(value, "100%%", "100%%%%");
                     if (value2 ~= value) then return fibaro:debug(value) else return fibaro:debug(string.format(value,...))  end
            end 
     end 
end,

 

Mais je n'avait pas une fixe pur le mauvais transport state.

 

Quelqu'un sait la solution?

 

Merci beaucoup,

 

Ronald

Partager ce message


Lien à poster
Partager sur d’autres sites

Trouvez!

 

Le track uri est aac: comme 'aac://stream.100p.nl/100pctnlaac'

 

Ci-dessous est le code correct / changement. C'est seulement le code pour Sonos.getCurrentTrack dans le main loop du VD.

 

Est'-ce-que possible de changer cette code dans le code générique ?

 

Merci bien,

 

Ronald

 

  Sonos.getCurrentTrack=function(a)
     Tk:trace("get current track request")
     return sendSoapMessage(a.props.controlURL.RendererAVTransport,
              a.props.serviceType.AVTransport,
              {name=a.props.actions.GetPositionInfo,service=a.props.serviceType.AVTransport},"<InstanceID>0</InstanceID><Channel>Master</Channel>",function(b)a.currentTrack.track=tonumber(b:match("<Track>(.+)</Track>")or 0)a.currentTrack.duration=tostring(b:match("<TrackDuration>(.+)</TrackDuration>")or"")a.currentTrack.relTime=tostring(b:match("<RelTime>(.+)</RelTime>")or"00:00:00")a.currentTrack.relCount=tonumber(b:match("<RelCount>(.+)</RelCount>")or 0)a.currentTrack.absCount=tonumber(b:match("<AbsCount>(.+)</AbsCount>")or 0)a.currentTrack.uri=tostring(b:match("<TrackURI>(.+)</TrackURI>")or"")local c=decode(tostring(b:match("<TrackMetaData>(.+)</TrackMetaData>")))a.currentTrack.title=string.gsub(decode(tostring(c:match("<dc:title>(.+)</dc:title>")or"")),1,22)a.currentTrack.creator=decode(tostring(c:match("<dc:creator>(.+)</dc:creator>")or""))a.currentTrack.artist=decode(tostring(c:match("<r:albumArtist>(.+)</r:albumArtist>")or""))a.currentTrack.album=decode(tostring(c:match("<upnp:album>(.+)</upnp:album>")or""))a.currentTrack.originalTrackNumber=tostring(c:match("<upnp:originalTrackNumber>(.+)</upnp:originalTrackNumber>")or"")
    Tk:trace(decode(a.currentTrack.uri or""))            
    if string.find(decode(a.currentTrack.uri or""),"x-rincon-mp3radio:",1,true)~=nil 
    then Tk:trace("MP3 Radio")
         a.currentTrack.isRadio=true;
         a.currentTrack.isFile=false;
         if a:getMediaInfo()then Tk:trace(a.mediaInfo.title) 
a.currentTrack.title=string.gsub(a.mediaInfo.title,1,25)end 
    elseif string.find(decode(a.currentTrack.uri or""),"aac:",1,true)~=nil then 
         Tk:trace("AAC Radio")
         a.currentTrack.isRadio=true;
         a.currentTrack.isFile=false  
         if a:getMediaInfo()then Tk:trace(a.mediaInfo.title) 
a.currentTrack.title=a.mediaInfo.title end     
    elseif string.find(decode(a.currentTrack.uri or""),"x-file-cifs:",1,true)~=nil then 
         Tk:trace("Track")
         a.currentTrack.isRadio=false;
         a.currentTrack.isFile=true    
    else Tk:trace("Unknown")
         a.currentTrack.isRadio=false;
         a.currentTrack.isFile=false 
         end
    end)
  end  

Partager ce message


Lien à poster
Partager sur d’autres sites

Une autre probleme...

 

Quand le nom du radio contenu une 1, le 1 dans le nom est remplace avec 25.dans le function Sonos.getCurrentTrack

 

Probleme:

 

a.currentTrack.title=string.gsub(a.mediaInfo.title,1,25)end 

 

Le correct code est

 

a.currentTrack.title=string.sub(a.mediaInfo.title,1,25)end 

Partager ce message


Lien à poster
Partager sur d’autres sites

×