Aller au contenu

Simulateur d'aube paramétrable


Krikroff

Messages recommandés

Je ressors un vieux bout de lua basé sur les équations de robert penner et posté à  l'origine ici http://forum.fibaro.com/viewtopic.php?t=1656

 

Tout est dans le titre. Vous pouvez utiliser cette scène de manière autonome ou bien dans le cadre d'une programmation horaire . Amusez vous bien :)

 

Pour la mise en place, il faut créer donc une nouvelle scène en mode LUA puis copier le code ci-dessous.

ensuite, renseigner tous les identifiants des périphériques de type "dimmer" dans la variable devices, c'est eux qui varieront d'intensité lumineuse.

local devices = {23, 45, 55};

Renseigner dans la variable

local curve = "inExpo"

la courbe choisie pour la variation lumineuse ou bien conserver celle par défaut. cf. tableau des courbes.

 

post-3-0-85873200-1388361497_thumb.png

local duration = 20;

La variable duration correspond à  la durée totale en seconde de la scène pour faire une transition de la valeur basse à  la valeur haute.

--[[
%% properties
%% globals
--]]
fibaro:debug("HC2 start script at " .. os.date());

-- LUA - Dawn simulator V1.0.1
--
-- Wake up "naturally", illuminated by a soft light and progressive.
-- Based on open source Robert Penner's original easing equations (Copyright © 2001 Robert Penner) 
-- Copyright © 2013 Jean-christophe Vermandé

-- USER SETTINGS :
-- Type of equation used to generate the curve (dimming).
-- Possible values are: linear, inQuad, inExpo, outExpo, inOutQuad, inOutExpo, outInExpo

local curve = "inExpo"; -- Type of equation used to generate the curve (dimming).
local debug = false;     -- To log in HC2 debug area
local devices = {36};   -- IDs of devices to be varied (only dimmable device), eg. {1, 16, 10}
local startValue = 0;   -- Begin value
local endValue = 100;   -- End value
local duration = 100;    -- Execution time in seconds of the scene


-- DO NOT EDIT THE CODE BELOW (except to suit your needs) --


dawnSimulatorEngine = {
  version = "1.0.1"
};
function dawnSimulatorEngine:init(startValue, endValue, duration, devices, curve, debug)
  self._lastValue = 0 
  self._startValue = startValue or 0;
  self._endValue = endValue or 100;
  self._duration = duration or 1;
  self._devices = devices or {}; 
  self._curve = equations.map[curve or 'linear'];  -- require 'equations' to operate
  self._debug = debug or true;
end
function dawnSimulatorEngine:_update(value)  
  self._lastValue = value; -- keep in memory the last value to compare later
  -- loop in deveices
  local name, id;
  for i=1, #self._devices do
    id = tonumber(self._devices[i]);
    fibaro:call(id, "setValue", value);
    if (self._debug) then
      name = fibaro:getName(id);
      if (name == nil or name == string.char(0)) then
        name = "Unknown"
      end
      fibaro:debug("Device:" .. name .. " setValue: " .. value);
    end
  end
end
function dawnSimulatorEngine:_compute(time)
  return math.ceil(tonumber(self._curve(time, self._startValue, self._endValue, self._duration)));
end
function dawnSimulatorEngine:start()
  local computedValue;
  local doWhile = true;
  local time = 0;
  -- timeline
  while (doWhile == true) do
    computedValue = self:_compute(time);
    -- prevent multiple call with same value
    if (computedValue ~= self._lastValue) then
      -- update device value
      self:_update(computedValue);
    end
    time = time + 1;
    if (time > self._duration) then
      doWhile = false;
      if (self._lastValue < self._endValue) then
        -- force target value
        self:_update(computedValue);
      end
    else
      fibaro:sleep(1000);
    end
    -- do while
  end
end
    
