Aller au contenu

Scène Pour Allumage Et Extinction De Lumière Avec Courbes


sebcbien

Messages recommandés

Bonjour,

 

Comme certains le savent, pour une question de WAF et de confort, je n'aime pas couper la lumière de manière brusque.

Il arrive parfois que l'on soit immobile et qu'on se retrouve dans le noir, particulièrement dans les WC ;-)

 

Bref, comme le savent bien @pepite @jojo @steven et autres, j'avais résolu ce problème avec GEA, après 5 minutes, si pas de mouvement, les lumière se dimmaient à  50% puis si toujours pas de mouvement pendant 3 minutes -> off

 

Il y a quelques inconvénients à  cette méthode: il faut ppas mal de lignes, tout ça pour deux niveaux...

    -- si PeriodeSunSet ou PeriodeSunRise, allumer lampe automatiquement si moins de 64%
  GEA.add({id2["SAM_MVT"],{"Value-", id2["SALLE_A_MANGER"],94}, estNotHouse_Manuel}, -1, "",{PeriodeSunSetSAM,PeriodeSunRiseSAM,{"Value", id2["SALLE_A_MANGER"], 95}})
	-- Hors Periodes sunset & sunrise, allumage manuel
	-- Si déjà  Allumé, Re-Allumage à  65% dès que détection mouvement sauf si module déjà  a + de 64% (économie zwave)
  GEA.add({id2["SAM_MVT"],{"Value+", id2["SALLE_A_MANGER"], 1},{"Value-", id2["SALLE_A_MANGER"],94}}, -1, "",{{"Value", id2["SALLE_A_MANGER"], 95}})
    -- Après 10min on dimme la lampe à  34% si pas de mouvement 
local malampesam = GEA.add({"Value+", id2["SALLE_A_MANGER"],59}, 10*60, "",{{"Value", id2["SALLE_A_MANGER"], 24},{"Repeat"}})
	-- Après 3 min on met la lampe à  65% (prète pour prochain allumage) puis on éteint, uniquement si la lampe est entre 1 et 35 
local malampesamdim = GEA.add({{"Value-", id2["SALLE_A_MANGER"],25},{"Value+", id2["SALLE_A_MANGER"], 1}}, 3*60,"",{{"Value", id2["SALLE_A_MANGER"], 95},{"Function", function() fibaro:sleep(300) end},{"turnOff"}},{"Repeat"})
    -- Relance des tâches en cas de détection si la lampe est allumée (économise GEA)
  GEA.add({id2["SAM_MVT"],{"Value+", id2["SALLE_A_MANGER"], 1}}, -1, "", {{"RestartTask", malampesam},{"RestartTask", malampesamdim}})	

J'aimerais externaliser cette gestion à  une scène qui pourrais gérer toutes les lampes de la maison sur le principe du simulateur d'aube de @Krikroff

 

http://www.domotique-fibaro.fr/index.php/topic/99-simulateur-daube-param%C3%A9trable/

 

Avantages: plus que deux lignes dans gea

--si détection de mouvement et lampe non éteinte (<98) alors demander allumage à  99% avec courbe OUTEXPO en 15 secondes)
GEA.add({id2["SAM_MVT"],{"Value-", id2["SALLE_A_MANGER"],98}, estNotHouse_Manuel}, -1, "",{PeriodeSunSetSAM,PeriodeSunRiseSAM,{"Global", "LAMPE_SAM", "15,OUTEXPO,99"}})
-- si lampe allumée plus de 5 minutes (a 99%) alors demander son extinction en 120 secondes via la courbe INEXPO
GEA.add({id2["SAM_MVT"],{"Value", id2["SALLE_A_MANGER"],99}, estNotHouse_Manuel},5*60, "",{PeriodeSunSetSAM,PeriodeSunRiseSAM,{"Global", "LAMPE_SAM", "120,INEXPO,0"}})
-- si un mouvement intervient alors que la lampe est en extinction, la ligne 1 s'active et ramène la lampe à  99%

propre non ?

 

ce principe peut s'appliquer facilement à  toutes lampes de la maison.

 

