Aller au contenu

Recommended Posts

V2 du 27/06/2014 grandement amélioré par STEVEN

 

Nouveautés de la V2:

- Calcul si le jour en cours et jour +1 est chômé ou pas

- Choix des jours fériés France ou Suisse

- Ce qui change par rapport à  la V1: ajout d'un label dans le module virtuel et ajout d'une variable globale JourChomeJ1, pour lancer le calcul depuis GEA ou SCHEDULER bouton 3 au lieu de 2 pour la version précédente.

 

Objectif: calculer si le jour en cours est chômé (WE ou férié) ou pas et stocker le résultat dans une variable globale, le tout sans dépendre d'un agenda externe à  la HC2 et de script intermédiaire.

 

Il s'agit d'une légère adaptation du code pour la VERA LITE de josDBlog

http://gurau-audibert.hd.free.fr/josdblog/2014/01/lua-vacances-jours-chomes-et-jours-feries/

 

1er étape, dans le panneau des variables, créer deux variables globale prédéfinie JourChome JourChomeJ1 avec les valeurs prédéfinies OUI NON.

med_gallery_192_116_15019.jpg

 

2 iém étape, créer un module virtuel avec deux labels et un bouton:

 

sml_gallery_192_116_17107.jpg

Le détail:

gallery_192_116_53021.jpg

 

Et ci-dessous la code à  coller dans le bouton du module virtuel:


-- Retourne OUI si le jour courant et J+1 est un jour chômé (WE ou férié)
-- Adapté de http://gurau-audibert.hd.free.fr/josdblog/2014/01/lua-vacances-jours-chomes-et-jours-feries/
-- Pour la HC2 par Hansolo
-- V1 26/06/2014 Initié par HANSOLO
-- V2 27/06/2014 Amélioré par STEVEN, gestion des JS SUISSE et calcul J et J+1
 
local france = true
local suisse = false
local geneve = false
 
-- Retourne le jour de la semaine en clair
function josdGetJourSemaine(jour)
	--fibaro:debug ("jour: ")
	josdGetJourSemaineTab={[0]="dimanche",[1]="lundi",[2]="mardi",[3]="mercredi",[4]="jeudi",[5]="vendredi",[6]="samedi"}
	return josdGetJourSemaineTab[tonumber(jour)]
end
 
