Page 1 sur 3

Premier script probleme

Publié : 11 avr. 2016, 22:22
par Alexandre
Bonsoir a tous,
Voici le premier script qui ne fonctionne pas et que j'ai édité dans la fonction événement.....j'ai besoin de vous!

commandArray = {}
if (devicechanged['ambilight_power'] == 'On')
then
os.execute('curl -X POST -H "Content-Type: application/json" -d '{"power":"Off"}' http://192.168.1.22:1925/1/ambilight/power')
end
return commandArray

merci d'avance

Re: Premier script probleme

Publié : 12 avr. 2016, 11:06
par Alexandre
Pour info l'erreur serait sur la 4 eme ligne

Re: Premier script probleme

Publié : 12 avr. 2016, 11:48
par rimram31
Ambitieux ;) du embedded json dans curl lui-même embedded dans un appel execute lua ...

Décris un peu mieux ton erreur stp pour aider a l'analyse, domoticz affiche quoi ??? mais déjà en lecture "rapide", il me semble que je vois une quote simple dans l'appel os.execute lui-même en quote simple. A priori un escape pour ces quotes simples, essayer \' pour les deux quotes du -d '...' de curl ?

Re: Premier script probleme

Publié : 12 avr. 2016, 12:37
par Alexandre
rimram31 a écrit :Ambitieux ;) du embedded json dans curl lui-même embedded dans un appel execute lua ...

Décris un peu mieux ton erreur stp pour aider a l'analyse, domoticz affiche quoi ??? mais déjà en lecture "rapide", il me semble que je vois une quote simple dans l'appel os.execute lui-même en quote simple. A priori un escape pour ces quotes simples, essayer \' pour les deux quotes du -d '...' de curl ?


Rimram j' ai pas tout compris a ta réponse,je suis novice. Pour simplifié je veux faire exécuter a domoticz une commande POST avec données via inter virtuel;
http://192.168.1.22:1925/1/ambilight/power
{"power":"Off"}
soit avec un script ou autre ,et par la suite établir d'autres commandes du même type.
merci de ton aide

Re: Premier script probleme

Publié : 12 avr. 2016, 13:09
par Neutrino
En gros, Rimram31 te dit de mettre ça :

Code : Tout sélectionner

os.execute('curl -X POST -H "Content-Type: application/json" -d \'{"power":"Off"}\' http://192.168.1.22:1925/1/ambilight/power')

Re: Premier script probleme

Publié : 12 avr. 2016, 16:34
par rimram31
Yep ;)

Comme dans d'autres langages, en LUA il faut "escaper" un caractère du genre simple quote ' ou double quote " si tu veux la mettre dans la chaine elle-même alors que ce caractère est justement celui utilisé pour délimiter la chaine au sens du langage. http://www.lua.org/pil/2.4.html Quand tu as des ' tu délimites avec " ou l'inverse, par contre quand tu as les deux tu es un peu coincé d'où la syntaxe possible en précédant de \ D'autres langages demanderont par exemple de doubler la quote. Si tu veux insérer un \, il te faut indiquer \\ (ça peut devenir comique ...)

Quand je disais plus haut que tu étais ambitieux c'est que ça peut être sportif parfois de faire un appel système (pour toi curl) demandant déjà des quotes pour syntaxe, le tout donné en paramètre dans un autre langage qui lui aussi va demander des quotes en séparateur, ca peut faire quote de quote de quote ... sans oublier que simple ou double quote n'ont pas la même signification en shell :mrgreen:

Re: Premier script probleme

Publié : 12 avr. 2016, 17:57
par Alexandre
Neutrino a écrit :En gros, Rimram31 te dit de mettre ça :

Code : Tout sélectionner

os.execute('curl -X POST -H "Content-Type: application/json" -d \'{"power":"Off"}\' http://192.168.1.22:1925/1/ambilight/power')




voici le log que ca me donne
Error: EventSystem: in Ambil On: [string "commandArray = {} ..."]:2: attempt to index global 'devicechanged' (a nil value


j'ai editer comme suit:

commandArray = {}
if (devicechanged['ambilight_power'] == 'On')
then
os.execute('curl -X POST -H "Content-Type: application/json" -d \'{"power":"On"}\' http://192.168.1.22:1925/1/ambilight/power')
end
return commandArray

Re: Premier script probleme

Publié : 12 avr. 2016, 17:59
par Alexandre
rimram31 a écrit :Yep ;)

Comme dans d'autres langages, en LUA il faut "escaper" un caractère du genre simple quote ' ou double quote " si tu veux la mettre dans la chaine elle-même alors que ce caractère est justement celui utilisé pour délimiter la chaine au sens du langage. http://www.lua.org/pil/2.4.html Quand tu as des ' tu délimites avec " ou l'inverse, par contre quand tu as les deux tu es un peu coincé d'où la syntaxe possible en précédant de \ D'autres langages demanderont par exemple de doubler la quote. Si tu veux insérer un \, il te faut indiquer \\ (ça peut devenir comique ...)

Quand je disais plus haut que tu étais ambitieux c'est que ça peut être sportif parfois de faire un appel système (pour toi curl) demandant déjà des quotes pour syntaxe, le tout donné en paramètre dans un autre langage qui lui aussi va demander des quotes en séparateur, ca peut faire quote de quote de quote ... sans oublier que simple ou double quote n'ont pas la même signification en shell :mrgreen:
Merci,mais malheureusement je comprend que la moitié...mais ça me fais avancer

Re: Premier script probleme

Publié : 12 avr. 2016, 18:02
par rimram31
Utile de préciser le message d'erreur: attempt to index global 'devicechanged' (a nil value ...)

Là, c'est propre a domoticz, si je ne me trompe pas le tableau devicechanged n'existe que pour les scripts dits "device". Il n'est pas créé par domoticz pour les autres types de script LUA d'ou l'erreur quand tu essaies d'y accéder.

Edit: Désolé j'essaierai de mieux vulgariser, l'histoire des caractères c'est que si tu écris x = 'toto'truc' le langage prend le premier ' comme la fin de la chaine s'arrête a 'toto' et ne comprends rien au reste (et le plus souvent se plante en erreur). Si on veut insérer un ' dans une chaine on écrit donc \' Dans ton cas tu appelles os.execute qui attend une chaine en paramètre (la ligne de commande a exécuter), chaine qui contient elle-même des ' , ceux destinés a curl. J'espère avoir été plus clair.

Re: Premier script probleme

Publié : 12 avr. 2016, 18:13
par Alexandre
rimram31 a écrit :Utile de préciser le message d'erreur: attempt to index global 'devicechanged' (a nil value ...)

Là, c'est propre a domoticz, si je ne me trompe pas le tableau devicechanged n'existe que pour les scripts dits "device". Il n'est pas créé par domoticz pour les autres types de script LUA d'ou l'erreur quand tu essaies d'y accéder.

Edit: Désolé j'essaierai de mieux vulgariser, l'histoire des caractères c'est que si tu écris x = 'toto'truc' le langage prend le premier ' comme la fin de la chaine s'arrête a 'toto' et ne comprends rien au reste (et le plus souvent se plante en erreur). Si on veut insérer un ' dans une chaine on écrit donc \' Dans ton cas tu appelles os.execute qui attend une chaine en paramètre (la ligne de commande a exécuter), chaine qui contient elle-même des ' , ceux destinés a curl. J'espère avoir été plus clair.


ok merci ,oui en effet c'est plus clair
As tu une solution pour mon erreur?