candysa Posté(e) le 15 novembre 2022 Signaler Posté(e) le 15 novembre 2022 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
Lazer Posté(e) le 15 novembre 2022 Signaler Posté(e) le 15 novembre 2022 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.
jojo Posté(e) le 19 novembre 2022 Signaler Posté(e) le 19 novembre 2022 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, ...)
jang Posté(e) le 20 novembre 2022 Signaler Posté(e) le 20 novembre 2022 (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é le 20 novembre 2022 par jang 1
Messages recommandés