-- Retourne le jour de Pâques au format epoch
-- annee : année (Integer) dont on désire connaître le jour de Pâques (ex : 2014)
function josdGetJourPaques(annee)
	local a=math.floor(annee/100);
	local b=math.fmod(annee,100);
	local c=math.floor((3*(a+25))/4);
	local d=math.fmod((3*(a+25)),4);
	local e=math.floor((8*(a+11))/25);
	local f=math.fmod((5*a+,19);
	local g=math.fmod((19*f+c-e),30);
	local h=math.floor((f+11*g)/319);
	local j=math.floor((60*(5-d)+b)/4);
	local k=math.fmod((60*(5-d)+,4);
	local m=math.fmod((2*j-k-g+h),7);
	local n=math.floor((g-h+m+114)/31);
	local p=math.fmod((g-h+m+114),31);
	local jour=p+1;
	local mois=n;
	josdGetJourPaquesAnnee=annee;
	josdGetJourPaquesEpochPaque=os.time{year=annee,month=mois,day=jour,hour=12,min=0};
	return josdGetJourPaquesEpochPaque;
end
 
-- Retourne true si le jour courant est un jour férié
function josdJourFerie(time)
	local today=os.date("%m-%d", time);
	local annee=tonumber(os.date("%Y", time));
	-- Dates fixes
	josdJourFerieTab = {}
	local epochPaques=josdGetJourPaques(annee);
	if (france) then
		josdJourFerieTab["01-01"] = true; -- 1er janvier
		josdJourFerieTab["05-01"] = true; -- Fête du travail
		josdJourFerieTab["05-08"] = true; -- Victoire des alliés
		josdJourFerieTab["07-14"] = true; -- Fête nationale
		josdJourFerieTab["08-15"] = true; -- Assomption
		josdJourFerieTab["11-01"] = true; -- Toussaint
		josdJourFerieTab["11-11"] = true; -- Armistice
		josdJourFerieTab["12-25"] = true; -- Noà«l
		-- Dates variables
		josdJourFerieTab[os.date("%m-%d",epochPaques)] = true;             -- Pâques
		josdJourFerieTab[os.date("%m-%d",epochPaques+24*60*60)] = true;    -- Lundi de Pâques = Pâques + 1 jour
		josdJourFerieTab[os.date("%m-%d",epochPaques+24*60*60*39)] = true;  -- Ascension = Pâques + 39 jours
		josdJourFerieTab[os.date("%m-%d",epochPaques+24*60*60*50)] = true; -- Pentecôte = Ascension + 50 jours
	end
	if (suisse) then 
		josdJourFerieTab["01-01"] = true; -- 1er janvier
		josdJourFerieTab["08-01"] = true; -- Fête national
		josdJourFerieTab["12-25"] = true; -- Noà«l
		-- Dates variables
		if (geneve) then 
			josdJourFerieTab[jeuneGenevois(time)] = true;             -- jeunes genevois
		else
			josdJourFerieTab[jeuneFederal(time)] = true;             -- jeunes genevois
		end
		josdJourFerieTab[os.date("%m-%d", epochPaques)] = true;             -- Pâques
		josdJourFerieTab[os.date("%m-%d", epochPaques+24*60*60)] = true;    -- Lundi de Pâques = Pâques + 1 jour
		josdJourFerieTab[os.date("%m-%d", epochPaques+24*60*60*39)] = true;  -- Ascension = Pâques + 39 jours
		josdJourFerieTab[os.date("%m-%d", epochPaques+24*60*60*50)] = true; -- Pentecôte = Ascension + 50 jours
		josdJourFerieTab[os.date("%m-%d", epochPaques-48*60*60)] = true;  -- Vendredi-saint = Pâques - 2 jour
	end
	return josdJourFerieTab[today]; -- (nldr : Both nil and false make a condition false)
end
 
 -- Calcul le jeudi qui suit le 1er dimanche de septembre
function jeuneGenevois(time)
  	local jour = 1
	local annee = tonumber(os.date("%Y", time))
	while (os.date("%A", os.time{year=annee, month=9, day=jour}) ~= "Sunday") do
		jour = jour + 1
	end
	return os.date("%m-%d", os.time{year=annee, month=9, day=(jour+4)})
end
 
-- Calcul le lundi qui suit le 3ème dimanche de septembre
function jeuneFederal(time)
  	local jour = 1
	local annee = tonumber(os.date("%Y", time))
	while (os.date("%A", os.time{year=annee, month=9, day=jour}) ~= "Sunday") do
		jour = jour + 1
	end
	return os.date("%m-%d", os.time{year=annee, month=9, day=(jour+15)})
end
 
 -- Affiche le résultat
function display(jour, result, label, variable, time)
	selfId = fibaro:getSelfId()
	fibaro:debug ("Jour chomé: " .. result)
	-- Mise à  jour de la variable globale
	if (variable) then fibaro:setGlobal(variable, result) end
	-- Mise à  jour du label du module virtuel
	fibaro:call(selfId,"setProperty","ui."..label..".value", jour .. " " .. os.date("%d.%m.%Y ",time).." Jour chomé: ".. result) 
end
 
 -- Lancement du calcul
function doCalculate(time, label, variable)
	local jour = josdGetJourSemaine(os.date("%w", time))
	josdJourChomeReturn = (jour=="samedi" or jour=="dimanche" or josdJourFerie(time))
	if josdJourChomeReturn then
		display(jour, "OUI", label, variable, time)
	else
		display(jour, "NON", label, variable, time)
	end
end
 
doCalculate(os.time(), "Label1", "JourChome")
doCalculate(os.time()+24*60*60, "Label2", "JourChomeJ1")

J’exécute le code tous les jours à  00H15 depuis le Scheduler (90 étant l'ID de mon module virtuel et 3 la position du bouton) ce qui évite d'utiliser le main loop du module virtuelle et d'éventuels problèmes.

luaDaySchedule:add("00:15","90", 3 , "pressButton",{"All"},true)

La même chose depuis GEA.

GEA.add({"Global", "", ""}, 30, "", {{"VirtualDevice", 90, 3},{"Time", "00:00", "00:01"}})

Pour choisir les jours fériés France ou Suisse (au début du code)

local france = oui
local suisse = non
local geneve = non

Merci à  STEVEN pour les améliorations.

 

Voilà  un truc tout simple que j'utilise pour gérer mes volets 

 

Correction du 13/07/2014, utiliser true ou false pour la sélection des calendriers des jours fériés

local france = true

local suisse = false

local geneve = false 

 

Correction du 14/04/2015, calcul du jeudi de l’ascension erroné

 

Correction du 03/05/2015, calcul du jeudi de l'ascension dans la partie Suisse

 

Correction du 25/05/2015, calcul du lundi de pentcôte

Modifié par HANSOLO
  • Upvote 9

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci beaucoup

Envoyé de mon GT-I9192 en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

Enfin un module utile..  :D

Partager ce message


Lien à poster
Partager sur d’autres sites

  Merci Hansolo.

 

 Impec ce petit module qui mérite bien une icône.

 

Jour chômé

 

Pour lancer le calcul depuis le GEA, est-ce possible d'appuyer sur le bouton 11 chaque jour à  minuit avec une ligne dans ce style?

GEA.add(214, -1, "", {{"VirtualDevice", 214, 1},{"Time", "00:00", "00:01"}})

Partager ce message


Lien à poster
Partager sur d’autres sites

 

 

je mettrais gea.add({"Global","",""},30,"",{{"Virtual.....

 

 

 

attention vérifie la syntaxe je l'écrit de mémoire à  partir de mon tel

Partager ce message


Lien à poster
Partager sur d’autres sites
GEA.add({"Global", "", ""}, 30, "", {{"VirtualDevice", 214, 2},{"Time", 00:00", "00:01"}})

Le bouton àl'ID 2 dans le Virtual Device 1 est le label.

Partager ce message


Lien à poster
Partager sur d’autres sites

 Merci messieurs les experts :60:

Je surveille cela ce soir.

Partager ce message


Lien à poster
Partager sur d’autres sites

 Si je peux me permettre Steven, il manque une guillemet avant le 00:00 ( ça me laissait les accolades et parenthèse de fin en vert)

GEA.add({"Global", "", ""}, 30, "", {{"VirtualDevice", 214, 2},{"Time", "00:00", "00:01"}})

Partager ce message


Lien à poster
Partager sur d’autres sites

Qui m'a volé mon guillemet, qui ?

Mea Culpa

Envoyé de mon GT-I9192 en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

Mais il est bien ce petit module :) merci àtoi va HANSOLO.

Sinon camarade, pourquoi le code dans un bouton et pas dans le main loop ?

Envoyé de mon iPhone àl'aide de Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

Des risque de plantage si on charge trop la main loop d'après ce que j'ai lu dans le forum, du coup je suis les conseils avisés.

Partager ce message


Lien à poster
Partager sur d’autres sites

Attention de ne pas vous faire avoir comme moi, le bouton est passé en id 3.

@Krikroff tu as oublié que les polonais ne dormais pas plus de 40mn dans un main loop ? :)

@Hansolo J'insiste, génial ton module.

Pour la v3, j'ai déjàune idée pour toi... Je travail pas le mercredi :)

Envoyé de mon GT-I9192 en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

@Steven, maintenant ils dorment moins :D -> http://bugzilla.fibaro.com/view.php?id=1501

 

@Hansolo, pas de soucis tu peux charger sans risque ton main loop.... Juste attention avec Net.FHttp et json.decode ;)

 

Merci pour ton module :60:

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut les gars,

 

[modebouletON] je ne comprend pas comment ça fonctionne votre agenda [modebouletOFF] ;)  :13:

 

Comment on rentre les dates chomé? Possible d'avoir un éclaircissement?  :P  :15:

 

Merci

Partager ce message


Lien à poster
Partager sur d’autres sites

Arf, j'aurais du lire avant le code, j'aurais compris que les dates doivent être rentré à  la mano dans le code;) 

 

Sorry :P

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Bon encore moi ;) 

Merci je viens de le mettre en place;) C'est cool ;)  :60:

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour

Juste pour changer l’icône selon que "JourChome"  ou "JourChomeJ1" soit repos ou travail

Ajout a la fin


if 
 ( fibaro:getGlobalValue("JourChome") == ("OUI") )
then
	fibaro:call(211, "pressButton", "5");
  else
  fibaro:call(211, "pressButton", "4");
end

et 2 boutons auquel j'ai affécté un icone différent

 

post-236-0-55109600-1404045945_thumb.jpg

post-236-0-24322200-1404045946_thumb.jpg

Partager ce message


Lien à poster
Partager sur d’autres sites

Encore moi, je suis chaud bouillant ;)  :15:  En faîte il pleut chez moi et je ne sais pas quoi faire;) LOL 

 

