Page 2 sur 3
Re: LUA - Variable avec une chaine et variable
Publié : 14 janv. 2016, 20:16
par rimram31
Seb13 a écrit :...('last_ping_'..v.nom) ne marche pas...Mais quand je fais ... cela fonctionne dans ce cas...
Et c'est tout a fait normal, tu ne m'as pas lu
Dans le premier cas il s'agit d'un nom de variable LUA évalué comme élément du code de ton script LUA et devant être au sens syntaxique un NOM DE VARIABLE alors que dans le 2ème il s'agit d'un index de tableau, plutôt d'un dictionnaire associatif (clef - valeur) où la valeur attendue est une simple chaine de caractère.
C'est un peu comme si tu voulais écrire:
Code : Tout sélectionner
toto = "if"
tutu = "then"
titi = "end"
toto 4 > 3 tutu ...
titi
Le pire c'est qu'il est des environnement ou ça pourrait marcher mais le plus souvent pas du tout (et heureusement pour nos pauvres petites têtes de programmeur).
Comme je te le disais, réécris ton code pour faire:
...
last_ping = {}
puis:
if (last_ping['Laurent'] and last_ping['Laurent']) > 3) ...
Re: LUA - Variable avec une chaine et variable
Publié : 15 janv. 2016, 10:23
par Seb13
Merci pour ta réponse
Mais je suis triste... pour moi le but d'une boucle est de ne pas répéter 50 fois la même ligne, donc, si j'ai une liste de 50 personnes... je fais une boucle qui va de 1 à 50 et qui fait, par exemple un print du nom...
For i =1 to 50 do
Print("le nom est : "..I)
End
Si j'ai un switch qui porte le nom de la personne... Test_Presence_Laurent
Dans ma boucle je veux prendre le nom de la variable i pour l'ajouter à Test_Presence_i pour avoir Test_Prensence_Laurent... tu vois le délire
Je ne me vois pas faire 50 lignes dans ma boucle pour les 50 noms...
Quand je fais Test_Presence_i, il me donne bien, Test_Presence_Laurent, c'est une chaine... mais impossible de le mettre en variable pour avoir la valeur de Test_Presence_Laurent...
Bref... je ne trouve pas que c'est hardu... comme pratique... même, si je suis d'accord avec toi que cela donne mal à la tête
Je vais faire sans pour l'instant... pas le choix
Encore merci pour ton temps...
Re: LUA - Variable avec une chaine et variable
Publié : 15 janv. 2016, 11:10
par rimram31
Sincèrement, je comprends rien a ce que tu veux faire ...
Il n'y a pas plus de lignes de code entre un
('last_ping_'..v.nom) et le
last_ping[v.nom] que je te suggère et même moins d'ailleurs car j'initialise le tableau en une seule ligne (
last_ping= {})
Je n'ai peut-être pas compris mais si ton besoin est une association clef / valeur (la raison de vouloir créer cette variable), il y a en LUA un objet pour ça autant l'utiliser
http://www.luteus.biz/Download/LoriotPr ... tionnaires. Il s'appelle, a défaut d'ailleurs je trouve, un tableau, dictionnaire ou map dans d'autres langages.
Pour reprendre ton exemple:
For i =1 to 50 do
Print("le nom est : "..I)
last_ping[l] = 12
End
Je ne réécris absolument pas 50 fois le code. Si tu es joueur d'ailleurs, tu peux même mettre un tableau dans un tableau, ce que gère domoticz par exemple pour les commandArray.
Re: LUA - Variable avec une chaine et variable
Publié : 15 janv. 2016, 12:20
par Seb13
Oui en effet, j'ai donné 2 exemples qui n'ont rien à voir... et si je donnais mon code directement !
En fait, c'est un script de présence via l'@ip du téléphone portable.
Cependant, le ping ne marche pas toujours, donc, j'enregistre dans une variable last_ping_seb un chiffre entier.
Si sup à 3 alors, j'ai executé 3 fois le script, donc, je suis absent, je passe le switch à Off.
Le tableau
Code : Tout sélectionner
Appareil = {};
Appareil[1] = {nom="Seb", ip = "xxx.xxx.xxx.xxx"}
La boucle pour comprendre le v
La partie dans la boucle où je ne veux pas écrire last_ping_seb = mais last_ping_..v.nom
Mais cela ne marche pas pour le test > 3
Ci-dessous le code, je dois écrire tous les prénoms de la famille sur le test.
Code : Tout sélectionner
if v.nom == 'Seb' then
last_ping_seb = last_ping_seb + 1
if last_ping_seb > 3 then
commandArray['Presence_'..v.nom]='Off'
end
end
if v.nom == 'Laurent' then
last_ping_Laurent = last_ping_Laurent + 1
if last_ping_Laurent > 3 then
commandArray['Presence_'..v.nom]='Off'
end
end
Ce que je veux c'est un truc du genre...
Sans le test du nom car dans la boucle je l'ai déjà.
Code : Tout sélectionner
last_ping_..v.nom = last_ping_..v.nom + 1
if last_ping_..v.nom > 3 then
commandArray['Presence_'..v.nom]='Off'
end
Tu comprends mieux

