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 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 :
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
Merci a STEVEN pour m'avoir aider a optimisez ce code
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...