-- Easing function (Penner's Easing Equations)
equations = equations or {
  version = "1.0.1",
  -- Linear
  linear = function(t, b, c, d)
    return c * t / d + b;
  end,
  -- InQuad
  inQuad = function(t, b, c, d)
    t = t / d;
    return c * math.pow(t, 2) + b;
  end,
  -- InOutQuad
  inOutQuad = function(t, b, c, d)
    t = t / d * 2;
    if t < 1 then
      return c / 2 * math.pow(t, 2) + b;
    else
      return -c / 2 * ((t - 1) * (t - 3) - 1) + b;
    end
  end,
  -- InOutExpo
  inOutExpo = function(t, b, c, d)
    if t == 0 then return b end
    if t == d then return b + c end
    t = t / d * 2;
    if t < 1 then
      return c / 2 * math.pow(2, 10 * (t - 1)) + b - c * 0.0005;
    else
      t = t - 1;
      return c / 2 * 1.0005 * (-math.pow(2, -10 * t) + 2) + b;
    end
  end,
  -- OutInExpo
  outInExpo = function(t, b, c, d)
    if t < d / 2 then
      return equations.outExpo(t * 2, b, c / 2, d);
    else
      return equations.inExpo((t * 2) - d, b + c / 2, c / 2, d);
    end
  end,
  -- InExpo
  inExpo = function(t, b, c, d)
    if t == 0 then
      return b;
    else
      return c * math.pow(2, 10 * (t / d - 1)) + b - c * 0.001;
    end
  end,
  -- OutExpo
  outExpo = function(t, b, c, d)
    if t == d then
      return b + c;
    else
      return c * 1.001 * (-math.pow(2, -10 * t / d) + 1) + b;
    end
  end
};

-- Equations map
equations.map = {
  ['linear'] = equations.linear,
  ['inQuad'] = equations.inQuad,
  ['inExpo'] = equations.inExpo,
  ['outExpo'] = equations.outExpo,
  ['inOutQuad'] = equations.inOutQuad,
  ['inOutExpo'] = equations.inOutExpo,
  ['outInExpo'] = equations.outInExpo
}

-- START SIMULATOR ENGINE
if (debug) then fibaro:debug("Starting the process"); end
--startEngine(equations.map[curve]);
dawnSimulatorEngine:init(startValue, endValue, duration, devices, curve, debug);
dawnSimulatorEngine:start();
if (debug) then fibaro:debug("End of the process"); end

post-3-0-77692100-1388361490_thumb.png

post-3-0-95463300-1388361493_thumb.png

  • Upvote 7
Lien vers le commentaire
Partager sur d’autres sites

Depuis que j'ai testé ce script j'avais une idée dans le coin de la tête. La nuit permettant de reposer le cerveau, ce matin je me suis attelé à  faire ce que j'avais en tête. Mon idée était de mettre tout cela dans un virtual device pour choisir la courbe, la pièce ou l'on veut exécuter le script, voici les modifs:

 

1- Créer deux variables:

"Aube_courbe" avec les valeurs linear, inQuad, inExpo, outExpo, inOutQuad, inOutExpo, outInExpo

"Aube_pièces" avec les valeurs du module correspondant de la pièce

 

2- Créer un virtual device avec:

A- Autant de bouton que de pièce qu'on veut utiliser, mettre aussi une label pour avoir l'info de la pièce sélectionnée, mettre le code suivant dans chaque bouton

--[[
%% properties
%% globals
--]]
 
fibaro:setGlobal("Aube_module", "39");
fibaro:call(151, "setProperty", "ui.Label1.value", "Bureau");

"39" est le numéro de module dimmer de la pièce à  reporter dans la variable "Aube_module"

"151" est le numéro du virtual device

"ui.Label1.value" est le numéro de label pour afficher l'info "bureau"

 

Répéter cela en modifiant les données pour chaque pièce

 

 

B- 7 boutons pour choisir la courbe de variation avec le code suivant dans chaque bouton:

--[[
%% properties
%% globals
--]]
 
fibaro:setGlobal("Aube_courbe", "linear");
fibaro:call(151, "setProperty", "ui.Label2.value", "linear");

"linear" est le type de courbe à  reporter dans la variable "Aube_courbe"

"151" est le numéro du virtual device

"ui.Label2.value" est le numéro de label pour afficher l'info "linear"

 

Répéter cela pour les 6 autres courbes

 

 

C- 1 bouton "Début réveil" pour lancer le réveil en douceur suivant le variable "Aube_module" et "Aube_courbe" avec le code suivant:

--[[
%% properties
%% globals
--]]
fibaro:debug("HC2 start script at " .. os.date());

-- LUA - Dawn simulator V1.0.1
--
-- Wake up "naturally", illuminated by a soft light and progressive.
-- Based on open source Robert Penner's original easing equations (Copyright © 2001 Robert Penner) 
-- Copyright © 2013 Jean-christophe Vermandé

-- USER SETTINGS :
-- Type of equation used to generate the curve (dimming).
-- Possible values are: linear, inQuad, inExpo, outExpo, inOutQuad, inOutExpo, outInExpo

local curve = fibaro:getGlobal("Aube_courbe") -- Type of equation used to generate the curve (dimming).
local debug = false;     -- To log in HC2 debug area
local devices = {fibaro:getGlobal("Aube_module")};   -- IDs of devices to be varied (only dimmable device), eg. {1, 16, 10}
local startValue = 0;   -- Begin value
local endValue = 100;   -- End value
local duration = 40;    -- Execution time in seconds of the scene


-- DO NOT EDIT THE CODE BELOW (except to suit your needs) --


dawnSimulatorEngine = {
  version = "1.0.1"
};
function dawnSimulatorEngine:init(startValue, endValue, duration, devices, curve, debug)
  self._lastValue = 0 
  self._startValue = startValue or 0;
  self._endValue = endValue or 100;
  self._duration = duration or 1;
  self._devices = devices or {}; 
  self._curve = equations.map[curve or 'linear'];  -- require 'equations' to operate
  self._debug = debug or true;
end
function dawnSimulatorEngine:_update(value)  
  self._lastValue = value; -- keep in memory the last value to compare later
  -- loop in deveices
  local name, id;
  for i=1, #self._devices do
    id = tonumber(self._devices[i]);
    fibaro:call(id, "setValue", value);
    if (self._debug) then
      name = fibaro:getName(id);
      if (name == nil or name == string.char(0)) then
        name = "Unknown"
      end
      fibaro:debug("Device:" .. name .. " setValue: " .. value);
    end
  end
end
function dawnSimulatorEngine:_compute(time)
  return math.ceil(tonumber(self._curve(time, self._startValue, self._endValue, self._duration)));
end
function dawnSimulatorEngine:start()
  local computedValue;
  local doWhile = true;
  local time = 0;
  -- timeline
  while (doWhile == true) do
    computedValue = self:_compute(time);
    -- prevent multiple call with same value
    if (computedValue ~= self._lastValue) then
      -- update device value
      self:_update(computedValue);
    end
    time = time + 1;
    if (time > self._duration) then
      doWhile = false;
      if (self._lastValue < self._endValue) then
        -- force target value
        self:_update(computedValue);
      end
    else
      fibaro:sleep(1000);
    end
    -- do while
  end
end
    
-- Easing function (Penner's Easing Equations)
equations = equations or {
  version = "1.0.1",
  -- Linear
  linear = function(t, b, c, d)
    return c * t / d + b;
  end,
  -- InQuad
  inQuad = function(t, b, c, d)
    t = t / d;
    return c * math.pow(t, 2) + b;
  end,
  -- InOutQuad
  inOutQuad = function(t, b, c, d)
    t = t / d * 2;
    if t < 1 then
      return c / 2 * math.pow(t, 2) + b;
    else
      return -c / 2 * ((t - 1) * (t - 3) - 1) + b;
    end
  end,
  -- InOutExpo
  inOutExpo = function(t, b, c, d)
    if t == 0 then return b end
    if t == d then return b + c end
    t = t / d * 2;
    if t < 1 then
      return c / 2 * math.pow(2, 10 * (t - 1)) + b - c * 0.0005;
    else
      t = t - 1;
      return c / 2 * 1.0005 * (-math.pow(2, -10 * t) + 2) + b;
    end
  end,
  -- OutInExpo
  outInExpo = function(t, b, c, d)
    if t < d / 2 then
      return equations.outExpo(t * 2, b, c / 2, d);
    else
      return equations.inExpo((t * 2) - d, b + c / 2, c / 2, d);
    end
  end,
  -- InExpo
  inExpo = function(t, b, c, d)
    if t == 0 then
      return b;
    else
      return c * math.pow(2, 10 * (t / d - 1)) + b - c * 0.001;
    end
  end,
  -- OutExpo
  outExpo = function(t, b, c, d)
    if t == d then
      return b + c;
    else
      return c * 1.001 * (-math.pow(2, -10 * t / d) + 1) + b;
    end
  end
};

-- Equations map
equations.map = {
  ['linear'] = equations.linear,
  ['inQuad'] = equations.inQuad,
  ['inExpo'] = equations.inExpo,
  ['outExpo'] = equations.outExpo,
  ['inOutQuad'] = equations.inOutQuad,
  ['inOutExpo'] = equations.inOutExpo,
  ['outInExpo'] = equations.outInExpo
}

-- START SIMULATOR ENGINE
if (debug) then fibaro:debug("Starting the process"); end
--startEngine(equations.map[curve]);
dawnSimulatorEngine:init(startValue, endValue, duration, devices, curve, debug);
dawnSimulatorEngine:start();
if (debug) then fibaro:debug("End of the process"); end

Voila ce que cela donne graphiquement dans l'image attachée. Y a plus qu'à  faire mumuse.

 

 

Maintenant y a un truc que je voudrais faire et que l'on voit sur le screenshot c'est utiliser le slider pour régler la durée, mais je n'y arrive pas car je n'ai jamais utilisé un slider.

J'ai tenté dans le code LUA du slider:

--[[
%% properties
%% globals
--]]
 
fibaro:setGlobal("Aube_duree", fibaro:getValue(151, "ui.Slider1.value"));
--[[
%% properties
%% globals
--]]
 
fibaro:setGlobal("Aube_duree", _sliderValue_);

Cela ne marche pas.

 

et dans le code principal

local duration = _sliderValue_;    -- Execution time in seconds of the scene

Mais là , la lumière s'allume trop vite comme si je l'allumais normalement. "Aube_duree" est une variable avec valeur numérique.

Si quelqu'un peut m'aider :D

post-16-0-63246500-1388476015_thumb.jpg

  • Upvote 2
Lien vers le commentaire
Partager sur d’autres sites

Bonne année à  tous :D

 

J'ai remis le nez dans ce script après avoir regardé celui de Krikroff sur la gestion de la déshum, cela m'a donné une idée.

J'ai testé plusieurs modifs et celle là  marche, y surement de quoi optimiser:

 

Dans le slider j'ai mis:

--[[
%% properties
%% globals
--]]
 
fibaro:setGlobal("Aube_duree", _sliderValue_);

Puis dans le script j'ai remplacé:

local duration = 40;    -- Execution time in seconds of the scene

Par:

local duree = fibaro:getGlobal("Aube_duree")
local duration = tonumber(duree) -- Execution time in seconds of the scene

Au final cela marche, réglage possible entre 0 et 100 secondes :P

Lien vers le commentaire
Partager sur d’autres sites

Petite évolution aujourd'hui car Mme trouvait que c'était trop violant comme réveil à  cause de la luminosité à  100%.

 

1- Ajout d'une variable "Aube_lum"

 

2- Ajout d'un slider avec le code suivant:

--[[
%% properties
%% globals
--]]
 
fibaro:setGlobal("Aube_lum", _sliderValue_);

3- Modification du script de réveil comme suit:

Remplacer

local endValue = 100;   -- End value

Par

local luminosite = fibaro:getGlobal("Aube_lum")
local endValue = tonumber(luminosite) -- End value

Enjoy ;)

Lien vers le commentaire
Partager sur d’autres sites

  • 1 an après...
  • 8 mois après...

Bonjour,

Merci pour le partage.

Je redéterre le sujet. :-)

 