Avec la ligne Alarm de GEA, on pourra déclencher un réveil lumineux en douceur.

allumage de la lampe des parents, en 15 minutes avec la courbe INQUAD et un target de 80%

ce serait un bon ajout à  mon réveil famille: http://www.domotique-fibaro.fr/index.php/topic/4014-r%C3%A9veil-douceur-aurore-artificielle-sp%C3%A9cial-parents/#entry58667

-- allumage de la lampe des parents, en 15 minutes avec la courbe INQUAD et un target de 80%  
GEA.add({{"Alarm", id2["REVEIL_AURORE_PARENTS"]}, est_House_Sleeping}, 0, "", {{"Global", "LAMPE_CH_PARENTS", "15*60,OUTEXPO,80"}})

Voilà  le but.

 

La ou je sens que je vais caler est une partie du script.

 

En effet, L'exemple ci-dessus fonctionnerais avec une VG et une scène par lampe

 

Et j'aimerais pouvoir gérer toutes les lampes de la maison avec une seule scène et une seule variable globale... plus facile pour partager le script par la suite...

 

Voici un arbre logique, je suis capable de l'écrire sans problème mais j'aurais besoin de quelqu'un qui pourrait m'aider à  écrire la partie passage des paramètres via la VG

post-826-0-64649700-1439841025_thumb.jpg

l'idée serait une VG globale structurée comme ceci:

{(LAMPE_CH_PARENTS, Durée, courbe,target),(LAMPE_CUISINE, Durée, courbe,target),(LAMPE_WC, Durée, courbe,target), ....}

a encoder en json peut être ?

 

ça c'est un problème.

 

L'autre est de gérer les scènes "concurentes"

 

j'magine qu'il faudrait écrire un "demon" qui se couperais quand il n'y a aucune demande, mais dès qu'il y en a une, à  ce moment il devra être capable de gérer toutes les demandes de toutes les lampes en un seul script...

 

Faisable ? des idées, suggestions, bouts de code ?

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

@Sebcbien,

Je ne pourrai pas beaucoup t'aider sur le coup, je n'ai aucun dimer chez moi.

 

Mais on peut sans problème stocker une info structurée sous forme de table son dans une variable globale.

 

Une autre façon, sans passer par le json, peut être comme ceci : 

