LUA - Variable avec une chaine et variable

Forum dédié aux problématiques concernant les scripts pour DomoticZ.
Entourez votre code et les logs avec les balises nommées code grâce au bouton <\>.
rimram31
Messages : 659
Inscription : 04 oct. 2015, 11:22
Localisation : Toulouse

Re: LUA - Variable avec une chaine et variable

Message 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) ...
Raspberry Pi 2 + carte RF pi "maison" + Domoticz
Sonde Oregon + Aliexpress - Prises Chacon (3500W) - 1wire DS18B20
Seb13
Messages : 273
Inscription : 07 janv. 2016, 23:46

Re: LUA - Variable avec une chaine et variable

Message 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 :P

Je vais faire sans pour l'instant... pas le choix :mrgreen:

Encore merci pour ton temps...
rimram31
Messages : 659
Inscription : 04 oct. 2015, 11:22
Localisation : Toulouse

Re: LUA - Variable avec une chaine et variable

Message 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.
Raspberry Pi 2 + carte RF pi "maison" + Domoticz
Sonde Oregon + Aliexpress - Prises Chacon (3500W) - 1wire DS18B20
Seb13
Messages : 273
Inscription : 07 janv. 2016, 23:46

Re: LUA - Variable avec une chaine et variable

Message 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

Code : Tout sélectionner

for i, v in pairs(Appareil) do
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 :oops:
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: LUA - Variable avec une chaine et variable

Message 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...
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
rimram31
Messages : 659
Inscription : 04 oct. 2015, 11:22
Localisation : Toulouse

Re: LUA - Variable avec une chaine et variable

Message 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.
Raspberry Pi 2 + carte RF pi "maison" + Domoticz
Sonde Oregon + Aliexpress - Prises Chacon (3500W) - 1wire DS18B20
Seb13
Messages : 273
Inscription : 07 janv. 2016, 23:46

Re: LUA - Variable avec une chaine et variable

Message 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 :ugeek:
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: LUA - Variable avec une chaine et variable

Message 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...
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
rimram31
Messages : 659
Inscription : 04 oct. 2015, 11:22
Localisation : Toulouse

Re: LUA - Variable avec une chaine et variable

Message par rimram31 »

:o 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.
Raspberry Pi 2 + carte RF pi "maison" + Domoticz
Sonde Oregon + Aliexpress - Prises Chacon (3500W) - 1wire DS18B20
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: LUA - Variable avec une chaine et variable

Message par vil1driver »

juste pour enfoncer le clou :D 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
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
Répondre