Voici un autre tuto de simulateur d'aube :

http://www.domotique-fibaro.fr/index.php/topic/4014-r%C3%A9veil-douceur-aurore-artificielle-sp%C3%A9cial-parents/

Partage par SebCbien (merci à  lui aussi)

 

Ce que je trouve pas mal c'est le fait de détecter les conditions individuellement des actionneurs :

   - Si une lampe est déjà  allumée, elle est exclue de l'allumage (évite de passer de 100% à  5% lorsque le script démarre et que l'on est déjà  levé)

   - Si on modifie une lampe elle est exclue (extinction ou allumage à  100% par exemple)

   - Si toutes les lampes ont été modifiées, fin du script

 

Je voulais donc savoir si quelqu'un aurait par hasard intégré ce type de fonction au simulateur ?

Et dans un sens global savoir où vous en êtes sur votre simulateur ?

Merci

PS : débutant sur HC2 mais commençant à  voir l'intérêt du LUA

Lien vers le commentaire
Partager sur d’autres sites

Si je peux me permettre un retour...

Personnellement àla longue on ne se réveille plus que quand la lumière est à100%... et encore ;-)

Alors que ce soit une courbe X ou Y, dans un sens ou dans l'autre, l'impact est très faible.

Ce n'est que mon expérience et ça inclus mes enfants et ma femme.

