Aller au contenu

Fonction globale/centrale sous HC3


Messages recommandés

Posté(e)

Bonjour à toutes et tous,

 

Me voilà de retour après quelques mois d'absences ;)

 

J'ai cherché à créer sous la HC3 une fonction "centrale/globale" qui retourne une valeur afin de l'utiliser dans des scénarios LUA ou QuickApps, mais impossible de trouver.

 

Savez-vous si cela est réalisable ? Je ne souhaite pas dupliquer les codes/fonctions que j'utilise dans plusieurs LUA (et pour la maintenir à jour c'est également plus simple).

Faut-il la déclarer dans une quickapp ?

Faut-il charger un fichier au démarrage de la box ? (include /source...)

 

Merci beaucoup pour votre aide,

Cordialement,

Candy

 

 

Posté(e)

Ce n'est pas possible.

Tu peux contourner le problème avec les fichiers dans les QA, il y a un tuto quelque par sur le forum pour automatiser la mise à jour des fichiers, et donc "pousser" automatiquement une nouvelle version de ta fonction dans tous les QA qui l'exploite.

 

Perso je reste traditionnel, mes fonctions utiles sont regroupées dans une librairie "tools" que je recopie dans un fichier de chaque QA qui l'exploite, mais manuellement.

Posté(e)

idée (peut-être débile)

 

Et si on créait un QA nommé "Tools", qui contient toutes les fonctions susceptibles d'être réutilisées ?

Que dans le QA où on en a besoin, on appelle la fonction

hub.call(id du QA "Tools", "méthode/fonction", Paramètre1, Paramètre2, ...)

 

Posté(e) (modifié)

This kind of works - it's not super efficient but for functions used once in a while it's ok.

 

The library, ex QA with id 1061

function foo(a,b) return a+b end
function bar(a,b) return a*b end

--------------------------------------------------
function QuickApp:RPC_CALL(path2,var2,n2,fun,args,qaf)
   local res
   if qaf then res = {n2,pcall(self[fun],self,table.unpack(args))}
   else res = {n2,pcall(_G[fun],table.unpack(args))} end
   api.put(path2,{name=var2, value=res}) 
end
function print() end

Then the client QA

do -- could be hidden in a separate QA file
    local var,cid,n = "RPC"..plugin.mainDeviceId,plugin.mainDeviceId,0
    local vinit,path = { name=var, value=""},"/plugins/"..cid.."/variables/"..var
    api.post("/plugins/"..cid.."/variables",{ name=var, value=""}) -- create var if not exist
    function fibaro._rpc(id,fun,args,timeout,qaf)
      n = n + 1
      api.put(path,vinit)
      fibaro.call(id,"RPC_CALL",path,var,n,fun,args,qaf)
      timeout = os.time()+(timeout or 3)
      while os.time() < timeout do
        local r,_ = api.get(path)
        if r and r.value~="" then
          r = r.value 
          if r[1] == n then
            if not r[2] then error(r[3],3) else return select(3,table.unpack(r)) end
          end
        end 
      end
      error(string.format("RPC timeout %s:%d",fun,id),3)
    end
    function fibaro.rpc(id,name,timeout) return function(...) return fibaro._rpc(id,name,{...},timeout) end end
end

local foo = fibaro.rpc(1061,'foo') -- create function for remote function in QA 1061 with name foo
local bar = fibaro.rpc(1061,'bar') -- create function for remote function in QA 1061 with name bar
                               
function QuickApp:onInit() 
    self:debug("onInit")
    print(foo(2,4)) 
    print(bar(2,4)) 
end

100 calls to foo(10,29) takes ~3s, so around 0.03s per call...

Modifié par jang
  • Like 1
×
×
  • Créer...