Aller au contenu
mprinfo

Scene Lua - Jour / Nuit Avec Décalge Possible Et Optimisation Du Sleep

Recommended Posts

Voici un Scène qui va vous permettre de savoir si on est le jour ou la nuit

et d'avoir un décalage en minute par rapport ou jour ou a la nuit

 

 

 

  • IL va nous falloir pour cette scène 2 variables globales et 1 variable globale prédéfinie
    • Jour_Nuit (Variable prédéfinie avec comme valeur Jour ou Nuit. elle aura 2 déclenchements)
    • SoleilLever (cette variable recevra les valeurs de la table TLever elle aura donc autant de déclenchement que de valeur dans la table TLever)
    • SoleilCoucher (Cette variable recevra les valeurs de la table TCoucher, elle aura donc autant de déclenchement que de valeur dans la table TCoucher)
    • Ces variables seront créées automatiquement si vous êtes en V4. Vous pouvez donnez un autre nom a chaque variable globales que les valeurs par défaut.
      -- Nom des Variables Globales
      local VGJourNuit = "Jour_Nuit"
      local VGLeverSoleil = "SoleilLever"
      local VGCoucherSoleil = "SoleilCoucher"
      -- Minutes de décalages par rapport au lever du soleil
      local TLever = {-60, -15, 30, 60, 50, 124}
      -- Minutes de décalages par rapport au Coucher du soleil
      local TCoucher = {-5, 30, 0, -30}
      -- Id du téléphone
      local IdTel = 181
    • Pour notre ami JoJo ainsi qu'a tout ceux qui sont en V3.60 il faudra crées les variables manuellement :D et désactivé ces trois lignes
      VerifVG(VGJourNuit, "Jour", {"Jour", "Nuit"})
      VerifVG(VGLeverSoleil, 0)
      VerifVG(VGCoucherSoleil, 0)
      -----------------------------
  • Il faut renseigner IdTel avec l'id de votre téléphone cela va servir a vous envoyez une notification lorsque la box démarre ou lorsqu il y a modification de la scène. Une notification est aussi possible si il y a un probléme de variable globale.
  • Le programme est optimisez pour que le sleep passe automatiquement de 1 mn à  30 mn en fonction des valeurs des tables coucher et lever

 

Exemple d'utilisation :

 

Scène bloc :

med_gallery_374_249_149691.jpg

 

Scène LUA

 