J'imagine que certains doivent avoir un sommeil très léger et que une courbe logarithmique leur conviendra mieux.

Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...

Salut A tous,

 

Je revient sur ce sujet car j'ai mis en place le simulateur d'aube sur la base de la scène à  Krikroff avec une mise en module virtuel idem à  Lolomail, juste un slider en plus pour le paramétrage de la durée en minute.

Maintenant ma question concerne la possibilité de mise en place d'un "snooze" ou "stop" pour stopper la scène de variation de lumière.

Quelqu'un connait la méthode ? n'étant pas trop calé lua, il s'agit juste d'un bout de code permettant de stopper durant x minute le cycle de réveil et de le relancer, ou pas.

Merci de votre aide.

Lien vers le commentaire
Partager sur d’autres sites

  • 1 an après...

Hello,

 

je ne sais pas si j'ai loupé un truc mais comment faites-vous pour mettre à jour l'heure de lever sur votre HC2? EN modifiant la varaiable à chaque fois? Ou màj auto depuis l'alarme du téléphone vers la HC2 ??

Parce que je ne me réveille pas tous les jours à la même heure... et j'avoue que devoir aller changer la variable au moment de me coucher, c'est pas très WAF ni MMAF (Moi-même Acceptance Factor)!! ;-)

J'ai bien vu le post de lionel57 sur l'appli mais ça me semble compliqué à mettre en place pour moi...

