Aller au contenu

Recup Json Alarme / Lua / VD


Messages recommandés

Posté(e)

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.

 

Posté(e)

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.

Posté(e) (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 :P )

 

Ou il faut que je le traite en json par un autre moyen ...

 

Tu penses que je peux tout faire en lua directement ?

 

 

 

 

 

 

Modifié par yoim
Posté(e)

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

  • Thanks 1
Posté(e)

Ok première erreur :P

 

 

[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)

 

Posté(e)

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 ?

Posté(e) (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é par yoim
Posté(e)

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 ?

Posté(e)

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. :P

 

Une fois que j'aurais compris le systeme, je pense que je vais m'amuser ...

 

Merci

 

Posté(e)

Bonjour,

Pour mettre dans une variable

fibaro:setGlobal("variable", json.encode(p.data))



Envoyé de mon Nexus 5X en utilisant Tapatalk

Posté(e)

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

  • Thanks 1
Posté(e) (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é par yoim
Posté(e)
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)

 

  • Like 1
Posté(e) (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é par yoim
Posté(e)

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"

  • Like 1
Posté(e)

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"

 

 

Posté(e) (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é par pepite
Posté(e) (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é par yoim
Posté(e) (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é par pepite
Posté(e)

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 ...

Posté(e)

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.

  • Like 2
Posté(e)
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"

  • Like 1
×
×
  • Créer...