Aller au contenu
emanet

Exécution Automatique Scéne Tous Les Jours (Même Heure)

Recommended Posts

Bonjour,

Je débute dans les scripts lua et je me prends la tête depuis quelques jours sur un cas qui doit faire sourire les experts...

Bref, c'est très simple...

 

Je souhaterai enclencher à  23h et déclencher à  01h une scène et ceci tous les jours.

 

Grâce aux différents tutos et docs trouvés sur le net, j'ai réussi à  poser un script.. mais il est exécuté uniquement au démarrage de la box ou manuellement. Est-ce que vous pourriez m'indiquer ce qu'il manque pour qu'il soit exécuté automatiquement tous les jours.

 

Mon script:

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

local currentDate = os.date("*t") --stock la date et heure actuelle du système sous forme d'un tableau à  l'intérieur de la variable currentDate

fibaro:debug('Heure actuelle:' ..currentDate.hour)

if (currentDate['hour'] >= 23 or currentDate['hour'] < 01) then
fibaro:call(8, 'turnOn')
else
fibaro:call(8, 'turnOff')
end

Merci d'avance pour votre support ;-)

Partager ce message


Lien à poster
Partager sur d’autres sites

je metterais ce script dans la manillon d'un VD (virtual device). La main loop s'exécute toutes les 3 sec

Partager ce message


Lien à poster
Partager sur d’autres sites

Regarde si la case scène active est bien cochée.

 

Pour apprendre, une approche simple est de faire un scène en mode block puis de convertir en LUA et analyser le résultat.

Partager ce message


Lien à poster
Partager sur d’autres sites

la case scène active devrait être cochée, vu que la scène s'exécute bien au démarrage de la box.

En fait il faut qu'elle vérifie "continuellement" l"heure, c'est pour cela que j'ai proposé le main loop.

 

Mais j'y pense, il fait faire attention, car ainsi ton script s'exécutera toutes les 3 sec à  partir de entre 23 h et 01h ?

En fait de script, tu allumes une lumière. Perso, pour ne pas fatiguer inutilement le relais, je rajouterais une condition que la lampe soit éteinte pour l'allumer

if (tonumber(fibaro:getValue(8, "value")) == 0 AND (currentDate['hour'] >= 23 or currentDate['hour'] < 01)) then

Partager ce message


Lien à poster
Partager sur d’autres sites

Pour moi la scène ne s'exécute qu'une seule fois au démarrage

Utilise GEA c'est bien plus facile lol

Envoyé de mon SM-G900F en utilisant Tapatalk

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

@mprinfo.

Fait attention àmon coeur de vieillard.

J'ai faillit avoir un arrêt cardiaque en lisant ton post.

TOI qui ferait de la promotion de GEA ?????

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui mais depuis que pitp2 et lazer sont passer je suis un autre homme. Je sais enfin que j'en ai une petite ils ont jamais vu cela lol

Envoyé de mon SM-G900F en utilisant Tapatalk

  • Upvote 2

Partager ce message


Lien à poster
Partager sur d’autres sites

Pour la tienne utilise l'antenne de la HC2 ? mdr

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour,

Je débute dans les scripts lua et je me prends la tête depuis quelques jours sur un cas qui doit faire sourire les experts...

Bref, c'est très simple...

 

Je souhaterai enclencher à  23h et déclencher à  01h une scène et ceci tous les jours.

 

Grâce aux différents tutos et docs trouvés sur le net, j'ai réussi à  poser un script.. mais il est exécuté uniquement au démarrage de la box ou manuellement. Est-ce que vous pourriez m'indiquer ce qu'il manque pour qu'il soit exécuté automatiquement tous les jours.

 

Mon script:

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

local currentDate = os.date("*t") --stock la date et heure actuelle du système sous forme d'un tableau à  l'intérieur de la variable currentDate

fibaro:debug('Heure actuelle:' ..currentDate.hour)

if (currentDate['hour'] >= 23 or currentDate['hour'] < 01) then
fibaro:call(8, 'turnOn')
else
fibaro:call(8, 'turnOff')
end

Merci d'avance pour votre support ;-)

 

Revenons a nos moutons

 

Le probléme de cette scène c'est qu'elle ne s'exécute qu'une seule fois

il faut donc utilisé le fameux do while true avec un sleep ou alors utiliser la scéne horaires que j'ai partagé

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci pour vos nombreux commentaires!

Alors,

 

Regarde si la case scène active est bien cochée.

 

Pour apprendre, une approche simple est de faire un scène en mode block puis de convertir en LUA et analyser le résultat.

Oui la scéna active est bien cochée.

Pas bête, je vais y penser mode bloc > LUA.

Mode block, c'est du GEA?

 

 

 

