Aller au contenu
Rem's

Récurrence Scène

Recommended Posts

Bonsoir à  tous,

Voici mon bout de code qui me permet de lancer le réveil le matin.

 

Si je lance manuellement cette scène (je me suis levé plus tôt), elle va donc tournée 2 fois à  l'heure dite.

 

J'ai rajouté la condition "fibaro:countScenes" ....... Est-elle au bon endroit ??

depuis cette modif, la scène ne se lance plus toute seul.

 

Merci de votre coup d'oeil

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

local sourceTrigger = fibaro:getSourceTrigger();
if (sourceTrigger["type"] == "autostart") then
while true do
    
    if fibaro:countScenes() > 1 then -- si la scène est lancée plus d'une fois alors
fibaro:abort() -- arrêt de cette lecture du script
end -- fin de la condition


local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
 ( ((currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "06:45") )
)
then
	-- 6h45 : Allumage réveil
    fibaro:call(71, "turnOn");

Partager ce message


Lien à poster
Partager sur d’autres sites

Essaye sa:

--[[
%% autostart
%% properties
%% globals
--]]
 
if ( (currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "06:45" )then
-- 6h45 : Allumage réveil
fibaro:call(71, "turnOn");
end

Faut vraiment que vous arrêtiez de créez une scène à  partir des blocs sa complique tout plus qu'autre chose.

Partager ce message


Lien à poster
Partager sur d’autres sites

Shad, tu n'as plus la boucle qui attend que l'heure arrive. Ton code ne s'exécutera jamais.

Rem, ton abort est dans ta boucle qui attend 6:45 donc tu tue cette dernière.

Partager ce message


Lien à poster
Partager sur d’autres sites

Merdouille, j'ai rien dit. Je me sert que du scheduler c'est pour sa :D

 

Rem's tu as mis un sleep à  la fin ???

Partager ce message


Lien à poster
Partager sur d’autres sites

Allez, on attaque.

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

local sourceTrigger = fibaro:getSourceTrigger();

-- si le déclencheur est le démarrage de la HC2
if (sourceTrigger["type"] == "autostart") then
   -- On boucle à  l'infini
   while true do
      -- on prend la date & heure
      local currentDate = os.date("*t");
      -- si ce n'est pas le weekend et qu'il est 6:45
      if ( currentDate.wday >= 2 and currentDate.wday <= 6 and (string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "06:45") ) then
         -- 6h45 : Allumage réveil
         fibaro:call(71, "turnOn");
      end
      -- on attend 1 minute
      fibaro:sleep(60*1000);
   end
else
   -- Si le déclencheur est autre, du style lancement manuel 
   -- de ce scénario
   -- on allume le réveil
   fibaro:call(71, "turnOn");
end

Si le déclencheur "SourceTrigger" est "autostart" (démarrage de la HC2) alors on lance une boucle sans fin qui va attendre toute les minutes vérifier s'il est 6:45, si oui, elle allume le module 71.

 

Par contre, si le déclencheur est autre chose alors on allume simplement le module 71.

 

Ce scénario DOIT pouvoir être exécuter plusieurs fois en même temps car il y a toujours la boucle qui tourne attendant l'heure et éventuellement un autre lancement manuel si tu te lève avant, cela peut donc faire 2 lancements en simultané.

Partager ce message


Lien à poster
Partager sur d’autres sites

Waouh ... Ok super, en plus comme dit Shad, ca ne provient pas de bloc.

Merci pour ces quelques lignes.

 

En revanche, je ne comprends pas la fin, "else ...   Pourquoi ça reprend la lampe, sans autre condition ??

 

Je vais déjà  me lancer avec le début.

 

Bonne journée

Partager ce message


Lien à poster
Partager sur d’autres sites

Le else est si la source de déclenchement n'est pas "autostart". En gros que doit faire le scénario si tu le lance toi manuellement. Dans ce cas là, tu veux aussi allumer la lampe.

Partager ce message


Lien à poster
Partager sur d’autres sites

Shad, je pars des blocs pour passer en lua (car beaucoup plus complet et rogolo) car je ne sais écrire le début d'un script.

Pourrais tu m'aider à  faire :

de 19H30 à  7H00

Id porte, 74

Si la porte est ouverte, on allume la lampe.(ID 9).

Si la porte est fermée, on étteint la lampe (ID 9).

 

Cela m'aiderait à  ne plus passer par les blocs qui compliquent et double le script.

 

Merci d'avance pour ton aide.

Partager ce message


Lien à poster
Partager sur d’autres sites

Alors sa c'est rapide et pour info (http://www.domotique-fibaro.fr/index.php/topic/194-lua-le%C3%A7on-2-%E2%80%93-association-de-modules/#entry1147)

--[[
%% properties
74 value
%% globals
--]]
 
local startSource = fibaro:getSourceTrigger();
local currentDate = os.date("*t");
local door = 71;
 
if (startSource['type']=='property') then
  if (startSource['deviceID']==tostring(baieleft) or startSource['deviceID']==tostring(baieright)) then
    if ( (tonumber(fibaro:getValue(door, "value")) > 0) and ( (string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) >= "19:30") or (string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) <= "07:00")  ) ) then
      if (fibaro:getValue(door, "value") == 0) then
      fibaro:call(door, "turnOn");
    else
      if (fibaro:getValue(door, "value") > 0) then
      fibaro:call(door, "turnOff");
    end
  end
