Yannick Posté(e) le 14 septembre 2015 Signaler Posté(e) le 14 septembre 2015 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 ? 1
jojo Posté(e) le 18 septembre 2015 Signaler Posté(e) le 18 septembre 2015 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
Yannick Posté(e) le 28 septembre 2015 Auteur Signaler Posté(e) le 28 septembre 2015 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
Yannick Posté(e) le 28 septembre 2015 Auteur Signaler Posté(e) le 28 septembre 2015 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
Yannick Posté(e) le 28 septembre 2015 Auteur Signaler Posté(e) le 28 septembre 2015 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
jojo Posté(e) le 29 septembre 2015 Signaler Posté(e) le 29 septembre 2015 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
Messages recommandés