Aller au contenu

Messages recommandés

Posté(e)

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

Posté(e)

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

Posté(e)

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.

Posté(e)
 

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 ?

Posté(e)

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.

Posté(e)
 

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
  • Upvote 1
Posté(e)

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

Posté(e)

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

×
×
  • Créer...