ROBBEJP Posté(e) le 12 juin 2021 Auteur Signaler Posté(e) le 12 juin 2021 Merci pour vos réponses. Pour m'aider à comprendre la philosophie des QuickAPP, tu pourrais me "convertir" le code de ma scène en une QuickAPP. Comme je l'avais dis a JJacques que je remercie une nouvelle fois pour son aide, je m'inspire d'exemple et pars de là pour avancer. Meric pour ton aide @Lazer Le code (démarrage auto of course) : function mainLoop() local ConsoForage1 = fibaro.getValue(21, "power") if tonumber(ConsoForage1) >= 20 and tonumber(ConsoForage1) <= 50 then fibaro.setTimeout(1000, function() local ConsoForage2 = fibaro.getValue(21, "power") if tonumber(ConsoForage2) >= 20 and tonumber(ConsoForage2) <= 50 then fibaro.call(21, "turnOff") fibaro.setTimeout(5000, function() fibaro.call(21, "turnOn") fibaro.setTimeout(1000, mainLoop) end) else fibaro.setTimeout(1000, mainLoop) end end) else fibaro.setTimeout(1000, mainLoop) end end mainLoop() 1
Lazer Posté(e) le 12 juin 2021 Signaler Posté(e) le 12 juin 2021 Désolé, pas le temps d'écrire le code LUA des autres... Je passe déjà beaucoup de temps à aider, et à écrire mes propres QA que je partage. Il y a déjà de nombreux QuickApp sur le forum, tu trouveras facilement des exemples pour t'inspirer. Et n'oublie pas que lors de la création d'un nouveau QA, tu as déjà un squelette proposé par Fibaro. Et bien sûr la doc officielle, même si elle n'est pas du tout didactique : https://manuals.fibaro.com/home-center-3-quick-apps/
ROBBEJP Posté(e) le 12 juin 2021 Auteur Signaler Posté(e) le 12 juin 2021 Pas de soucis je comprend. Je vais creuser la doc en croisant avec celle du forum
ROBBEJP Posté(e) le 20 juin 2021 Auteur Signaler Posté(e) le 20 juin 2021 (modifié) Hello ça y est, j'ai tout remplacé par des QA .. en cherchant bien, on fini par s'en sortir ! J'aurais juste une petite question: Dans cet exemple très basic, je cherche à ce que mon "button1" inhibe ce qui pourrait être en cours via les autres appels des autres fonctions (exemple, si la fonction du button4 est encore en cours, je souhaite qu'elle s'arrête). Une sorte de Killscene en quelques sorte mais au sein de la meme scene... Comment on pourrait faire ça ? -- Bouton button4 function QuickApp:vingtmin() fibaro.call(28, "turnOn") fibaro.setTimeout(1200000, function() fibaro.call(28, 'turnOff') end) end -- Bouton button1 function QuickApp:stop() fibaro.call(28, "turnOff") end function QuickApp:onInit() -- self:debug("onInit") end Modifié le 20 juin 2021 par ROBBEJP
Lazer Posté(e) le 20 juin 2021 Signaler Posté(e) le 20 juin 2021 Dans ton bouton stop, tu définie une variable interne au QA, par exemple : self.codearret = true Et dans ta boucle infinie, tu testes sa valeur pour savoir si tu dois exécuter le code ou non : if not self.codearret then -- faire des choses end Attention, ça n'arrêtera pas le code en cours d'exécution dans le bouton4. Mais ça empêchera qu'il exécute une nouvelle action lors du prochain clic sur le bouton
ROBBEJP Posté(e) le 20 juin 2021 Auteur Signaler Posté(e) le 20 juin 2021 Merci Lazer pour ta réponse. Par contre, il me faudrait arreter le code en cours du bouton4. Tu crois que ce serait possible ?
Lazer Posté(e) le 20 juin 2021 Signaler Posté(e) le 20 juin 2021 Non Mais tu appliques le même principe, puisque je vois que tu fais un settimeout, donc tu dois retester la valeur de ta variable au sein même de la fonction apellée par settimeout, et tu auras le résultat voulu.
ROBBEJP Posté(e) le 21 juin 2021 Auteur Signaler Posté(e) le 21 juin 2021 (modifié) Merci @Lazer, Je n'y avait tout simplement pas pensé. Je viens de faire les modif de mes boutons et les essai sont concluant. Est-il possible, par contre, de "killer" une instance d'une autre QA ? Par exemple, depuis ma QA "TOTO" je souhaite arrêter et "rebooter" la QA "TATA" ? Je suppose que même punition sur ta précédente réponse mais avec une variable global plutôt ... mais je demande quand même Merci en tous cas pour ton aide précieuse ! Bye. Modifié le 21 juin 2021 par ROBBEJP
Lazer Posté(e) le 21 juin 2021 Signaler Posté(e) le 21 juin 2021 Non tu ne peux pas agir sur un autre process (chaque QA s’exécute dans un process différent au niveau du système d'exploitation Linux) Tout ce que tu peux faire, c'est faire communiquer 2 QA par le biais du mécanisme mis en place par Fibaro (appel de fonction avec fibaro.call()), ou bien en partageant du contenu dans une variable globale. Cette dernière solution est proscrire autant que possible, car cela va réaliser des écritures inutiles dans la DB (impact sur les performances et l'usure de la mémoire Flash), et demander un "polling" régulier de la part du QA cible... pas du tout optimal. Le mieux reste d'appeler une fonction de ton autre QA, qui elle-même réalisera exactement ce que tu fais avec ton bouton actuel, à savoir définir une variable locale qui désactivera l'exécution du QA 1
ROBBEJP Posté(e) le 22 juin 2021 Auteur Signaler Posté(e) le 22 juin 2021 Question pouvant paraitre ultra simple mais je la pose quand même Je possède un module FGS213. Je souhaite agir depuis une QA uniquement lors de l'activation du module via l'interrupteur connecté au S1. Est-ce possible de récupérer ça depuis la QA afin que je puisse effectuer une action dédié par l'activation par ce biais et uniquement pas ce biais ?
Lazer Posté(e) le 22 juin 2021 Signaler Posté(e) le 22 juin 2021 Oui avec l'API refreshStates, mais pas simple : La façon de faire standard de Fibaro, c'est d'utiliser un trigger dans une scène. Mais quand tu veux faire ça dans un QuickApp, soit tu utilises une scène qui appelle le QA (un peu lourd à maintenir, à cause de la dépendance entre les ID), ou bien avec la technique que j'ai donnée au dessus.
ROBBEJP Posté(e) le 22 juin 2021 Auteur Signaler Posté(e) le 22 juin 2021 je viens de finir de lire ton POST, excellent travail. Par contre, une fois la QA (et donc la boucle qui tourne pour catcher les évènements), je fais comment pour récupérer l'info dans ma QA finale ? Tu n'aurais pas un exemple de code a me donner plizzze ?
Lazer Posté(e) le 22 juin 2021 Signaler Posté(e) le 22 juin 2021 Justement, tu as un exemple de code utilisable dans le topic en question. Il faut juste ajouter ton propre traitement dans la boucle là où j'ai laissé des commentaires. Sinon, en QA déjà existant sur le forum, il y a GEA, mais pas vraiment le meilleur exemple, tellement le code est complexe.
ROBBEJP Posté(e) le 22 juin 2021 Auteur Signaler Posté(e) le 22 juin 2021 lol, zut, j'avais pas fait gaffe Donc bai ... yapluka Merci encore @Lazer local id = event.data and event.data.id --if id == 123 then --self:debug("Event :", json.encode(event)) --end end
ROBBEJP Posté(e) le 22 juin 2021 Auteur Signaler Posté(e) le 22 juin 2021 Yes, ça marche nickel !! Question: Pourquoi avoir fait en sorte de devoir lancer la boucle manuellement via le bouton ? (je cherche juste à comprendre s'il y a une subtilité qui m'échappe) J'envisage de faire l'appel automatique de la boucle par cette ligne de commande (en cas que la HC3 reboot). Cela, à ton sens, devrait-il poser pb ? fibaro.setTimeout(0, function() self:buttonLoop() end)
Lazer Posté(e) le 22 juin 2021 Signaler Posté(e) le 22 juin 2021 C'était au cas où la boucle pose problème, et fasse planter la box, car j'étais en phase de test et j'en ai lancé plusieurs dans différents QA simultanément, pour tester la montée en charge. Si la boucle avait été en démarrage automatique dans le QA et fasse rebooter la box en boucle, je n'aurais jamais pu m'en sortir (expérience vécue lors d'un autre test...) Mais maintenant qu'on sait que ça fonctionne, tu peux utiliser ta boucle normalement dans ton QA, avec un lancement automatique. Ton setTimeout me semble OK
Messages recommandés