Si j'ai bien compris pour rajouter des dates à  ma convenance il faut que je rajoute en dessous de ça 

 

  1. -- Dates variables
    josdJourFerieTab[os.date("%m-%d",epochPaques)] = true;             -- Pâques
    josdJourFerieTab[os.date("%m-%d",epochPaques+24*60*60)] = true;    -- Lundi de Pâques = Pâques + 1 jour
    josdJourFerieTab[os.date("%m-%d",epochPaques+24*60*60*9)] = true;  -- Ascension = Pâques + 39 jours
    josdJourFerieTab[os.date("%m-%d",epochPaques+24*60*60*49)] = true; -- Pentecôte = Ascension + 49 jours
    1.  

 

Si par exemple je veux rajouter les vacances scolaires des enfants du 2 juillet au 31 aoà»t il faut que je rajoute quoi? 

josdJourFerieTab[os.date("%m-%d",epochZoneB)] = true;             -- Vacance Zone B

 

Besoin d'un coup de main ;) Merci 

Partager ce message


Lien à poster
Partager sur d’autres sites

Regarde sur le blog indiqué au début, l'auteur originel gère les vacances scolaires.

 

N'ayant pas l'utilité, je n'ai pas repris cette fonctionnalité (pour des vacances scolaires passe encore, mais pour des congés durant les périodes scolaires pas très pratique de modifier dans le code)

 

Merci Casinos, je garde sous le coude pour la prochaine version.

Partager ce message


Lien à poster
Partager sur d’autres sites

×