Vacances Scolaires
Je partage avec vous ma première adaptation de Virtual Device (VD) qui gère les vacances scolaires selon les différentes zones en France.
Je suis parti (respect des sources) du code VD Jours Chômés de @HANSOLO et de l'initiative de @mprinfo (Vacances Scolaire De Monsieur Steven) :
Source : https://www.domotique-fibaro.fr/topic/1420-jour-chã´mã©/
Source : https://www.domotique-fibaro.fr/topic/4050-vacances-scolaire-de-monsieur-steven/#comment-59240
Pour info, le code de Monsieur @Steven va traiter le fichier xml telecharge sur "http://telechargement.index-education.com/vacances.xml" et lit les données du fichier pour faire les calculs et afficher les 9 prochaines périodes de vacances scolaires en fonction de votre code département et sa zone scolaire.
J'ai adapté le code pour :
qu'il indique si aujourd'hui et demain sont des jours de vacances scolaires (voir variables ci-dessous)
qu'il précise si le jour en cours est dans une période de vacances scalaires
qu'il affiche la période en cours sur le module (la version de Steven n'affichait que les prochaines période)
actualiser le VD et les variables en utilisant la scène GEA avec la commande suivante (qui simule un clic sur le bouton <Rafraichir>)
Voici le tutorail, il convient :
1) de créer 3 variables globales (ou laisser le VD les créer automatiquement) :
VacScolaire (contient le nombre de jours jusqu'au prochaines vacances scolaires)
VacScolaireJ (contient OUI ou NON pour indiquer si aujourd'hui est un jour de vacances scolaires)
VacScolaireJ1 (contient OUI ou NON pour indiquer si demain est un jour de vacances scolaires)
Vous pouvez également modifier le nom de ces variables globale, notamment nécessaire si vous avez des enfants dans des zones scolaires différentes. Il convient dans ce cas de créer 2 VD avec chacun leurs variables globales.
2) Importer le module virtuel ci-dessous (Vacances_scolaires.vfib.json).
3) Indiquer dans le code du bouton "Rafraichir" votre code département pour déterminer automatiquement votre zone de vacances scolaire :
departement = "78",
varglobal = "VacScolaire",
varglobalJ = "VacScolaireJ",
varglobalJ1 = "VacScolaireJ",
Dans mon cas, c'est le 78 (Yvelines) situé dans la zone C.
Vous pouvez également modifier le nom des variables dans cette même partie de code.
4) Ajouter la commande ci-dessous dans les événements de votre scène GEA (sous le fonction function setEvents() et modifier l'id de votre VD.
GEA.add(true, 30, "", {{"VirtualDevice", 130, 1},{"Time", "00:00", "00:01"}})
La valeur 130 ci-dessus correspond à l'id de mon VD qui est disponible dans le chemin de votre explorateur, exemple : http://192.168.0.30/fibaro/fr/devices/virtual_edit.html?id=128.
5) Modifier éventuellement l'icône fournie ci-dessous de votre VD par celle de votre choix. Depuis le bouton <Rafraichir>.
Vous trouverez ci-joint le fichier module virtuel et l'icône de celui-ci.
Bon usage pour les intéressés et à votre dispo. dans la limite de mes compétences en LUA.
Merci aux sources pour ces partages.
Sources :
VD à importer : Vacances_Scolaires V1.4.vfib.json
Code LUA du bouton rafraîchir : Vacances_scolaires V1.4.lua
Change log :
08/01/2017 : version V1.4 (Création automatique des variables globales + Quelques petites améliorations cosmétiques)
08/01/2017 : version V1.3 (Correction de la mise à jour de la variable globale qui contient le nombre de jours jusqu'au prochaines vacances)
08/01/2017 : version V1.2 (Correction et optimisation du code, suite aux problèmes rencontrés par certaines personnes sur leur iPhone)
19/02/2017 : version V1.1 (Correction bug sur le calcul Jour de VacScolaireJ1 la veille du dernier jour des vacances scolaires)
09/02/2017 : version V1.0 (version initiale)
Testez moi ça, normalement si je ma pas gouré ça doit marcher.
local Ville = "Lille"
local dayofchange = 31 -- Jour du changement d'Année scolaire
local monthofchange = 8 -- Mois du changement d'Année scolaire
local Annee = ""
local data = fibaro:getGlobal("VacancesScolaire")
local i = 1
local now = os.time()
local holiday = false
local holidayd1 = false
local vacance = {}
-- --------------------------------------------------------------------------------------------------------------
-- Determine l'Année Scolaire par rapport aux paramètres monthofchange & dayofchange
-- --------------------------------------------------------------------------------------------------------------
local dateofchange = os.time({day=dayofchange,month=monthofchange,year=os.date("%Y"),hour=0,min=0,sec=0})
if now > dateofchange then
Annee = os.date("%Y").."-"..(os.date("%Y") + 1)
else
Annee = (os.date("%Y") -1).."-"..os.date("%Y")
end
-- --------------------------------------------------------------------------------------------------------------
-- Calcule le nombre de jours entre 2 dates
-- --------------------------------------------------------------------------------------------------------------
function delai(dated, dateparam)
diff = os.difftime(dated, dateparam)
return math.floor(diff / (60*60*24))
end
-- --------------------------------------------------------------------------------------------------------------
-- Transforme une date en string en date exploitable
-- --------------------------------------------------------------------------------------------------------------
function getDateFormat(sdate)
year,month,day = sdate:match("(%d+)-(%d+)-(%d+)")
return os.time({day=day,month=month,year=year,hour=0,min=0,sec=0})
end
local status, jsonTable = pcall(function() return json.decode(data) end)
for j = 1, #jsonTable do
if jsonTable[j].fields.location == Ville and jsonTable[j].fields.annee_scolaire == Annee then
local Description = jsonTable[j].fields.description
local Annee_Scolaire = jsonTable[j].fields.annee_scolaire
local Start_date = tostring(jsonTable[j].fields.start_date)
local End_date = tostring(jsonTable[j].fields.end_date)
Zone = jsonTable[j].fields.zones
--local Ville = jsonTable[j].fields.location
if (now > getDateFormat(Start_date) and now < getDateFormat(End_date)) then
holiday = true
elseif ( getDateFormat(Start_date) > now and not holiday) then
if nextholiday ~= nil then
if getDateFormat(Start_date) < nextholiday then nextholiday = getDateFormat(Start_date) end
else
nextholiday = getDateFormat(Start_date)
end
end
if (now+24*60*60 > getDateFormat(Start_date) and now+24*60*60 < getDateFormat(End_date)) then
holidayd1 = true
end
table.insert(vacance, getDateFormat(Start_date).." - "..getDateFormat(End_date).." | "..Description)
end
end
fibaro:call(fibaro:getSelfId(), "setProperty", "ui.ville.value", Ville)
fibaro:call(fibaro:getSelfId(), "setProperty", "ui.zone.value", Zone)
table.sort(vacance)
for k, v in pairs(vacance) do
local date1 = string.match(v, "(%d+)%s");
local date2 = string.match(v, "-%s(%d+)%s");
local libelle = string.match(v, "|%s(.+)");
fibaro:call(fibaro:getSelfId(), "setProperty", "ui.Label"..k..".value", os.date("%d.%m.%Y", date1) .. " - " .. os.date("%d.%m.%Y", date2) .. " | " .. libelle)
end
if holiday then
fibaro:call(fibaro:getSelfId(), "setProperty", "ui.today.value", "Oui")
else
fibaro:call(fibaro:getSelfId(), "setProperty", "ui.today.value", "Non")
fibaro:call(fibaro:getSelfId(), "setProperty", "ui.status.value", "Dans ".. delai(nextholiday, now) .. " Jours")
end
if holidayd1 then
fibaro:call(fibaro:getSelfId(), "setProperty", "ui.tomorrow.value", "Oui")
else
fibaro:call(fibaro:getSelfId(), "setProperty", "ui.tomorrow.value", "Non")
end