DzVents : Mise en forme message curl

Vous avez des questions concernant les scripts dans Domoticz, posez vos questions ici, quelque soit le langage nous tenterons des réponses pertinentes ...
Répondre
Greg.O
Messages : 116
Enregistré le : 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 v2020.2 sur Raspberry Pi 3B+
Raspbian Buster
Capteurs T/Hum Xiaomi / ConBee II
Zwave

boum
Messages : 121
Enregistré le : 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 v4.10717 sur Pi³ / Z-Wave / RFXCom

Greg.O
Messages : 116
Enregistré le : 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 v2020.2 sur Raspberry Pi 3B+
Raspbian Buster
Capteurs T/Hum Xiaomi / ConBee II
Zwave

Répondre