J'avais aussi récupéré une façon de faire avec Tasker sur un autre site mais je crois que ça ne fonctionne plus depuis qqes temps...

 

Merci de vos retours.

Julien

Lien vers le commentaire
Partager sur d’autres sites

 La box connait l'heure de lever et de coucher du soleil selon les coordonnées GPS que tu lui as renseigné. Tu peux les récupérer par le mode bloc dans les conditions du timer, moi, c'est par le GEA de @Steven (sunset et sunrise).

 

Lien vers le commentaire
Partager sur d’autres sites

Salut Did, 

Ok mais après ? Je ne me réveille pas obligatoirement voire jamais en même temps que le soleil !! Et je ne le veux pas !!? :-) 

Ce que je souhaite c'est que le simulateur se déclenche en fonction de l'heure que je mets sur mon alarme de téléphone, le soir en me couchant... Et cette heure change d'un jour sur l'autre selon mes RV, astreintes etc...

Pour compléter, je n'ai pas GEA... j'ai peur que ce soit compliqué pour moi... Je bataille déjà avec LUA donc çà fait rajouter une couche d'apprentissage en plus. 

Lien vers le commentaire
Partager sur d’autres sites

 Je ne suis pas spécialiste de Lua mais tu devrais pouvoir inclure l'ouverture des volets dans la scène pour que ce soit automatique (ou lancer une autre scène qui elle, les ouvrira).

 

Lien vers le commentaire
Partager sur d’autres sites

Heu, je crois qu'on ne se comprend pas did...!! :-) En tout cas, je ne comprends pas ce que tu veux me dire...!! ^^

 

Ce que je souhaite, c'est :

1- le soir, programmer, sur mon téléphone android, l'heure de réveil du lendemain (et c'est mon téléphone qui sonnera pour me faire lever du lit)

2- faire en sorte que cette heure de réveil, paramétrée sur l'appli réveil de mon téléphone, soit intégrée dans la HC2 : comment ? c'est ça ma question 

3- en fonction de l'heure de réveil que j'aurai paramétrée et intégrée comme une variable dans un VD ou une scène, permettre le déclenchement du simulateur d'aube. Pour être exact, je souhaite déclencher le simulateur 20 minutes avant mon heure de réveil et faire durer le simulateur pendant 20 minutes --> comme ça, quand la lumière est à 100%, le réveille sonne et je me lève...

 

Lien vers le commentaire
Partager sur d’autres sites

Le plus simple, c'est GEA.
Le vd alarme de Steven et une ligne dans GEA.
Tu trouveras des exemples faciles dans le showroom GEA (voir la signature)
Tu peux programmer une heure et les jours auxquels ça doit déclencher (par exemple pas les weekend)
J'ai plusieurs VD alarm pour plusieurs heures (un pour la semaine, un pour l'heure du weekend, un pour la veilleuse des enfants)..


Sent from my SM-N910F using Tapatalk


Lien vers le commentaire
Partager sur d’autres sites

Salut à Tous,

 

Je suis pas mal pris en ce moment mais pour ma part j'utilise mon réveil android pour lancer mes scènes de réveil.

 

Ci dessous le lien vers le tuto et le nécéssaire réalisé par Lionel57

 

 

 

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

Salut,

 

@sebcbien : pas encore osé passez le pas pour GEA... j'ai peur que ce soit trop compliqué pour moi (faibles notions en lua)

@Fred.domotique : j'avais bien vu le tuto de @Lionel57 mais quand j'installe l'apk sur mon tél, j'ai un message d'erreur qui dit" Un pbe est survenu lors de l'analyse du package". J'ai un SAMSUNG S7 EDGE avec ANdroid 7 (Nougat)... 

 

Lien vers le commentaire
Partager sur d’autres sites

  • 4 ans après...
×
×
  • Créer...