Aller au contenu

Messages recommandés

Posté(e)

@pepite, malheureusement je n'ai pas le temps :s j'utilise même pas ce VD je sais même pas comment il fonctionne. C'était pour aider dans un premier temps à récupérer le fichier.

  • Like 2
Posté(e) (modifié)

Bon finalement voici (c'est bien parce que tu me l'as demandé @pepite :D

 

Création d'une varibale global VacancesScolaire, Créer la scéne ci-dessous, importer le module virtuel ci-joint et modifier dans le premier bouton votre ville et les dates souhaitez. Ensuite faire runner la scène une fois par jour avec GEA par exemple ;)

 

Scene : 

--[[
%% properties
%% events
%% globals
--]]

local id_vd = xxx

local http = net.HTTPClient()
http:request("https://www.data.gouv.fr/fr/datasets/r/000ae493-9fa8-4088-9f53-76d375204036", {  
    success = function(response)
      if response.status == 200 then
        if response.data and response.data ~= "" then
          fibaro:setGlobal("VacancesScolaire", response.data)
          fibaro:call(id_vd, "pressButton", "1")
          fibaro:debug("Success")
        else
          fibaro:debug("Error : empty response data")
        end
      else
        fibaro:debug("Erreur : status=" .. tostring(response.status) .." Message : " .. tostring(response.data))
      end
    end,
    error = function(err)
      fibaro:debug("Erreur : " .. err)
    end,
    options = {
      method = 'GET',
      timeout = 3000,
      headers = {['content-type']='application/json'},
      checkCertificate = false,
    }
})

 

VD Vacances_Scolaire.vfib

 

Modifié par ADN182
Bug Fix
  • Like 2
Posté(e)

Juste pour rendre le truc encore plus automatique, il faudrait que ta variable "Année" ne soit pas codée en dur mais qu'elle soit reprise par rapport à l'année courante (genre fin Aout elle est mise à jour pour la future année scolaire qui arrive ou un truc du genre).

Posté(e) (modifié)

Pour toi @BenjyNet ;) 

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 stats = false


-- --------------------------------------------------------------------------------------------------------------
-- 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)
    local 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 and not state) then
      	nextholiday=getDateFormat(Start_date)
      	state = true
    end
    
    if (now+24*60*60  > getDateFormat(Start_date) and now+24*60*60 < getDateFormat(End_date)) then
       holidayd1 = true 
    end
    fibaro:call(fibaro:getSelfId(), "setProperty", "ui.Label"..i..".value", " du "..Start_date.." au "..End_date.." "..Description)
    i = i + 1
  end
    fibaro:call(fibaro:getSelfId(), "setProperty", "ui.zone.value", Zone)
    fibaro:call(fibaro:getSelfId(), "setProperty", "ui.ville.value", Ville)
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

Il faut désormais renseigner la ville et le jour et mois souhaitais pour le changement d'année scolaire. (par défaut 31 Aout)

Modifié par ADN182
Add code and update first post witth good vd
  • Like 1
Posté(e) (modifié)

Bonsoir

Je viens de déployer le VD avec le code corrigé et la scene

Cela fonctionne, je viens aussi d'ajouter la ligne dans GEA pour lancer la scene toutes les nuits.

 

Toutefois j'ai une question:

    Pourquoi la zone ne se remplie pas ?

    Ville ==> Toulouse

 

D'autre part, je ne comprends pas trop à quoi correspond le champ "Statut"

 

Merci d'avance

Modifié par kioneoranga
Posté(e)
Il y a 19 heures, BenjyNet a dit :

Hey les gars, vous arrivez à créer des variables globales par l'API ?

Selon le firmware ;-)

<4.55

api.post("/globalVariables", {name="Benjynet", isEnum=0})

>4.55

api.post("/globalVariables", {name="BEnjyNet4.55", isEnum=false})

 

A tester bien sur ;-)

 

@kioneoranga

J'avais le souci aussi mais j'ai modifié sans prevenir comme ceci (pardon, j'aurais du..) Je n'ai pas compris Ville s'affichait mais pas Zone..alors que le fonctionnement est identique. Bizarre

 

local Ville = jsonTable[j].fields.location
fibaro:call(fibaro:getSelfId(), "setProperty", "ui.zone.value", Zone)
fibaro:call(fibaro:getSelfId(), "setProperty", "ui.ville.value", Ville)

@ADN182

Je pense que le calcul de la fonction delai n'est pas correcte. ;-)

Ca me met 210 jours aujourd'hui ;-) avant les Vacances de LA toussaint en Octobre

 

Petit Detail : peut-etre trier les Labels des vacances les plus proches aux plus éloignées ;-) Qu'en penses tu ?

 

Merci pour le boulot
   

Posté(e)

Venez habité sur Lille ;) ça fonctionne plus sérieusement faut que je regarde, j'ai dû bien tombé avec Lille, faut rajouter le stockage des date et vérifier la plus proche quelques choses du genre.

Envoyé de mon Nexus 5X en utilisant Tapatalk

Posté(e)

@pepite

Bonjour, je ne comprends pas bien en quoi consiste la correction que tu as faite pour correctement prendre en compte la "Zone"

Désolé je ne dois pas avoir les yeux en face des trous ce matin.... hihihihihi

 

Ensuite c'est clair le calcul du nombre de jour avant les prochains congés est un peu long, je ne vais pas tenir moi non plus jusque là

Et pour finir, je ne sais pas par quel biais, mais si dans la liste des congés  affichée via les labels, cela pouvait être dans l'ordre chrono cela serait parfait.  :-)

 

Merci encore pour ce nouveau mécanisme

 

Posté(e)

Chez moi ça marche pas, il me trouve toujours en vacances :)

Ce qu'il faudrait faire pour améliorer le script ci-dessus, c'est de stocker les données de vacances dans une table provisoire et de la trier sur les dates de début puis ensuite de les afficher dans l'ordre.

Posté(e) (modifié)

Hello,

 

Voici le code avec les modifs demandées (j'ai mis à jour mon post avec le VD) : 

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, " du "..Start_date.." au "..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
  fibaro:call(fibaro:getSelfId(), "setProperty", "ui.Label"..k..".value", v)
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

 

Modifié par ADN182
Posté(e)
Le 07/09/2019 à 09:02, Sakkhho a dit :

pour info 

le VD qui allait chercher telechargement.index-education.com

refonctionne très bien chez moi 

 

Bonjour @sakkhho

 

Ah bon ? il y a une erreur pourtant non ? sur le difftime, le xml ne doit pas renvoyer une date de vacances non ?

Si ca tourne chez toi, peux tu partager le code stp ? merci

Posté(e) (modifié)

J'avais un soucis dans le json. Donc ça ne marchait pas. Là c'est good.

Donc impeccable, merci l'ami.

 

Ah non, j'ai dit une connerie, la zone ne se met pas à jour.

Modifié par BenjyNet
Oups
Posté(e)

Yep j'avais trouvé. Je vais me permettre de modifier un peu ton code pour le côté esthétique des dates. Si y'a besoin je partagerai, rien de transcendant.

  • Upvote 2
Posté(e)
Il y a 2 heures, BenjyNet a dit :

Yep j'avais trouvé. Je vais me permettre de modifier un peu ton code pour le côté esthétique des dates. Si y'a besoin je partagerai, rien de transcendant.

Partage, partage   :-)

Vive cette communauté

×
×
  • Créer...