end

J'ai pas essayé.

Partager ce message


Lien à poster
Partager sur d’autres sites

Voici ma version pour répondre àta demande :

--[[
%% properties
74 value
%% globals
--]]

-- Ce scénario sera executé uniquement àl'ouverture / fermeture
-- du décteur de porte ID 74

local currentDate = os.date("*t")
local currentHour = string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min)
local door = 74
local light = 9

-- entre 19:30 et 07:00 --
if (currentHour >= "19:30" and currentHour <= "07:00") then
  if (tonumber(fibaro:getValue(door, "value")) > 0) then
     -- porte en alert soit ouverte
    fibaro:call(light, "turnOn");
  else
    -- porte fermée
    fibaro:call(light, "turnOn");
    
  end  
end

Pas testé non plus

Partager ce message


Lien à poster
Partager sur d’autres sites

Question par curiosité, ça lance quoi réellement ça ?

  1. fibaro:call(71, "turnOn");

 

Est-ce que ça repasse off par une action manuelle ?

 

Je pensais à  une approche un peu différente qui consiste à  stocker l'état dans une variable afin de savoir s'il faut l'allumer ou non, et de décomposer en 2 parties, une qui set la variable (par exemple tous les soirs à  20h en fonction de quel jour on est , un peu comme on arme son reveil)  et l'autre qui applique l'action à  l'heure dite  en fonctioin de cette variable, et en profite pour changer son état (comme on desarme son reveil).

Ainsi tu ne peux pas avoir deux fois la sonnerie, si tu te lèves plus tôt et  tu pourrais choisir de désactiver ton reveil un jour de RTT, sans retoucher au code, juste avec un bouton virtuel qui change cette variable ( et indique son état accessoirement)

 

Je crois que certains ont même déjà  codé un scheduler en module virtuel, pour avoir une jolie interface de réglage des heures et jours concernés (c'est toi Shad ?)

Partager ce message


Lien à poster
Partager sur d’autres sites

Cela allume le périphérique qui a pour ID le numéro 71. Pour l'éteindre, c'est "turnOff" au lieu de "turnOn".

Partager ce message


Lien à poster
Partager sur d’autres sites

Nan mais ça j'avais compris  :P

Ce que je veux savoir c'est ce qu'il y a derrière, c'est quoi le periph lié çà  cet ID, une prise, un contact sec, une lampe?

 

Je dis ça parce qu'il l'allume , mais on en sait pas comment il l'éteind, ce qui est aussi une source de réponse à  son problème initial, à  savoir ne pas le faire deux fois.

Dans vos codes, il me semble, amha que vous avez résolu son premier problème, à  savoir l'allumer de maniere non programmée en appelant le meme scenario, en revanche il se lancera tout de même à  6h45, une seconde fois.

 

D'ou l'interet de savoir s'il l'arrete en appuyant sur un interrrupteur physique ou s'il refait une action "domotique", qui pourrait permettre de stocker l'info que ça a déjà  été fait aujourd'ui et qu'il ne faut pas le refaire

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

ID 71, c'est un wall plug. En réalité c'est le début des actions (mon scénario va allumer les lampes dans la maison au fur et à  mesure, ainsi que la freebox (merci krikkof)).

J'ai essayé le script de shad et celui de steven en rajoutant la fonction debug, mais rien n'y fait.

 

Pour arrêter, si ca devait être le cas, je passe par un code Activation/Désactivation. j'ai aussi fait une scène avec la fonction abort. Sinon MAC ou PC.

Partager ce message


Lien à poster
Partager sur d’autres sites

OK, donc en fait tu vas probablement lancer un scenario de reveil plus complexe, qui sera ton petit "ceremonial du matin"

 

Ben a mon avis ça vaut carrément le coup de l'imaginer à  la façon que je propose, à  savoir de stocker dans une variable globale l'info de savoir si on doit executer la scene aujourd'hui ou pas, et eventuellement stocker dans une variable l'heure à  laquelle ça doit se passer de manière automatique.

Ainsi, l'heure venue, si tu t'es déjà  levé, et que donc tu as exécuté ton "ceremonial", il aura pris soin de changer l'état de cette variable et de ne pas se rééxecuter (idem pour les jours ou tu le disable vonlontairement.

Si en revanche tu ne l'a pas executé manuellement, il se fera...

 

De toute façon, moi je dois le faire de cette manière, aussi pour automatiser quelques trucs selon que les enfants ont école ou pas..

Partager ce message


Lien à poster
Partager sur d’autres sites

Après plusieurs tests, il semble que la fonction "fibaro countscene" fonctionne la ou elle est placée : Le réveil se lance à  6h 45, si je me lève plus tôt et que je déclenche manuellement (via iPhone, iPad, ou bouton minimote), la scène ne se joue pas une 2ème fois.

 

Je mets la scène en entière pour ceux que cela inspire, elle est détaillé au fil de l'avancement (et j'ai mis des debugs de partout).

 

