mprinfo Posté(e) le 25 mars 2015 Signaler Posté(e) le 25 mars 2015 Sunrisehour, Sunsethour, Os.date Et Variable Jour_Nuit V1.00 Une version plus élaborée ce trouve ici : http://www.domotique-fibaro.fr/scene-lua-jour-nuit-avec-decalge-possible-et-optimisation-du-sleep/ Au début j'ai utilisé le mode bloc pour mettre ma variable à jour. Un jour j'ai rencontré un soucis, la variable ne s'était pas mise a jour ? Pourquoi ? Tout simplement ma box était en cours de démarrage lorsque l'heure était égale a l'heure du coucher du soleil. Exemple : J'ai une coupe de courant de 18h00 à 19h00 Le coucher du soleil est a 18h24. Lorsque j'allume ma box a 19h00 la scène s'exécute bien mais comme l'heure de coucher du soleil et 18h24 elle ne met pas a jour la variable globale. J'ai donc décider de faire cela en LUA et dans une seul Scéne. Il me fallait : L'heure de lever du soleil fibaro:getValue(1, "sunriseHour") L'heure de coucher du soleil fibaro:getValue(1, "sunsetHour") L'heure Actuelle Var_Heure = os.date("%H:%M", os.time()) il me reste plus qu'à surveiller l'heure actuelle Et de la comparer avec le avec l'heure du coucher et du lever du soleil while true do local Var_Heure = os.date("%H:%M", os.time()) local Lever = fibaro:getValue(1, "sunriseHour") local Coucher = fibaro:getValue(1, "sunsetHour") if ( Var_Heure == Lever ) then fibaro:setGlobal("Jour_Nuit", "Jour"); elseif ( Var_Heure == Coucher ) then fibaro:setGlobal("Jour_Nuit", "Nuit"); else fibaro:debug("controle en cours") end fibaro:sleep(60*1000); end Avec ce code j'ai toujours le probléme si ma box et éteinte au moment du lever ou du coucher du soleil je vais donc ajouter ce code : if (os.date("%H:%M", os.time()) >= fibaro:getValue(1, "sunriseHour")) and (os.date("%H:%M", os.time()) < fibaro:getValue(1, "sunsetHour")) then fibaro:setGlobal("Jour_Nuit", "Jour"); else fibaro:setGlobal("Jour_Nuit", "Nuit"); end Je teste : Si l'heure et supérieur ou égal est inférieur a l'heure du coucher du soleil Si c'est le cas il fait Jour sinon il fait Nuit. On dispose de tout pour faire notre Scéne : (Version 1.0) --[[ %% autostart --]] -- Test du nombre de scènes en cours if (fibaro:countScenes() > 1) then fibaro:abort() end -- met la variable a jour au démarrage if (os.date("%H:%M", os.time()) >= fibaro:getValue(1, "sunriseHour")) and (os.date("%H:%M", os.time()) < fibaro:getValue(1, "sunsetHour")) then fibaro:setGlobal("Jour_Nuit", "Jour"); else fibaro:setGlobal("Jour_Nuit", "Nuit"); end -- se lance au démarrage et toutes les 60 secondes. while true do local Var_Heure = os.date("%H:%M", os.time()) local Lever = fibaro:getValue(1, "sunriseHour") local Coucher = fibaro:getValue(1, "sunsetHour") if ( Var_Heure == Lever ) then fibaro:setGlobal("Jour_Nuit", "Jour"); elseif ( Var_Heure == Coucher ) then fibaro:setGlobal("Jour_Nuit", "Nuit"); else fibaro:debug("controle en cours") end fibaro:sleep(60*1000); end Date et heure courante (os.date) http://www.luteus.biz os.date([format [, temps ] ]) Retourne dans une table des informations de date et heure formatté par une chaîne de caractère. La chaîne de caractère a le même format que la fonction strftime() de C. Les caractères suivants sont utilisés pour spécifier le format de la date : %a - nom abrégé du jour de la semaine (local) %A - nom complet du jour de la semaine (local) %b - nom abrégé du mois (local) %B - nom complet du mois (local) %c - représentation préférée pour les dates et heures, en local %C - numéro de siècle (l'année, divisée par 100 et arrondie entre 00 et 99) %d - jour du mois en numérique (intervalle 01 à 31) %D - identique à %m/%d/%y %e - numéro du jour du mois. Les chiffres sont précédés d'un espace (de ' 1' à '31') %g - identique à %G, sur 2 chiffres %G - L'année sur 4 chiffres correspondant au numéro de semaine (voir %V). Même format et valeur que %Y, excepté que si le numéro de la semaine appartient à l'année précédente ou suivante, l'année courante sera utilisé à la place %h - identique à %b %H - heure de la journée en numérique, et sur 24-heures (intervalle de 00 à 23) %I - heure de la journée en numérique, et sur 12- heures (intervalle 01 à 12) %j - jour de l'année, en numérique (intervalle 001 à 366) %m - mois en numérique (intervalle 1 à 12) %M - minute en numérique %n - caractère de nouvelle ligne %p - `AM' ou `PM', en majuscule, suivant la valeur donnée, ou la chaîne correspondante pour la locale courante %P - `am' ou `pm', en majuscule, suivant la valeur donnée, ou la chaîne correspondante à la locale courante %r - l'heure au format a.m. et p.m %R - l'heure au format 24h %S - secondes en numérique %t - tabulation %T - l'heure actuelle (égal à %H:%M:%S) %u - le numéro de jour dans la semaine, de 1 à 7. (1 représente Lundi) %U - numéro de semaine dans l'année, en considérant le premier dimanche de l'année comme le premier jour de la première semaine %V - le numéro de semaine comme défini dans l'ISO 8601:1988, sous forme décimale, de 01 à 53. La semaine 1 est la première semaine qui a plus de 4 jours dans l'année courante, et dont Lundi est le premier jour. (Utilisez %G ou %g pour les éléments de l'année qui correspondent au numéro de la semaine pour le timestamp donné.) %W - numéro de semaine dans l'année, en considérant le premier lundi de l'année comme le premier jour de la première semaine %w - jour de la semaine, numérique, avec Dimanche = 0 %x - format préféré de représentation de la date sans l'heure %X - format préféré de représentation de l'heure sans la date %y - l'année, numérique, sur deux chiffres (de 00 à 99) %Y - l'année, numérique, sur quatre chiffres %Z ou %z - fuseau horaire, ou nom ou abréviation (suivant le système d'exploitation) %% - un caractère `%' littéral Exemple : >os.date("%Y/%m/%d %H:%M:%S") '2010/03/04 09:05:16' Module Virtuel Coucher et Lever Soleil : 5
Berale64 Posté(e) le 25 mars 2015 Signaler Posté(e) le 25 mars 2015 Merci. Très bonne idée. Ne pas oublier, si V3.60 un petit sleep avant la première instruction pour être sur.
Rocketlud Posté(e) le 25 mars 2015 Signaler Posté(e) le 25 mars 2015 Merci pour le partage excellent je rebondis sur une question par rapport au soleil Si je veux récupèrer l'heure de couché et de levé du soleil, existe t'il une fonction qui pourrait me retourner ses valeurs ? ++
Rocketlud Posté(e) le 25 mars 2015 Signaler Posté(e) le 25 mars 2015 Ah oui !!!!!! Lol Merci 2 fois alors pour le partage et pour m'avoir fait prendre conscience que je n'ai plus 20 ans il sont ou mes lunettes lol
Steph11 Posté(e) le 25 mars 2015 Signaler Posté(e) le 25 mars 2015 Très bon tutos! Mais j'ai une question bête: pourquoi éteindre ta box?
JossAlf Posté(e) le 26 mars 2015 Signaler Posté(e) le 26 mars 2015 Ben non ! Perso je ne coupe pas au compteur mais seulement la ligne sur laquelle je veux installer le module.
pepite Posté(e) le 26 mars 2015 Signaler Posté(e) le 26 mars 2015 bijour, bien vu le partage, bonne idée ;-) même le plus simple c'est important. Je suis aussi une bille, non un BOULET en LUA, merci à tous de tous les partages et le boulot que vous faites :60: :60:
JossAlf Posté(e) le 26 mars 2015 Signaler Posté(e) le 26 mars 2015 #mpinfo : Est-ce que la partie qui suit ne serait pas suffisante ? if (os.date("%H:%M", os.time()) >= fibaro:getValue(1, "sunriseHour")) and (os.date("%H:%M", os.time()) < fibaro:getValue(1, "sunsetHour")) then fibaro:setGlobal("Jour_Nuit", "Jour"); else fibaro:setGlobal("Jour_Nuit", "Nuit"); end Toute la partie qui commence ligne 12 à "while true do" ne sert à rien puisque le code du dessus fait son Å“uvre ? Ou j'ai pas tout compris On pourrait simplifier comme ça ? --[[ %% autostart --]] fibaro:sleep(10*1000) -- Permet de contourner un bug qui empêche le lancement d'une scène au démarrage en V3.6. while true do if (os.date("%H:%M", os.time()) >= fibaro:getValue(1, "sunriseHour")) and (os.date("%H:%M", os.time()) < fibaro:getValue(1, "sunsetHour")) then fibaro:setGlobal("Jour_Nuit", "Jour"); fibaro:debug("Il fait jour !") else fibaro:setGlobal("Jour_Nuit", "Nuit"); fibaro:debug("Il fait nuit !") end fibaro:sleep(60*1000) end
Steph11 Posté(e) le 26 mars 2015 Signaler Posté(e) le 26 mars 2015 @mprinfo, non je coupe le disjoncteur de la pièce concerné.... après je ne sais pas si tu avais une raison de couper ta box de telle heure àtelle heure?? Et sinon, pour le redémarrage de ta box, tu le fait en automatique via ( Lua) ou en manuel? Pour ceux que sa intéresse j'ai trouvé ça, il ne reste plus cas traduire. mais ca ma l'ère très compliqué: http://www.lua.org/manual/5.1/manual.html#lua_pushcclosure
Steph11 Posté(e) le 26 mars 2015 Signaler Posté(e) le 26 mars 2015 La seule scène que j'avais réussi àfaire était celle-ci; elle prend en compte la levée et le couché du soleil pour allumer une lampe quand mon garage est détecté ouvert. Oui point négatif ou pas: si le garage est déjàouvert avant le couché du soleil, la scène se déclenchera quand même et déclenchera l'allumage de la lumière. Depuis que je l'ai pas de soucie particulié, après si vous trouvez qqles chose àaméliorer,ou si vous trouvez un point négatif; je suis preneur....Merci Coucher du soleil Lever du soleil Ma scène
JossAlf Posté(e) le 26 mars 2015 Signaler Posté(e) le 26 mars 2015 (modifié) #Stephane : Quel est le but exact de ta scène ? Te prévenir que ton garage est ouvert ou allumer une lumière dans ton garage quand tu l'ouvres ? Dans tous les cas, efface "jour_nuit" de l'entête. La scène se déclenchera seulement lors de l'ouverture du garage et non au au changement de valeur de la variable "jour-nuit". Modifié le 26 mars 2015 par JossAlf
Steph11 Posté(e) le 26 mars 2015 Signaler Posté(e) le 26 mars 2015 2ème cas. Quand j'ouvre mon garage et qu'il fait nuit j'allume la lumière du couloir
Steph11 Posté(e) le 26 mars 2015 Signaler Posté(e) le 26 mars 2015 @mprinfo, merci pour tes infos. Mais il m'a fallu plus de 4 jours pour faire ce script en lua alos je vais laissé comme ça...
JossAlf Posté(e) le 26 mars 2015 Signaler Posté(e) le 26 mars 2015 dans cette scéne le déclencheur est autostart donc la scéne sera déclencher au démarrage. elle ne sera donc plus excécuter jusqu'au prochain démarrage c'est pour cela que je fais une boucle dans la quelle toutes les minutes on comparer l'heure actuel et leur de lever et coucher du soleil Non, je t'assure que ça tourne en continu à partir du démarrage. Sauf erreur de ma part, "%% autostart" permet de provoquer le lancement de la scène au démarrage mais en suite la scène tourne toujours. Fais un essai avec le debug que j'ai mis ; tu verras qu'elle tourne toujours et encore : [DEBUG] 12:43:34: Il fait jour [DEBUG] 12:44:34: Il fait jour [DEBUG] 12:45:35: Il fait jour [DEBUG] 12:46:35: Il fait jour [DEBUG] 12:47:35: Il fait jour [DEBUG] 12:48:35: Il fait jour [DEBUG] 12:49:35: Il fait jour [DEBUG] 12:50:35: Il fait jour [DEBUG] 12:51:35: Il fait jour 1
pepite Posté(e) le 26 mars 2015 Signaler Posté(e) le 26 mars 2015 @mprinfo : je pense aussi que le %%autostart permet de relancer la scene après redemarrage de la box. Après ca tourne encore. J'ai 'limpresson que ce que propose JossAlf avec la comparaison de l'heure suffit, puisque c'est dans la boucle. Je me trompe peut-etre
pepite Posté(e) le 26 mars 2015 Signaler Posté(e) le 26 mars 2015 ce que je comprends, mais,peut-etre mal : %%autostart : permet de lancer, relancer la scene après un rebbot de la box et après c'est la boucle qui fait tourner la scene : while true do
JossAlf Posté(e) le 26 mars 2015 Signaler Posté(e) le 26 mars 2015 Si c'est cela ca va être simple de lancer des scènes en fonction de l heure Ben oui c'est la cas ! C'est ce qui permet par exemple d'attendre le couché du soleil pour lancer une scène.
JossAlf Posté(e) le 26 mars 2015 Signaler Posté(e) le 26 mars 2015 Pour être précis : Dans l'entête d'une scène le trigger %% autostart permet de lancer cette scène automatiquement au démarrage et/ou après son enregistrement. Ca évite de cliquer sur "RUN" ou "Démarrer" pour la lancer. Une fois la scène lancée, la boucle tourne à l'infini ce qui permet de jouer avec les "if" ou "while true do". Il ne faut donc pas oublier de mettre un fibaro:sleep(30*1000) pour calmer la boucle PS : (le temps du sleep est libre mais il vaut mieux éviter de descendre sous les 30 secondes) PS2 : le sleep s'exprime en millisecondes -> fibaro:sleep(30*1000) est plus lisible que fibaro:sleep(30000) mais donne le même résultat.
mprinfo Posté(e) le 26 mars 2015 Auteur Signaler Posté(e) le 26 mars 2015 Il faut aussi éviter des sleep de plus de 40mn dans le main loop des vd merci pour ces infos. Ici j'ai mis un sleep de 60s car dans la boucle je contrôle l heure exacte donc minutes par minutes. J'ai reflechi a ce que tu me propse ca m arrive lol ce qui me derrange c'est la mise a jour de la variable a chaque lecture de la scène Envoyé de mon SM-G900F en utilisant Tapatalk
jojo Posté(e) le 26 mars 2015 Signaler Posté(e) le 26 mars 2015 pour le coucher du soleil, on n'est pas à5 minutes près => donc un sleep de 10 ou 15 min me semble suffisant. Pour éviter d'écrire àchaque fois la variable, on fait une lecture de la variable, et SI elle doit être modifiée, alors on fait le fibaro:setGlobal ...
pepite Posté(e) le 26 mars 2015 Signaler Posté(e) le 26 mars 2015 bonne idée jojo et comme ca, qu'en pensez-vous ? --[[ %% autostart --]] fibaro:sleep(10*1000) -- Permet de contourner un bug qui empêche le lancement d'une scène au démarrage en V3.6. while true do if (os.date("%H:%M", os.time()) >= fibaro:getValue(1, "sunriseHour")) and (os.date("%H:%M", os.time()) < fibaro:getValue(1, "sunsetHour")) and (fibaro:getGlobalValue("Jour_Nuit") == "Nuit") then fibaro:setGlobal("Jour_Nuit", "Jour"); fibaro:debug("Il fait jour !") elseif (fibaro:getGlobalValue("Jour_Nuit") == "Jour") then fibaro:setGlobal("Jour_Nuit", "Nuit"); fibaro:debug("Il fait nuit !") end fibaro:sleep(60*1000) end
JossAlf Posté(e) le 26 mars 2015 Signaler Posté(e) le 26 mars 2015 Je ne pense pas que la mise à jour de la variable à chaque fois soit problématique. Sauf à considérer que ça userait le disque. Au niveau des performances (si tant est que cela jouerait ici), il faudrait estimer le gain entre : 1) tester la variable (donc la lire) avant de la modifier et 2) Ecrire directement dans la variable. Mais il est vrai qu'il serait mieux d'écrire dans la variable que si nécessaire.
mprinfo Posté(e) le 26 mars 2015 Auteur Signaler Posté(e) le 26 mars 2015 @JossAlf Excuse moi, j'étais sur mon tel et j'ai pas bien lu ta proposition de code, je croyais que tu voulais supprimer la boucle do while true. je vais essayé d'expliquer pour j'ai écris mon code de cette facon 1 - autostart va démarrer ma scène une fois au démarrage de la box. 2 - Je vais donc regarder si on est le jour ou la nuit, j'ai d'ailleurs pris le jour pour ne pas avoir de soucis car la nuit et sur 2 jours Je force la mise a jour de la variable globales, car je ne sais pas le pourquoi comment du redémarrage Le code qui suis n'est pas obligatoire c'est juste pour faire un Controle en Cas d'erreur Lorsque que j'écris un script et qu'il fonctionne j'essaie quand j'ai un peu de temp de l'optimiser et de mettre des contrôles d'erreur (je débute donc pas toujours simple) if (os.date("%H:%M", os.time()) >= fibaro:getValue(1, "sunriseHour")) and (os.date("%H:%M", os.time()) < fibaro:getValue(1, "sunsetHour")) then fibaro:setGlobal("Jour_Nuit", "Jour"); else fibaro:setGlobal("Jour_Nuit", "Nuit"); end 3 - Mon script arrive dans une boucle infinie, Je sais que ma variable globale et OK je n'ai plus qu'a faire un contrôle toutes les minutes pour voir si la condition et remplis dans mon script la variable globale et mise a jour 2 fois par jour dans ton script la variable globale et mise a jour 60 fois par heure soit 1440 donc 1438 fois pour rien 4 - Par contre je vais modifie le script car il manque un contrôle d'erreur qui peu être important. local NbreScene = fibaro:countScenes () if (NbreScene == 1) then while do true end else fibaro:debug("La variable a été mise a jour Manuellement") end vu que l'on utilise une boucle sans fin il est bon qu'elle ne soit exécuté qu'une seule fois par contre si tu appuies Manuellement sur le bouton Exécuter la variable sera mise a jour. Merci pour ce retour
Messages recommandés