jjacques68 Posté(e) le 19 juin 2017 Signaler Posté(e) le 19 juin 2017 (modifié) Bonjour à tous ! J'ai besoin d'un coup de pouce pour un algorithme. J'explique : J'ai une alarme complètement indépendante de la domotique qui me renvoie un signal sur une entrée d'un IPX. si IN = 0 alors alarme = activée TOTALE si IN = 1 alors alarme = désactivée si IN = clignote (fréquence moins d'une seconde) alors alarme = activée PARTIELLEMENT et c'est ce dernier cas qui me pose problème ! comment tester si IN clignote ? ACTUELLMENT j'ai fais : (ça marche mais y a des loupés, donc ça me plait pas) l'IPX me compte les puls sur cette entrée IN. à chaque changement d'état de l'entrée IN (montant et descendant), j'envoie vers un label d'un VD la valeur du compteur et l'état (0-1) de l'entrée IN. J'ai une scène qui se déclenche sur la modification de ce label. le problème est que j'ai du mettre un fibaro:countScenes() pour ne pas avoir plus d'une instance de scène, sinon ça déconne. et oui, la scène se déclenche au moins 2 fois par seconde et du coup j'ai des ratés quand je mets des VG à jour. normal car dans mon label du VD, il y a deux valeurs : le compteur et l'état de IN. Et le IN change 1 x /seconde, et entre 2 changements, le compteur change aussi... Alors je me dis pourquoi pas oublier le compteur et se contenter que de la valeur de l'entrée IN (0-1) !!! d'où ma question plus haut... Si vous avez des idées, faites vous plaisir ! merci d'avance ! Modifié le 19 juin 2017 par jjacques68
pepite Posté(e) le 19 juin 2017 Signaler Posté(e) le 19 juin 2017 Bonjour, Alors la, vu que ca clignoe heuuu.. ;-) Moi je ne vois pas, peut-etre les experts. Si tu te contentes de IN c'est comme si tu avais le retour de l'armement TOTAL Si tu veux absolument avoir un retour sur l'armement partiel, je contournerais : - j'ajouterais un capteur qui s'arme en partiel - je recupererais l'etat de ce dernier + celui du IN En clair, je tenterais de récuperer IN à 0 + "qqch" (VG, label, capteur..) qui me permettrait de savoir que suis en partiel. Je ne sais pas si c'est faisable, juste une idée de contournement ne sachant pas récuperer l'etat partiel.
jjacques68 Posté(e) le 19 juin 2017 Auteur Signaler Posté(e) le 19 juin 2017 c'est ce que je fais en quelque sorte avec le compteur d'impulsion de l'ipx, mais ça me plait pas. Et oui il me faut la remonté d'info de la marche partielle !
jojo Posté(e) le 19 juin 2017 Signaler Posté(e) le 19 juin 2017 je ferait une scène qui change la valeur d'une variable à chaque changement de IN. Et il y a moyen en LUA de voir quand la variable à changé pour la dernière fois. Maintenant, je ne sais pas s'il stocke également les sec. Regarde le code de @Steven qui informe quand une variable a été modifiée. Si la variable n'a pas changé depuis 5 sec, c'est que l'alarme partielle n'est pas activée
pepite Posté(e) le 19 juin 2017 Signaler Posté(e) le 19 juin 2017 oui bonne idée @jojo. tu modifies la Variable depuis l'IPX sur HC2 ou sur le buoton d'un VD et après : local dernieremodif = fibaro:getModificationTime(id, "proprietes") if (os.time() - dernieremodif) > X then print("Alarme partielle activee ou pas..") end
jjacques68 Posté(e) le 19 juin 2017 Auteur Signaler Posté(e) le 19 juin 2017 Mouais donc pas le choix, obligé de passé par une mesure de temps pour visualiser les changements...
pepite Posté(e) le 19 juin 2017 Signaler Posté(e) le 19 juin 2017 oui mais c'est plutot pas mal au niveau fiabilité nonn ? tu ne trouves pas ?
jjacques68 Posté(e) le 19 juin 2017 Auteur Signaler Posté(e) le 19 juin 2017 ben ça ressemble un peu avec ce que je faisais avec le compteur sur l'entrée... Maintenant fudrait que je test avec le coup du fibaro:getModificationTime j'essayerai et vous dirai
jjacques68 Posté(e) le 19 juin 2017 Auteur Signaler Posté(e) le 19 juin 2017 zut, marche pas : fibaro:getModificationTime(id, "proprietes") j'ai mis l'id du VD où y a le label modifié par l'ipx, et j'ai essayé avec "value", "properties", "ui.label.value", ... mais il me renvoie nul...
jjacques68 Posté(e) le 19 juin 2017 Auteur Signaler Posté(e) le 19 juin 2017 il me semble qu'on a pas de getModificationTime sur les VD...
jjacques68 Posté(e) le 19 juin 2017 Auteur Signaler Posté(e) le 19 juin 2017 et en passant par une variable non plus : local LastUpDate = fibaro:getGlobalModificationTime("IpxIn2") il me retourne toujours la même chose !!
jjacques68 Posté(e) le 19 juin 2017 Auteur Signaler Posté(e) le 19 juin 2017 (modifié) @jojo, @pepite, j'arrive à quelque chose avec votre aide, mais pas encore tiptop PS : Je me trompais avant avec les getModificationTime et getGlobalModificaionTime... désolé... Voici la première scène toute simple qui met à jour la VG sur le changement d'état de l'IPX : --[[ %% properties 329 ui.Alarme.value --]] --[[ Scène qui met à jour la VG "IpxIn2" (0 ou 1) trigger par le changement du label du VD (mis à jour par l'ipx) --]] --contrôle du nombre d'instances if fibaro:countScenes() > 2 then print(os.date("%d/%m/%Y").." - To many instance : "..fibaro:countScenes()) fibaro:abort() end local Trigger = fibaro:getSourceTrigger() if (Trigger.type == "property") then fibaro:setGlobal("IpxIn2",fibaro:get(329, "ui.Alarme.value")) --met à jour la VG end Voici la seconde scène qui boucle toute les 10 secondes pour voir les changements de la variable : --[[ %% autostart %% properties %% events %% globals --]] --[[ Scène qui analyse le changement de la variable --]] function CheckAlarme() local LastUpDate = fibaro:getGlobalModificationTime("IpxIn2") --si heure actuelle - heure de la denrière MAJ de la VG < 2 secondes if (os.time() - LastUpDate) < 2 then -- marche Partielle print("marche partielle") else --sinon c'est que c'est soit éteint, soit allumé --lecture de la variable donc de l'input 2 LabelValue = fibaro:getValue(329, "ui.Alarme.value") if tonumber(LabelValue) == 1 then -- si 1 alors c'est alarme = OFF print("OFF") else --sinon (=0) c'est alame = ON print("marche total") end end --rappel de la fonction setTimeout(CheckAlarme, 10*1000) end CheckAlarme() Mais !!! parce que y a un mais !!!! si l'ipx envoie une valeur dans le label du VD, 2 secondes avant que boucle du setTimeOut ne reprenne, ça m'indique marche partielle, alors que ce n'est pas forcément le cas !! donc c'est déjà mieux qu'avant, mais pas encore parfait !!!!! Modifié le 19 juin 2017 par jjacques68
pepite Posté(e) le 20 juin 2017 Signaler Posté(e) le 20 juin 2017 Bonjour, Je n'aurais pas fait comme ca. Je ferais : - depuis l'IPX : push direct sur changement d'etat de IN pour aller cliquer sur le bouton d'un VD : --> qui met à jour la variable globale IPXin2 --> qui teste la derniere date de modif --> selon le test, une belle icone : Alarme partielle, activée ou arretee J'ai l'impression que ce serait plus simple que de passer par 2 scenes dont une qui boucle toutes les 10 secs, donc eventuellement perte d'info. La ce sera sur chaque changement d'etat, en terme de ressource je trouve cela mieux non ? Je pense que c'est faisable et plus optimisé. A tester evidemment ;-) 1
jojo Posté(e) le 20 juin 2017 Signaler Posté(e) le 20 juin 2017 oui et il faut également tester que la modification qui vient d'êre faite reste valable un certain temps, avant de définir le statut définitif de l'alarme
jjacques68 Posté(e) le 20 juin 2017 Auteur Signaler Posté(e) le 20 juin 2017 justement, pour tester dans le temps, il me faut une scène supplémentaire ! la deuxième que j'ai faite avec la boucle ! Je peux pas tester sans condition de temps, j'avais essayé. ça marche pour le ON, le OFF, et pour le partielle (clignotement) MAIS quand le partielle s'arrête, le in de l'ipx ne bouge plus et donc plus de test ! d'où le bouclage... Maintenant avec l'histoire du bouton du VD, oui je pense pouvoir économiser une scène (la première)... Vais tester ça ce soir...
jjacques68 Posté(e) le 20 juin 2017 Auteur Signaler Posté(e) le 20 juin 2017 (modifié) Bon je viens de me séparer de ma première scène (qui mettait à jour la VG). Donc maintenant suis passé par le VD auquel j'ai ajouté 2 boutons (Up et Down). Up = activé par IPX sur front montant = mise jour de la VG à 1 Down = activé par IPX sur front descendant = mise à jour de la VG à 0 (opération très simple, et une scène en moins. ) @pepite je ne peux pas dans les boutons du VD intégrer la notion de dernière date de modif ! car par exemple : quand l'alarme et en partielle, les boutons sont activé alternativement -> ça ok. Mais quand elle s'arrête, les boutons ne sont donc plus actionnés et donc le test de la dernière modif s'arrête aussi ! et du coup elle garde le statut "partielle" ! Quand il n'y a plus d'alternance, il faudrait vérifier l'état de la VG ! Et je n'ai plus de test ! d'où cette notion de durée de validité dans le temps de @jojo j'ai n'ai rien changé dans le deuxième scène à part que je ne lit plus la valeur de l'ipx dans le label du VD, mais dans la VG. ça simplifie car j'ai une scène en moins, mais y a toujours cette histoire de Il y a 18 heures, jjacques68 a dit : si l'ipx envoie une valeur, 2 secondes avant que la boucle du setTimeOut ne reprenne, ça m'indique marche partielle, alors que ce n'est pas forcément le cas !! je suis sûr qu'il y a moyen de faire mieux, mais je bloque c'est terrible !! ça aurait été top de tout faire dans le VD... je réfléchis toujours question bête, ma deuxième scène pourrait être intégré dans le MainLoop du VD (sans le setTimeout bien sûr) ? Modifié le 20 juin 2017 par jjacques68
jjacques68 Posté(e) le 20 juin 2017 Auteur Signaler Posté(e) le 20 juin 2017 (modifié) alors oui ça marche la deuxième scène dans le mainLoop du VD... sans le setTimeout, et pas de sleep... je laisse le mainloop faire sont boulo. Mais niveau ressource est ce que c'est ok ? Mais toujours même constatation, y a des ratés... lors du changement d'état... EDIT : oula y a beaucoup de loupés, obligé de clamer le mainLoop avec un sleep de 5 secondes... j'aime pas ça... Modifié le 20 juin 2017 par jjacques68
jojo Posté(e) le 20 juin 2017 Signaler Posté(e) le 20 juin 2017 je parle maintenant en théorie, car je n'ai plus de HC2. Est-ce que c'est une bêtise que je raconte, si je dis que juste avec le VD c'est ok ? Il faut 2 variables : la première en 0 ou 1 en fonction de ce que l'IPX te retourne => ok pour les boutons up et down du VD un seconde avec le statu définitif de l'alarme : TOTAL / PARTIEL / DEACTIVEE et tu utilises le main loop QUI TOURNE TOUTES LES 3 SECONDES pour tester la durée que ta première VG est à 0 ou 1. Si moins de 6 secondes (à voir / tester) tu mets la seconde VG à PARTIEL, si non, tu la mets à TOTAL ou DEACTIVEE en fonction de la valeur 1 ou 0 de la première ? Y a-t-il une erreur dans mon raisonnement, ou est-ce trop simple ?
jjacques68 Posté(e) le 20 juin 2017 Auteur Signaler Posté(e) le 20 juin 2017 Ok pour ton raisonnement pour la 2ème variable, c'est le cas. voici le code du mainLoop : local LastUpDate = fibaro:getGlobalModificationTime("IpxIn2") --si heure actuelle - heure de la denrière MAJ de la VG < 2 secondes if (os.time() - LastUpDate) < 2 then -- marche Partielle fibaro:debug("marche partielle") fibaro:setGlobal("AlarmeOnOff", 2) else --sinon c'est que c'est soit éteint, soit allumé Value = fibaro:getValue("IpxIn2") if tonumber(Value) == 1 then -- si 1 alors c'est alarme = OFF fibaro:debug("OFF") fibaro:setGlobal("AlarmeOnOff", 0) else --sinon (=0) c'est alame = ON fibaro:debug("marche total") fibaro:setGlobal("AlarmeOnOff", 1) end end fibaro:sleep(10*1000) Le sleep est obligatoire sinon c'est la panique. bon on ça ressemble ce que tu dis
jjacques68 Posté(e) le 22 juin 2017 Auteur Signaler Posté(e) le 22 juin 2017 Bon alors le coup du MainLoop, c'est pas top beaucoup trop de plantage. L'input de l'ipx change en effet au moins 2 fois par seconde, et donc avec la vitesse de rafraichissement du mainLoop (2-3 secondes) ça panique. Même avec le sleep que j'avais monté à 10 secondes. Donc je suis revenu à la scène pour analyser le statut e la VG. pour résumer : 1 VD avec 2 boutons pour changer l'état de la VG IpxIn 1 Scène avec une boucle qui toute les 10 secondes teste l'heure de la dernière modif de cette VG.
jojo Posté(e) le 22 juin 2017 Signaler Posté(e) le 22 juin 2017 Ok, mais je ne comprends pas la différence. Car ton ipx appuye toujours 2 fois par seconde sur le bouton du vd ? Mais c'est vrai que l'on avait beaucoup entendu parlé de problème de stabilité des main loopsEnvoyé de mon Nexus 5 en utilisant Tapatalk
pepite Posté(e) le 22 juin 2017 Signaler Posté(e) le 22 juin 2017 Je ne saisis pas bien non plus pourquoi il y a autant de rate, c'est dommage cette histoire de clignotement quand même. Je ne vois aps comment contourner mieux que ce que tu fais déjà ou mieux que ce qu'on a proposé avec @jojo. Je n'arrive pas a trouver...ca m'enerve ;-)
jjacques68 Posté(e) le 22 juin 2017 Auteur Signaler Posté(e) le 22 juin 2017 c'est clair, le principe est tout bête, mais je vois pas comment faire mieux non plus. et oui ça énerve. en tout cas aujourd'hui je n'ai,pas eu de soucis...
ADN182 Posté(e) le 26 juin 2017 Signaler Posté(e) le 26 juin 2017 Hello, le clignote se fait tout le temps lorsque tu est en mode partiel, jusqu'à tant que tu change de mode ? Envoyé de mon Nexus 5X en utilisant Tapatalk
Messages recommandés