----------------------------------
-- User Settings
----------------------------------
-- la Table doit avoir la structure suivante :
--     1/ nom de la variable globale entre "
--     2/ ID du VD qui affiche la valeur de la VG
--     3/ n° du premier bouton qui doit être appuyé 
--        (qui correspond à  la première valeur de la variable)
--     4/ n° du dernier bouton qui doit être appuyé
--        (qui correspond à  la dernière valeur de la variable
--         on suppose que tous les boutons se suivent de 1 en 1)
--     5/ valeurs possibles de la variable entre "
--        (elles doivent être listées dans l'ordre des boutons de la VD)

local Table = {"Auth_PS3", 23, 3, 4, "Autorisé", "Interdit",
               "Auth_TV", 289, 3, 4, "Autorisé", "Interdit",
               "Auth_VMCEtage", 290, 3, 4, "Autorisé", "Interdit",
               "Auth_TerrPar", 291, 3, 4, "Autorisé", "Interdit",
               "Auth_LumHallNuit", 362, 3, 4, "Autorisé", "Interdit",
               "ECS", 292, 3, 4, "Oui", "Non",
               "DayPart", 130, 3, 4, "After SunRise", "After SunSet",
               "Noel", 363, 3, 4, "Oui", "Non",
               "Saison", 133, 3, 6, "Printemps", "Eté", "Automne", "Hiver",
               "Chauffage", 351, 3, 5, "0", "1", "2",
               "Vacances", 293, 3, 4, "Oui", "Non"
              }

----------------------------------
-- DO not change bellow this line
----------------------------------

local i = 1
while Table[i] ~= nil do
   local VG_Nom = tostring(Table[i])
   fibaro:debug("----------------------------")
   fibaro:debug("Nom de la variable Globale = " ..VG_Nom)
   local VD_id = tostring(Table[i+1])
   local Btn_Deb = tonumber(Table[i+2])
   local Btn_Fin = tonumber(Table[i+3])
   local NbrVal = (Btn_Fin - Btn_Deb) + 1 --Nbr de valeur possibles de la variable
   fibaro:debug('NbrVal = ' ..NbrVal)
   i = i + 4
   local VG_Val = fibaro:getGlobalValue(VG_Nom)
   fibaro:debug('Valeur de la variable Globale = ' ..VG_Val)
   for j = 1,NbrVal do
     if VG_Val == Table[i+j-1] then
         fibaro:debug(VG_Nom.. ' = ' ..VG_Val)
         fibaro:debug("Il faut appuyer sur le bouton : " ..Btn_Deb.. " de la VD_id " ..VD_id)
         fibaro:call(VD_id, "pressButton", Btn_Deb)
     end
     Btn_Deb = Btn_Deb + 1
   end  -- for
   i = i + NbrVal
end -- while
  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

Ce bout de scripts me dit quelques choses lol

@sebcbien je développe pas en lua en ce moment car j'ai du taf en extérieur et ma fille en vacances. Si cette hivers tu n'as pas avancé on regardera cela ensemble

Envoyé de mon SM-G900F en utilisant Tapatalk

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

Pour faire un tableau propre en LUA, il est possible de "nommer" ses valeurs. Après c'est plus parlant et plus simple d'emploi.

 

Voici un micro morceau de code

local dimmer = {device=25, 
  		curve="inExp", 
  		delai=20, 
  		max=100}

-- Accéder au numéro du device
print(dimmer.device)

-- Ajouter dans une variable globale
fibaro:setGlobal("Test", json.encode(dimmer))

-- reprendre d'une variable globale
local jDecoded = json.decode(fibaro:getGlobalValue("Test"))

-- Accéder au type de courbe
print(jDecoded.curve)

.

Courage

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

Merci Steven, je garde ça.

J'ai déjàun simple tableau basé sur le premier exemple de Jojo.

Pour le moment je cale sur les courbes.

Le simulateur d'aube de @Krikroff n'est malheureusement pas réversible...

donc si je lui demande de varier de 15 à50 en 25secondes ça va, mais malheureusement les équations ne fonctionnent plus lorsque je demande de varier de 50 à15 en 20 secondes... ça aurait pu me rendre heureux et faire un beau simulateur de coucher de soleil ... ;-)

Soit, j'ai jamais touché aux math.pow et autres, je cherche un peu (beaucoup même... :-/ ) po'v neurone :-p

Lien vers le commentaire
Partager sur d’autres sites

avec ceci ça ira mieux ce soir pour générer des fonctions descendantes... http://www.math10.com/en/problem-solver/ ;)

 

ça m'aurais bien aidé à  l'époque ça... nos enfants seront des imbéciles en math... ou pas :-p

Lien vers le commentaire
Partager sur d’autres sites

ok, j'ai réussi à  adapter 2-3 équations et le script d'aube pour mes besoins.

 

@steven @jojo, j'ai encore réfléchi, et je ne voit pas comment je pourrais avec une seule scène gérer toutes les lampes.

 

Si on les actionne une par unes, ça devrait aller, il y aura autant de scènes en parallèle que de lampes à  dimmer.

 

Mais disons que j'ai demandé un allumage progressif de la lampe de chambre le matin. j'ai donc écrit l'ordre dans la vg:

 

Au passage Steven, quel est l'avantage d'encoder et de décoder en json  par rapport à  directement stocker un tableau ?

fibaro:setGlobal("Curves_Dimmer", {device=25, curve="outinExpo", delai=120, max=80})

la scène à  reçu l'ordre et est occupée à  boucler pendant 2 minutes..

 

ensuite j'allume une chambre d'enfant et la VG est remplacée par un autre ordre. une scène parallèle se lance et effectue le dimming

 

jusqu'ici tout va bien.

 

Ensuite j'arrive dans la sdb et je demande l'extinction... effectuée directement ou via un gea -1

