Page 1 sur 1

DzVents : Mise en forme message curl

Publié : 22 oct. 2020, 18:29
par Greg.O
Salut,

je m'arrache les cheveux sur la mise en forme d'un message Curl dans un script Dzvents. Je cherche à modifier le paramètre 'duration' d'un PIR Xiaomi. Pour cela, il faut passer par un message de ce type :

Code : Tout sélectionner

curl -H 'Content-Type: application/json' -X PUT -d '{"duration": 300}' http://192.168.1.1:80/api/36E138295E/sensors/5/config
J'ai donc essayé cette ligne de code :

Code : Tout sélectionner

os.execute(curl -H 'Content-Type: application/json' -X PUT -d '{"duration": 300}' http://192.168.1.1:80/api/36E138295E/sensors/5/config )
Mais rien n'y fait : j'ai systématiquement ce type d'erreur :

Code : Tout sélectionner

2020-10-22 18:16:00.270 Error: dzVents: Error: (3.0.2) error loading module 'Test' from file '/home/pi/domoticz/scripts/dzVents/scripts/Test.lua':
2020-10-22 18:16:00.270 /home/pi/domoticz/scripts/dzVents/scripts/Test.lua:28: ')' expected near 'Content' 
J'ai cru comprendre en cherchant à droite à gauche que c'est à cause des guillemets, et qu'il fallait positionner un '\' devant certains ', mais je n'ai pas réussi à m'en sortir ainsi.
Si qqn avait une explication, merci

Re: DzVents : Mise en forme message curl

Publié : 23 oct. 2020, 10:50
par boum
Pour comprendre comment faire cette fois et les prochaines, il faut savoir comment les chaines de caractères fonctionnent en Lua.
Il y a plusieurs moyens de définir du texte en Lua. Les plus courantes sont "bla" et 'bla'. L'interpréteur Lua est très basique. Un guillemet ou une apostrophe définit le début de la chaine. Il lit la chaine jusqu'à intercepter un caractère identique.
Du coup, pour une chaine qui contient des guillemets, il vaut mieux l'entourer d'apostrophes. Et vice et versa :mrgreen:

Dans le cas de la commande ci-dessus, on a déjà les deux. Là, c'est surtout à cause de la donnée en JSON qui contient des guillemets et on ne veut pas que le shell les interprète. D'où les apostrophes autours — les règles sont différentes en bash et en Lua…

Pour permettre à Lua d'inclure un caractère spécial dans une chaine, il faut le protéger avec le backslash \. Du coup, ça donne qq chose comme : "Il lui dit : \"L'oiseau !\"" ou 'Il lui dit : "L\'oiseau !"'.

Voilà pour la théorie. En pratique, Lua possède une troisième méthode pour définir des chaines de caractères : [[bla]]

Code : Tout sélectionner

os.execute([[curl -H 'Content-Type: application/json' -X PUT -d '{"duration": 300}' http://192.168.1.1:80/api/36E138295E/sensors/5/config]])
:lol:

Re: DzVents : Mise en forme message curl

Publié : 23 oct. 2020, 11:20
par Greg.O
Merci beaucoup : ton explication est limpide et m'a permis de comprendre mon erreur.