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.
2 iém étape, créer un module virtuel avec deux labels et un bouton:
Le détail:
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