Aller au contenu
p78ch201

Programmation Lua Basique

Recommended Posts

d'ailleurs est-ce bien utile d'avoir sunsethour ? n'est-ce pas une variable systeme ?

En effet, c'est une variable système donc ton scénario ne peux pas la mettre à  jour. 

 

En LUA le code pour savoir s'il fait jour ou nuit est tellement compliqué que l'idée d'avoir 2 scénarios est très bonne. De plus, il est aisé d'utiliser ta variable "Jour" dans d'autre scénario.

 

Pour info, voici le code pour s'avoir s'il fait jour :

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) == fibaro:getValue(1, "sunriseHour")) )
)
then

Partager ce message


Lien à poster
Partager sur d’autres sites

j'avais vu ça aussi en essaynt de convertir mes scenes bloc en LUA.

je comprend pas cette ligne :

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

vu que currentDate.wday ne peut etre egal qu'a un chiffre entre 1 et 7, cette condition est toujours vraie, donc quelle est son utilité ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Elle veux dire "Tout les jours" donc c'est vrai qu'elle est complètement inutile. Sauf, si on rajoute un jours dans la semaine ... personnellement, je suis partant pour autant que cela soit un jour férié  :P

 

Le système traduit bêtement ce qu'il y a dans ta scène et comme dans la scène tous les jours sont cochés par défaut, cela donne ce code inutile .. que d'ailleurs j'ai recopié aussi vu que je ne suis pas plus intelligent que le traducteur.

 

local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
( (string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == fibaro:getValue(1, "sunriseHour")) )
)
then

Partager ce message


Lien à poster
Partager sur d’autres sites

Est-ce que je pourrais envisager un code comme ceci dans mon module :

local currentDate = os.date("*t");

if ( ( (string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) =< fibaro:getValue(1, "sunriseHour")) ) and
(string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) >= fibaro:getValue(1, "sunsetHour")) )
then

Partager ce message


Lien à poster
Partager sur d’autres sites

En tant que développeur ma réponse est NON. Tu ne peux pas comparer des valeurs (heures) sous forme de chaîne de caractères, le résultat n'est jamais viable.

 

Il faut récupérer toutes ces valeurs et les convertir en une seule et même unité. Dans notre cas, nous allons tout convertir en minutes puis nous allons comparer le tout ensemble.

 

fibaro:getValue(1,'sunriseHour')  nous retourne "06:38" alors nous allons prendre les 2 premiers caractères pour les heures et les 2 derniers pour les minutes. Ensuite nous allons les convertir en chiffre (tonumber) puis les transformer en minutes (heures*60+minutes). Même procédé pour sunset.

Pour l'heure actuel, c'est plus simple car LUA fourni le nécessaire. 

 

--[[
%% properties
%% globals
--]]
local sunriseHour = fibaro:getValue(1,'sunriseHour') 
local sunsetHour = fibaro:getValue(1,'sunsetHour') 
local currentHour = os.date("*t")
 
local sunrise = tonumber(string.sub (sunriseHour, 1 , 2) ) * 60 + tonumber(string.sub(sunriseHour, 4) )
local sunset = tonumber(string.sub (sunsetHour, 1 , 2) ) * 60 + tonumber(string.sub(sunsetHour, 4) )
local now = currentHour.hour * 60 + currentHour.min;
 
fibaro:debug("Sunrise : " .. sunrise)
fibaro:debug("Sunset : "..sunset)
fibaro:debug("Maintenant : " ..now)
 
if ( (now >= sunrise) and (now <= sunset)) then
   fibaro:debug("Il fait jour");  
end

Partager ce message


Lien à poster
Partager sur d’autres sites

du coup ça me donne ça :

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

local sunriseHour = fibaro:getValue(1,'sunriseHour') 
local sunsetHour = fibaro:getValue(1,'sunsetHour') 
local currentHour = os.date("*t")
 
local sunrise = tonumber(string.sub (sunriseHour, 1 , 2) ) * 60 + tonumber(string.sub(sunriseHour, 4) )
local sunset = tonumber(string.sub (sunsetHour, 1 , 2) ) * 60 + tonumber(string.sub(sunsetHour, 4) )
local now = currentHour.hour * 60 + currentHour.min;
 
fibaro:debug("Sunrise : " .. sunrise)
fibaro:debug("Sunset : "..sunset)
fibaro:debug("Maintenant : " ..now)
 
if ( (now >= sunrise) and (now <= sunset)) then
  fibaro:debug("Il fait jour");
  fibaro:setGlobal("JOUR", "1");
  fibaro:call(81, "setProperty", "ui.label10.value", "JOUR");
else
  fibaro:debug("Il fait nuit");
 fibaro:setGlobal("JOUR", "0");
  fibaro:call(81, "setProperty", "ui.label10.value", "NUIT");
end

--temporisation de 5 minutes
fibaro:sleep(300000);