Re: LUA - Variable avec une chaine et variable
Publié : 15 janv. 2016, 13:18
par vil1driver
Pourquoi ne pas juste utiliser l'existant...
viewtopic.php?f=10&t=1366
Et si ça te dit... Apprendre par l'exemple..
On comprend bien plus en étudiant...
Re: LUA - Variable avec une chaine et variable
Publié : 15 janv. 2016, 13:53
par rimram31
Seb13 a écrit :Oui en effet, j'ai donné 2 exemples qui n'ont rien à voir... et si je donnais mon code directement ...
J'avais très bien compris alors

si tu relis ce que je t'ai expliqué, ton code deviendrait:
Code : Tout sélectionner
Appareil = {};
Appareil[1] = {nom="Seb", ip = "xxx.xxx.xxx.xxx"}
last_ping = {}
...
for i, v in pairs(Appareil) do
...
last_ping[v.nom] = 0
...
last_ping[v.nom] = last_ping[v.nom] + 1
if last_ping[v.nom] > 3 then
commandArray['Presence_'..v.nom]='Off'
end
...
On pourrait aussi utiliser ça:
Code : Tout sélectionner
Appareil = {};
Appareil[1] = {nom="Seb", ip = "xxx.xxx.xxx.xxx", last_ping=0 }
...
for i, v in pairs(Appareil) do
...
v.last_ping = v.last_ping + 1
if v.last_ping > 3 then
commandArray['Presence_'..v.nom]='Off'
end
...
Puisque ton besoin est d'avoir un "tableau de last_ping", chaque valeur associée a une entrée de ton tableau.
Ce que tu cherches a faire n'est tout simplement pas correct au sens du langage, LUA ici, passe un peu de temps sur une introduction au langage et des exemples notamment de scripts domoticz comme le suggère vil1driver.
Re: LUA - Variable avec une chaine et variable
Publié : 15 janv. 2016, 14:32
par Seb13
Merci... j'adore la 2ème idée, de le mettre dans le tableau !
Pourquoi n'y ai-je pas pensé !
Encore merci, je vais tester dans 1h... je te fais un retour.
Je vais lire un peu LUA... je me suis lancé en mode Freestyle...
J'ai fait du code dans ma jeunesse

mais cela fait longtemps et le manque de pratique... cela va revenir ici

Re: LUA - Variable avec une chaine et variable
Publié : 15 janv. 2016, 14:51
par vil1driver
tant que ce n'est pas stocké dans une variable utilisateur ou un fichier sur le disque,
tout ce qui se passe dans le script est oublié au lancement suivant...
Re: LUA - Variable avec une chaine et variable
Publié : 15 janv. 2016, 17:18
par rimram31

je suis passé a coté, du coup j'ai été voir le script original ...
Il te faut essayer un truc comme ça:
Code : Tout sélectionner
Appareil[1] = {nom="Seb", ip = "xxx.xxx.xxx.xxx" }
...
local variable_name
local last_ping
for i, v in pairs(Appareil) do
...
variable_name = 'last_ping_'..v.nom
last_ping = tonumber(uservariables[variable_name ])
last_ping = last_ping + 1
if last_ping > 3 then
commandArray['Presence_'..v.nom]='Off'
end
commandArray['Variable:'..variable_name] = tostring(last_ping)
...
Là, pas de souci car tu adresses un tableau de valeurs,
uservariables que te fourni domoticz dans un script smart LUA. Pas la même chose que d'utiliser une variable LUA.
La différence effectivement comme dit vil1driver est que dans le premier cas il s'agit de variables du script LUA qui ne durent que le temps d'exécution du script. Dans le second cas, on utilise les variables domoticz pour avoir des données conservées (via la db) d'un appel a l'autre.
Re: LUA - Variable avec une chaine et variable
Publié : 15 janv. 2016, 17:21
par vil1driver
juste pour enfoncer le clou

d’habitude je n'aime pas trop insister mais
ceci est fonctionnel déjà si jamais t'en à assez de chercher à débugger ton code
viewtopic.php?p=11744#p11744