la case scène active devrait être cochée, vu que la scène s'exécute bien au démarrage de la box.

En fait il faut qu'elle vérifie "continuellement" l"heure, c'est pour cela que j'ai proposé le main loop.

 

Mais j'y pense, il fait faire attention, car ainsi ton script s'exécutera toutes les 3 sec à  partir de entre 23 h et 01h ?

En fait de script, tu allumes une lumière. Perso, pour ne pas fatiguer inutilement le relais, je rajouterais une condition que la lampe soit éteinte pour l'allumer

if (tonumber(fibaro:getValue(8, "value")) == 0 AND (currentDate['hour'] >= 23 or currentDate['hour'] < 01)) then

Bonne remarque jojo, en effet il faut que je rajoute cette condition pour éviter qu'elle s'écute en permanence. Mais mon problème pour l'instant s'est qu'elle ne s'éxecute pas en permanence justement...

C'est quoi la "main loop"? Virtual Server?

 

 

 

@mprinfo: la scéne ne s'execute en effet 1x seule fois, mais au démarrage de la box ou lancer la scène manuellement..

Partager ce message


Lien à poster
Partager sur d’autres sites

En même temps ce serait pas mal que tu dises àquoi sert ta scène pour qu'on mieux t'aider.

Partager ce message


Lien à poster
Partager sur d’autres sites

pour ceux qui n'utilisent pas GEA j'ai crée un scène qui mets a jours des VG toutes les 30mn cela permet de pouvoir déclencher une scéne a l'heure que l'on veut sans avoir a faire une do while true et le sleep ne dépassera jamais 30mn

on utilise les vg pour le déclenchement et ensuite on filtre en fonction de l'heure que l'on veut

 

Voici un exemple pour un déclenchement a 6h

--[[
%% globals
Heure
--]]
----------------------------------------------------------------------
--   Contrôle si 1 Scène et déjà  en cours et le déclencheur a 6h    --
----------------------------------------------------------------------
local NbreScene = fibaro:countScenes()
local heureDeclenchement = tonumber(fibaro:getGlobalValue( "Heure" ))
if NbreScene ~= 1 then
   fibaro:debug("Il y a déjà  une instance en cours... ")
   fibaro:abort();
elseif heureDeclenchement ~= 6 then
  
   fibaro:debug("le déclencheur n'est pas 6h")
   fibaro:abort();
end

Partager ce message


Lien à poster
Partager sur d’autres sites

voila la scéne qui crée les déclenchements toute les 30 mn

il faut 2 VG

DemiHeure

Heure

--[[
%% autostart
%% globals
DemiHeure
--]]

fibaro:debug("Demarrage en cours...")
local NbreScene = fibaro:countScenes()
fibaro:debug("Nombres de Scéne en cours : "..NbreScene)
fibaro:sleep(60*1000)
local Minutes = tonumber(os.date("%M", os.time()))
local Pause = 0
if Minutes > 30 then
  Pause = 60 - Minutes
  else
  Pause = 30 - Minutes
end
fibaro:debug("Mise a jour Variable : "..Pause.."mn")
fibaro:sleep(Pause*60*1000)
Minutes = tonumber(os.date("%M", os.time()))
fibaro:debug(Minutes)
fibaro:setGlobal("DemiHeure", Minutes)
if Minutes == 0 then
   local Heure = tonumber(os.date("%H", os.time()))
   fibaro:setGlobal("Heure", Heure)
end

Partager ce message


Lien à poster
Partager sur d’autres sites

 

Bonne remarque jojo, en effet il faut que je rajoute cette condition pour éviter qu'elle s'écute en permanence. Mais mon problème pour l'instant s'est qu'elle ne s'éxecute pas en permanence justement...

C'est quoi la "main loop"? Virtual Server?

 

En fait je te propose de NE PAS utiliser de scène.

Donc tu cliques sur le tab devices -> add or remove device -> add a Virtual Device

Là  tu dis que c'est un VD en LUA

et tu rentres ton code dans la main loop. Cette main loop c'est "la même chose" qu'une scène avec une boucle infinie, car le code de cette main loop s'exécute toutes les 3 secondes

Partager ce message


Lien à poster
Partager sur d’autres sites

les Vd et les scénes sont complémentaires

le soucis des VD c'est qu'il n'y aura aucune évolution

Partager ce message


Lien à poster
Partager sur d’autres sites

Voilà  une scène toute simple pour commencer.

--[[
%% autostart
%% properties

%% globals
--]]


while true do
  local currentDate = os.date("*t");
  local TriggerTime = string.format("%02d",currentDate.hour)..":"..string.format("%02d",currentDate.min);
  local TriggerDay = currentDate.wday;

  if (TriggerTime == "23:00") then   
      fibaro:call(8,turnOn);
   elseif (TriggerTime == "01:00") then  
      fibaro:call(8,turnOff);
 end  
 
