Aller au contenu

Simplification Et Amélioration Du Code


JossAlf

Messages recommandés

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

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

 

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 ?

Lien vers le commentaire
Partager sur d’autres sites

 

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
Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...