Aller au contenu

Scene / Traitement Json


Messages recommandés

Posté(e)

Je veux tout simplement recuperer une valeur dans un decode json en Lua.

 

C'est possible de recuperer une valeur en Lua / Json comme ceci :

 

fibaro:debug(jsonTable.zip)

 

Pour recuperer tout simplement le zip de mon json ? Ma valeur récupoéré est toujour nill.

 

Merci pour votre aide.

 

local url = 'http://ip-api.com/json',80
   fibaro:debug("oki")
  
http = net.HTTPClient()
http:request(url, {
                 options = { method = 'GET' },   				

  			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.zip == tonumber("75000")
then
  fibaro:debug('CP value successfully decoded')
end
      
                 end,
                 error = function(err)
                            fibaro:debug(err)
                 end
  
  })

 

Posté(e)

Voici ma scène complète qui surveille le changement d'IP à l'aide du JSON fourni par ce site :

Tu pourras facilement extraire l'info qu'il te faut (le champ "jsonTable.zip")

 

--[[
%% autostart
%% properties
%% globals
--]]
--------------------------------------------------
-- Scene   : Check Public IP Address
-- Author  : Lazer
-- Version : 1.0
-- Date    : June 2017
--------------------------------------------------

-- User variables
local URL = "http://ip-api.com/json"
local intervalle = 60
local userID = {0}              -- Email
local smartphoneID = {0}        -- Push
local sms = {
	["VD_ID"]     = 0,            -- Virtual Device ID
	["VD_Button"] = "1",          -- Virtual Device Button
	["VG_Name"]   = "SMS"         -- Global Variable Name
}
local debug = false

-- System variables
local IP = nil


--
-- Message function
--
function Message(color, message)
	if color and color ~= "" then
		fibaro:debug('<span style="color:'..color..';">'..(message or '<nil>')..'</span>')
	else
		fibaro:debug(message or '<nil>')
	end
end


--
-- Notification function
--
function Notification(message, param)
	local message = message or "<vide>"
	Message("yellow", "Notification : "..message)
	if param then
		for _, notif in ipairs(param) do
			if debug then
				Message("grey", notif)
			end
			-- Envoi Push
			if notif == "push" and smartphoneID then
				for _, id in ipairs(smartphoneID) do
					if debug then
						Message("grey", "Send Push smartphone ID : "..id)
					end
					fibaro:call(id, "sendPush", message)
				end
			-- Envoi Email
			elseif notif == "email" and userID then
				for _, id in ipairs(userID) do
					if debug then
						Message("grey", "Send Email user ID : "..id)
					end
					fibaro:call(id, "sendEmail", "HC2 Public IP Check", message)
				end
			-- Envoi SMS
			elseif notif == "sms" and sms then
				if debug then
					Message("grey", "Send SMS : VD_ID="..(sms["VD_ID"] or 0).." VD_Button="..(sms["VD_Button"] or "0").." VG_Name="..(sms["VG_Name"] or ""))
				end
				fibaro:setGlobal(sms["VG_Name"], message)
				if sms["VD_ID"] and tonumber(sms["VD_ID"])>0 and sms["VD_Button"] and tonumber(sms["VD_Button"])>0 then
					fibaro:call(sms["VD_ID"], "pressButton", sms["VD_Button"])
				end
			end
		end
	else
		Message("orange", "Warning : no notification options given")
	end
end


--
-- Check function
--
function Check(interval)

	Message(nil, "Check")

	local httpClient = net.HTTPClient()
	if debug then
		Message("grey", URL)
	end
	-- Check IP
	httpClient:request(URL, {
		success = function(response)
			--if debug then
				--Message("gray", json.encode(response))
			--end
			if response.status == 200 then
				if response.data and response.data ~= "" and response.data:sub(1, 1) == "{" and response.data:sub(-1) == "}" then
					local jsonTable = json.decode(response.data)
					if jsonTable.status and jsonTable.status == "success" then
						if not IP then
							IP = jsonTable.query
							Message("blue", "IP Address : " .. (jsonTable.query or "???"))
							Message("blue", "ISP : " .. (jsonTable.isp or "???"))
						else
							if IP ~= jsonTable.query then
								local newIP = (jsonTable.query or "???")
								Message("orange", os.date('%d/%m/%Y') .. " : New IP : " .. newIP)
								Message("orange", "New ISP : " .. (jsonTable.isp or "???"))
								Notification("Old IP : " .. IP .. " - New IP : " .. newIP .. " - ISP : " .. (jsonTable.isp or "???"), {"push", "email", "sms"})
								IP = newIP
							elseif debug then
								Message("blue", "Same IP : " .. (jsonTable.query or "???"))
							end
						end
					else
						Message("red", "Error : status = " .. (jsonTable.status or "???") .. " - message = " .. (jsonTable.message or "???") .. " - query = " .. (jsonTable.query or "???"))
					end
				else
					Message("red", "Error : empty or invalid response data")
				end
			else
				Message("red", "Error : status=" .. tostring(response.status))
			end
		end,
		error = function(err)
			Message("red", 'httpClient:request() : Error : ' .. err)
		end,
		options = {
			method = 'GET',
			timeout = 10000
		}
	})

	-- Wait
	if interval and interval > 0 then
		setTimeout(function() Check(interval) end, interval*1000)
	end

end -- function


--
-- Main loop
--
local trigger = fibaro:getSourceTrigger()
if trigger["type"] == "autostart" then
	Message(nil, os.date('%d/%m/%Y').." : Scene instance autostart")
	-- Call Check function
	setTimeout(function() Check(intervalle) end, 0)
elseif trigger["type"] == "other" then
	Message(nil, os.date('%d/%m/%Y').." : Scene instance manual launch")
	-- Call Check function
	Check(nil)
else
	Message(nil, os.date('%d/%m/%Y').." : Unknown trigger : "..trigger["type"])
end

 

  • Like 2
×
×
  • Créer...