Aller au contenu
jjacques68

Question boucle For

Recommended Posts

Hello  tout le monde !

 

rapide question car je trouve pas la solution au sujet du boucle for.

 

voici un bout de code :

local TabMessage = {
  [9] =  "Volet 6 ",
  [11] = "Volet 5 ",
  [13] = "Volet 4 ",
  [15] = "Volet 3 ",
  [17] = "Volet 2 ",
  [19] = "Volet 1 "
}

for k,v in pairs(TabMessage) do
  print(k.." "..v)
end

lorsque je regarde le debug, les éléments de mon tableau sont tous là, mais ne sont pas dans l'ordre 9-11-13-15-17-19.

Ils sont complètement aléatoires.

J'aimerai bien qu'ils soient classés suivant le chiffre entre [] (représente leur ID...).

J'ai essayé avec la fonction ipairs() mais la c'est pire, rien ne s'affiche.

 

quelqu'un à une idée ?

 

Merci d'avance !!

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Je me réponds à moi-même :

 

local TabMessage = {
  [1] = {Id=9, Mes=  "Volet 6 "},
  [2] = {Id=11, Mes = "Volet 5 "},
  [3] = {Id=13, Mes = "Volet 4 "},
  [4] = {Id=15, Mes = "Volet 3 "},
  [5] = {Id=17, Mes = "Volet 2 "},
  [6] = {Id=19, Mes = "Volet 1 "}
}

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour,

 

Avec ipairs() tu avais l'index de la table non ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Nan rien du tout, je pense parce que je forçais les index avec les crochets.

 

J'ai changer mes tables pour mettre des valeurs tels que {Id= xx, Mes=Xxxxxxx}.

La les index sont automatiques et avec la fonction ipairs() ça marche bien.

Inconvenient, je suis obliger de parcourir le tableau avec une boucle FOR pour trouver la valeur souhaitée.

 

Alors qu'avant, avec les valeurs entre crochets, je pouvait de suite sélectionner la bonne valeur dans la table.

Mais ipairs() ne fonctionnait pas.

 

Et j'avais besoin de parcourir la boucle avec ipairs ET de pouvoir sélectionner une valeur précise...

Bref pour mon script j'ai changer la manière de faire et c'est ok.

C'est juste cette boucle "FOR" de recherche qui me dérange un peu, j'imagine que c'est une surcharge du pross de la HC2...

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

For est plus rapide que pairs, qui est lente.
Il y a des benchmark sur le net

Et pairs ne parcours pas le tableau dans l'ordre, c'est aussi documenté sur le net, et je l'ai également toujours constaté.

Partager ce message


Lien à poster
Partager sur d’autres sites

tant mieux si la boucle for est plus rapide.

 

bon je pense avoir optimisé au max mon script, pas de variables inutiles et redondantes, pas de syntaxe de fou.

utilisation de retour de fonction et passage de paramètres.

 

en tout cas ça semble bien marcher.

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour @jjacques68,

 

Tu peux partager ton code si ce n'est pas top secret stp. Pour ma culture habituelle ;-)

 

Partager ce message


Lien à poster
Partager sur d’autres sites

@pepite, alors voilà mon script...

Avant ce script j'avais autant de scènes que de device pour recevoir les notifications push sur mon tél (ce qui fini par faire beaucoup...)

Maintenant, j'ai un seul script pour toutes les notifications de mes device (device réels).

 

Il doit y avoir eu d'autre méthodes proposées sur le forum, mais comme je dis, le faire tout seul, ça permet de progresser...

 

Si quelqu'un a des choses à dire sur ce script (convention de codage, convention de nommage des variables, syntaxe du sciprt, ...), je suis totalement preneur :) !

 

Il est assez évolutif, car lors d'ajout de modules, il me suffit de rajouter l'ID dans les trigger et une ligne dans la variable tableau.

(le nom des modules est simplifié pour garder un certain anonymat, dans mon script, les volets, éclairages et radiateurs ont des noms plus précis ;) )

--[[
%% autostart
%% properties

9 value
11 value
13 value
15 value
17 value
19 value
40 targetLevel
44 value
46 value
48 value
52 value
57 value
85 value
93 value
107 value
122 value
138 value
169 targetLevel
179 targetLevel
181 targetLevel
183 targetLevel
186 targetLevel
188 targetLevel
224 targetLevel
243 value
245 value
251 value

%% events
%% globals
--]]

local Trigger = fibaro:getSourceTrigger() --recupère le trigger
local IdPhone = fibaro:getGlobal("IdPhone") --ID du téléphone