fibaro:sleep(60*1000);
end

Fait attention à  Jojo c'est un obsédé du Vd !  :D

 

Je n'utilise pas le jour de la semaine TriggerDay (valeur de 0 à  6) pour n'actionner que certains jours.

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Et des icones lol si il savait ce que je suis entrain de faire avec les icônes.....

Envoyé de mon SM-G900F en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

si je puis me permettre, je ferais une condition >= au lieu de ==, s'il y avait une retard quelconque dans la box et le test si la lampe est éteinte

Partager ce message


Lien à poster
Partager sur d’autres sites

C'est super! Merci pour vos commentaires, je comprends de mieux et mieux l'environnement.

Mais ce n'est pas encore gagné...

 

 

En même temps ce serait pas mal que tu dises à  quoi sert ta scène pour qu'on mieux t'aider.

C'est pour enclencher la pompe de filtrage de la piscine, je souhaite le faire uniquement pendant les heures creuses.

 

 

En fait je te propose de NE PAS utiliser de scène.

Donc tu cliques sur le tab devices -> add or remove device -> add a Virtual Device

Là  tu dis que c'est un VD en LUA

et tu rentres ton code dans la main loop. Cette main loop c'est "la même chose" qu'une scène avec une boucle infinie, car le code de cette main loop s'exécute toutes les 3 secondes

Merci pour l'explicatif, en effet VD peut être très utile. Je prends conscience que les scènes ne sont pas exécuté en permanence... 

 

 

Voilà  une scène toute simple pour commencer.

--[[
%% autostart
%% properties

%% globals
--]]


while true do
  local currentDate = os.date("*t");
  local TriggerTime = string.format("%02d",currentDate.hour)..":"..string.format("%02d",currentDate.min);
  local TriggerDay = currentDate.wday;

  if (TriggerTime == "23:00") then   
      fibaro:call(8,turnOn);
   elseif (TriggerTime == "01:00") then  
      fibaro:call(8,turnOff);
 end  
 
fibaro:sleep(60*1000);
end

Fait attention à  Jojo c'est un obsédé du Vd !  :D

 

Je n'utilise pas le jour de la semaine TriggerDay (valeur de 0 à  6) pour n'actionner que certains jours.

Ton bout de code me plaît bien et en plus je le comprends...

Il me semble correct, mais cela génère l'erreur suivante:

post-4853-0-34154200-1439579780_thumb.png

Partager ce message


Lien à poster
Partager sur d’autres sites

Je viens de faire un copier/coller de la scène que je t'ai proposé et ça marche très bien.

Tu as surement raté un truc en la copiant.

Partager ce message


Lien à poster
Partager sur d’autres sites

vérifie les guillemets, souvent le copier/coller ne se fait pas comme il faut. remplace ceux que tu a collés et les retappants

Partager ce message


Lien à poster
Partager sur d’autres sites

Le copier/coller n'a pas fonctionné correctement dans mon cas?!? J'ai essayé de retaper les guillemets, effacer les espaces, ... Bref, j'ai finalement retapé le code entièrement à  la main... Et là , ça a fonctionné... Tout fonctionne à  merveille!

 

Voici le dernière version du script (owner: Berale24) avec juste quelques commentaires en plus pour comprendre le déroulement du programme. Pour les novice comme moi ;-)

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

while true do
  local currentDate = os.date("*t");
  local triggerTime = string.format("%02d",currentDate.hour)..":"..string.format("%02d",currentDate.min);
  local triggerDay = currentDate.wday;
  fibaro:debug("Contrôle conditions démarrage programme fitration piscine")
  
  if (triggerTime == "21:00") then
    fibaro:call(22, "turnOn");
    fibaro:debug("Démarrage pompe de filtration piscine");

    elseif (triggerTime == "01:00") then
    fibaro:call(22, "turnOff");
    fibaro:debug("Arrêt pompe de filtration piscine");
  end
  
  fibaro:debug("Programme filtration piscine en stand-by");
  fibaro:sleep(60*1000);
end

Merci @jojo, @mpinfo et @Berale24 pour le support!

Partager ce message


Lien à poster
Partager sur d’autres sites

content pour toi que ça fonctionne.

Perso j'aurais fais une condition (>= "21:00" et >= "01:00") au lieu de (== "21:00" et == "01:00") car si pour une raison ou une autre (panne de courant, la box est allé prendre un apéro, ...) elle loupe l'heure précise ta pompe ne démarre pas ou ne s'arrête pas.

Et pour éviter avec le >= que le relais trinque, faire un test si le relais est on ou off

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

×