je veux un déclenchement de scène (Il n'y a aucun ordre a respecter)

  • 45 minutes avant le lever = -45
  • 15 minutes avant le lever = -15
  • 23 minutes apres le lever = 20
  • 1h20 minutes apres le lever = 80
  • 0 minutes = Jour dans la tables TLever il est donc inutile de mettre 0, il sera ajouter automatiquement a la table

Je renseigne donc ma table TLever comme ceci

local TLever = {-45, 20, 80, -15}

Je fais de même avec la table TCoucher

local TCoucher = {-5, 30, -30}

Récupération des triggers dans une scène

  • Utilisation de la variables globales Jour_Nuit comme trigger
        --[[
        %% globals
        Jour_Nuit
        --]]
    
        local JourNuit = fibaro:getGlobalValue("Jour_Nuit")
    
        if JourNuit == "Jour" then
           fibaro:debug("Il fait "..JourNuit)
        end
    
        if JourNuit == "Nuit" then
           fibaro:debug("Il fait "..JourNuit)
        end
    
    
    
  • Utilisation de ou des variables globales SoleilLever et SoleilCoucher comme trigger

    --[[
    %% globals
    SoleilLever
    SoleilCoucher 
    --]]
    
    local trigger = fibaro:getSourceTrigger()
    
    if (trigger['type'] == 'global') then
      LeverCoucher = trigger['name']
      valeur = tonumber(fibaro:getGlobalValue(LeverCoucher))
      print(nom, valeur)
    end
    
    -- le code dans ce test sera déclencher 15 mn aprés le coucher
    if LeverCoucher == "SoleilCoucher" and valeur == 15 then
      
       fibaro:call(7, "close") --Fermeture volet 15 mn après le coucher
      
    end  
    
    -- le code dans ce test sera déclancher 30 mn avant le coucher
    if nom == "SoleilLever" and valeur == -30 then
      
       fibaro:call(7, "close") --Fermeture volet 30 mn avant le lever du soleil
    
    end
    
  • :13: Merci a STEVEN pour m'avoir aider a optimisez ce code :13:

Voici le code a copier dans une scène Version 3.00b

--[[
%% autostart
--]]

-- Nom des Variables Globales
local VGJourNuit = "Jour_Nuit"
local VGLeverSoleil = "SoleilLever"
local VGCoucherSoleil = "SoleilCoucher"
-- Minutes de décalages par rapport au lever du soleil
local TLever = {-60, -15, 30, 60, 50, 124}
-- Minutes de décalages par rapport au Coucher du soleil
local TCoucher = {-5, 30, 0, -30}
-- Id du téléphone
local IdTel = 181

--************ Ne rien modifier en dessous de cette ligne ************
 
----------------------------------------------------------------------
-- Envoi d'un Push pour avertir que le box à  démarrer ou redémarrer --
----------------------------------------------------------------------
function EnvoiPush(Message)
        fibaro:debug(Message)
        fibaro:call(IdTel, "sendPush", Message)
end

-- -----------------------------------------------------------------
--       Vérification Variable Globale et création si besoin      --  
-- -----------------------------------------------------------------
function VerifVG(nom, valeur, choix)
        if (fibaro:getGlobalValue(nom) == nil) then
	       local enum = 0
	       if (type(choix) ~= "nil") then
    	      enum = 1
	       end
  	       api.post("/globalVariables", {name=nom, isEnum=enum}) 
           if enum == 1 then
              local variable = {}
	          variable.value = tostring(valeur)
	          variable.isEnum = false
	          if (type(choix) ~= "nil") then
		         variable.isEnum = true
		         variable.enumValues = choix
	          end
  	          api.put("/globalVariables/" .. nom, variable)
           end
        end
end
 
----------------------------------------------------------------------
--                   Mise a jour d'une variable global              --
----------------------------------------------------------------------
function UpdateVG(NomVG, Valeurs)
        if (fibaro:getGlobalValue(NomVG) == nil) then
           fibaro:debug("il faut cree la variable "..NomVG)
           EnvoiPush(string.format("La variable Globale %s n'existe pas ou a ete supprimer", NomVG))
           fibaro:abort() -- fin du programme
        end
           fibaro:debug("Mise a jour de la Variable Globale : "..NomVG.." = "..Valeurs)
           fibaro:setGlobal(NomVG, Valeurs);
end
 
----------------------------------------------------------------------
--           Vérification de l'heure et mise à  jour                 --
--                de la variable si nécessaire                      --
----------------------------------------------------------------------
function UpdateJourNuit(NomVG, heure)
        local valeurs = "Nuit"
        -- test si on est le jour ou la nuit
        if (heure >= leverSoleil) and (heure < coucherSoleil) then
           valeurs = "Jour"
	    end
        fibaro:debug(string.format("Lever Soleil : %s - Coucher Soleil : %s", leverSoleil, coucherSoleil))
        UpdateVG(NomVG, valeurs) -- mise a jour de la VG Jour_Nuit
end
 
----------------------------------------------------------------------
--          Compare les tables Lever et coucher du soleil           --
--                   avec sunrisehour et sunsethour                 --
----------------------------------------------------------------------
function LeverCoucher(NomVG, TableNom, SunRiseSet, JourNuit)
        for index, v in ipairs(TableNom) do
           if (os.date("%H:%M", os.time()+v*-60)) == SunRiseSet then
              UpdateVG(NomVG, v)
              if v == 0 then
                 fibaro:debug("il fait : "..JourNuit)
                 UpdateVG(VGJourNuit, JourNuit)
              end
           end
        end
end

----------------------------------------------------------------------
--           Conversion Date format texte en format Date            --
----------------------------------------------------------------------
function ConvertionDate(NomDate)
         
          -- on extrait l'heure et minute (%d+) est un digit
         local heure, minute = string.match(NomDate, "(%d+):(%d+)") 
         -- On récupère l'heure et date actuelle sous forme de tableau
         local TableDate = os.date("*t")
         -- On modifie l'heure et les minutes
         TableDate.hour = heure
         TableDate.min = minute
         -- Nous pouvons maintenant exploiter "MonHeure" comme une vrai date
         local MonHeure = os.time(TableDate)
         return (MonHeure)
end

---------------------------------------------------------------------------- 
--           Calcul la valeur du Sleep en fonction des Max et Mini        --
--                       des Tables Lever et Coucher                      --
----------------------------------------------------------------------------
function calculPause(j, heure, minilever, maxilever, minicoucher, maxicoucher)
         fibaro:debug("Heure Actuelle : "..heure)
         -- mini et max lever
         local heurelever = ConvertionDate(leverSoleil)
         local heureleverMini = (os.date("%X", heurelever+(minilever*60)))
         local heureleverMaxi = (os.date("%X", heurelever+(maxilever*60)))
         fibaro:debug("heure Lever Soleil Mini : "..heureleverMini.." - Maxi : "..heureleverMaxi)
         -- mini et max coucher
         local heurecoucher = ConvertionDate(coucherSoleil)
         local heurecoucherMini = (os.date("%X", heurecoucher+(minicoucher*60)))
         local heurecoucherMaxi = (os.date("%X", heurecoucher+(maxicoucher*60)))
         fibaro:debug("heure Coucher Soleil Mini : "..heurecoucherMini.." - Maxi : "..heurecoucherMaxi)
         if heure >= heureleverMini and heure < heureleverMaxi 
            or heure >= heurecoucherMini and heure < heurecoucherMaxi then
            j=1
         end
         return (j)
end
 
-- ===================================================================
-- ==        Nous avons fini la préparation de notre code           ==
-- ==            Nous pouvons  Exécuter le programme                ==
-- ==         Script réaliser par MPRINFO  Version 3.00B            ==
-- ==             Grand Merci à  STEVEN pour son aide                ==
-- ===================================================================

----------------------------------------------------------------------
--   Envoi d'un Push pour donner la date et l'heure de démarrage    --
----------------------------------------------------------------------
EnvoiPush(string.format("La box a démarré le %s a %s", os.date("%d/%m/%Y"), os.date("%R")))

----------------------------------------------------------------------
--               Contrôle si 1 Scène et déjà  en cours               --
----------------------------------------------------------------------
local NbreScene = fibaro:countScenes()
if NbreScene ~= 1 then;
  fibaro:debug("Il y a déjà  une instance en cours... ")
  fibaro:abort();
end
 
----------------------------------------------------------------------
--          Vérification si les variables globales existe           --
--              et Création ou Modification si Besoin               --
----------------------------------------------------------------------
VerifVG(VGJourNuit, "Jour", {"Jour", "Nuit"})
VerifVG(VGLeverSoleil, 0)
VerifVG(VGCoucherSoleil, 0)
----------------------------------------------------------------------
-- Mise a jour de la variable VG Jour_Nuit au Démarrage de la Box   --
--        Ou lors de la sauvegarde de la scène                      --
----------------------------------------------------------------------
leverSoleil = fibaro:getValue(1, "sunriseHour")
coucherSoleil = fibaro:getValue(1, "sunsetHour")
UpdateJourNuit(VGJourNuit, os.date("%H:%M", os.time()))

---------------------------------------------------------------------
--    Trie des Tables et récupération des valeurs min et maximum   --
---------------------------------------------------------------------
-- Traitement de la Table TLever
table.insert(TLever, 1, 0) -- ajout de 0 mn dans la table
table.sort(TLever)
local MiniLever = ((TLever[1]-30))
local MaxiLever = ((TLever[#TLever]+1))
-- Traitement de la Table TChoucher
table.insert(TCoucher, 1, 0) -- ajout de 0 mn dans la table
table.sort(TCoucher)
local MiniCoucher = ((TCoucher[1]-30))
local MaxiCoucher = ((TCoucher[#TCoucher]+1))

---------------------------------------------------------------------
--    Test toute les minutes pour savoir si c'est jour ou nuit     --
---------------------------------------------------------------------
while true do
  
    local j = 30
    local osHeure = os.date("%H:%M", os.time())
    leverSoleil = fibaro:getValue(1, "sunriseHour")
    coucherSoleil = fibaro:getValue(1, "sunsetHour")
 
    LeverCoucher(VGLeverSoleil, TLever, leverSoleil, "Jour")
    LeverCoucher(VGCoucherSoleil, TCoucher, coucherSoleil, "Nuit")
 
    
    j = calculPause(j, osHeure, MiniLever, MaxiLever, MiniCoucher, MaxiCoucher)
    fibaro:debug(string.format("Valeur du Sleep %s mn",j))
        
    fibaro:sleep(j*60*1000); -- Pause en fonction de la valeur de J
  
end

A ceux qui vont utiliser cette scène, Merci de me faire un retour sur ce code...

  • Upvote 9

Partager ce message


Lien à poster
Partager sur d’autres sites

Hello,

 

superbe taf ! Merci Merci

 

Il y a vraiment du taf c'est vraiment impressionnant, je vais tester cela, cependant faut-il que l'on supprime l'ancienne version sur notre box avec les variables et tout refaire proprement ou pas ?

 

Sinon GG les gars

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui ca serai mieux

Les variables ce créée automatiquement donc aucun soucis

Envoyé avec mon SmartPhone

Partager ce message


Lien à poster
Partager sur d’autres sites

salut

 

dis moi, je trouver le module avec Jour_Soir_Nuit plus adéquat,,, a savoir que je me sert de soir pour déclencher les lumières (baisse lux, 16h hiver et 22h été) et me sert du nuit (23h) pour couper la VMC ou tout autres !

 

En l'occurrence, le mode nuit serait Soir pour moi, et il faudrait que je rajoute un mode nuit,,,,? est ce possible avec ta scène?

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui tu peux le faire. Si tu t'y commais un peu en lua c'est assez simple. Je suis sur mon tel mais demain je peux te donner le code qu'il faut ajouter

Envoyé avec mon SmartPhone

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui je veux bien ton code , a comparer avec celui que je viens de pondre,,,a savoir,,,,TOUTES tes nuit tranformer en Soir ! Et une heur fixe pour basculer en Nuit,

 

j'ai une mise à  jour toutes les 6mins (pour le mode nuit), le cas ou la VMC Vitesse 2 est allumer par exces C02 > 1200ppm

 

--[[
%% autostart
--]]
 
-- Nom des Variables Globales
local VGJourNuit = "Jour_Nuit"
local VGLeverSoleil = "SoleilLever"
local VGCoucherSoleil = "SoleilCoucher"
-- Minutes de décalages par rapport au lever du soleil
local TLever = {-60, -15, 30, 60, 50, 124}
-- Minutes de décalages par rapport au Coucher du soleil
local TCoucher = {-5, 30, 0, -30}
-- Id du téléphone
local IdTel = 24

local sourceTrigger = fibaro:getSourceTrigger();
function tempFunc()
local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
 ( (tonumber(os.date("%H%M")) >= tonumber(string.format("%02d%02d", "21", "45")) or tonumber(os.date("%H%M")) <= tonumber(string.format("%02d%02d", "07", "30"))) and (math.floor(os.time()/60)-math.floor(1430599500/60))%6 == 0 )
)
then
	fibaro:setGlobal("Jour_Nuit", "Nuit");
end

setTimeout(tempFunc, 60*1000)
end
if (sourceTrigger["type"] == "autostart") then
tempFunc()
else

local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
startSource["type"] == "other"
)
then
	fibaro:setGlobal("Jour_Nuit", "Nuit");
end

end

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci Pascal,

 

J'adoreeeeeeuuuuuuuuuu

 

-------------

 

Voici un test de scène que j'ai voulu faire en mode bloc transformer en LUA pour toi :)

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

local startSource = fibaro:getSourceTrigger();
if (
 ( tonumber(fibaro:getGlobalValue("SoleilCoucher")) == tonumber("0") )
or
startSource["type"] == "other"
)
then
	fibaro:call(175, "pressButton", "1");
end

L'idée est d’appeler le bouton virtuel avec le ON pour allumer les LED de la terasses ^^

 

Mais ca marche pas lol

 

---------------------

 

Rectification ! ça marche, pour mon test j'ai demandé dans la scène d'éteindre les LED de la terrasses au bout de 30 secondes !

 

Par contre il considère comment le SoleilCoucher ? c'est a qu'elle heure?, et comment lui dire si il faut démarrer genre 15 ou 30 min après le couché du soleil ?

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

local startSource = fibaro:getSourceTrigger();
if (
 ( tonumber(fibaro:getGlobalValue("SoleilCoucher")) == tonumber("0") )
or
startSource["type"] == "other"
)
then
	fibaro:call(175, "pressButton", "1");
	setTimeout(function()
		fibaro:call(175, "pressButton", "2");
	end, 30000)
end

Modifié par cybersquat

Partager ce message


Lien à poster
Partager sur d’autres sites

voici comment on fait avec un scéne bloc il faut mettre la variable comme déclencheur

med_gallery_374_249_149691.jpg

Partager ce message


Lien à poster
Partager sur d’autres sites

@mprinfo,

 

Exactement ça que j'ai effectué, bon ca me rassure lol, j'étais dans ma bonne logique, je pourrai ensuite la transformer en LUA et la laisser ainsi !

 

En plus sur le mien je vais lui coller un autre ( ET - re bouton pour éteindre les led de la terrasses tant de minutes plus loin ou heures)

 

 

Merci de ton aide Pascal, c'est apprécié !

Partager ce message


Lien à poster
Partager sur d’autres sites

 

Oui je veux bien ton code , a comparer avec celui que je viens de pondre,,,a savoir,,,,TOUTES tes nuit tranformer en Soir ! Et une heur fixe pour basculer en Nuit,

 

j'ai une mise à  jour toutes les 6mins (pour le mode nuit), le cas ou la VMC Vitesse 2 est allumer par exces C02 > 1200ppm

 

--[[
%% autostart
--]]
 
-- Nom des Variables Globales
local VGJourNuit = "Jour_Nuit"
local VGLeverSoleil = "SoleilLever"
local VGCoucherSoleil = "SoleilCoucher"
-- Minutes de décalages par rapport au lever du soleil
local TLever = {-60, -15, 30, 60, 50, 124}
-- Minutes de décalages par rapport au Coucher du soleil
local TCoucher = {-5, 30, 0, -30}
-- Id du téléphone
local IdTel = 24

local sourceTrigger = fibaro:getSourceTrigger();
function tempFunc()
local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
 ( (tonumber(os.date("%H%M")) >= tonumber(string.format("%02d%02d", "21", "45")) or tonumber(os.date("%H%M")) <= tonumber(string.format("%02d%02d", "07", "30"))) and (math.floor(os.time()/60)-math.floor(1430599500/60))%6 == 0 )
)
then
	fibaro:setGlobal("Jour_Nuit", "Nuit");
end

setTimeout(tempFunc, 60*1000)
end
if (sourceTrigger["type"] == "autostart") then
tempFunc()
else

local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
startSource["type"] == "other"
)
then
	fibaro:setGlobal("Jour_Nuit", "Nuit");
end

end

 

ce code ne fonctionnera pas car il ne sera exécuté qu'une seule fois au démarrage et après il ne sera plus lu

Partager ce message


Lien à poster
Partager sur d’autres sites

je viens de regarder ce que tu veux la scéne jour_nuit n'est pas vraiment adapter pour ce que tu veux faire

 

pour exécuter une scéne avec des triggers voici un tuto : http://www.domotique-fibaro.fr/index.php/topic/4153-tout-sur-le-d%C3%A9clenchement-dune-sc%C3%A9ne-en-lua-by-steven/

 

Il faudrait crée un scène qui démarre au démarrage de la box avec une boucle while true do qui s'exécute en permanence on n'y mets un sleep de 60s comme cela la boucle s'exécutera toutes le minutes

 

exemple :

while true do
 
    local osHeure = os.date("%H:%M", os.time())
    fibaro:debug("il est : "..osHeure)
    fibaro:sleep(60*1000); -- Pause en fonction de 1mn
end

toutes les minutes tu auras dans le debug il est : .......

while true do
  if (
     ( (tonumber(os.date("%H%M")) >= tonumber(string.format("%02d%02d", "21", "45")) 
     or tonumber(os.date("%H%M")) <= tonumber(string.format("%02d%02d", "07", "30"))) 
     and (math.floor(os.time()/60)-math.floor(1430599500/60))%6 == 0 )
     )
  then
    fibaro:setGlobal("Jour_Nuit", "Nuit");
  end
   
    fibaro:sleep(60*1000); -- Pause en fonction de 1mn
end

La tu as une scène qui prend en compte tes conditions et qui mets a jour la variable Jour_Nuit sur nuit

 

dans ma scène si tu ajoutes

VerifVG(VGJourNuit, "Jour", {"Jour", "Nuit"})

que tu remplaces par

VerifVG(VGJourNuit, "Jour", {"Jour", "Nuit", "Soir"})

et que tu remplaces

function UpdateJourNuit(NomVG, heure)
        local valeurs = "Nuit"

par

function UpdateJourNuit(NomVG, heure)
        local valeurs = "Soir"

tu auras soir au lieu de nuit au coucher du soleil.

Partager ce message


Lien à poster
Partager sur d’autres sites

 

Merci Pascal,

 

J'adoreeeeeeuuuuuuuuuu

 

-------------

 

Voici un test de scène que j'ai voulu faire en mode bloc transformer en LUA pour toi :)

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

local startSource = fibaro:getSourceTrigger();
if (
 ( tonumber(fibaro:getGlobalValue("SoleilCoucher")) == tonumber("0") )
or
startSource["type"] == "other"
)
then
	fibaro:call(175, "pressButton", "1");
end

L'idée est d’appeler le bouton virtuel avec le ON pour allumer les LED de la terasses ^^

 

Mais ca marche pas lol

 

---------------------

 

Rectification ! ça marche, pour mon test j'ai demandé dans la scène d'éteindre les LED de la terrasses au bout de 30 secondes !

 

Par contre il considère comment le SoleilCoucher ? c'est a qu'elle heure?, et comment lui dire si il faut démarrer genre 15 ou 30 min après le couché du soleil ?

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

local startSource = fibaro:getSourceTrigger();
if (
 ( tonumber(fibaro:getGlobalValue("SoleilCoucher")) == tonumber("0") )
or
startSource["type"] == "other"
)
then
	fibaro:call(175, "pressButton", "1");
	setTimeout(function()
		fibaro:call(175, "pressButton", "2");
	end, 30000)
end

salut

 

le mode nuit est jour sont l'heure de coucher ou du lever du soleil ces information sont mise a jour tout les jours

 

si tu veux un décalage de 30 mm tu mets dans la table 30 mn et dans ta scéne bloc tu mets 30 mn c'est tout simple

j'ai mis un exemple sur le post 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Yop,

 

Oui c'est ceux que j'ai fait et ca marche nickel :) ce soir ca a marché nickel ^^

 

Merci

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci mprinfo,,, je test cela

--[[
%% autostart
--]]
 
-- Nom des Variables Globales
local VGJourNuit = "Jour_Nuit"
local VGLeverSoleil = "SoleilLever"
local VGCoucherSoleil = "SoleilCoucher"
-- Minutes de décalages par rapport au lever du soleil
local TLever = {-60, -15, 30, 60, 50, 124}
-- Minutes de décalages par rapport au Coucher du soleil
local TCoucher = {-5, 30, 0, -30}
-- Id du téléphone
local IdTel = 24



--************ Ne rien modifier en dessous de cette ligne ************
 
----------------------------------------------------------------------
-- Envoi d'un Push pour avertir que le box àdémarrer ou redémarrer --
----------------------------------------------------------------------
function EnvoiPush(Message)
        fibaro:debug(Message)
        fibaro:call(IdTel, "sendPush", Message)
end
 
-- -----------------------------------------------------------------
--       Vérification Variable Globale et création si besoin      --  
-- -----------------------------------------------------------------
function VerifVG(nom, valeur, choix)
        if (fibaro:getGlobalValue(nom) == nil) then
	       local enum = 0
	       if (type(choix) ~= "nil") then
    	      enum = 1
	       end
  	       api.post("/globalVariables", {name=nom, isEnum=enum}) 
           if enum == 1 then
              local variable = {}
	          variable.value = tostring(valeur)
	          variable.isEnum = false
	          if (type(choix) ~= "nil") then
		         variable.isEnum = true
		         variable.enumValues = choix
	          end
  	          api.put("/globalVariables/" .. nom, variable)
           end
        end
end
 
----------------------------------------------------------------------
--                   Mise a jour d'une variable global              --
----------------------------------------------------------------------
function UpdateVG(NomVG, Valeurs)
        if (fibaro:getGlobalValue(NomVG) == nil) then
           fibaro:debug("il faut cree la variable "..NomVG)
           EnvoiPush(string.format("La variable Globale %s n'existe pas ou a ete supprimer", NomVG))
           fibaro:abort() -- fin du programme
        end
           fibaro:debug("Mise a jour de la Variable Globale : "..NomVG.." = "..Valeurs)
           fibaro:setGlobal(NomVG, Valeurs);
end
 
----------------------------------------------------------------------
--           Vérification de l'heure et mise àjour                 --
--                de la variable si nécessaire                      --
----------------------------------------------------------------------
function UpdateJourNuit(NomVG, heure)
        local valeurs = "Soir"
        -- test si on est le jour ou la nuit
        if (heure >= leverSoleil) and (heure < coucherSoleil) then
           valeurs = "Jour"
	    end
        fibaro:debug(string.format("Lever Soleil : %s - Coucher Soleil : %s", leverSoleil, coucherSoleil))
        UpdateVG(NomVG, valeurs) -- mise a jour de la VG Jour_Nuit
end
 
----------------------------------------------------------------------
--          Compare les tables Lever et coucher du soleil           --
--                   avec sunrisehour et sunsethour                 --
----------------------------------------------------------------------
function LeverCoucher(NomVG, TableNom, SunRiseSet, JourNuit)
        for index, v in ipairs(TableNom) do
           if (os.date("%H:%M", os.time()+v*-60)) == SunRiseSet then
              UpdateVG(NomVG, v)
              if v == 0 then
                 fibaro:debug("il fait : "..JourNuit)
                 UpdateVG(VGJourNuit, JourNuit)
              end
           end
        end
end
 
----------------------------------------------------------------------
--           Conversion Date format texte en format Date            --
----------------------------------------------------------------------
function ConvertionDate(NomDate)
 
          -- on extrait l'heure et minute (%d+) est un digit
         local heure, minute = string.match(NomDate, "(%d+)%d+)") 
         -- On récupère l'heure et date actuelle sous forme de tableau
         local TableDate = os.date("*t")
         -- On modifie l'heure et les minutes
         TableDate.hour = heure
         TableDate.min = minute
         -- Nous pouvons maintenant exploiter "MonHeure" comme une vrai date
         local MonHeure = os.time(TableDate)
         return (MonHeure)
end
 
---------------------------------------------------------------------------- 
--           Calcul la valeur du Sleep en fonction des Max et Mini        --
--                       des Tables Lever et Coucher                      --
----------------------------------------------------------------------------
function calculPause(j, heure, minilever, maxilever, minicoucher, maxicoucher)
         fibaro:debug("Heure Actuelle : "..heure)
         -- mini et max lever
         local heurelever = ConvertionDate(leverSoleil)
         local heureleverMini = (os.date("%X", heurelever+(minilever*60)))
         local heureleverMaxi = (os.date("%X", heurelever+(maxilever*60)))
         fibaro:debug("heure Lever Soleil Mini : "..heureleverMini.." - Maxi : "..heureleverMaxi)
         -- mini et max coucher
         local heurecoucher = ConvertionDate(coucherSoleil)
         local heurecoucherMini = (os.date("%X", heurecoucher+(minicoucher*60)))
         local heurecoucherMaxi = (os.date("%X", heurecoucher+(maxicoucher*60)))
         fibaro:debug("heure Coucher Soleil Mini : "..heurecoucherMini.." - Maxi : "..heurecoucherMaxi)
         if heure >= heureleverMini and heure < heureleverMaxi 
            or heure >= heurecoucherMini and heure < heurecoucherMaxi then
            j=1
         end
         return (j)
end
 
-- ===================================================================
-- ==        Nous avons fini la préparation de notre code           ==
-- ==            Nous pouvons  Exécuter le programme                ==
-- ==         Script réaliser par MPRINFO  Version 3.00B            ==
-- ==             Grand Merci àSTEVEN pour son aide                ==
-- ===================================================================
 
----------------------------------------------------------------------
--   Envoi d'un Push pour donner la date et l'heure de démarrage    --
----------------------------------------------------------------------
EnvoiPush(string.format("La box a démarré le %s a %s", os.date("%d/%m/%Y"), os.date("%R")))
 
----------------------------------------------------------------------
--               Contrôle si 1 Scène et déjàen cours               --
----------------------------------------------------------------------
local NbreScene = fibaro:countScenes()
if NbreScene ~= 1 then;
  fibaro:debug("Il y a déjàune instance en cours... ")
  fibaro:abort();
end
 
----------------------------------------------------------------------
--          Vérification si les variables globales existe           --
--              et Création ou Modification si Besoin               --
----------------------------------------------------------------------
VerifVG(VGJourNuit, "Jour", {"Jour", "Nuit", "Soir"})
VerifVG(VGLeverSoleil, 0)
VerifVG(VGCoucherSoleil, 0)
----------------------------------------------------------------------
-- Mise a jour de la variable VG Jour_Nuit au Démarrage de la Box   --
--        Ou lors de la sauvegarde de la scène                      --
----------------------------------------------------------------------
leverSoleil = fibaro:getValue(1, "sunriseHour")
coucherSoleil = fibaro:getValue(1, "sunsetHour")
UpdateJourNuit(VGJourNuit, os.date("%H:%M", os.time()))
 
---------------------------------------------------------------------
--    Trie des Tables et récupération des valeurs min et maximum   --
---------------------------------------------------------------------
-- Traitement de la Table TLever
table.insert(TLever, 1, 0) -- ajout de 0 mn dans la table
table.sort(TLever)
local MiniLever = ((TLever[1]-30))
local MaxiLever = ((TLever[#TLever]+1))
-- Traitement de la Table TChoucher
table.insert(TCoucher, 1, 0) -- ajout de 0 mn dans la table
table.sort(TCoucher)
local MiniCoucher = ((TCoucher[1]-30))
local MaxiCoucher = ((TCoucher[#TCoucher]+1))
 
---------------------------------------------------------------------
--    Test toute les minutes pour savoir si c'est jour ou nuit     --
---------------------------------------------------------------------
while true do
  if (
     ( (tonumber(os.date("%H%M")) >= tonumber(string.format("%02d%02d", "21", "45")) 
     or tonumber(os.date("%H%M")) <= tonumber(string.format("%02d%02d", "07", "30"))) 
     and (math.floor(os.time()/60)-math.floor(1430599500/60))%6 == 0 )
     )
  then
    fibaro:setGlobal("Jour_Nuit", "Nuit");
  end
 
    fibaro:sleep(60*1000); -- Pause en fonction de 1mn
end

Partager ce message


Lien à poster
Partager sur d’autres sites

et d'ailleurs, pense a le signer ton code tout en haut,,,,, :13:

 

IMPECC,,,, premier test OK

Partager ce message


Lien à poster
Partager sur d’autres sites

@q.philippe je préfère resté discret :D

 

Voici un exemple de script qui utilise lever et coucher du soleil c'est une version teste qui fonctionne :D

Je donne ce script a titre d'exemple il n'y aura aucun support

--[[
%% globals
SoleilLever
SoleilCoucher 
--]]
local mesvolets ={
    ["Bureau"] = 5,
    ["Ch_Enfants1"] = 7,
    ["Chaufferie"] = 9,
    ["Ch_Enfants2"] = 17,
    ["Ch_Parents"] = 19,
    ["Cuisine"] = 23,
    ["SAM"] = 25,
    ["SdB"] = 27,
    ["Salon"] = 29,
  }
-- Table Zone (Groupes de modules)
local RDC = {"Bureau", "Ch_Enfants2", "Chaufferie"}
local Nord = {"Bureau", "Ch_Parents", "Cuisine", "SAM"}
local Jardin = {"Chaufferie", "Ch_Amis", "SdB"}
local chambre = {"Ch_Parents", "Ch_Enfants1"}
--------------------------------------------------------------------------
local nomLever = "SoleilLever" --> Nom de la Variable Globale lever soleil
local nomCoucher = "SoleilCoucher" --> Nom de la Variable Globale coucher soleil
local JourChome = fibaro:getGlobalValue("JourChome") --> Nom de la variable Module Virtuel Hansloo
local Conges = fibaro:getGlobalValue("Conges")
local IdTel = fibaro:getGlobalValue("IdI9305") -- Recuperation de id du tel pour le push
local Pause = 0 -- Temp de pause entre chaque commande de modules en seconde

-----------------------------------------------------------------------
-- Test si la valeur a enoyer est différente de la valeur du module
-----------------------------------------------------------------------
function testvaleur(id, valeurs)
         local GetValeur = tonumber(fibaro:getValue(id, "value"))
         if valeurs ~= GetValeur then
            fibaro:call(id, "setValue", valeurs)
            fibaro:debug(id.." - action en cours... - Valeur "..valeurs)
         end
end
----------------------------------------------------------------------------
-- Recupération de l'id par rapport au nom de la tables mesvolets
----------------------------------------------------------------------------
function volets(zone, valeurs)
        if zone == nil then
           fibaro:debug("Erreur dans la table ou table inéxitante")
           fibaro:abort()
        end
        if (type(zone) == "table") then  
           for i,v in ipairs(zone) do
              local id = mesvolets[v]
              if id == nil then
                 fibaro:debug("ERREUR NOM DU VOLET - "..v.." - dans une table")
              else
                 testvaleur(id, valeurs) 
              end
           end
        elseif (type(zone) == "string") then
           local id = mesvolets[zone]
           if id == nil then
              fibaro:debug("ERREUR DANS LE NOM DU VOLET : "..zone)
           else
              testvaleur(id, valeurs) 
           end
        else
           fibaro:debug("Erreur......")
        end
        
end

--------------------------------------------------------------------
-- test si le déclencheur est lever du soleil
--------------------------------------------------------------------
function lever(zone, valeurs, minutes)
        if nomTrigger == nomLever and valeurTrigger == minutes then
           if minutes == nil then; 
              minutes = 0
           end
           volets(zone, valeurs, minutes)
        end 
end
--------------------------------------------------------------------
-- test si le déclencheur est coucher du soleil
--------------------------------------------------------------------
function coucher(zone, valeurs, minutes)
        if nomTrigger == nomCoucher and valeurTrigger == minutes then
           if minutes == nil then; 
              minutes = 0
           end
           volets(zone, valeurs, minutes)
        end 
end

--------------------------------------------------------------------------
-- Demarrage du programme
--------------------------------------------------------------------------
local trigger = fibaro:getSourceTrigger()
if (trigger['type'] == 'global') then
  nomTrigger = trigger['name']
  valeurTrigger = tonumber(fibaro:getGlobalValue(nomTrigger))
  print("Nom du déclencheur = ", nomTrigger, " - Minutes : ", valeurTrigger)
else
  fibaro:debug("La scéne ne peut être lancer que par une Variable Globale")
  fibaro:abort();
end
-------------------------------------------------------------------------
-- Ne rien modifier au dessus de cette ligne
-------------------------------------------------------------------------
-- Commandes a écrit pour lever du soleil
-- lever (Funtion qui traite le lever du soleil
-- coucher(zone, valeur, minutes)
-- exemple pour actionné les volets de la table Rue a 80% 10 minutes avant le lever
-- lever(Rue, 80, -10)
-- exemple pour actionné le volet "Bureau" au lever du jour
-- lever("Bureau", 99, 0)
-- Pour actionner un volet au coucher du soleil
-- Il faut remplacer lever par coucher
-- ex : coucher(Rue, 0, 20)
------------------------------------------------------------------------
lever(Nord, 99, 10)
lever(Chambre, 99, 0)
lever(Jardin, 99, -15)
lever("Salon", 99, 0)
coucher(Nord, 0, -15)
coucher(Chambre, 0, 10)
coucher(Jardin, 0, 30)
coucher("Salon", 85, 30)



Partager ce message


Lien à poster
Partager sur d’autres sites

tu ne mets pas a jour sunrise et sunset

    local osHeure = os.date("%H:%M", os.time())
    leverSoleil = fibaro:getValue(1, "sunriseHour")
    coucherSoleil = fibaro:getValue(1, "sunsetHour")
 
    LeverCoucher(VGLeverSoleil, TLever, leverSoleil, "Jour")
    LeverCoucher(VGCoucherSoleil, TCoucher, coucherSoleil, "Nuit")

Partager ce message


Lien à poster
Partager sur d’autres sites

Super, script mis en place àla place de ma scène bloc qui cesse de fonctionner au bout de quelques jours.

Merci !

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Après 1 mois A me casser la tête pour installer ce programme j'ai 2 soucis, mais quî vient sà»rement de moi.(comme d'habitude)

une fois le programme installer dans la parti Débug 

j'ai l'heure lever soleil ex: 06h00-08h30 en fonction de mes décalage mis dans ma variable TLever, jusque là  ok mais

dans l'heure coucher soleil j'ai 10h00-16h41en fonction de mes décalage mis dans ma variable TCoucher,

- probleme il fait nuit A 16h42 alors que le coucher du soleil est A 17h01 et la fin du crépuscule est A 17h30 donc nuit après.

- et pour finir pas de déclenchement au lever du soleil en créant une scene bloc.

 

une idée peut être ???

 

post-255-0-83763200-1449657248_thumb.jpeg

post-255-0-21863400-1449657773_thumb.jpeg

Partager ce message


Lien à poster
Partager sur d’autres sites

pour le mode bloc c'est normal regarde bien ton déclencheur je crois que tu as un soucis

 

peux tu mettre ton code de la scène STP voici ce que j'ai chez moi

local VGJourNuit = "Jour_Nuit"
local VGLeverSoleil = "SoleilLever"
local VGCoucherSoleil = "SoleilCoucher"
-- Minutes de décalages par rapport au lever du soleil
local TLever = {-30, -20, -10, 10, 20, 30}
-- Minutes de décalages par rapport au Coucher du soleil
local TCoucher = {-30, -20, -10, 10, 20, 30}

Partager ce message


Lien à poster
Partager sur d’autres sites

je vois un -300 cela fais 5 h avant c'est normal ton soucis

 

pour le mode bloc tu t'ai trompé entre couché et levé

Partager ce message


Lien à poster
Partager sur d’autres sites

En faite j'avais mis -300 pour tester le coucher du soleil dans une scene avant la nuit.

Je vais l'enlever pour voir si cela vient de ca et je te fait un retour.

post-255-0-70508800-1449688186_thumb.jpeg

Si je lit le mode bloc;

300 minutes avant le coucher du soleil, j'allume le wall plug puis je l'éteint 15 heures plus tard.

Partager ce message


Lien à poster
Partager sur d’autres sites

Après recherche, je résume:

J'ai enlevé les 300 minutes de décalages avant le coucher du soleil dans le TCoucher.

résultat, je suis passé de 10h11-16h42 à  14h11-16h42 dans l'heure coucher mini mais cela n'a pas changé, il fait toujours nuit A 16h42.

apres j'ai vu que c'était sur internet que notre box trouvais l'heure du coucher, lever du soleil donc c'était forcément juste 

sauf si ma situation géographique n'était pas bonne.

et bien oui!!! la longitude et latitude n'était plus bonne??

post-255-0-78938400-1449784789_thumb.jpeg

Partager ce message


Lien à poster
Partager sur d’autres sites

×