Aller au contenu

Messages recommandés

Posté(e)

Bonjour,

 

J'ai découvert une commande Lua "isdst" qui permet de savoir si nous sommes en heure d'été. On doit pouvoir stocker cette réponse

 

"true" dans une variable Saison mais je ne sait pas si il y a une réponse "false" pour les mois d'hiver. Quelqu'un a une idée sur les lignes

 

de commande Lua pour récupérer cette info dans le panneau des variables?

 

Merci.

 

  • Upvote 1
Posté(e)

Pour cela il faut créer une variable global depuis le panneau variable (il y a  un tuto pour cela sur le forum il me semble).

Par exemple la variable saison.

Puis utiliser la commande LUA fibaro:getGlobalValue("saison") pour lire la valeur ou bien fibaro:setGlobal("saison", true ou false) pour mettre à  jour la variable global.

 

Example:

-- récupération d'une table Date
local dt = os.date("*t");
-- création de la chaîne pour l'affichage
local display = dt.hour..":"..dt.min..":"..dt.sec.." Heure d'été -> "..tostring(dt.isdst);
-- Sortie de la variable vers la fenêtre debug du HC2
-- false pour hiver, true pour été
fibaro:debug(display);
-- mise à  jour de la variable
fibaro:setGlobal("saison", dt.isdst);

Voilou !

Posté(e)

Merci beaucoup Krikroff

 

Par contre,  la routine ne modifie pas la valeur:

 

Quand je fais démarrer, cela m'affiche:

 

[DEBUG] 13:46:40: 13:46:40 Heure d'été -> false

 

[ERROR] 13:46:40: line :setGlobal (arg 3), expected  'string const &' got 'boolean'

 

et la valeur de la variable saison ne change pas dans le panneau.

Posté(e)

avec plaisir,

 

ok, il faut remplacer la ligne

fibaro:setGlobal("saison", dt.isdst);

par

fibaro:setGlobal("saison", tostring(dt.isdst));

il demande un string et pas un boolean ;)

Posté(e)

Bah oui, comment n'y ai-je pas pensé plus tôt?

 

Je plaisante, je n'aurais jamais été capable de pondre ça et aussi rapidement.

 

Merci encore.

Posté(e)

Après tu peux aller plus loin encore :), avec une variable global "predefinie" par exemple: saison été/hiver et avec un code dans le genre

if (dt.isdst) then
  fibaro:setGlobal("saison", "été");
else
  fibaro:setGlobal("saison","hiver");
end
  • Upvote 1
Posté(e)

Royale, et il n'y a pas besoin de mettre de pause pour économiser les ressources de la HC2 (comme elle n'est utilisée qu'une fois tous les six mois)?

Posté(e)

Oui, placer le code dans une scène qui s’exécute 1x par jour par exemple ;)

Posté(e)

Je vais encore abuser de votre temps mais j'ai fait une scène avec les blocs et mis un timer basé sur un intervalle de 24 heures entre 4h00 et 4h02.

 

Puis j'ai converti les blocs en Lua, et enfin ajouté le code ce qui me donne:

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

local sourceTrigger = fibaro:getSourceTrigger();
if (sourceTrigger["type"] == "autostart") then
while true do

local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
 ( (tonumber(os.date("%H%M")) >= tonumber(string.format("%02d%02d", "04", "00")) and tonumber(os.date("%H%M")) <= tonumber(string.format("%02d%02d", "04", "02"))) and (math.floor(os.time()/60)-math.floor(1389063600/60))%1440 == 0 )
)
then
end

fibaro:sleep(60*1000);
end
else

local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
startSource["type"] == "other"
)
then
-- récupération table Date
local dt = os.date("*t");
-- création de la chaîne pour affichage
local display = dt.hour..":"..dt.min..":"..dt.sec.." Heure d'été -> "..tostring(dt.isdst);
-- Sortie de la variable vers la fenêtre debug du HC2
-- false pour hiver, true pour été
fibaro:debug(display);
-- mise à  jour de la variable
fibaro:setGlobal("Saison", tostring(dt.isdst));
    if (dt.isdst) then
    fibaro:setGlobal("Saison", "Eté");
    else
    fibaro:setGlobal("Saison","Hiver");
    end

