Aller au contenu
mprinfo

Sunrisehour, Sunsethour, Os.date Et Variable Jour_Nuit

Recommended Posts

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 : Coucher-Lever_Jour.vfib

Modifié par mprinfo
  • Upvote 5

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci. Très bonne idée.

Ne pas oublier, si V3.60 un petit sleep avant la première instruction pour être sur. ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

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 ?

++

Partager ce message


Lien à poster
Partager sur d’autres sites

@mprinfo, 

génial ton idée ! 

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

Très bon tutos!

Mais j'ai une question bête: pourquoi éteindre ta box?

Partager ce message


Lien à poster
Partager sur d’autres sites

Ben non ! Perso je ne coupe pas au compteur mais seulement la ligne sur laquelle je veux installer le module.  ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

#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

Partager ce message


Lien à poster
Partager sur d’autres sites

@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. :D mais ca ma l'ère très compliqué:

http://www.lua.org/manual/5.1/manual.html#lua_pushcclosure

Partager ce message


Lien à poster
Partager sur d’autres sites

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

post-255-0-33204800-1427369484_thumb.jpg

Lever du soleil

post-255-0-79793000-1427369751_thumb.jpg

Ma scène

post-255-0-91045900-1427369813_thumb.jpg

Partager ce message


Lien à poster
Partager sur d’autres sites

#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é par JossAlf

Partager ce message


Lien à poster
Partager sur d’autres sites

2ème cas. Quand j'ouvre mon garage et qu'il fait nuit j'allume la lumière du couloir

Partager ce message


Lien à poster
Partager sur d’autres sites

@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... ;):D

Partager ce message


Lien à poster
Partager sur d’autres sites

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
  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

@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 :rolleyes:

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

@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

Partager ce message


Lien à poster
Partager sur d’autres sites

×