HANSOLO Posté(e) le 26 juin 2014 Signaler Posté(e) le 26 juin 2014 (modifié) 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 Modifié le 25 mai 2015 par HANSOLO 9
Steven Posté(e) le 26 juin 2014 Signaler Posté(e) le 26 juin 2014 Merci beaucoup Envoyé de mon GT-I9192 en utilisant Tapatalk
Fredric Posté(e) le 27 juin 2014 Signaler Posté(e) le 27 juin 2014 un module de plus utile, je dirais
Did Posté(e) le 27 juin 2014 Signaler Posté(e) le 27 juin 2014 Merci Hansolo. Impec ce petit module qui mérite bien une icône. 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"}})
HANSOLO Posté(e) le 27 juin 2014 Auteur Signaler Posté(e) le 27 juin 2014 je mettrais gea.add({"Global","",""},30,"",{{"Virtual..... attention vérifie la syntaxe je l'écrit de mémoire à partir de mon tel
Steven Posté(e) le 27 juin 2014 Signaler Posté(e) le 27 juin 2014 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.
Did Posté(e) le 27 juin 2014 Signaler Posté(e) le 27 juin 2014 Merci messieurs les experts Je surveille cela ce soir.
Did Posté(e) le 27 juin 2014 Signaler Posté(e) le 27 juin 2014 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"}})
Steven Posté(e) le 27 juin 2014 Signaler Posté(e) le 27 juin 2014 Qui m'a volé mon guillemet, qui ? Mea Culpa Envoyé de mon GT-I9192 en utilisant Tapatalk
Krikroff Posté(e) le 27 juin 2014 Signaler Posté(e) le 27 juin 2014 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
HANSOLO Posté(e) le 27 juin 2014 Auteur Signaler Posté(e) le 27 juin 2014 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.
HANSOLO Posté(e) le 27 juin 2014 Auteur Signaler Posté(e) le 27 juin 2014 V2 améliorée par STEVEN publiée
Steven Posté(e) le 27 juin 2014 Signaler Posté(e) le 27 juin 2014 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
Krikroff Posté(e) le 27 juin 2014 Signaler Posté(e) le 27 juin 2014 @Steven, maintenant ils dorment moins -> 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 1
Rocketlud Posté(e) le 29 juin 2014 Signaler Posté(e) le 29 juin 2014 Salut les gars, [modebouletON] je ne comprend pas comment ça fonctionne votre agenda [modebouletOFF] Comment on rentre les dates chomé? Possible d'avoir un éclaircissement? Merci
Rocketlud Posté(e) le 29 juin 2014 Signaler Posté(e) le 29 juin 2014 Arf, j'aurais du lire avant le code, j'aurais compris que les dates doivent être rentré à la mano dans le code;) Sorry 1
Rocketlud Posté(e) le 29 juin 2014 Signaler Posté(e) le 29 juin 2014 Bon encore moi Merci je viens de le mettre en place;) C'est cool
CASINOS Posté(e) le 29 juin 2014 Signaler Posté(e) le 29 juin 2014 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
Rocketlud Posté(e) le 29 juin 2014 Signaler Posté(e) le 29 juin 2014 Encore moi, je suis chaud bouillant 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 -- 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 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
HANSOLO Posté(e) le 29 juin 2014 Auteur Signaler Posté(e) le 29 juin 2014 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.
Messages recommandés