end

end

Ais-je bon?

Posté(e)

met les balises codes pour que ce soit plus lisibles et revoit ton incrementation ;).

 

Ton code contient des erreurs il me semble:

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

local sourceTrigger = fibaro:getSourceTrigger();

if (sourceTrigger["type"] == "autostart") then
  while true do
    local currentDate = os.date("*t");
    local startSource = fibaro:getSourceTrigger();
    if (((tonumber(os.date("%H%M")) >= tonumber(string.format("%02d%02d", "04", "00")) and tonumber(os.date("%H%M")) <= tonumber(string.format("%02d%02d", "04", "02"))) and (math.floor(os.time()/60)-math.floor(1389063600/60))%1440 == 0 )) then
    end
    fibaro:sleep(60*1000);
  end

else
  local currentDate = os.date("*t");
  local startSource = fibaro:getSourceTrigger();
  if ( startSource["type"] == "other") then
    -- récupération table Date
    local dt = os.date("*t");
    -- création de la chaîne pour affichage
    local display = dt.hour..":"..dt.min..":"..dt.sec.." Heure d'été -> "..tostring(dt.isdst);
    -- Sortie de la variable vers la fenêtre debug du HC2
    -- false pour hiver, true pour été
    fibaro:debug(display);
    -- mise à  jour de la variable
    fibaro:setGlobal("Saison", tostring(dt.isdst));
    if (dt.isdst) then
      fibaro:setGlobal("Saison", "Eté");
    else
      fibaro:setGlobal("Saison","Hiver");
    end
  end
end
Posté(e)

Bonjour Shad et merci,

 

Comment met-on ce cadre et la numérotation des lignes qui rend plus clair l'apparence du message?

Posté(e)

Heu attend, j'avais pas vue que ton code venait d'un bloc graphique. Je comprend pas mal de choses pourquoi ton code est bizarre :D

 

En fait si tu veux faire une scène ou tu clics pour exécuter la commande de krikroff car j'avoue ne pas comprendre la partie entre 4h00 et 4h02 du matin.

Le plus simple est de faire simplement:

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

local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if ( startSource["type"] == "other") then
  -- création de la chaîne pour affichage
  local display = currentDate.hour..":"..currentDate.min..":"..currentDate.sec.." Heure d'été -> "..tostring(currentDate.isdst);
  -- Sortie de la variable vers la fenêtre debug du HC2
  -- false pour hiver, true pour été
  fibaro:debug(display);
  -- mise à  jour de la variable
  fibaro:setGlobal("Saison", tostring(currentDate.isdst));
  if (currentDate.isdst) then
    fibaro:setGlobal("Saison", "Eté");
  else
    fibaro:setGlobal("Saison","Hiver");
  end
end

Tiens moi au courant si c'est bon.

Posté(e)

C'est pour ajouter un déclenchement journalier de cette commande de Krikroff qui n'a pas besoin de tourner 24h/24 mais simplement

 

