JossAlf Posté(e) le 20 juin 2014 Signaler Posté(e) le 20 juin 2014 Bonjour, J'aurais besoin des lumières des pontes en programmation Lua. (Steven ou Krikroff si vous vous ennuyez en ce moment) Pour résumer, j'ai 5 squeezebox. Avec le code actuel je peux choisir de diffuser sur une des squeezes (en la nommant) ou sur toutes. Mais pas sur 2 ou 3 ou 4. Pour cela il faudrait améliorer le code pour gérer des arguments mais je ne sais pas encore faire ça. Faut-il utiliser une fonction, une boucle ? Je souhaiterais conserver le principe actuel qui consiste à utiliser un petit code que je "glisse" dans mes scènes ou modules virtuels et qui simule l'appui sur le bouton 1 dont vous trouverez le code à al fin de ce post. Voici le petit code que je "glisse" : -- Faire un copier/coller de ce code dans le bouton ou la scène -- depuis lequel on souhaite diffuser un message -- NivSonore -> de 1 à 100 -- SqueezeNom -> Toutes ; Cuisine ; Salon ; ChambreB ; ChambreH ; Garage -- Attention à ne pas se tromper sur l'orthographe des Squeezes !!! -- Messager -> Texte pour la TTS (inutile de mettre des %20) --Annonce sur la Squeezebox ... fibaro:setGlobal('NivSonore' , 50) fibaro:setGlobal('SqueezeNom' , "Garage") fibaro:setGlobal('Messager' , "Ceci est un message") fibaro:call(123, "pressButton", "1"); -- -- fin annonce Squeezebox Dans l'idéal je souhaiterais pouvoir utiliser des paramètres multiples du style : fibaro:setGlobal('SqueezeNom' , "Garage, cuisine, ChambreH") Voici le code du bouton 1 du module virtuel qu'il faudrait améliorer : -- JossAlf 17/06/14 (V1.3) ; JossAlf 23/05/14 (V1.2) ; JossAlf 22/05/14 (V1.1) -- V1.3 : Ajout du garage et modif de ChambreH. -- Scène permettant simplifier la diffusion de messages sur 1 ou plusieurs squeezeboxes. -- Nécessite de créer les Variables Globales : NivSonore ; SqueezeNom ; Messager -- l'appel de cette scene dans un module virtuel ou une autre scène se fera de façon simple -- en affectant les valeurs aux variables Globales -- puis en lancant cette scène. local SqueezeNom = fibaro:getGlobalValue("SqueezeNom") local player = nil -- Adresse IP du Logitech Media Server local ipadd = "192.168.0.46" -- le port du serveur local portno = 9090 local Squeezers = { ['Cuisine'] = "00:04:20:2b:81:00 ", ['Salon'] = "00:04:20:29:bb:3e ", ['ChambreB'] = "00:04:20:2c:0b:fe ", ['ChambreH'] = "00:04:20:2e:57:ba ", ['Garage'] = "00:04:20:2c:35:bc ", ['Toutes'] = "00:04:20:2b:81:00 ", --permet d'utiliser la squeeze de la cuisine en maitre } local player = Squeezers[SqueezeNom] fibaro:debug(player .. SqueezeNom) --choix des squeezes qui vont être utilisées pour l'émission -- 1er cas toutes if SqueezeNom == 'Toutes' then fibaro:debug("On allume toutes les squeezes") -- on allume toutes les squeezes les unes après les autres (qui sont synchronisées) -- Garage local player = Squeezers["Garage"] local cmnd = "power 1 " local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) -- réglage du niveau sonore local VolumeSon = fibaro:getGlobalValue('NivSonore') local cmnd = "mixer volume " .. VolumeSon .. " " local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) -- Salon local player = Squeezers["Salon"] local cmnd = "power 1 " local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) -- réglage du niveau sonore local VolumeSon = fibaro:getGlobalValue('NivSonore') local cmnd = "mixer volume " .. VolumeSon .. " " local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) -- ChambreB local player = Squeezers["ChambreB"] local cmnd = "power 1 " local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) -- réglage du niveau sonore local VolumeSon = fibaro:getGlobalValue('NivSonore') local cmnd = "mixer volume " .. VolumeSon .. " " local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) -- ChambreH local player = Squeezers["ChambreH"] local cmnd = "power 1 " local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) -- réglage du niveau sonore local VolumeSon = fibaro:getGlobalValue('NivSonore') local cmnd = "mixer volume " .. VolumeSon .. " " local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) -- cuisine local player = Squeezers["Cuisine"] local cmnd = "power 1 " local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) -- réglage du niveau sonore local VolumeSon = fibaro:getGlobalValue('NivSonore') local cmnd = "mixer volume " .. VolumeSon .. " " local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) -- on laisse une seconde pour laisser le temps à toutes les squeeze de s'allumer fibaro:sleep(1000) fibaro:debug("Toutes allumées et volume réglé à " .. VolumeSon) else -- 2ème cas 1 seule squeeze sera utilisée -- On n'allume qu'1 seule squeeze local SqueezeNom = fibaro:getGlobalValue("SqueezeNom") local player = Squeezers[SqueezeNom] -- Allumage de la squeezebox local cmnd = "power 1 " local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) -- réglage du niveau sonore local VolumeSon = fibaro:getGlobalValue('NivSonore') local cmnd = "mixer volume " .. VolumeSon .. " " local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) fibaro:sleep(1*1000) fibaro:debug(SqueezeNom .. " allumée et volume réglé à " .. VolumeSon) end -- On envoie le message local player = Squeezers[SqueezeNom] local notification = fibaro:getGlobalValue('Messager') -- On remplace les espaces par des %20 local notification = string.gsub((notification)," ", "%%20"); fibaro:debug(notification) local cmnd = "playlist play http://translate.google.com/translate_tts?tl=FR&ie=UTF-8&q=" .. notification; local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) fibaro:debug(SqueezeNom .. cmnd) -- OFF des squeezeBoxs après 10 secondes fibaro:sleep(10*1000) -- on éteint toutes les squeezes les unes après les autres if SqueezeNom == 'Toutes' then -- Garage local player = Squeezers["Garage"] local cmnd = "power 0 " local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) -- Salon local player = Squeezers["Salon"] local cmnd = "power 0 " local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) -- ChambreB local player = Squeezers["ChambreB"] local cmnd = "power 0 " local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) -- ChambreH local player = Squeezers["ChambreH"] local cmnd = "power 0 " local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) -- cuisine (placée ici pour quelle reste maître -dernier MAC donné- pour la diffusion) local player = Squeezers["Cuisine"] local cmnd = "power 0 " local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) fibaro:debug("Toutes éteintes") else local player = Squeezers[SqueezeNom] local cmnd = "power 0 " local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) fibaro:debug(SqueezeNom .. " éteinte") end A votre bon code M'sieur Dames ...
Shad Posté(e) le 20 juin 2014 Signaler Posté(e) le 20 juin 2014 C'est très simple a la place de mettre un if et else tu as juste un mettre une boucle for. Et dans cette boucle for tu met if X =Garage elseif X= ChambgreH ...
JossAlf Posté(e) le 20 juin 2014 Auteur Signaler Posté(e) le 20 juin 2014 Mais comment je fais pour passer mes arguments ? Si je veux allumer 3 radios je fais comment ?
JossAlf Posté(e) le 20 juin 2014 Auteur Signaler Posté(e) le 20 juin 2014 Shad tu peux m'en dire plus parce que là je ne comprends pas comment m'en sortir...
Shad Posté(e) le 20 juin 2014 Signaler Posté(e) le 20 juin 2014 Si j'ai bien compris ce que tu veux faire c'est à dire effectuer une action sur les noms des squeezebox dans ta variable, le plus simple est tu enlèves toutes la partie à partir de ton if SqueezeNom== toutes et tu met : for i = 1, #SqueezeNom do local player = Squeezers[SqueezeNom[i]] local cmnd = "power 0 " local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) local VolumeSon = fibaro:getGlobalValue('NivSonore') local cmnd = "mixer volume " .. VolumeSon .. " " local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) end Dis moi si sa fonctionne.
JossAlf Posté(e) le 20 juin 2014 Auteur Signaler Posté(e) le 20 juin 2014 J'ai une erreur [ERROR] 20:51:49: line 34: attempt to concatenate local 'player' (a nil value) correspond à la ligne local player = Squeezers[SqueezeNom[i]] J'aurai été tenté par ça mais ça ne fonctionne pas non plus. for i = 1, #Squeezers do local player = Squeezers[i] Cela dit j'ai l'impression que ce n'est pas ce que je cherche à faire. Là tu me propose de simplifier l'allumage de toutes les radios. Mais je ne peux pas choisir d'allumer seulement 3 ou 2 radio avec mon petit code d'appel? Si ?
Steven Posté(e) le 20 juin 2014 Signaler Posté(e) le 20 juin 2014 Je suis pas àla maison du week-end mais regarde ceci : http://www.domotique-fibaro.fr/index.php?/topic/1195-Tableau-Dans-Une-Variable-Globale#entry16077 Envoyé de mon GT-I9192 en utilisant Tapatalk
Shad Posté(e) le 21 juin 2014 Signaler Posté(e) le 21 juin 2014 Si je crois que c'est ce que tu cherches àfaire, la boucle for va lire chaque squeezebox qu'il y a dans la variable. Je regarderais demain.
JossAlf Posté(e) le 21 juin 2014 Auteur Signaler Posté(e) le 21 juin 2014 Ca y est 128 lignes de gagnées une une souplesse accrue ! Merci Shad pour ta boucle for ! Merci Steven pour l'astuce pour transformer une variable en tableau par le json ! Voilà ce que ça donne : -- JossAlf ; 21/06/14 (V2.0) 17/06/14 (V1.3) ; 22/05/14 (V1.1) ; 23/05/14 (V1.2) -- V2.0 : Simplification du code et possibilité d'allumer 1,2,3,4 ou 5 squeeze. -- Scène permettant simplifier la diffusion de messages sur 1 ou plusieurs squeezeboxes. -- Nécessite de créer les Variables Globales : NivSonore ; SqueezeNom ; Messager -- l'appel de cette scene dans un module virtuel ou une autre scène se fera de façon simple -- en affectant les valeurs aux variables Globales -- puis en lancant cette scène. local ListeSqueeze = fibaro:getGlobal("SqueezeNom"); local TableauSqueezeNom = json.decode(ListeSqueeze); local player = nil -- Adresse IP du Logitech Media Server local ipadd = "192.168.0.46" -- le port du serveur local portno = 9090 local Squeezers = { ['Cuisine'] = "00:04:20:2b:81:00 ", ['Salon'] = "00:04:20:29:bb:3e ", ['ChambreB'] = "00:04:20:2c:0b:fe ", ['ChambreH'] = "00:04:20:2e:57:ba ", ['Garage'] = "00:04:20:2c:35:bc ", ['Toutes'] = "00:04:20:2b:81:00 ", --permet d'utiliser la squeeze de la cuisine en maitre } --On allume toutes les squeezes for i = 1, #TableauSqueezeNom do local player = Squeezers[TableauSqueezeNom[i]] local cmnd = "power 1 " local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) -- on règle le son local VolumeSon = fibaro:getGlobalValue('NivSonore') local cmnd = "mixer volume " .. VolumeSon .. " " local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) end -- on laisse une seconde pour laisser le temps à toutes les squeeze de s'allumer fibaro:sleep(1000) -- On envoie le message en utilisant la première radio local player = Squeezers[TableauSqueezeNom[1]] local notification = fibaro:getGlobalValue('Messager') -- On remplace les espaces par des %20 local notification = string.gsub((notification)," ", "%%20"); fibaro:debug(notification) local cmnd = "playlist play http://translate.google.com/translate_tts?tl=FR&ie=UTF-8&q=" .. notification; local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) -- OFF des squeezeBoxs après 10 secondes fibaro:sleep(10*1000) -- on éteint toutes les squeezes for i = 1, #TableauSqueezeNom do fibaro:debug("debut de la boucle") local player = Squeezers[TableauSqueezeNom[i]] fibaro:debug(player) local cmnd = "power 0 " local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) end Et le petit code à glisser partout où on souhaite utiliser l'émission sur les squeeze : -- Faire un copier/coller de ce code dans le bouton ou la scène -- depuis lequel on souhaite diffuser un message -- NivSonore -> de 1 à 100 -- SqueezeNom -> Cuisine ; Salon ; ChambreB ; ChambreH ; Garage -- Attention à ne pas se tromper sur l'orthographe des Squeezes !!! -- Messager -> Texte pour la TTS (inutile de mettre des %20) --Annonce sur la Squeezebox ... fibaro:setGlobal('NivSonore' , 50) --Liste des squeezes sous la forme {"Salon","ChambreH", "Cuisine"} local ListeSqueeze = {"Salon","ChambreH", "Cuisine"} fibaro:setGlobal("SqueezeNom" , json.encode(ListeSqueeze)) fibaro:setGlobal('Messager' , "Ceci est un message") fibaro:call(134, "pressButton", "1"); -- fin annonce Squeezebox 1
JossAlf Posté(e) le 21 juin 2014 Auteur Signaler Posté(e) le 21 juin 2014 Tiens c'est bizarre le Json renvoie une erreur quand j'utilise le petit bout de code qui fabrique le Json depuis une scène. J'ai contourné le problème en passant par un MV appelé depuis cette scène. Mais c'est étonnant comme réaction. Peut être un bug ? Envoyé de mon iPhone àl'aide de Tapatalk
Steven Posté(e) le 22 juin 2014 Signaler Posté(e) le 22 juin 2014 Tiens c'est bizarre le Json renvoie une erreur quand j'utilise le petit bout de code qui fabrique le Json depuis une scène. J'ai contourné le problème en passant par un MV appelé depuis cette scène. Mais c'est étonnant comme réaction. Peut être un bug ? Envoyé de mon iPhone àl'aide de Tapatalk Idem pour moi, j'ai oublié de préciser cela. D'un autre côté j'ai découvert que cela ne fonctionne pas dans une scène il n'y a que 4 jours Envoyé de mon GT-I9192 en utilisant Tapatalk
Messages recommandés