yoim Posté(e) le 9 janvier 2018 Signaler Posté(e) le 9 janvier 2018 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 })
Lazer Posté(e) le 9 janvier 2018 Signaler Posté(e) le 9 janvier 2018 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 2
yoim Posté(e) le 9 janvier 2018 Auteur Signaler Posté(e) le 9 janvier 2018 C'est bon ca fonctionne, merci beaucoup pour ce partage
Messages recommandés