--tableau de device
-- ID, type de test, Nom pour le retour
local TabMessage = {    
  {Id = 19,  Funct = "Volet", Name = "Volet 1 "},
  {Id = 17,  Funct = "Volet", Name = "Volet 2 "},
  {Id = 15,  Funct = "Volet", Name = "Volet 3 "},
  {Id = 13,  Funct = "Volet", Name = "Volet 4 "},
  {Id = 11,  Funct = "Volet", Name = "Volet 5 "},
  {Id = 9,   Funct = "Volet", Name = "Volet 6 "},
 
  {Id = 57,  Funct = "OpenClose", Name = "Porte salon "},
  {Id = 85,  Funct = "OpenClose", Name = "Porte garage "},
  {Id = 93,  Funct = "OpenClose", Name = "Porte entrée "},
 
  {Id = 40,  Funct = "Thermostat", Name = "Radiateur 1 "},
  {Id = 169, Funct = "Thermostat", Name = "Radiateur 2 "},
  {Id = 183, Funct = "Thermostat", Name = "Radiateur 3 "},
  {Id = 186, Funct = "Thermostat", Name = "Radiateur 4 "},
  {Id = 188, Funct = "Thermostat", Name = "Radiateur 5 "},
  {Id = 179, Funct = "Thermostat", Name = "Radiateur 6 "},
  {Id = 224, Funct = "Thermostat", Name = "Radiateur 7 "},
  {Id = 181, Funct = "Thermostat", Name = "Radiateur 8 "},
 
  {Id = 138, Funct = "OnOff", Name = "Eclairage 1 "}, 
  {Id = 44,  Funct = "OnOff", Name = "Eclairage 2 "},
  {Id = 46,  Funct = "OnOff", Name = "Eclairage 3 "},
  {Id = 243, Funct = "OnOff", Name = "Eclairage 4 "},
  {Id = 245, Funct = "OnOff", Name = "Eclairage 5 "},  
  {Id = 251, Funct = "OnOff", Name = "Eclairage 6 "},
 
  {Id = 48,  Funct = "ActifPassif", Name = "Capteur innondation informatique "},
  {Id = 107, Funct = "ActifPassif", Name = "Capteur innondation chaufferie "},
  {Id = 122, Funct = "ActifPassif", Name = "Capteur pluie "},
  
  {Id = 52,  Funct = "OnOff", Name = "Alimentation armoire informatique "}  
}

--function de test qui retourne le message à envoyé
--paramères: ID, Nom, fonction de test
--test la valeur du module passé en paramètres en fonction du type de test
function Test(IdName, IdDevice, Funct)
  if Funct=="OnOff" then 
    if tonumber(fibaro:getValue(IdDevice, "value")) > 0 then
	  return IdName.."ON."
    else
	  return IdName.."OFF."
    end

  elseif Funct == "ActifPassif" then
    if tonumber(fibaro:getValue(IdDevice, "value")) > 0 then
	  return IdName.."Actif."
  	else
	  return IdName.."Passif."
    end
  
  elseif Funct =="OpenClose" then
    if tonumber(fibaro:getValue(IdDevice, "value")) == 1 then
	  return IdName.."Ouvert."
    else
	  return IdName.."Fermée."
    end

  elseif Funct == "Volet" then
    if tonumber(fibaro:getValue(IdDevice, "value")) >= 90 then
      return IdName.."ouvert."
    elseif tonumber(fibaro:getValue(IdDevice, "value")) == 0 and Funct == "Volet" then
      return IdName.."fermé."
    else
      return IdName.."ouvert à "..fibaro:getValue(IdDevice, "value").."%."
    end

  elseif Funct == "Thermostat" then
    return IdName.."réglée à : "..fibaro:getValue(IdDevice, "targetLevel").." °C."
  end
end

--function appelé si autostart ou appel manuel--------------------------------------------------------------------
function ExecAuto()
  fibaro:sleep(10*1000) --retarde l'execution (pour l'autostart)
  local Mail = "Etat des device :".."\n".."\n" --variable recevant le résultat
  for _,v in ipairs(TabMessage) do --boucle sur tous les ID de TabMessage    
    Mail = Mail..Test(v.Name, v.Id, v.Funct).."\n" --appel de la fonction test avec les 3 paramètres
  end
  --print(Mail)
  fibaro:call(2, "sendEmail", "Info sur l`état des device.", Mail) --envoi d'un mail 
end

--function appelée lors d'une changement détat des modules déclarés en trigger de la scene----------------------
function ExecDevice(IdDevice)
  for _,v in ipairs(TabMessage) do --boucle dans le tableau pour trouver le bon module
	if v.Id == IdDevice then	-- quand trouvé	
      -- push avec appel de la fonction test avec les 3 paramètres
      --print(Test(v.Name, v.Id, v.Funct))
      fibaro:call(IdPhone, "sendPush", Test(v.Name, v.Id, v.Funct))
	end		
  end
end

--MAIN----------------------------------------------------------------------------------------------------------------------

-- si scène lancée par autostart ou manuel
if Trigger["type"] == "autostart" or Trigger["type"] == "other" then 
  ExecAuto()  
--si scène lancée par property   
elseif Trigger["type"] == "property" then  
  ExecDevice(Trigger["deviceID"])
end

S'il faut des précisions, faites moi le savoir...

 

Je viens de me rendre compte que j'aurai pu optimiser encore plus le code et ne faire qu'une fonction regroupant ExecAuto et ExecDevice... 

 

PS : dommage avec la nouvelle version du forum, on perd les couleurs du code (malgré la sélection dans la fenêtre de l'éditeur) et la mise en page syntaxique...

Modifié par jjacques68

Partager ce message


Lien à poster
Partager sur d’autres sites

Joli ;-) 

 

Question, ton entête avec tes espaces ne te crée  pas d'erreur ? 

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 2 heures, pepite a dit :

Question, ton entête avec tes espaces ne te crée  pas d'erreur

Non non aucune erreur !

pourquoi ça devrait ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Ce n'est certainement plus le cas avec les derniers firmwares, mais fut un temps où tout caractère dans l'entête, espaces, commentaires.... faisait planter la scène.

Depuis je n'ai jamais retesté, mais si tu confirmes que ca fonctionne c'est tant mieux.

Partager ce message


Lien à poster
Partager sur d’autres sites

×