jjacques68 Posté(e) le 27 février 2017 Signaler Posté(e) le 27 février 2017 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 !!
jjacques68 Posté(e) le 27 février 2017 Auteur Signaler Posté(e) le 27 février 2017 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 "} }
pepite Posté(e) le 28 février 2017 Signaler Posté(e) le 28 février 2017 Bonjour, Avec ipairs() tu avais l'index de la table non ?
jjacques68 Posté(e) le 28 février 2017 Auteur Signaler Posté(e) le 28 février 2017 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...
Lazer Posté(e) le 28 février 2017 Signaler Posté(e) le 28 février 2017 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é.
jjacques68 Posté(e) le 28 février 2017 Auteur Signaler Posté(e) le 28 février 2017 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.
pepite Posté(e) le 1 mars 2017 Signaler Posté(e) le 1 mars 2017 Bonjour @jjacques68, Tu peux partager ton code si ce n'est pas top secret stp. Pour ma culture habituelle ;-)
jjacques68 Posté(e) le 1 mars 2017 Auteur Signaler Posté(e) le 1 mars 2017 @pepite : je te post le script ce soir 1
jjacques68 Posté(e) le 2 mars 2017 Auteur Signaler Posté(e) le 2 mars 2017 (modifié) @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é le 2 mars 2017 par jjacques68
pepite Posté(e) le 6 mars 2017 Signaler Posté(e) le 6 mars 2017 Joli ;-) Question, ton entête avec tes espaces ne te crée pas d'erreur ?
jjacques68 Posté(e) le 6 mars 2017 Auteur Signaler Posté(e) le 6 mars 2017 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 ?
pepite Posté(e) le 7 mars 2017 Signaler Posté(e) le 7 mars 2017 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.
Messages recommandés