une fois/jour à  4h pendant 2 min. (changement d'heure effectué à  3h). Après la valeur est stockée dans ma variable saison.

Posté(e)

Pourquoi laisser pendant 2 min??

La lancer une fois à  4h10 devrais suffire.

 

De plus je te conseille pour un soucis de facilité de gestion d'utiliser le scheduler que j'ai mis ici.

Tu verras quand tu commenceras à  avoir plein de scène ce sera beaucoup mieux à  gérer tout depuis le même endroit et tu peux suivre si tes scènes sont bien lancer.

Et pour la création des scènes, c'est également simplifiez car tu as juste à  mettre pour la lancer:

--[[
%% properties
%% globals
--]]
 
local startSource = fibaro:getSourceTrigger();
 
if ( startSource["type"] == "other") then
......
end
Posté(e)

La lancer une seule fois suffira en effet. J'ai mis en place le sheduler,  Scene Restart Schedule dans des scènes et Alarm clock  dans un

 

périphérique virtuel mais là  je suis encore plus perdu: en parcourant toutes les lignes, je vois qu'il y a des variables à  ajouter dans le

 

panneau mais je ne suis pas encore assez calé pour la mise en service et l'utilisation de sheduler.

 

Merci

Posté(e)

Pour être sà»r ne de pas faire de bétises (corrige moi si je me trompe):

 

1 périphérique virtuel pour Réveil (j'ai pris celui d'I-magin en français) vérifier le nom des variables

 

            Dans ce périphérique virtuel, adapter le n°id de ce VD à  la ligne: local alarmClockDevice de chaque bouton

 

1 scène pour Scene Restart Schedule

 

            Comment on la nomme? A quoi sert cette scène? compter le nombre de scènes qui tournent? tuer les scènes?

 

1 scène pour scheduler-1-3-0

 

            Comment on la nomme? Planificateur? Dans la ligne 97: local restartScene = 67 correspond à  quel Id?

 

            Dans la ligne 98: local alarmClocks = { alarmTime1 = {deviceID = 268, correspond à  quel Id?

 

            idem pour la ligne 103 et le n°294? Quelles sont les variables à  mettre en place et leur valeur?

 

Merci pour ta patiente.

 

 


 
Posté(e)

Je comprends Shad dans sa démarche, mais j'aurais tendance à  dire que le scheduler est à  aborder avec un minimum d' aisance avec la prog LUA et pas forcement justifié au début d'une installation ;) mais plus dans un second temps.

 

Le code suivant fait une vérification tous les jours à  4:15, il n'est pas optimisé car juste passage du mode bloc à  LUA mais bon ...

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

function check()
  -- récupération table Date
  local dt = os.date("*t");
  -- création de la chaîne pour affichage
  local display = dt.hour..":"..dt.min..":"..dt.sec.." Heure d'été -> "..tostring(dt.isdst);
  -- Sortie de la variable vers la fenêtre debug du HC2
  -- false pour hiver, true pour été
  fibaro:debug(display);
  -- mise à  jour de la variable
  if (dt.isdst) then
    fibaro:setGlobal("Saison", "Eté");
  else
    fibaro:setGlobal("Saison","Hiver");
  end
end

local sourceTrigger = fibaro:getSourceTrigger();
if (sourceTrigger["type"] == "autostart") then
  while true do
    local currentDate = os.date("*t");
    local startSource = fibaro:getSourceTrigger();
    if ( ( ((currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6 or currentDate.wday == 7) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "04:15") )) then
          check();
    end  
    fibaro:sleep(60*1000);
  end
else
  local currentDate = os.date("*t");
  local startSource = fibaro:getSourceTrigger();
  if (startSource["type"] == "other") then
    check();
  end
end

Bon courage.

Posté(e)

Il ne manque pas entre les lignes 16 & 17 cette commande:

 

fibaro:setGlobal("Saison", tostring(dt.isdst));

Posté(e)

Alors: Si tu utilises une variable prédéfinie "Été" / "Hiver" il faut utiliser

if (dt.isdst) then
  fibaro:setGlobal("Saison", "Eté");
else
  fibaro:setGlobal("Saison","Hiver");
end

si c'est une variable "simple" il faut utiliser

fibaro:setGlobal("Saison", tostring(dt.isdst));

mais pas les deux ;)

  • 11 mois après...
Posté(e)

Salut les gars, 

 

Je souhaiterais faire de même afin d'optimiser mes volets roulants lors du changement d'heure ou de saison;) Did tu pourrais me faire un ptit retour de ce que tu as fait  :15:

 

Merci 

×
×
  • Créer...