Aller au contenu

Messages recommandés

Posté(e)

Je vous propose le script suivant qui émule la méthode "fibaro.call" moyennent quelques ajustements:

 

Version 1.0.0

 

  1. La prise en charge de callbacks (success, error)
  2. 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 :)

 

  • Like 3
  • Krikroff a épinglé, à l’affiche, plus en évidence et à l’affiche ce sujet
Posté(e)

Je prends mon mal en patience ! Te fais pas iech @BenjyNet de toute manière elle n'est pas en stock :P

  • Haha 1
×
×
  • Créer...