Krikroff Posté(e) le 5 avril 2020 Signaler Posté(e) le 5 avril 2020 Je vous propose le script suivant qui émule la méthode "fibaro.call" moyennent quelques ajustements: Version 1.0.0 La prise en charge de callbacks (success, error) Le support du retard d'action (actuellement proposée par l' API mais non visible depuis la méthode intégrée call) Code lisible: -- Name: callAction -- Description: Trigger an action of the specified device -- Arg1: id [number] Device id -- Arg2: actionName [string] Action name -- Arg3: params [array] { delay [number], args [array] (option), success [function] (option), error [function] (option) } -- Return: nothing function callAction(id, actionName, params) local url = "http://127.0.0.1:11111/api/devices/" .. id .. "/action/" .. actionName local headers = { ["content-type"] = "application/json;charset=UTF-8", ["X-Fibaro-Version"] = "2", ["Cache-Control"] = "no-cache, no-store" } params = params or {delay=0, args={}} local args = params.args if (#args==0) then args = {{}} end assert(tonumber(params.delay), "callAction(id, actionName, delay, ...), delay argument must be an integer") local delay = tonumber(params.delay or 0) if (delay < 0) then delay = 0 end local arguments = { args = args, delay = delay } local http = net.HTTPClient({ timeout = 20000 }) http:request(url, { options = { headers = headers, method = "POST", data = json.encode(arguments) }, success = function(status) if (params.success ~= nil and type(params.success) == "function") then params.success(status.status, status.data) end end, error = function(error) if (params.error ~= nil and type(params.error) == "function") then params.error(error) end end }) end Version minifiée: Taux de compression du code: 48.53% function callAction(a,b,c)local d="http://127.0.0.1:11111/api/devices/"..a.."/action/"..b;local e={["content-type"]="application/json;charset=UTF-8",["X-Fibaro-Version"]="2",["Cache-Control"]="no-cache, no-store"}c=c or{delay=0,args={}}local f=c.args;if#f==0 then f={{}}end;assert(tonumber(c.delay),"callAction(id, actionName, delay, ...), delay argument must be an integer")local g=tonumber(c.delay or 0)if g<0 then g=0 end;local h={args=f,delay=g}local i=net.HTTPClient({timeout=20000})i:request(d,{options={headers=e,method="POST",data=json.encode(h)},success=function(j)if c.success~=nil and type(c.success)=="function"then c.success(j.status,j.data)end end,error=function(k)if c.error~=nil and type(c.error)=="function"then c.error(k)end end})end Un exemple d'utilisation pour illustrer: local params = { delay = 0, args = {"arg1", "arg2"}, success = function(status, data) print("success") print(status) end, error = function(error) print("error") end } -- Arg1: id [number] Device id -- Arg2: actionName [string] Action name -- Arg3: params [array] { delay [number], args [array] (option), success [function] (option), error [function] (option) } callAction(946, "turnOff", params) A venir dans une prochaine version: Sécurisation de l’exécution (via pcall) Une action poussée sur plusieurs périphériques Plusieurs actions poussées sur un périphérique Amusez-vous bien 3
BenjyNet Posté(e) le 5 avril 2020 Signaler Posté(e) le 5 avril 2020 Putain c'est nickel tes présentations de code comme ça @Krikroff ! Ça donne envie d'acheter, tu fais iech 1
Krikroff Posté(e) le 5 avril 2020 Auteur Signaler Posté(e) le 5 avril 2020 Je prends mon mal en patience ! Te fais pas iech @BenjyNet de toute manière elle n'est pas en stock 1
jjacques68 Posté(e) le 5 avril 2020 Signaler Posté(e) le 5 avril 2020 ooooh mais c’est du tout très bien ça... vais m’en inspirer... merci ! 1
Messages recommandés