Logique et syntaxe LUA

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 <\>.
Thib38
Messages : 10
Inscription : 23 déc. 2020, 19:37

Logique et syntaxe LUA

Message par Thib38 »

Bonjour à tous,

Je me permet de faire appels à vos lumières après plusieurs jours à lire et relire le site et le forum.

Ma question est simple,
en observant ce code ici :

Code : Tout sélectionner

local temperature = devicechanged[string.format('%s_Temperature', sonde)]
Si je comprends cette ligne, (et d'après ce que j'ai vu ici) on fait une chaine de caractère où %s est la valeur de la sonde, si le capteur est à 21.3 °C, la chaine obtenue pour temperature est :

Code : Tout sélectionner

21.3_Temperature
Avec ça, on fait une vérification avec des valeurs :

Code : Tout sélectionner

if (temperature < (consigne - hysteresis) )
on compare une chaine de caractères avec des valeurs...
Comment ça peut fonctionner ?

En vous remerciant d'avance et mille excuse si je suis passer à travers un truc aussi simple.
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Logique et syntaxe LUA

Message par Keros »

Bonjour Thib38 et bienvenue sur le forum ;)

L'exemple que tu prends n'est pas simple, surtout l'utilisation de cette fonction.

J'ai trouvé une réponse là : https://www.tutorialspoint.com/lua/lua_strings.htm : string.format('%s_Temperature', sonde) revient à faire sonde..'_Temperature', en remplaçant la variable sonde par sa valeur.

Tu pourrais écrire simplement local temperature = devicechanged['Salon_Temperature'] ;)

Va savoir pourquoi dans des exemples, tu as des choses compliquées :mrgreen:
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
Thib38
Messages : 10
Inscription : 23 déc. 2020, 19:37

Re: Logique et syntaxe LUA

Message par Thib38 »

Merci pour l'accueil, et merci pour la réponse Keros, effectivement on peut faire plein de choses avec string.format().

Mais on est bien d'accord qu'ensuite cette chaîne est comparée avec des valeurs ?
(j'ai essayé ce script et il fonctionne, et je ne comprends pas :? )

Alors que si on utilise local temperature = devicechanged['Salon_Temperature'] on va comparer que des valeurs ?
Dernière modification par Keros le 23 déc. 2020, 22:20, modifié 1 fois.
Raison : Merci de ne pas citer le message précédent lors d'une réponse direct
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Logique et syntaxe LUA

Message par Keros »

Ce qui compte, ce sont les valeurs !!
Zut Perceval sort de ce corps :mrgreen:
Désolé, un moment d'égarement :lol:


Décortiquons local temperature = devicechanged[string.format('%s_Temperature', sonde)]. Cela donne :

local temperature = on enregistre la donnée dans une variable local nomée température.
devicechanged[XXXXX] c'est la valeur du dispositif XXXXX quant il changera.
string.format('%s_Temperature', sonde) c'est pour définir le nom du dispositif

La chaine permet de définir le dispositif. C'est ensuite la valeur du dispositif qui est enregistré dans la variable. Et enfin comparé à une autre valeur dans la suite du programme.
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
Thib38
Messages : 10
Inscription : 23 déc. 2020, 19:37

Re: Logique et syntaxe LUA

Message par Thib38 »

"C'est pas faux !" :D

Je pense que j'ai compris ce que je ne comprends pas !
Tu pourrais écrire simplement local temperature = devicechanged['Salon_Temperature']
Pourquoi _Temperature ?
Pourquoi ne pas écrire : local temperature = devicechanged['Salon']
Encore mieux : local temperature = devicechanged['sonde'] puisqu'il est définit local sonde = 'Salon'
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Logique et syntaxe LUA

Message par Keros »

:lol:
Thib38 a écrit : 23 déc. 2020, 23:58 Pourquoi _Temperature ?
Salon_Temperature c'est le nom du dispositif dans l'exemple.
Thib38 a écrit : 23 déc. 2020, 23:58 Pourquoi ne pas écrire : local temperature = devicechanged['Salon']
Oui à condition que ton dispositif s'appele Salon. Tu pourrais l'appeler Sonde_salon, Capteur-salon, etc
Thib38 a écrit : 23 déc. 2020, 23:58 Encore mieux : local temperature = devicechanged['sonde'] puisqu'il est définit local sonde = 'Salon'
Là non : sonde est entre guillements donc c'est du texte.
Pour utiliser la variable il faudrait :

Code : Tout sélectionner

local sonde = 'Salon'
local temperature = devicechanged[sonde]
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
denis_brasseur
Messages : 898
Inscription : 24 déc. 2018, 17:05
Localisation : (26)

Re: Logique et syntaxe LUA

Message par denis_brasseur »

C'est d'ailleurs encore plus visible avec l'affichage syntaxique depuis l'éditeur d'évènement ou Notepad++ :
Capture.PNG
Capture.PNG (7.2 Kio) Consulté 3027 fois
La couleur te permet de bien faire la différence entre une variable et le nom du device.
Pi3 + DD PiDrive - RFXtrx433 - AEON Labs ZW090
Thib38
Messages : 10
Inscription : 23 déc. 2020, 19:37

Re: Logique et syntaxe LUA

Message par Thib38 »

effectivement j'ai mélangé variable et dispositif, merci à tous pour ces éclaircissements,

Mais donc j'en déduis que devicechanged[] renvoie une chaine de caratères ?
du coup j'ai testé :

Code : Tout sélectionner

tonumber(devicechanged[Sonde])
et là, les comparaisons entre nombres fonctionnent !
Thib38
Messages : 10
Inscription : 23 déc. 2020, 19:37

Re: Logique et syntaxe LUA

Message par Thib38 »

Salon_Temperature c'est le nom du dispositif dans l'exemple.
sauf que dans le script, Salon est un dispositif, pas Salon_Temperature Je ne comprends pas d'où sort ce _Temperature dans le code, alors qu'aucun de mes dispositifs ne comporte ce terme. et pourtant, il tourne... ce script ! (je l'ai essayé)

en revanche que je mette
local temperature = devicechanged[sonde] ou local temperature = devicechanged['Salon']
J'obtiens :
Error: EventSystem: in script_device_B1: [string " -- ..."]:27: attempt to compare string with number
Dernière modification par Keros le 24 déc. 2020, 16:34, modifié 1 fois.
Raison : Question recues en MP
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Logique et syntaxe LUA

Message par Keros »

Salon n'est pas forcément un dispositif. L'auteur du script a certainement appelé ces différents capteurs Salon_Temparéture, Cuisine_Température, Chambre_Temperature.

Et comme il utilise le suffixe _Temperature à chaque fois, il a utilisé un formatge de chaine de caractère "automatiquement".

PS : je ne réponds pas aux demandes par MP ;)
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
Répondre