DzVents : Mise en forme message curl

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 <\>.
Greg.O
Messages : 148
Inscription : 07 oct. 2017, 18:04

DzVents : Mise en forme message curl

Message 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
Domoticz v2021.1 sur Raspberry Pi 3B+
Raspbian Buster
Capteurs T/Hum Xiaomi / ConBee II
Zwave
boum
Messages : 233
Inscription : 18 janv. 2019, 11:34
Localisation : France

Re: DzVents : Mise en forme message curl

Message 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:
Domoticz v2022.2 sur linux-mint / Z-Wave-JS / RFXCom / Zigbee2MQTT
Greg.O
Messages : 148
Inscription : 07 oct. 2017, 18:04

Re: DzVents : Mise en forme message curl

Message par Greg.O »

Merci beaucoup : ton explication est limpide et m'a permis de comprendre mon erreur.
Domoticz v2021.1 sur Raspberry Pi 3B+
Raspbian Buster
Capteurs T/Hum Xiaomi / ConBee II
Zwave
Répondre