yoim Posté(e) le 28 décembre 2017 Signaler Posté(e) le 28 décembre 2017 Bonjour, J'ai une vielle alarme ou j'arrive a recuperer des etats de certains modules. Je recupere ces infos comme ca : http://IPALARME/action/sensorListGet Il me sort ce type d'infos. /*-secure- { senrows : [ {no : "1", type : "Remote Controller", area : "1", zone : "1", name : "User", attr : "Personal Att", cond : "", battery : "", tamp : "", bypass : "No"}, {no : "2", type : "Remote Keypad", area : "1", zone : "2", name : "Entrance", attr : "", cond : "", battery : "", tamp : "", bypass : "No"}, {no : "3", type : "Door Contact", area : "1", zone : "3", name : "Veranda", attr : "Entry", cond : "Open", battery : "", tamp : "", bypass : "No"}, {no : "4", type : "IR Sensor", area : "1", zone : "4", name : "Couloir", attr : "Entry", cond : "", battery : "", tamp : "", bypass : "No"}, {no : "5", type : "IR Sensor", area : "1", zone : "5", name : "Salon", attr : "Entry", cond : "", battery : "", tamp : "", bypass : "No"}, {no : "6", type : "IR Sensor", area : "1", zone : "6", name : "Palier", attr : "Entry", cond : "", battery : "", tamp : "", bypass : "No"}, {no : "7", type : "Door Contact", area : "1", zone : "7", name : "Porte Principale", attr : "Entry", cond : "", battery : "", tamp : "", bypass : "No"}] } */ Comme on peut le voir a la ligne no 3 : j'ai mon capteur de porte qui est ouvert. cond :"Open" Il est pas vraiment formater JSON. Est ce que vous pensez qu'on peut ecrire un Lua pour recuperer les conditions de mon alarme. J'ai essayé avec curl, et je peux recup mes etats, mais bon si je peux le faire en Lua ca sera plus propre. Merci pour votre aide.
Steven Posté(e) le 29 décembre 2017 Signaler Posté(e) le 29 décembre 2017 En récupérant le flux, il suffirait de faire un code du style : local result = "/*-secure-{ senrows : [{no : \"1\", type : \"Remote Controller\", area : \"1\", zone : \"1\", name : \"User\", attr : \"Personal Att\", cond : \"\", battery : \"\", tamp : \"\", bypass : \"No\"},{no : \"2\", type : \"Remote Keypad\", area : \"1\", zone : \"2\", name : \"Entrance\", attr : \"\", cond : \"\", battery : \"\", tamp : \"\", bypass : \"No\"},{no : \"3\", type : \"Door Contact\", area : \"1\", zone : \"3\", name : \"Veranda\", attr : \"Entry\", cond : \"Open\", battery : \"\", tamp : \"\", bypass : \"No\"},{no : \"4\", type : \"IR Sensor\", area : \"1\", zone : \"4\", name : \"Couloir\", attr : \"Entry\", cond : \"\", battery : \"\", tamp : \"\", bypass : \"No\"},{no : \"5\", type : \"IR Sensor\", area : \"1\", zone : \"5\", name : \"Salon\", attr : \"Entry\", cond : \"\", battery : \"\", tamp : \"\", bypass : \"No\"},{no : \"6\", type : \"IR Sensor\", area : \"1\", zone : \"6\", name : \"Palier\", attr : \"Entry\", cond : \"\", battery : \"\", tamp : \"\", bypass : \"No\"},{no : \"7\", type : \"Door Contact\", area : \"1\", zone : \"7\", name : \"Porte Principale\", attr : \"Entry\", cond : \"\", battery : \"\", tamp : \"\", bypass : \"No\"}]}*/" local open = false result:gsub("(.-)Door Contact(.-)name : \"(.-)\"(.-)cond : \"(.-)\"", function(a,b,c,d,e) if (e == "Open") then open = true print(c .. " est ouvert") end end) if (open) then -- traitement ici end L'exemple ne prend en compte que les contacteurs de porte.
yoim Posté(e) le 29 décembre 2017 Auteur Signaler Posté(e) le 29 décembre 2017 (modifié) Merci @Steven Merci pour le code, mais est ce que je peux recuperer mon json directement sur cette adresse. http://IPALARME/action/sensorListGet En lua je lui fait recuperer le json de l'adresse et apres je mets ton code ? ( comment recuperer le flux justement ) Ou il faut que je le traite en json par un autre moyen ... Tu penses que je peux tout faire en lua directement ? Modifié le 29 décembre 2017 par yoim
Steven Posté(e) le 29 décembre 2017 Signaler Posté(e) le 29 décembre 2017 Tu peux tout faire dans un scénario LUA : local url = "http://IPALARME/action/sensorListGet" function checkDoors(result) local open = false result:gsub("(.-)Door Contact(.-)name : \"(.-)\"(.-)cond : \"(.-)\"", function(a,b,c,d,e) if (e == "Open") then open = true print(c .. " est ouvert") end end) if (open) then -- traitement ici end end local http = net.HTTPClient() http:request(url, { options = { method = 'GET', headers = {["Content-Type"] = "application/json"}}, success = function(response) checkDoors(response) end, error = function(response) log(" ERROR !!! " .. response) end, }) Bien évidement, non testé. Courage 1
yoim Posté(e) le 29 décembre 2017 Auteur Signaler Posté(e) le 29 décembre 2017 Merci Je test tout ca ...
yoim Posté(e) le 29 décembre 2017 Auteur Signaler Posté(e) le 29 décembre 2017 Ok première erreur [DEBUG] 15:40:34: [1;31m2017-12-29 15:40:34.739354 [ fatal] LUA error: /opt/fibaro/scenes/1.lua:11: attempt to call method 'gsub' (a nil value) [DEBUG] 15:40:57: [1;31m2017-12-29 15:40:57.020782 [ fatal] LUA error: /opt/fibaro/scenes/1.lua:11: attempt to call method 'gsub' (a nil value) [DEBUG] 15:42:14: [1;31m2017-12-29 15:42:14.335621 [ fatal] LUA error: /opt/fibaro/scenes/1.lua:11: attempt to call method 'gsub' (a nil value)
Steven Posté(e) le 29 décembre 2017 Signaler Posté(e) le 29 décembre 2017 C'est qu'il n'a pas de retour de la requête. Question bête tu as bien remplacé IPALARME : local url = "http://IPALARME/action/sensorListGet" Par l'adresse IP de ton alarme ?
yoim Posté(e) le 29 décembre 2017 Auteur Signaler Posté(e) le 29 décembre 2017 Oui j ai remplacé par la bonne ip. Par contre j ai une authentification sur l alarme. Dans mon adresse j ai mis User:password@ip/chemin http://user:password@IPALARME/action/sensorListGet Je te l avais pas précisé. Sent from my iPhone using Tapatalk
yoim Posté(e) le 29 décembre 2017 Auteur Signaler Posté(e) le 29 décembre 2017 (modifié) En ayant fait des tests, je me rends compte qu'on est pas dans un fichier json bien formaté il manque des "" sur certains parametres. Fichier en recup comme ca : {no : "1", type : "Remote Controller", area : "1", zone : "1", name : "User", attr : "Personal Att", cond : "", battery : "", tamp : "", bypass : "No"}, en le modifiant : {"no" :"1", "type" : "Remote Controller", "area" : "1", "zone" : "1", "name" : "User", "attr" : "Personal Att", "cond" : "", "battery" : "", "tamp" : "", "bypass" : "No"} Là on serait correct en json. Modifié le 29 décembre 2017 par yoim
yoim Posté(e) le 30 décembre 2017 Auteur Signaler Posté(e) le 30 décembre 2017 Je pense avoir trouvé qq chose. En faite ce n'est pas du json, c'est du JavaScript object. Je peux recuperer du JavaScript object en Lua ?
yoim Posté(e) le 31 décembre 2017 Auteur Signaler Posté(e) le 31 décembre 2017 Bon, j'y arrive presque. J'arrive enfin a voir mes data dans le debug en procedant comme ci dessus. Je n'arrive pas recuperer mes données et les mettre dans une variable. Voila le code local url = "http://webconex.eu/egardia/egardia.json" fibaro:debug("oki") function checkDoors(result) local open = false result:gsub("(.-)Door Contact(.-)name : \"(.-)\"(.-)cond : \"(.-)\"", function(a,b,c,d,e) if (e == "Open") then open = true print(c .. " est ouvert") end fibaro:debug(result) end) if (open) then fibaro:debug("plop") end end http = net.HTTPClient() http:request(url, { options = { method = 'GET' }, success = function(p) fibaro:debug(p.status) fibaro:debug(p.data) end, error = function(err) fibaro:debug(err) end }) et voila le debug : [DEBUG] 12:46:27: oki [DEBUG] 12:46:27: 200 [DEBUG] 12:46:27: /*-secure- [DEBUG] 12:46:27: { senrows : [ [DEBUG] 12:46:27: {no : "1", type : "Remote Controller", area : "1", zone : "1", name : "User", attr : "Personal Att", cond : "", battery : "", tamp : "", bypass : "No"}, [DEBUG] 12:46:27: {no : "2", type : "Remote Keypad", area : "1", zone : "2", name : "Entrance", attr : "", cond : "", battery : "", tamp : "", bypass : "No"}, [DEBUG] 12:46:27: {no : "3", type : "Door Contact", area : "1", zone : "3", name : "Veranda", attr : "Entry", cond : "Open", battery : "", tamp : "", bypass : "No"}, [DEBUG] 12:46:27: {no : "4", type : "IR Sensor", area : "1", zone : "4", name : "Couloir", attr : "Entry", cond : "", battery : "", tamp : "", bypass : "No"}, [DEBUG] 12:46:27: {no : "5", type : "IR Sensor", area : "1", zone : "5", name : "Salon", attr : "Entry", cond : "", battery : "", tamp : "", bypass : "No"}, [DEBUG] 12:46:27: {no : "6", type : "IR Sensor", area : "1", zone : "6", name : "Palier", attr : "Entry", cond : "", battery : "", tamp : "", bypass : "No"}, [DEBUG] 12:46:27: {no : "7", type : "Door Contact", area : "1", zone : "7", name : "Porte Principale", attr : "Entry", cond : "", battery : "", tamp : "", bypass : "No"}] [DEBUG] 12:46:27: } [DEBUG] 12:46:27: */ [DEBUG] 12:46:27: Elle s'affiche dans mon debug, mais comment les inserer dans une variable pour ensuite les traiter avec gsub ou find. Une fois que j'aurais compris le systeme, je pense que je vais m'amuser ... Merci
pepite Posté(e) le 31 décembre 2017 Signaler Posté(e) le 31 décembre 2017 Bonjour,Pour mettre dans une variable fibaro:setGlobal("variable", json.encode(p.data))Envoyé de mon Nexus 5X en utilisant Tapatalk
pepite Posté(e) le 31 décembre 2017 Signaler Posté(e) le 31 décembre 2017 Mais tu peux faire tes gsub et find en partant de ta fonction apres ton debug, tu traites p.data Envoyé de mon Nexus 5X en utilisant Tapatalk 1
yoim Posté(e) le 2 janvier 2018 Auteur Signaler Posté(e) le 2 janvier 2018 (modifié) Merci @pepite et @Steven Vos conseils m'ont bien aidé. Mais je suis encore bloqué suite à mon incompetence dans le code. J'arrive a recuperer mon fichier qui n'est pas vraiment du Json mais plus du Javascript Object. J'arrive avec la commande gsub a sortir mes mots "Open" ... J'arrive aussi a enregistrer mon retour dans une Global Variable. Par contre le json.encode ne fonctionne pas. Vu que ce n 'est pas du Json je pense que c'est normal. Je peux mettre tout ce que je veux dans ma Global Variable. On est pas limité ? ( nbre de caractere ) Je les ressorts correctement mais vu que c'est mis n'importe comment, je ne suis pas sure d'utiliser la bonne methode. Ma variable Moys fonctionne et le gsub aussi. Mais je n'arrive pas à inserer mon retour dans la Global Variable ? ( Open ) C'est tout le fichier qui s'insère ... Comme ci le gsub n'etait pas pris en compte lors de l'envoie dans ma Global Variable. Une idée ? Avec le lib net.HTTPClient, je peux configurer une authentification ? Merci d'avance. --[[ %% properties %% events %% globals --]] local url = "http://webconex.eu/egardia/egardia.json" fibaro:debug("oki") local http = net.HTTPClient() http:request(url, { options = { method = 'GET' }, success = function(p) --fibaro:debug(p.status) --fibaro:debug(p.data) fibaro:setGlobal("Veranda", p.data) local Globe = fibaro:getGlobalValue('Veranda') --fibaro:debug(Globe) local Moys = string.gsub(Globe, "Open", print) fibaro:setGlobal("plop", Moys) -- local yes = string.gmatch(p.data, "Open") -- fibaro:debug(yes) end, error = function(err) fibaro:debug(err) end }) Debug [DEBUG] 20:22:51: oki [DEBUG] 20:22:51: Open Modifié le 2 janvier 2018 par yoim
pepite Posté(e) le 3 janvier 2018 Signaler Posté(e) le 3 janvier 2018 Il y a 13 heures, yoim a dit : fibaro:setGlobal("plop", Moys) Bonjour, Tu parles de cette ligne là que tu ne peux pas mettre dans ta variable globale ? Je pense que c'est normal, à vérifier par les experts tout de même, mais le print fait un "print" (ah bon ;-)) de ton gsub, c'est pour cela que tu as ensuite tout le fichier dans ta variable. et comme ceci : local Moys = Globe:match("Open") print(Moys) 1
yoim Posté(e) le 3 janvier 2018 Auteur Signaler Posté(e) le 3 janvier 2018 (modifié) Bon voila, c'est bon. Merci beaucoup. Globe:match Vu que je suis newbie en Lua, probleme d'ecriture. Merci beaucoup. Mais avec gsub je peux faire la même chose ... En fait vu que ce n'est pas du json, je ne peux pas tout mettre dans un tableau ... En Javascript Object j'ai ca : http://webconex.eu/egardia/egardia.json Je veux recuperer cond: qui ne sont pas en double "" sur la ligne où j'ai "Door Contact" Sachant que quand une porte est ouverte j'ai le cond : qui devient cond : "Open" --[[ %% properties %% events %% globals --]] local url = "http://webconex.eu/egardia/egardia.json" fibaro:debug("oki") local http = net.HTTPClient() http:request(url, { options = { method = 'GET' }, success = function(p) --fibaro:debug(p.status) --fibaro:debug(p.data) fibaro:setGlobal("Veranda", p.data) local Globe = fibaro:getGlobalValue('Veranda') --fibaro:debug(Globe) local Moys = Globe:match("Open") print(Moys) --local Moys = string.gsub(Globe, "Open", print) -- local Moys = ("Open") fibaro:setGlobal("plop", Moys) --fibaro:debug(Moys) --local myString = (tostring(Moys)) --fibaro:debug("myString") if (Moys == "Open") then fibaro:debug("plopOK") end -- local yes = string.gmatch(p.data, "Open") -- fibaro:debug(yes) end, error = function(err) fibaro:debug(err) end }) Modifié le 3 janvier 2018 par yoim
pepite Posté(e) le 3 janvier 2018 Signaler Posté(e) le 3 janvier 2018 Cool. Ca ne fonctionne pas un match comme ceci Globe:match("cond:Open") ? Sinon va falloir jouer avec les pattern et enlever ou rajouter des guillements pour arriver à "cond:open" 1
yoim Posté(e) le 3 janvier 2018 Auteur Signaler Posté(e) le 3 janvier 2018 Si ca marche super. Mais vu que j'ai 2 lignes, quand je vais avoir "Open" ca sera pour l'ensemble des contacts portes. Si j'avais pu les séparer ... En tout cas là je recupere bien ma valeur "Open"
pepite Posté(e) le 3 janvier 2018 Signaler Posté(e) le 3 janvier 2018 (modifié) On parle bien de tes Door contact ? Donc ce qui les différencie est le "name" ? tu peux donc tester le name et Open, du genre if Globe:match("Veranda") and Globe:match("cond:Open") then.... ... end Ca pourrait le faire non ? Modifié le 3 janvier 2018 par pepite
yoim Posté(e) le 3 janvier 2018 Auteur Signaler Posté(e) le 3 janvier 2018 ah oui excellente idée Je teste.
yoim Posté(e) le 3 janvier 2018 Auteur Signaler Posté(e) le 3 janvier 2018 (modifié) Arf .. Non Ca ne fonctionne pas. Mais c normal car ce n'est pas un tableau. Donc que j'ai dans ma string un "Open" Il ne sait pas d'où il provient. Il me dit simplement, j'ai un "Open" dans le string ... Je ne peux pas les differencier. La seule chose qui change dans mon fichier c'est cond : Open Veranda et Porte principale seront toujours écris dans mon fichier. Là j'ai une alerte quand j'ai "Open" dans mon fichier. Si j'ai 1 ou 2 conditions "Open" ca se déclenche... J'arrive pas a savoir d'où ca vient. Est ce que je peux faire une authentification sur ma requete url ? Pour recup mon fichier j'ai une sorte de htaccess a l'entree de ma page. -- Alternatively, one could fill the appropriate header and authenticate -- the request directly. r, c = http.request { url = "http://www.example.com/private/index.html", headers = { authentication = "Basic " .. (mime.b64("fulano:silva")) } } J'ai trouvé ce type de chose. Qq un a deja essayé ? ou ca : local http = net.HTTPClient() http:request(url, user, password, { options = { method = 'GET', authentication = "Basic " }, Modifié le 3 janvier 2018 par yoim
pepite Posté(e) le 4 janvier 2018 Signaler Posté(e) le 4 janvier 2018 (modifié) Bonjour @yoim Tu n'arrives pas à récupérer cela ? name : "Veranda" Oui oui tu peux faire de l'authentification, exemple avec password en base64 options = { method = 'POST', headers = { ["content-type"] = 'application/json', ["Authorization"] = 'Basic '..password }, Modifié le 4 janvier 2018 par pepite
yoim Posté(e) le 4 janvier 2018 Auteur Signaler Posté(e) le 4 janvier 2018 Si j'arrive a récuperer mais le probleme que j'ai c'est que quand je lui fait matcher "Open" et que j'ai 2 contact portes et que les names Porte Principale et Veranda ne changent pas. Je ne sais pas comment lui dire. C'est le "Open" Veranda qui est ouvert. Car là que ce soit l'un ou l'autre il me fait l'alerte. Mais c'est normal car il match dès qu'il voit un "Open" dans mon flux data. Je pense qu'il faut que je fasse un gsub en patern sur les lignes ...
Steven Posté(e) le 4 janvier 2018 Signaler Posté(e) le 4 janvier 2018 Il faut utiliser les pattern afin de matcher "Véranda" avec "cond:" et prendre le mot d'après. Je sais c'est facile à dire mais pas à faire. Je t'avais fourni au tout depuis un morceau de code dont tu dois pouvoir t'inspirer. 2
pepite Posté(e) le 4 janvier 2018 Signaler Posté(e) le 4 janvier 2018 Le 29/12/2017 à 14:51, Steven a dit : result:gsub("(.-)Door Contact(.-)name : \"(.-)\"(.-)cond : \"(.-)\"", function(a,b,c,d,e) @yoim, je suis incapable d'ecrire ca, mais a force de cotoyer @steven je commence à comprendre. C va etre ton "name" est e sera "Open" 1
Messages recommandés