Aller au contenu

Besoin d'aide sur algorithme


Messages recommandés

Posté(e) (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é par jjacques68
Posté(e)

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.

Posté(e)

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 :) !

Posté(e)

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

Posté(e)

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

 

Posté(e)

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 :) 

Posté(e)

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... :( 

Posté(e) (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é par jjacques68
Posté(e)

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 ;-)

  • Upvote 1
Posté(e)

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

Posté(e)

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...

Posté(e) (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 :angry:

 

question bête, ma deuxième scène pourrait être intégré dans le MainLoop du VD (sans le setTimeout bien sûr) ?

 

 

 

 

 

Modifié par jjacques68
Posté(e) (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é par jjacques68
Posté(e)

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 :

  1. 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
  2. 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 ?

Posté(e)

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 :) 

Posté(e)

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.

 

Posté(e)

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 loops

Envoyé de mon Nexus 5 en utilisant Tapatalk

Posté(e)

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 ;-)

Posté(e)

:) 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...

Posté(e)

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

×
×
  • Créer...