Je voudrai bien le Week end lui faire jouer une playlist plutôt que BFM télé, mais là  je fais de la brasse coulée ...!

 

Bonne soirée

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

local sourceTrigger = fibaro:getSourceTrigger();
if (sourceTrigger["type"] == "autostart") then
while true do
    
    if fibaro:countScenes() > 1 then -- si la scène est lancée plus d'une fois alors
fibaro:abort() -- arrêt de cette lecture du script
end -- fin de la condition


local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
 ( ((currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "06:45") )
)
then
	-- 6h45 : Allumage réveil
    fibaro:call(71, "turnOn");
	fibaro:call(41, "turnOn");
	fibaro:call(56, "pressButton", "1");
    fibaro:sleep(7*1000);
    fibaro:call(56, "pressButton", "14");
    fibaro:sleep(4*1000);
    fibaro:call(56, "pressButton", "9");
      
      fibaro:debug("Lancement du réveil")
      fibaro:sleep(600*1000);
	-- 6h55 : Allumage salon & cuisine
    fibaro:call(14, "turnOn");
    fibaro:call(43, "turnOn");
      
      fibaro:debug("Allumage salon")
      fibaro:sleep(600*1000);
    fibaro:call(11, "turnOn");
    fibaro:call(9, "setValue", "20");
      
      fibaro:sleep(300*1000);
    -- Lancement de Disney Channel
	fibaro:call(58, "pressButton", "1");
    fibaro:call(9, "setValue", "50");
      
      fibaro:debug("Lancement de Disney channel")
      fibaro:sleep(1800*1000);
	fibaro:call(11, "turnOff");
	fibaro:sleep(300*1000);
    -- Extinction 1
	fibaro:call(41, "turnOff");
	fibaro:call(43, "turnOff");
      
      fibaro:debug("Extinction lumière")
    fibaro:call(56, "pressButton", "2");
      fibaro:sleep(5*1000);
    fibaro:call(56, "pressButton", "14");
      fibaro:sleep(4*1000);
    fibaro:call(56, "pressButton", "9"); 
      fibaro:debug("Bascule vers BFM")
	  fibaro:sleep(600*1000);
    -- Extinction 2
	fibaro:call(14, "turnOff");
	  fibaro:sleep(300*1000);
    fibaro:call(56, "pressButton", "2");
    fibaro:call(9, "turnOff");
      fibaro:sleep(600*1000);
	fibaro:call(71, "turnOff");
      fibaro:debug("Fin de scénario")
	
end

fibaro:sleep(60*1000);
end
else

local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
startSource["type"] == "other"
)
then
	-- 6h45 : Allumage réveil
    fibaro:call(71, "turnOn");
	fibaro:call(41, "turnOn");
	fibaro:call(56, "pressButton", "1");
    fibaro:sleep(7*1000);
    fibaro:call(56, "pressButton", "14");
    fibaro:sleep(4*1000);
    fibaro:call(56, "pressButton", "9");
      
      fibaro:debug("Lancement du réveil")
      fibaro:sleep(600*1000);
	-- 6h55 : Allumage salon & cuisine
    fibaro:call(14, "turnOn");
    fibaro:call(43, "turnOn");
      
      fibaro:debug("Allumage salon")
      fibaro:sleep(600*1000);
    fibaro:call(11, "turnOn");
    fibaro:call(9, "setValue", "20");
      
      fibaro:sleep(300*1000);
    -- Lancement de Disney Channel
	fibaro:call(58, "pressButton", "1");
    fibaro:call(9, "setValue", "50");
      
      fibaro:debug("Lancement de Disney channel")
      fibaro:sleep(1800*1000);
	fibaro:call(11, "turnOff");
	fibaro:sleep(300*1000);
    -- Extinction 1
	fibaro:call(41, "turnOff");
	fibaro:call(43, "turnOff");
      
      fibaro:debug("Extinction lumière")
    fibaro:call(56, "pressButton", "2");
      fibaro:sleep(5*1000);
    fibaro:call(56, "pressButton", "14");
      fibaro:sleep(4*1000);
    fibaro:call(56, "pressButton", "9"); 
      fibaro:debug("Bascule vers BFM")
	  fibaro:sleep(600*1000);
    -- Extinction 2
	fibaro:call(14, "turnOff");
	  fibaro:sleep(300*1000);
    fibaro:call(56, "pressButton", "2");
    fibaro:call(9, "turnOff");
      fibaro:sleep(600*1000);
	fibaro:call(71, "turnOff");
      fibaro:debug("Fin de scénario")
	
end
  
end

Partager ce message


Lien à poster
Partager sur d’autres sites

Regarde avec les

if (currentDate.wday == 1 or currentDate.wday == 7) then
 
end

Partager ce message


Lien à poster
Partager sur d’autres sites

×