Aller au contenu
ROBBEJP

std:exception: 'Timeout'

Recommended Posts

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(1000function()
            local ConsoForage2 = fibaro.getValue(21"power")
            if tonumber(ConsoForage2) >= 20 and tonumber(ConsoForage2) <= 50 then 
            
                fibaro.call(21"turnOff")
                fibaro.setTimeout(5000function() 
                    fibaro.call(21"turnOn"
                    fibaro.setTimeout(1000, mainLoop)
                end)
                
            else
                fibaro.setTimeout(1000, mainLoop)
            end            
        end)
    else
        fibaro.setTimeout(1000, mainLoop)
    end
end
 
mainLoop()
  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

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/

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Pas de soucis :) je comprend.

 

Je vais creuser la doc en croisant avec celle du forum ;)

 

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

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(1200000function()
fibaro.call(28'turnOff')
end)
end
 
-- Bouton button1
function QuickApp:stop()
fibaro.call(28"turnOff")
end
 
function QuickApp:onInit()
 --   self:debug("onInit")
end
Modifié par ROBBEJP

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci Lazer pour ta réponse.

 

Par contre, il me faudrait arreter le code en cours du bouton4.

 

Tu crois que ce serait possible ?

 

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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é par ROBBEJP

Partager ce message


Lien à poster
Partager sur d’autres sites

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

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

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 ?

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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 :13: ? 

 

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

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(0function() self:buttonLoop() end)
 
 

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

×