sebcbien Posté(e) le 17 août 2015 Signaler Posté(e) le 17 août 2015 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 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 ? 1
jojo Posté(e) le 17 août 2015 Signaler Posté(e) le 17 août 2015 @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 1
mprinfo Posté(e) le 17 août 2015 Signaler Posté(e) le 17 août 2015 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 1
sebcbien Posté(e) le 17 août 2015 Auteur Signaler Posté(e) le 17 août 2015 ok, merci, je vais déjà essayer de faire fonctionneer ça avec une seule variable et une seule scène pour une seule lampe :-) après on verra.
mprinfo Posté(e) le 17 août 2015 Signaler Posté(e) le 17 août 2015 Tu sais un scène peut avoir plusieurs instance donc si tu l écrit "bien" elle peut faire l'affaire pour x module Envoyé de mon SM-G900F en utilisant Tapatalk
Steven Posté(e) le 18 août 2015 Signaler Posté(e) le 18 août 2015 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 1
sebcbien Posté(e) le 18 août 2015 Auteur Signaler Posté(e) le 18 août 2015 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
sebcbien Posté(e) le 18 août 2015 Auteur Signaler Posté(e) le 18 août 2015 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
sebcbien Posté(e) le 18 août 2015 Auteur Signaler Posté(e) le 18 août 2015 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 ? :-)
Invité chris6783 Posté(e) le 18 août 2015 Signaler Posté(e) le 18 août 2015 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
Steven Posté(e) le 19 août 2015 Signaler Posté(e) le 19 août 2015 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. 1
mprinfo Posté(e) le 19 août 2015 Signaler Posté(e) le 19 août 2015 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 1
Kalophtalmos Posté(e) le 1 octobre 2015 Signaler Posté(e) le 1 octobre 2015 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 ?
sebcbien Posté(e) le 2 octobre 2015 Auteur Signaler Posté(e) le 2 octobre 2015 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 :-)
Messages recommandés