Aller au contenu

Recup Etat Json


Messages recommandés

Posté(e)

J'ai un bout de code ou je dois recuperer l'etat de mon module :

 

--[[
%% properties
%% events
%% globals
--]]

local url = 'http://192.168.42.4:9595/cm?cmnd=Power',80

   fibaro:debug("oki")
  
http = net.HTTPClient()
http:request(url, {
                 options = { method = 'GET' },
			     --headers = { authentication = 'Basic '..password },
					
    				

  			success = function(p)
                            fibaro:debug(p.status)
                            --fibaro:debug(p.data)
      						jsonString = json.encode(p.data)
      						jsonTable = json.decode(jsonString)

      
      		fibaro:debug(jsonTable)
      				
      
      if(jsonTable.POWER == ON)
then
  fibaro:debug('null value successfully decoded')
end
      
                 end,
                 error = function(err)
                            fibaro:debug(err)
                 end
  
  })

--fibaro:setGlobal("variable", json.encode(p.data))
--jsonTable = { value1 = 512, value2 = json.null }
--jsonString = json.encode(jsonTable)
 
-- after encoding jsonString variable contains '{ "value2": null, "value1": 512 }' string

Mon retour Json est comme ca :

 

{"POWER":"ON"}

Je veux que quand mon etat est sur On ou sur Off il l'envoie dans une Global Variable.

 

Je pense que j'ai mal ecris ca :

 

 if(jsonTable.POWER == ON)

 

Ou alors est ce qu'il faut que je joue avec gsub ?

 

Merci pour vos lumieres.

 

 

Posté(e)

Bonjour,

 

Essaie cela dans ton code
 

fibaro:debug(jsonTable)
fibaro:debug("POWER : " .. jsonTable.POWER)
fibaro:debug("Type : " .. type(jsonTable.POWER))

if (jsonTable.POWER == "ON") then

  fibaro:debug('null value successfully decoded')

end

 

  • Upvote 1
Posté(e)

Merci @pepite Tu es toujours là pour mes problemes Json.

 

J'ai un retour comme qui il recupere rien dans POWER.

 

[DEBUG] 09:27:47: oki
[DEBUG] 09:27:47: 200
[DEBUG] 09:27:47: {"POWER":"ON"}
[DEBUG] 09:27:47: 2020-01-24 09:27:47.904707 [ fatal] LUA error: /opt/fibaro/scenes/318.lua:27: attempt to concatenate field 'POWER' (a nil value)

 

Posté(e)

J'ai souvent ce probleme quand je veux recuperer des valeurs en Json.

 

Je suis toujours obligé d'utiliser Gsub. Mon JSON est mal formaté ?

 

 

Posté(e) (modifié)

normalement dans un tableau j'ai juste a sortir mes valeurs.

 

Dans mon tableau J'ai un champ POWER avec une valeur ON ou OFF

 

C'est bien un tableau ca :

{"POWER":"ON"}

Je n'arrive jamais a les sortir simplement ces valeurs. Je suis toujours obligé de lui donner des indications, enlever les "" ou les . C'est le deuxieme mot .... avec gsub

 

Est ce que c'est a cause du Lua ou de la facon dont je veux recuperer les valeurs.

Modifié par yoim
Posté(e) (modifié)

Merci @pepite J'ai trouvé sur du code où tu avais aidé qq un sur ce forum. :D

 

Je ne me suis peut être pas fait bien comprendre. Je voulais retrouver mon état d'un module grace a sa sortie en Json.

 

Dans certains language et comme tu me l'avais indiqué en faisant 

jsonTable.POWER

Je devrais tout de suite avoir ma valeur soit ON ou OFF. En lua il faut toujours retouché a ta string pour obtenir le bon résultat ... et du coup gsub et les patterns sont très interessants.

 

Je te mets mon code qui fonctionne. J'ai flashé un module SonOff et je voulais avoir son retour d'etat. C'est chose faite.

 

--[[
%% autostart
%% properties
%% events
%% globals
--]]

local Source = fibaro:getSourceTrigger()

function Run()
  
  local delay = 60 --en secondes
  

local url = 'http://192.168.42.4:9595/cm?cmnd=Power',80

   fibaro:debug("oki")
  fibaro:debug("Prog Launch")
  
http = net.HTTPClient()
http:request(url, {
                 options = { method = 'GET' },
			     --headers = { authentication = 'Basic '..password },
					
    				

  			success = function(p)
                            fibaro:debug(p.status)
                            --fibaro:debug(p.data)
      						jsonString = json.encode(p.data)
      						jsonTable = json.decode(jsonString)

      
      		fibaro:debug(jsonTable)
            fibaro:debug(jsonTable.POWER)
      
      
      
      if(jsonTable.POWER == OFF)
then
  fibaro:debug('null value successfully decoded')
end
      
     fibaro:debug("Prog Launch")
        
      local power = jsonTable
      
      fibaro:debug(power)
      
local sep = ":"
local position_sep = power:find(sep)
local longueur_chaine_test = power:len()
local longueur_chaine_sep = sep:len()
local sub_avant_sep =power:sub(position_sep+longueur_chaine_sep,longueur_chaine_test)      
print(longueur_chaine_test)
print(position_sep)
print(longueur_chaine_sep)
print(position_sep+longueur_chaine_sep)
print(sub_avant_sep)   


function removeLastChar (string) -- fonction dernier charachter
  return string:sub(1, -2)
end

local ok = removeLastChar(sub_avant_sep) --remove dernier character
     
      print (ok)
      

local final = ok:gsub('"','')    -- on del les ""
      
      print (final)
      
      fibaro:setGlobal("SonOff", final) -- on stock dans Global Variable

                 end
    
  })

      setTimeout(Run,delay*1000)
  end

     if Source["type"] == "autostart" or  Source ["type"] == "other" then
  Run()
  end

Merci pour tes lumieres. ;)

 

Modifié par yoim
Posté(e)

Bonjour. J'ai rien allumé soit ce coup là :-)

Heu si tu fais ca, ca doit pas etre un json :-) sauf si je dis une betise :-) ca doit plutot etre en mode string

Envoyé de mon BND-L21 en utilisant Tapatalk

Posté(e)

Je te suggère d'essayer le code suivant :

--[[
%% autostart
--]]

local Source = fibaro:getSourceTrigger()

function Run()
	local delay = 60 --en secondes

	local url = 'http://192.168.42.4:9595/cm?cmnd=Power'

	fibaro:debug("oki")
	fibaro:debug("Prog Launch")
  
	http = net.HTTPClient()
	http:request(url, {options = { method = 'GET' },
				 success = function(p)
								fibaro:debug(p.status)
								jsonTable = json.decode(p.data)
								fibaro:debug('jsonTable.POWER=' .. jsonTable.POWER)
								fibaro:setGlobal("SonOff", jsonTable.POWER) -- on stocke dans Global Variable
							end,
				 error = function(err)
							fibaro:debug('http:request call error, error =' .. err);
						 end
						 
			})
	setTimeout(Run, delay*1000)
end

if Source["type"] == "autostart" or  Source ["type"] == "other" then
	Run()
end

 

  • Thanks 1
Posté(e)

En effet @Barelle ca fonctionne impec et c'est 10x plus simple.

 

Mon erreur etait là :

 

jsonString = json.encode(p.data)
jsonTable = json.decode(jsonString)

J'ai encode p.data alors qu'il fallait le decode :p

 

Merci beaucoup ;) C'est bien du Json :D

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