et mes deux scènes deviennent inutiles ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Si tu veux complètement abandonner tes 2 autres scénarios, il faut que celui-ci tourne en boucle toutes les 5 minutes et pour ceci, il faut l'inclure dans une boucle sans fin.

Attention a rajouter le %% autostart au début. Pour que la HC2 démarre ton scénario automatiquement au démarrage.

--[[
%% autostart
%% properties
%% globals
--]]
while (true) do
   local sunriseHour = fibaro:getValue(1,'sunriseHour')
   local sunsetHour = fibaro:getValue(1,'sunsetHour')
   local currentHour = os.date("*t")
   local sunrise = tonumber(string.sub (sunriseHour, 1 , 2) ) * 60 + tonumber(string.sub(sunriseHour, 4) )
   local sunset = tonumber(string.sub (sunsetHour, 1 , 2) ) * 60 + tonumber(string.sub(sunsetHour, 4) )
   local now = currentHour.hour * 60 + currentHour.min;
   fibaro:debug("Sunrise : " .. sunrise)
   fibaro:debug("Sunset : "..sunset)
   fibaro:debug("Maintenant : " ..now)
    if ( (now >= sunrise) and (now <= sunset)) then
     fibaro:debug("Il fait jour");
     fibaro:setGlobal("JOUR", "1");
     fibaro:call(81, "setProperty", "ui.label10.value", "JOUR");
   else
     fibaro:debug("Il fait nuit");
    fibaro:setGlobal("JOUR", "0");
     fibaro:call(81, "setProperty", "ui.label10.value", "NUIT");
   end
   --temporisation de 5 minutes
   fibaro:sleep(300000);
end

Partager ce message


Lien à poster
Partager sur d’autres sites

Vous vous prenez vraiment la tête pour calculer sunrise et sunset -_-'.

Utilisez le scheduler, ce sera plus simple et en plus vous pouvez lui dire combien de temps avant ou après il fait l'action.

Partager ce message


Lien à poster
Partager sur d’autres sites

Me suis pas encore penché sur le scheduler :P

Pour le moment, ces petits modules m aident a comprendre le lua. Un module qui affiche jour/nuit n est pas très utile en soi !

Partager ce message


Lien à poster
Partager sur d’autres sites

Tu devrais vraiment t'y mettre car sa te ferait gagner du temps.

En plus t'apprendra toujours le lua avec d'autre code.

Partager ce message


Lien à poster
Partager sur d’autres sites

 

Si tu veux complètement abandonner tes 2 autres scénarios, il faut que celui-ci tourne en boucle toutes les 5 minutes et pour ceci, il faut l'inclure dans une boucle sans fin.

Attention a rajouter le %% autostart au début. Pour que la HC2 démarre ton scénario automatiquement au démarrage.

 

en fait c'est tout l'interet de mettre le code dans un module, la boucle se fait toute seule !

Partager ce message


Lien à poster
Partager sur d’autres sites

Heuuu ... en effet, la boucle se fait toute seule, mais comme c'est complètement bugé, elle ne va pas tourner longtemps  :15:

 

Les "main loop" des modules ne fonctionne pas bien, il vaut mieux mettre le code dans un bouton d'un module et avoir un scénario qui toute les X secondes va executer le code du bouton.

 

Aucun système n'est parfait ... sauf quand on connait toutes ces failles  ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

Non pour du code simple les main loops fonctionne bien.

Par contre àpartir du moment que tu commences àrécupérer des info d'api extérieur ou des trucs comme sa en effet il y a des bugs.

Mais en effet si tu pars sur code complexe, il vaut mieux appeler un bouton.

Partager ce message


Lien à poster
Partager sur d’autres sites

je dis comme shad ,,,

 

moi j'ai 2 scènes sur une variables,,,,

 

1 scène jour et scène nuit , j'ai même rajouté soir , une variable jour_soir_nuit.    scenes a telle heure jour 07h15

1 scène heure creuse une autre heure pleine ,  une variable Hr creuse ou Hr pleine. (quand la maison est vide la journée, PAS pour l'EdF).(je coupe la VMC en Hr creuse et la nuit).

1 scène été_hiver sur une variable.( a modifier chaque année la date mai2014....oct2014.( au une idée en écrivant,,,,rajouter un bloc pour 2015, un bloc année 2016 , 2017 dans ma scène)

 

il me manque une variable Lundi,Mardi,,Samedi,WK.... comme le module REVEIL, que je vais voir a réutiliser.

 

beaucoup de scene placer dans une room : variable mais tout marche et je peux faire de vrai montage,,,,VMC MARCHE quand JOUR,quand Hr pleine,en HIVER, et si je suis la tralalalala.

Plus simple pour DOMOTISER.

 

pareil pour la VMC, comme ca j'utilise les variables pour dire: si SdB eclairage on , en jour et soir, Hr pleine, alors vitesse 2.

 

Permet de pouvoir rendre des variables sans toucher en permanence a tes scenes parce que tu rajoutes tel ou tel scene,module ou variable.

 

 

cordialement

Partager ce message


Lien à poster
Partager sur d’autres sites

×