fibaro:setGlobal("Curves_Dimmer",{device=25, curve="outinExpo", delai=10, max=0})

Et c'est là  que les Athéniens s'atteignirent et que les satrapes s'attrapèrent...

 

On va avoir les deux scripts qui vont pas s'entendre.

 

Deux solutions que j'imagine.

 

Solution 1:

Durant les boucles, vérifier la vg, décoder et vérifier si l'ordre y est toujours

la VG globale devra donc pouvoir contenir plusieurs tableaux:

fibaro:setGlobal("Curves_Dimmer",{{device=25, curve="outinExpo", delai=10, max=0},{device=30, curve="inExpo", delai=20, max=100})

Ceci implique:

- à  chaque écriture de la VG, nécessité de la lire, de la "décoder", de la modifier (mette une autre demande pour la lampe 25 par exemple) et de la re-stocker ... tout ça en espérant que ailleurs un autre script ne décide pas d'en faire autant pile en même temps...

- de l'autre côté, la scène de dimming doit a chaque boucle verifier si l'ordre de la vg n'a pas changé, donc lire et décoder la vg.

- il peut y avoir plusieures scènes en parallèle mais elles doivent pouvoir flagger "je m'occupe de ce dimming" et si une scène se lance et qu'il n'y a rien de nouveau, elle abort

 

solution 2:

 

Ne gérer les courbes que les ordres en automatique via GEA, s'il y a une action manuelle(0 ou 99%) durant la boucle -> abort

Normalement si le mode automatique est logique, il ne devrait pas y avoir de télescopage.

On pourra donc laisser les scènes tourner en parallèle

 

Avis ? astuces ? mars ? chocolat glacé ? sourire de la crémière ? :-)

Lien vers le commentaire
Partager sur d’autres sites

Invité chris6783

L'avantage du encode et du décode c que tu manipules simplement des tableaux pouvant contenir d'autres tableaux et tu ne t'occupes pas de gérer les accolades ouvrantes et fermantes. Si un jour tu décides d'ajouter un niveau de tableau aucun problème... Alors que si tu gères toi même l'équivalent du encode/décode tu vas passer pas mal de temps àcompter les accolades pour les fermer au bon endroit.... Et te tromper

Lien vers le commentaire
Partager sur d’autres sites

Tu peux très bien imaginer une variable globale par dimmer (ex : DIM_SALON, DIM_CHAMBRE1, ...) chaque une de ces variables serait déclencheur du même scénario. (Tu peux aussi en avoir qu'une avec un tableau .. mais c'est beaucoup plus compliqué)

 

Ensuite, tu rajoutes une variable globale qui va stocker les Dimmers en cours de traitement.

 

Si le dimmer qui a lancer le scénario n'est pas dans la liste des dimmers en cours de traitement, l'ajouter dans cette liste. Effectuer le traitement puis le retirer de la liste.

 

... et voilà  ...

 

 

Donc si le dimmer est déjà  dans le liste, il ne fera rien ... ou inversement tu peux le faire dormir tant qu'il est dans la liste afin qu'il soit traité une fois que le précédent soit fini.

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

Le mieux c'est quand meme le tableau car si tu as beaucoup de dimmers çàen fait des VG

Par contre pour codé cela c'est chaud mais je vous le principe. Encore une idée àmettre de côté pour cette hiver merci Monsieur Steven

Envoyé de mon SM-G900F en utilisant Tapatalk

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...

Savez vous si on peut passer des variables àune scène? (je suis newbie sur la HC2...)

Si c'est le cas, pourquoi ne pas utiliser une scène comme une méthode globale recevant des paramètres (l'objet sur lequel appliquer la courbe par exemple) et agissant en fonction ?

Lien vers le commentaire
Partager sur d’autres sites

Bonjour

Oui c'est possible.

En tant que newbie, la problematique évoquée ici ne me semble pas être la meilleure pour commencer.

On est en face d'un problème de "concurence" qui ne va pas être simple a régler vu les contraintes de la HC2.

Bonne chance pour l'apprentissage :-)

Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...