Aller au contenu

Messages recommandés

Posté(e)

Salut à  tous, 

 

J'ai une question et je n'arrive pas à  trouver de réponse alors je me tourne vers les pros du LUA.

 

Contexte : je souhaite actionner en même plusieurs modules  mais en essayant de faire cela sur une seule variable mais je n'y arrive pas. J'illustre mon propos :


local a,b,c,d,e,f = 37,39,57,48,58,56
local TV = 49
 

  if ((tonumber(fibaro:getValue(a,b,c, 'value'))) == 0)
       then 
    fibaro:call(a,b,c,'turnOn')
 

c'est faisable ou pas ? 

  • Upvote 1
Posté(e)

je pense que ce code ne peut pas fonctionner, car le nombre de paramètres attendus par la fonction ne correspond pas.

J'essayerais qqch comme ceci :

local groupeLampes = {37,39,57,48,58,56}
 
for _,v inpairs(groupeLampes) do
  if (tonumber(fibaro:getValue(v, 'value'))) == 0 then
    fibaro:call(v,'turnOn')
  end
end

  • 2 semaines après...
Posté(e)

Salut Jojo,

Je reviens vers toi pour ton explication de texte ci-dessus qui me renvoies une erreur que je ne comprends pas (pour info j'ai migré en V4.057 dernièrement).

Voici mon code complet

--[[
%% properties
30 sceneActivation
%% globals
--]]
-- l'id de ma télécommande est 30. Pensez à  mettre le votre
 
-- Déclaration des variables
-- 1/On récupère la scène activée, on convertit le texte en nombre (via la commande tonumber) et on la stocke dans la variable "NumScene" pour l'utiliser dans la suite du script
local minimote = 30
local NumScene = tonumber(fibaro:getValue(minimote, "sceneActivation")) 
local Lampes_salon = {148,150,158}
local Lampes_sejour = {153,157,159}
local Lampes_etages = {Lampes_salon,Lampes_sejour}
local TV = 154
 
-- 2/ lancement des scènes
-- Si la touche appuyée génère le numéro de scène 1 (touche 1 appui court)
-- on récupère l'état des modules du salon et on fait l'inverse (s'ils sont allumés, on éteint et s'ils sont éteints on les allume) 

if (NumScene == 1) 
  then
  fibaro:debug("Bouton 1 appuyé (court):")
  for _,v in pairs(lampes_salon) do
  if (tonumber(fibaro:getValue(v, 'value'))) == 0 then
    fibaro:call(v,'turnOn')
    fibaro:debug("Allumage lampes Salon")
end
    end

  else
    fibaro:call(v,'turnOff')
    fibaro:debug("Extinction Lampes Salon")
end
end
 
-- même chose pour les lampes du séjour
-- si un appui court sur le bouton 2 de la télécommande, on vérifie l'état des lampes et on fait l'inverse
-- attention : la scène 1 correspond à  un appui COURT sur le bouton 1.
-- la scène 2 correspond à  un appui LONG sur le bouton 1
-- la scène 3 correspond à  un appui COURT sur le bouton 2
-- la scène 4 correspond à  un appui long sur le bouton 2
-- et ainsi de suite jusque 8
 
if (NumScene == 3) 
  then
  for _,v in pairs(lampes_sejour) do
  if (tonumber(fibaro:getValue(v, 'value'))) == 0 then
    fibaro:call(v,'turnOn')
    fibaro:debug("Bouton 2 appuyé (court):")

  else fibaro:call(v,'turnOff')
end 
end

-- maintenant si on appui longtemps sur le bouton (scène 2), on allume allume ou on éteint tout l'étage en même temps
 
if (NumScene == 2)
then fibaro:debug("Bouton 1 appuyé (long:") 
    for _,v in pairs(Lampes_etages) do
  if (tonumber(fibaro:getValue(v, 'value'))) == 0 then
    fibaro:call(v,'turnOn')
 else fibaro:call(v,'turnOff')
 
end
end
-- ça c'est pour moi seulement, c'est une prise qui est isolée
 
if (NumScene == 4) then 
fibaro:debug("Bouton 4 appuyé (long):")
 if ((tonumber(fibaro:getValue(TV, 'value'))) == 0)
 then fibaro:call(TV,'turnOn')
 fibaro:debug("Allumage TV")
 else fibaro:call(TV,'turnOff')
 fibaro:debug("Extinction TV")
 end 
end
 
-- et on peut aussi déclencher des scènes qu'on aura programmées à  l'avance ou qui sont gérées par la box (dans mon cas, ouvertures et fermetures diverses des volets de ma maison
 
if (NumScene == 5) 
then 
fibaro:startScene(5)
 elseif (NumScene == 7)
 then fibaro:startScene(3)
 elseif (NumScene == 6) 
then fibaro:startScene(2)
 elseif (NumScene == 8)
 then fibaro:startScene(4)
 end
  end

et voici ce que ça me renvoit

[DEBUG] 08:58:04: [1;31m2015-09-28 08:58:04.328771 [ fatal] Runtime error: /opt/fibaro/scenes/147.lua:35: expected near 'end'[0m

un p'tit coup de main ??? stp 

 

Merci

Posté(e)

JE viens de debugger les If Then end comme suit 

--[[
%% properties
30 sceneActivation
%% globals
--]]
-- l'id de ma télécommande est 30. Pensez à  mettre le votre
 
-- Déclaration des variables
-- 1/On récupère la scène activée, on convertit le texte en nombre (via la commande tonumber) et on la stocke dans la variable "NumScene" pour l'utiliser dans la suite du script
local minimote = 30
local NumScene = tonumber(fibaro:getValue(minimote, "sceneActivation")) 
local Lampes_salon = {148,150,158}
local Lampes_sejour = {153,157,159}
local Lampes_etages = {Lampes_salon,Lampes_sejour}
local TV = 154
 
-- 2/ lancement des scènes
-- Si la touche appuyée génère le numéro de scène 1 (touche 1 appui court)
-- on récupère l'état des modules du salon et on fait l'inverse (s'ils sont allumés, on éteint et s'ils sont éteints on les allume) 

if (NumScene == 1) 
  then
  fibaro:debug("Bouton 1 appuyé (court):")
  for _,v in inpairs(lampes_salon) do
  if (tonumber(fibaro:getValue(v, 'value'))) == 0 then
    fibaro:call(v,'turnOn')
    fibaro:debug("Allumage lampes Salon")
  else
    fibaro:call(v,'turnOff')
    fibaro:debug("Extinction Lampes Salon")
end
end
end 
-- même chose pour les lampes du séjour
-- si un appui court sur le bouton 2 de la télécommande, on vérifie l'état des lampes et on fait l'inverse
-- attention : la scène 1 correspond à  un appui COURT sur le bouton 1.
-- la scène 2 correspond à  un appui LONG sur le bouton 1
-- la scène 3 correspond à  un appui COURT sur le bouton 2
-- la scène 4 correspond à  un appui long sur le bouton 2
-- et ainsi de suite jusque 8
 
if (NumScene == 3) 
  then
  for _,v in inpairs(lampes_sejour) do
  if (tonumber(fibaro:getValue(v, 'value'))) == 0 then
    fibaro:call(v,'turnOn')
    fibaro:debug("Bouton 2 appuyé (court):")

  else fibaro:call(v,'turnOff')
end 
end
end
-- maintenant si on appui longtemps sur le bouton (scène 2), on allume allume ou on éteint tout l'étage en même temps
 
if (NumScene == 2)
then fibaro:debug("Bouton 1 appuyé (long:") 
    for _,v in inpairs(Lampes_etages) do
  if (tonumber(fibaro:getValue(v, 'value'))) == 0 then
    fibaro:call(v,'turnOn')
 else fibaro:call(v,'turnOff')
end 
end
end
-- ça c'est pour moi seulement, c'est une prise qui est isolée
 
if (NumScene == 4) then 
fibaro:debug("Bouton 4 appuyé (long):")
 if ((tonumber(fibaro:getValue(TV, 'value'))) == 0)
 then fibaro:call(TV,'turnOn')
 fibaro:debug("Allumage TV")
 else fibaro:call(TV,'turnOff')
 fibaro:debug("Extinction TV")
 end 
end
 
-- et on peut aussi déclencher des scènes qu'on aura programmées à  l'avance ou qui sont gérées par la box (dans mon cas, ouvertures et fermetures diverses des volets de ma maison
 
if (NumScene == 5) 
then 
fibaro:startScene(5)
 elseif (NumScene == 7)
 then fibaro:startScene(3)
 elseif (NumScene == 6) 
then fibaro:startScene(2)
 elseif (NumScene == 8)
 then fibaro:startScene(4)
 end

et maintenant j'ai ça

[DEBUG] 09:09:09: [1;31m2015-09-28 09:09:09.034219 [ fatal] Runtime error: /opt/fibaro/scenes/147.lua:44: attempt to call global 'inpairs' (a nil value)[0m
Posté(e)

Désolé de t'avoir dérangé... j'ai trouvé !!!!!

--[[
%% properties
30 sceneActivation
%% globals
--]]
-- l'id de ma télécommande est 30. Pensez à  mettre le votre
 
-- Déclaration des variables
-- 1/On récupère la scène activée, on convertit le texte en nombre (via la commande tonumber) et on la stocke dans la variable "NumScene" pour l'utiliser dans la suite du script
local minimote = 30
local NumScene = tonumber(fibaro:getValue(minimote, "sceneActivation")) 
local Lampes_salon = {148,150,158}
local Lampes_sejour = {153,157,159}
local Lampes_etages = {Lampes_salon,Lampes_sejour}
local TV = 154
 
-- 2/ lancement des scènes
-- Si la touche appuyée génère le numéro de scène 1 (touche 1 appui court)
-- on récupère l'état des modules du salon et on fait l'inverse (s'ils sont allumés, on éteint et s'ils sont éteints on les allume) 

if (NumScene == 1) 
  then
  fibaro:debug("Bouton 1 appuyé (court):")
  for _,v in pairs(Lampes_salon) do
  if (tonumber(fibaro:getValue(v, 'value'))) == 0 then
    fibaro:call(v,'turnOn')
    fibaro:debug("Allumage lampes Salon")
  else
    fibaro:call(v,'turnOff')
    fibaro:debug("Extinction Lampes Salon")
end
end
end 
-- même chose pour les lampes du séjour
-- si un appui court sur le bouton 2 de la télécommande, on vérifie l'état des lampes et on fait l'inverse
-- attention : la scène 1 correspond à  un appui COURT sur le bouton 1.
-- la scène 2 correspond à  un appui LONG sur le bouton 1
-- la scène 3 correspond à  un appui COURT sur le bouton 2
-- la scène 4 correspond à  un appui long sur le bouton 2
-- et ainsi de suite jusque 8
 
if (NumScene == 3) 
  then
  for _,v in pairs(Lampes_sejour) do
  if (tonumber(fibaro:getValue(v, 'value'))) == 0 then
    fibaro:call(v,'turnOn')
    fibaro:debug("Bouton 2 appuyé (court):")

  else fibaro:call(v,'turnOff')
end 
end
end
-- maintenant si on appui longtemps sur le bouton (scène 2), on allume allume ou on éteint tout l'étage en même temps
 
if (NumScene == 2)
then fibaro:debug("Bouton 1 appuyé (long:") 
    for _,v in pairs(Lampes_etages) do
  if (tonumber(fibaro:getValue(v, 'value'))) == 0 then
    fibaro:call(v,'turnOn')
 else fibaro:call(v,'turnOff')
end 
end
end
-- ça c'est pour moi seulement, c'est une prise qui est isolée
 
if (NumScene == 4) then 
fibaro:debug("Bouton 4 appuyé (long):")
 if ((tonumber(fibaro:getValue(TV, 'value'))) == 0)
 then fibaro:call(TV,'turnOn')
 fibaro:debug("Allumage TV")
 else fibaro:call(TV,'turnOff')
 fibaro:debug("Extinction TV")
 end 
end
 
-- et on peut aussi déclencher des scènes qu'on aura programmées à  l'avance ou qui sont gérées par la box (dans mon cas, ouvertures et fermetures diverses des volets de ma maison
 
if (NumScene == 5) 
then 
fibaro:startScene(5)
 elseif (NumScene == 7)
 then fibaro:startScene(3)
 elseif (NumScene == 6) 
then fibaro:startScene(2)
 elseif (NumScene == 8)
 then fibaro:startScene(4)
 end
 

en réfléchissant un peu et en réveillant ses neurones ça fonctionne 

Posté(e)

sorry, c'était moi qui t'avais induit en erreur, il fallait

for _,v in ipairs(groupeLampes) do

au lieu de

for _,v inpairs(groupeLampes) do
×
×
  • Créer...