Aller au contenu

Messages recommandés

Posté(e)

Bonjour,

 

Suite à  mes précédentes expériences que j'ai déjà  partagées sur le forum officiel Fibaro, j'ai revu mes modules virtuels pour la gestion du chauffage. Evidemment ce serait tellement mieux de pouvoir utiliser le panneau de chauffage du HC2 mais ce n'est pas possible avec la gestion de notre fil pilote, et je ne suis pas pour le ON/OFF pur et dur du radiateur qui risquerait d'endommager la partie électronique. La solution présentée ici est également possible sans avoir une sonde de température dans chaque pièce chauffée.

 

Le premier module virtuel est un thermostat programmeur de zone. C'est à  dire qu'il permet de piloter l'ensemble des radiateurs qui vont suivre ses consignes.

 


Module virtuel thermostat

 

 

Le programmateur de zone permet: 

- de définir les modes des radiateurs de la zone en: Confort, Eco, Hors-gel, Arrêt. 

- de définir 2 programmes différents suivants les horaires de la journée 

- de définir un mode automatique, qui définit les modes voulus suivant les jours de la semaine. 

 

Le second module virtuel permet de piloter les radiateurs grâce au FGBS-221 et sa gestion des 4 ordres du fil pilote (avec les bonnes diodes de redressement):

 

Module virtuel radiateur

 

Le module de pilotage de radiateur permet de: 

- piloter directement le radiateur avec les modes Confort, Eco, Hors-gel, Arrêt indépendamment des consignes données par le programmateur de zone 

- suivre les consignes données par le programmateur de zone 

- mettre le radiateur à  l'arrêt dès qu'une fenêtre ou porte est ouverte. Une vérification est faite 5 min après l'ouverture, si la fenêtre est toujours ouverte on attend de nouveau 5min. Sinon, on remet le chauffage à  son état initial. 

 

Voilà  une synthèse du fonctionnement:

 

fonctionnement module chauffage

 

Voici comment mettre tout cela en oeuvre: 

 

Module programmateur de zone: 



Tout d'abord, il faut créer les variables globales prédéfinie avec les valeurs suivantes: 

z1_heat_engine = Auto, Prog1, Prog2, Confort, Eco, Hors-gel, Arret 

--> ça, c'est ce que le programmateur demande 



z1_heat_mode = Confort, Eco, Hors-gel, Arret 

-->ça, c'est les valeurs que devront suivre chacun des radiateurs qui suivront le programmateur. 

 

variables thermostat

Vous remarquerez dans les variables globales et dans l'ensemble des codes suivants le "z1". Cela correspond en fait à  une zone N°1. Si vous souhaiter faire une deuxième zone, il vous faudra faire du remplacer "z1" par "z2" dans l'ensemble des parties des codes et recréer d'autres variables globales, ça devrait fonctionner. 



Ensuite, il faut créer un module virtuel avec les boutons suivants, attention à  bien reporter votre N° de module virtuel dans les boutons et veiller à  la cohérence des ID des boutons et le code lua de chaque bouton: 

 

Les labels:

thermostat1

 

Bouton auto:

thermostat2

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

fibaro:setGlobal("z1_heat_engine", "Auto");
fibaro:debug("Mode Auto");
fibaro:log("Mode Auto");
fibaro:call(31, "setProperty", "ui.label_0_0.value", " Auto");

Bouton Prog1:


thermostat3

 

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

fibaro:setGlobal("z1_heat_engine", "Prog1");
fibaro:debug("Mode Prog1");
fibaro:log("Mode Prog1");
fibaro:call(31, "setProperty", "ui.label_0_0.value", " Prog1");

Bouton Prog2:

thermostat4


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

fibaro:setGlobal("z1_heat_engine", "Prog2");
fibaro:debug("Mode Prog2");
fibaro:log("Mode Prog2");
fibaro:call(31, "setProperty", "ui.label_0_0.value", " Prog2");

Bouton Confort:

thermostat5


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

fibaro:setGlobal("z1_heat_engine", "Confort");
fibaro:setGlobal("z1_heat_mode", "Confort");
fibaro:debug("Mode Confort");
fibaro:log("Mode Confort");
fibaro:call(31, "setProperty", "ui.label_0_0.value", " Confort");

Bouton Eco:

thermostat6


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

fibaro:setGlobal("z1_heat_engine", "Eco");
fibaro:setGlobal("z1_heat_mode", "Eco");
fibaro:debug("Mode Eco");
fibaro:log("Mode Eco");
fibaro:call(31, "setProperty", "ui.label_0_0.value", " Eco");

Bouton Hors-gel:

thermostat7

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

fibaro:setGlobal("z1_heat_engine", "Hors-gel");
fibaro:setGlobal("z1_heat_mode", "Hors-gel");
fibaro:debug("Mode Hors-gel");
fibaro:log("Mode Hors-gel");
fibaro:call(31, "setProperty", "ui.label_0_0.value", " Hors-gel");

Bouton Arret:

thermostat8


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

fibaro:setGlobal("z1_heat_engine", "Arret");
fibaro:setGlobal("z1_heat_mode", "Arret");
fibaro:debug("Mode Arret");
fibaro:log("Mode Arret");
fibaro:call(31, "setProperty", "ui.label_0_0.value", " Arret");

 

Et enfin copier le main loop suivant, en y indiquant vos paramètres utilisateurs. Pour paramétrer les programmes, il faut choisir les modes que vous souhaitez entre 2 horaires de votre choix. 

--[[
%% properties
%% globals
--]]
-- LUA - heat Engine V2.0.0
--
--
--variables globales à  déclarer: z1_heat_engine = Auto, Prog1, Prog2, Confort, Eco, Hors-gel, Arret.
--variables globales à  déclarer: z1_heat_mode = Confort, Eco, Hors-gel, Arret.

-------------------------------------------------------------------------------------------------------------
-- USER SETTINGS : --
-------------------------------------------------------------------------------------------------------------

---------------------
-- Paramètres généraux:
---------------------
local debug = true; --activer le mode debug
local ID_virtual_module = "31";

-----------------------------------
-- Definir les différents programmes:
-----------------------------------
local z1_time_1 = "06:00";
local z1_heat_mode_1_2_prog1 = "Confort";
local z1_heat_mode_1_2_prog2 = "Eco";
local z1_time_2 = "08:00";
local z1_heat_mode_2_3_prog1 = "Eco";
local z1_heat_mode_2_3_prog2 = "Confort";
local z1_time_3 = "13:00";
local z1_heat_mode_3_4_prog1 = "Eco";
local z1_heat_mode_3_4_prog2 = "Confort";
local z1_time_4 = "18:00";
local z1_heat_mode_4_5_prog1 = "Confort";
local z1_heat_mode_4_5_prog2 = "Confort";
local z1_time_5 = "21:00";
local z1_heat_mode_5_6_prog1 = "Eco";
local z1_heat_mode_5_6_prog2 = "Eco";
local z1_time_6 = "23:59";
local z1_heat_mode_6_1_prog1 = "Eco";
local z1_heat_mode_6_1_prog2 = "Eco";

-----------------------------------------------------------------------------------------
--Définition du programme automatique de la semaine: un mode au choix pour chaque jour (Prog1, Prog2, Confort, Eco, Hors-gel, Arret):
-----------------------------------------------------------------------------------------
local z1_Monday_auto = "Prog1";
local z1_Tuesday_auto = "Prog1";
local z1_Wednesday_auto = "Prog1";
local z1_Thursday_auto = "Prog1";
local z1_Friday_auto = "Prog1";
local z1_Saturday_auto = "Prog2";
local z1_Sunday_auto = "Prog2";



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


heatEngine = {
version = "1.0.0"
};

local z1_heat_engine = fibaro:getGlobal("z1_heat_engine");


local minute = 60000 --in milliseconds
local currentDate = os.date("*t");
local currentTime = string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min);
local z1_heat_mode = fibaro:getGlobal("z1_heat_mode");


--wday=1 is Sunday
--wday=2 is Monday
--wday=3 is Tuesday
--wday=4 is Wednesday
--wday=5 is Thursday
--wday=6 is Friday
--wday=7 is Saturday

if (z1_heat_engine == "Confort") then
z1_heat_mode= "Confort";
end

if (z1_heat_engine == "Eco") then
z1_heat_mode= "Eco";
end

if (z1_heat_engine == "Hors-gel") then
z1_heat_mode= "Hors-gel";
end

if (z1_heat_engine == "Arret") then
z1_heat_mode= "Arret";
end

if (z1_heat_engine == "Prog1") then
if z1_time_1 <= z1_time_2 then
if z1_time_1 <= currentTime and currentTime <= z1_time_2 then
z1_heat_mode= z1_heat_mode_1_2_prog1;
end
else
if not (z1_time_2 < currentTime and currentTime < z1_time_1) then
z1_heat_mode= z1_heat_mode_1_2_prog1;
end
end
if z1_time_2 <= z1_time_3 then
if z1_time_2 <= currentTime and currentTime <= z1_time_3 then
z1_heat_mode= z1_heat_mode_2_3_prog1;
end
else
if not (z1_time_3 < currentTime and currentTime < z1_time_2) then
z1_heat_mode= z1_heat_mode_2_3_prog1;
end
end
if z1_time_3 <= z1_time_4 then
if z1_time_3 <= currentTime and currentTime <= z1_time_4 then
z1_heat_mode= z1_heat_mode_3_4_prog1;
end
else
if not (z1_time_4 < currentTime and currentTime < z1_time_3) then
z1_heat_mode= z1_heat_mode_3_4_prog1;
end
end
if z1_time_4 <= z1_time_5 then
if z1_time_4 <= currentTime and currentTime <= z1_time_5 then
z1_heat_mode= z1_heat_mode_4_5_prog1;
end
else
if not (z1_time_5 < currentTime and currentTime < z1_time_4) then
z1_heat_mode= z1_heat_mode_4_5_prog1;
end
end
if z1_time_5 <= z1_time_6 then
if z1_time_5 <= currentTime and currentTime <= z1_time_6 then
z1_heat_mode= z1_heat_mode_5_6_prog1;
end
else
if not (z1_time_6 < currentTime and currentTime < z1_time_5) then
z1_heat_mode= z1_heat_mode_5_6_prog1;
end
end
if z1_time_6 <= z1_time_1 then
if z1_time_6 <= currentTime and currentTime <= z1_time_1 then
z1_heat_mode= z1_heat_mode_6_1_prog1;
end
else
if not (z1_time_1 < currentTime and currentTime < z1_time_6) then
z1_heat_mode= z1_heat_mode_6_1_prog1;
end
end

end

if (z1_heat_engine == "Prog2") then
if z1_time_1 <= z1_time_2 then
if z1_time_1 <= currentTime and currentTime <= z1_time_2 then
z1_heat_mode= z1_heat_mode_1_2_prog2;
end
else
if not (z1_time_2 < currentTime and currentTime < z1_time_1) then
z1_heat_mode= z1_heat_mode_1_2_prog2;
end
end
if z1_time_2 <= z1_time_3 then
if z1_time_2 <= currentTime and currentTime <= z1_time_3 then
z1_heat_mode= z1_heat_mode_2_3_prog2;
end
else
if not (z1_time_3 < currentTime and currentTime < z1_time_2) then
z1_heat_mode= z1_heat_mode_2_3_prog2;
end
end
if z1_time_3 <= z1_time_4 then
if z1_time_3 <= currentTime and currentTime <= z1_time_4 then
z1_heat_mode= z1_heat_mode_3_4_prog2;
end
else
if not (z1_time_4 < currentTime and currentTime < z1_time_3) then
z1_heat_mode= z1_heat_mode_3_4_prog2;
end
end
if z1_time_4 <= z1_time_5 then
if z1_time_4 <= currentTime and currentTime <= z1_time_5 then
z1_heat_mode= z1_heat_mode_4_5_prog2;
end
else
if not (z1_time_5 < currentTime and currentTime < z1_time_4) then
z1_heat_mode= z1_heat_mode_4_5_prog2;
end
end
if z1_time_5 <= z1_time_6 then
if z1_time_5 <= currentTime and currentTime <= z1_time_6 then
z1_heat_mode= z1_heat_mode_5_6_prog2;
end
else
if not (z1_time_6 < currentTime and currentTime < z1_time_5) then
z1_heat_mode= z1_heat_mode_5_6_prog2;
end
end
if z1_time_6 <= z1_time_1 then
if z1_time_6 <= currentTime and currentTime <= z1_time_1 then
z1_heat_mode= z1_heat_mode_6_1_prog2;
end
else
if not (z1_time_1 < currentTime and currentTime < z1_time_6) then
z1_heat_mode= z1_heat_mode_6_1_prog2;
end
end

end

if (z1_heat_engine == "Auto") then
if (currentDate.wday == 1 ) then
if z1_Sunday_auto == "Confort" or z1_Sunday_auto == "Eco" or z1_Sunday_auto == "Hors-gel" or z1_Sunday_auto == "Arret" then
z1_heat_mode = z1_Sunday_auto;
end
if (z1_Sunday_auto == "Prog1") then
if z1_time_1 <= z1_time_2 then
if z1_time_1 <= currentTime and currentTime <= z1_time_2 then
z1_heat_mode= z1_heat_mode_1_2_prog1;
end
else
if not (z1_time_2 < currentTime and currentTime < z1_time_1) then
z1_heat_mode= z1_heat_mode_1_2_prog1;
end
end
if z1_time_2 <= z1_time_3 then
if z1_time_2 <= currentTime and currentTime <= z1_time_3 then
z1_heat_mode= z1_heat_mode_2_3_prog1;
end
else
if not (z1_time_3 < currentTime and currentTime < z1_time_2) then
z1_heat_mode= z1_heat_mode_2_3_prog1;
end
end
if z1_time_3 <= z1_time_4 then
if z1_time_3 <= currentTime and currentTime <= z1_time_4 then
z1_heat_mode= z1_heat_mode_3_4_prog1;
end
else
if not (z1_time_4 < currentTime and currentTime < z1_time_3) then
z1_heat_mode= z1_heat_mode_3_4_prog1;
end
end
if z1_time_4 <= z1_time_5 then
if z1_time_4 <= currentTime and currentTime <= z1_time_5 then
z1_heat_mode= z1_heat_mode_4_5_prog1;
end
else
if not (z1_time_5 < currentTime and currentTime < z1_time_4) then
z1_heat_mode= z1_heat_mode_4_5_prog1;
end
end
if z1_time_5 <= z1_time_6 then
if z1_time_5 <= currentTime and currentTime <= z1_time_6 then
z1_heat_mode= z1_heat_mode_5_6_prog1;
end
else
if not (z1_time_6 < currentTime and currentTime < z1_time_5) then
z1_heat_mode= z1_heat_mode_5_6_prog1;
end
end
if z1_time_6 <= z1_time_1 then
if z1_time_6 <= currentTime and currentTime <= z1_time_1 then
z1_heat_mode= z1_heat_mode_6_1_prog1;
end
else
if not (z1_time_1 < currentTime and currentTime < z1_time_6) then
z1_heat_mode= z1_heat_mode_6_1_prog1;
end
end

end
if (z1_Sunday_auto == "Prog2") then
if z1_time_1 <= z1_time_2 then
if z1_time_1 <= currentTime and currentTime <= z1_time_2 then
z1_heat_mode= z1_heat_mode_1_2_prog2;
end
else
if not (z1_time_2 < currentTime and currentTime < z1_time_1) then
z1_heat_mode= z1_heat_mode_1_2_prog2;
end
end
if z1_time_2 <= z1_time_3 then
if z1_time_2 <= currentTime and currentTime <= z1_time_3 then
z1_heat_mode= z1_heat_mode_2_3_prog2;
end
else
if not (z1_time_3 < currentTime and currentTime < z1_time_2) then
z1_heat_mode= z1_heat_mode_2_3_prog2;
end
end
if z1_time_3 <= z1_time_4 then
if z1_time_3 <= currentTime and currentTime <= z1_time_4 then
z1_heat_mode= z1_heat_mode_3_4_prog2;
end
else
if not (z1_time_4 < currentTime and currentTime < z1_time_3) then
z1_heat_mode= z1_heat_mode_3_4_prog2;
end
end
if z1_time_4 <= z1_time_5 then
if z1_time_4 <= currentTime and currentTime <= z1_time_5 then
z1_heat_mode= z1_heat_mode_4_5_prog2;
end
else
if not (z1_time_5 < currentTime and currentTime < z1_time_4) then
z1_heat_mode= z1_heat_mode_4_5_prog2;
end
end
if z1_time_5 <= z1_time_6 then
if z1_time_5 <= currentTime and currentTime <= z1_time_6 then
z1_heat_mode= z1_heat_mode_5_6_prog2;
end
else
if not (z1_time_6 < currentTime and currentTime < z1_time_5) then
z1_heat_mode= z1_heat_mode_5_6_prog2;
end
end
if z1_time_6 <= z1_time_1 then
if z1_time_6 <= currentTime and currentTime <= z1_time_1 then
z1_heat_mode= z1_heat_mode_6_1_prog2;
end
else
if not (z1_time_1 < currentTime and currentTime < z1_time_6) then
z1_heat_mode= z1_heat_mode_6_1_prog2;
end
end

end

end
if (currentDate.wday == 2 ) then
if z1_Monday_auto == "Confort" or z1_Monday_auto == "Eco" or z1_Monday_auto == "Hors-gel" or z1_Monday_auto == "Arret" then
z1_heat_mode = z1_Monday_auto;
end
if (z1_Monday_auto == "Prog1") then
if z1_time_1 <= z1_time_2 then
if z1_time_1 <= currentTime and currentTime <= z1_time_2 then
z1_heat_mode= z1_heat_mode_1_2_prog1;
end
else
if not (z1_time_2 < currentTime and currentTime < z1_time_1) then
z1_heat_mode= z1_heat_mode_1_2_prog1;
end
end
if z1_time_2 <= z1_time_3 then
if z1_time_2 <= currentTime and currentTime <= z1_time_3 then
z1_heat_mode= z1_heat_mode_2_3_prog1;
end
else
if not (z1_time_3 < currentTime and currentTime < z1_time_2) then
z1_heat_mode= z1_heat_mode_2_3_prog1;
end
end
if z1_time_3 <= z1_time_4 then
if z1_time_3 <= currentTime and currentTime <= z1_time_4 then
z1_heat_mode= z1_heat_mode_3_4_prog1;
end
else
if not (z1_time_4 < currentTime and currentTime < z1_time_3) then
z1_heat_mode= z1_heat_mode_3_4_prog1;
end
end
if z1_time_4 <= z1_time_5 then
if z1_time_4 <= currentTime and currentTime <= z1_time_5 then
z1_heat_mode= z1_heat_mode_4_5_prog1;
end
else
if not (z1_time_5 < currentTime and currentTime < z1_time_4) then
z1_heat_mode= z1_heat_mode_4_5_prog1;
end
end
if z1_time_5 <= z1_time_6 then
if z1_time_5 <= currentTime and currentTime <= z1_time_6 then
z1_heat_mode= z1_heat_mode_5_6_prog1;
end
else
if not (z1_time_6 < currentTime and currentTime < z1_time_5) then
z1_heat_mode= z1_heat_mode_5_6_prog1;
end
end
if z1_time_6 <= z1_time_1 then
if z1_time_6 <= currentTime and currentTime <= z1_time_1 then
z1_heat_mode= z1_heat_mode_6_1_prog1;
end
else
if not (z1_time_1 < currentTime and currentTime < z1_time_6) then
z1_heat_mode= z1_heat_mode_6_1_prog1;
end
end

end
if (z1_Monday_auto == "Prog2") then
if z1_time_1 <= z1_time_2 then
if z1_time_1 <= currentTime and currentTime <= z1_time_2 then
z1_heat_mode= z1_heat_mode_1_2_prog2;
end
else
if not (z1_time_2 < currentTime and currentTime < z1_time_1) then
z1_heat_mode= z1_heat_mode_1_2_prog2;
end
end
if z1_time_2 <= z1_time_3 then
if z1_time_2 <= currentTime and currentTime <= z1_time_3 then
z1_heat_mode= z1_heat_mode_2_3_prog2;
end
else
if not (z1_time_3 < currentTime and currentTime < z1_time_2) then
z1_heat_mode= z1_heat_mode_2_3_prog2;
end
end
if z1_time_3 <= z1_time_4 then
if z1_time_3 <= currentTime and currentTime <= z1_time_4 then
z1_heat_mode= z1_heat_mode_3_4_prog2;
end
else
if not (z1_time_4 < currentTime and currentTime < z1_time_3) then
z1_heat_mode= z1_heat_mode_3_4_prog2;
end
end
if z1_time_4 <= z1_time_5 then
if z1_time_4 <= currentTime and currentTime <= z1_time_5 then
z1_heat_mode= z1_heat_mode_4_5_prog2;
end
else
if not (z1_time_5 < currentTime and currentTime < z1_time_4) then
z1_heat_mode= z1_heat_mode_4_5_prog2;
end
end
if z1_time_5 <= z1_time_6 then
if z1_time_5 <= currentTime and currentTime <= z1_time_6 then
z1_heat_mode= z1_heat_mode_5_6_prog2;
end
else
if not (z1_time_6 < currentTime and currentTime < z1_time_5) then
z1_heat_mode= z1_heat_mode_5_6_prog2;
end
end
if z1_time_6 <= z1_time_1 then
if z1_time_6 <= currentTime and currentTime <= z1_time_1 then
z1_heat_mode= z1_heat_mode_6_1_prog2;
end
else
if not (z1_time_1 < currentTime and currentTime < z1_time_6) then
z1_heat_mode= z1_heat_mode_6_1_prog2;
end
end

end
end
if (currentDate.wday == 3 ) then
if z1_Tuesday_auto == "Confort" or z1_Tuesday_auto == "Eco" or z1_Tuesday_auto == "Hors-gel" or z1_Tuesday_auto == "Arret" then
z1_heat_mode = z1_Tuesday_auto;
end
if (z1_Tuesday_auto == "Prog1") then
if z1_time_1 <= z1_time_2 then
if z1_time_1 <= currentTime and currentTime <= z1_time_2 then
z1_heat_mode= z1_heat_mode_1_2_prog1;
end
else
if not (z1_time_2 < currentTime and currentTime < z1_time_1) then
z1_heat_mode= z1_heat_mode_1_2_prog1;
end
end
if z1_time_2 <= z1_time_3 then
if z1_time_2 <= currentTime and currentTime <= z1_time_3 then
z1_heat_mode= z1_heat_mode_2_3_prog1;
end
else
if not (z1_time_3 < currentTime and currentTime < z1_time_2) then
z1_heat_mode= z1_heat_mode_2_3_prog1;
end
end
if z1_time_3 <= z1_time_4 then
if z1_time_3 <= currentTime and currentTime <= z1_time_4 then
z1_heat_mode= z1_heat_mode_3_4_prog1;
end
else
if not (z1_time_4 < currentTime and currentTime < z1_time_3) then
z1_heat_mode= z1_heat_mode_3_4_prog1;
end
end
if z1_time_4 <= z1_time_5 then
if z1_time_4 <= currentTime and currentTime <= z1_time_5 then
z1_heat_mode= z1_heat_mode_4_5_prog1;
end
else
if not (z1_time_5 < currentTime and currentTime < z1_time_4) then
z1_heat_mode= z1_heat_mode_4_5_prog1;
end
end
if z1_time_5 <= z1_time_6 then
if z1_time_5 <= currentTime and currentTime <= z1_time_6 then
z1_heat_mode= z1_heat_mode_5_6_prog1;
end
else
if not (z1_time_6 < currentTime and currentTime < z1_time_5) then
z1_heat_mode= z1_heat_mode_5_6_prog1;
end
end
if z1_time_6 <= z1_time_1 then
if z1_time_6 <= currentTime and currentTime <= z1_time_1 then
z1_heat_mode= z1_heat_mode_6_1_prog1;
end
else
if not (z1_time_1 < currentTime and currentTime < z1_time_6) then
z1_heat_mode= z1_heat_mode_6_1_prog1;
end
end

end
if (z1_Tuesday_auto == "Prog2") then
if z1_time_1 <= z1_time_2 then
if z1_time_1 <= currentTime and currentTime <= z1_time_2 then
z1_heat_mode= z1_heat_mode_1_2_prog2;
end
else
if not (z1_time_2 < currentTime and currentTime < z1_time_1) then
z1_heat_mode= z1_heat_mode_1_2_prog2;
end
end
if z1_time_2 <= z1_time_3 then
if z1_time_2 <= currentTime and currentTime <= z1_time_3 then
z1_heat_mode= z1_heat_mode_2_3_prog2;
end
else
if not (z1_time_3 < currentTime and currentTime < z1_time_2) then
z1_heat_mode= z1_heat_mode_2_3_prog2;
end
end
if z1_time_3 <= z1_time_4 then
if z1_time_3 <= currentTime and currentTime <= z1_time_4 then
z1_heat_mode= z1_heat_mode_3_4_prog2;
end
else
if not (z1_time_4 < currentTime and currentTime < z1_time_3) then
z1_heat_mode= z1_heat_mode_3_4_prog2;
end
end
if z1_time_4 <= z1_time_5 then
if z1_time_4 <= currentTime and currentTime <= z1_time_5 then
z1_heat_mode= z1_heat_mode_4_5_prog2;
end
else
if not (z1_time_5 < currentTime and currentTime < z1_time_4) then
z1_heat_mode= z1_heat_mode_4_5_prog2;
end
end
if z1_time_5 <= z1_time_6 then
if z1_time_5 <= currentTime and currentTime <= z1_time_6 then
z1_heat_mode= z1_heat_mode_5_6_prog2;
end
else
if not (z1_time_6 < currentTime and currentTime < z1_time_5) then
z1_heat_mode= z1_heat_mode_5_6_prog2;
end
end
if z1_time_6 <= z1_time_1 then
if z1_time_6 <= currentTime and currentTime <= z1_time_1 then
z1_heat_mode= z1_heat_mode_6_1_prog2;
end
else
if not (z1_time_1 < currentTime and currentTime < z1_time_6) then
z1_heat_mode= z1_heat_mode_6_1_prog2;
end
end

end

end
if (currentDate.wday == 4 ) then
if z1_Wednesday_auto == "Confort" or z1_Wednesday_auto == "Eco" or z1_Wednesday_auto == "Hors-gel" or z1_Wednesday_auto == "Arret" then
z1_heat_mode = z1_Wednesday_auto;
end
if (z1_Wednesday_auto == "Prog1") then
if z1_time_1 <= z1_time_2 then
if z1_time_1 <= currentTime and currentTime <= z1_time_2 then
z1_heat_mode= z1_heat_mode_1_2_prog1;
end
else
if not (z1_time_2 < currentTime and currentTime < z1_time_1) then
z1_heat_mode= z1_heat_mode_1_2_prog1;
end
end
if z1_time_2 <= z1_time_3 then
if z1_time_2 <= currentTime and currentTime <= z1_time_3 then
z1_heat_mode= z1_heat_mode_2_3_prog1;
end
else
if not (z1_time_3 < currentTime and currentTime < z1_time_2) then
z1_heat_mode= z1_heat_mode_2_3_prog1;
end
end
if z1_time_3 <= z1_time_4 then
if z1_time_3 <= currentTime and currentTime <= z1_time_4 then
z1_heat_mode= z1_heat_mode_3_4_prog1;
end
else
if not (z1_time_4 < currentTime and currentTime < z1_time_3) then
z1_heat_mode= z1_heat_mode_3_4_prog1;
end
end
if z1_time_4 <= z1_time_5 then
if z1_time_4 <= currentTime and currentTime <= z1_time_5 then
z1_heat_mode= z1_heat_mode_4_5_prog1;
end
else
if not (z1_time_5 < currentTime and currentTime < z1_time_4) then
z1_heat_mode= z1_heat_mode_4_5_prog1;
end
end
if z1_time_5 <= z1_time_6 then
if z1_time_5 <= currentTime and currentTime <= z1_time_6 then
z1_heat_mode= z1_heat_mode_5_6_prog1;
end
else
if not (z1_time_6 < currentTime and currentTime < z1_time_5) then
z1_heat_mode= z1_heat_mode_5_6_prog1;
end
end
if z1_time_6 <= z1_time_1 then
if z1_time_6 <= currentTime and currentTime <= z1_time_1 then
z1_heat_mode= z1_heat_mode_6_1_prog1;
end
else
if not (z1_time_1 < currentTime and currentTime < z1_time_6) then
z1_heat_mode= z1_heat_mode_6_1_prog1;
end
end

end
if (z1_Wednesday_auto == "Prog2") then
if z1_time_1 <= z1_time_2 then
if z1_time_1 <= currentTime and currentTime <= z1_time_2 then
z1_heat_mode= z1_heat_mode_1_2_prog2;
end
else
if not (z1_time_2 < currentTime and currentTime < z1_time_1) then
z1_heat_mode= z1_heat_mode_1_2_prog2;
end
end
if z1_time_2 <= z1_time_3 then
if z1_time_2 <= currentTime and currentTime <= z1_time_3 then
z1_heat_mode= z1_heat_mode_2_3_prog2;
end
else
if not (z1_time_3 < currentTime and currentTime < z1_time_2) then
z1_heat_mode= z1_heat_mode_2_3_prog2;
end
end
if z1_time_3 <= z1_time_4 then
if z1_time_3 <= currentTime and currentTime <= z1_time_4 then
z1_heat_mode= z1_heat_mode_3_4_prog2;
end
else
if not (z1_time_4 < currentTime and currentTime < z1_time_3) then
z1_heat_mode= z1_heat_mode_3_4_prog2;
end
end
if z1_time_4 <= z1_time_5 then
if z1_time_4 <= currentTime and currentTime <= z1_time_5 then
z1_heat_mode= z1_heat_mode_4_5_prog2;
end
else
if not (z1_time_5 < currentTime and currentTime < z1_time_4) then
z1_heat_mode= z1_heat_mode_4_5_prog2;
end
end
if z1_time_5 <= z1_time_6 then
if z1_time_5 <= currentTime and currentTime <= z1_time_6 then
z1_heat_mode= z1_heat_mode_5_6_prog2;
end
else
if not (z1_time_6 < currentTime and currentTime < z1_time_5) then
z1_heat_mode= z1_heat_mode_5_6_prog2;
end
end
if z1_time_6 <= z1_time_1 then
if z1_time_6 <= currentTime and currentTime <= z1_time_1 then
z1_heat_mode= z1_heat_mode_6_1_prog2;
end
else
if not (z1_time_1 < currentTime and currentTime < z1_time_6) then
z1_heat_mode= z1_heat_mode_6_1_prog2;
end
end

end

end
if (currentDate.wday == 5 ) then
if z1_Thursday_auto == "Confort" or z1_Thursday_auto == "Eco" or z1_Thursday_auto == "Hors-gel" or z1_Thursday_auto == "Arret" then
z1_heat_mode = z1_Thursday_auto;
end
if (z1_Thursday_auto == "Prog1") then
if z1_time_1 <= z1_time_2 then
if z1_time_1 <= currentTime and currentTime <= z1_time_2 then
z1_heat_mode= z1_heat_mode_1_2_prog1;
end
else
if not (z1_time_2 < currentTime and currentTime < z1_time_1) then
z1_heat_mode= z1_heat_mode_1_2_prog1;
end
end
if z1_time_2 <= z1_time_3 then
if z1_time_2 <= currentTime and currentTime <= z1_time_3 then
z1_heat_mode= z1_heat_mode_2_3_prog1;
end
else
if not (z1_time_3 < currentTime and currentTime < z1_time_2) then
z1_heat_mode= z1_heat_mode_2_3_prog1;
end
end
if z1_time_3 <= z1_time_4 then
if z1_time_3 <= currentTime and currentTime <= z1_time_4 then
z1_heat_mode= z1_heat_mode_3_4_prog1;
end
else
if not (z1_time_4 < currentTime and currentTime < z1_time_3) then
z1_heat_mode= z1_heat_mode_3_4_prog1;
end
end
if z1_time_4 <= z1_time_5 then
if z1_time_4 <= currentTime and currentTime <= z1_time_5 then
z1_heat_mode= z1_heat_mode_4_5_prog1;
end
else
if not (z1_time_5 < currentTime and currentTime < z1_time_4) then
z1_heat_mode= z1_heat_mode_4_5_prog1;
end
end
if z1_time_5 <= z1_time_6 then
if z1_time_5 <= currentTime and currentTime <= z1_time_6 then
z1_heat_mode= z1_heat_mode_5_6_prog1;
end
else
if not (z1_time_6 < currentTime and currentTime < z1_time_5) then
z1_heat_mode= z1_heat_mode_5_6_prog1;
end
end
if z1_time_6 <= z1_time_1 then
if z1_time_6 <= currentTime and currentTime <= z1_time_1 then
z1_heat_mode= z1_heat_mode_6_1_prog1;
end
else
if not (z1_time_1 < currentTime and currentTime < z1_time_6) then
z1_heat_mode= z1_heat_mode_6_1_prog1;
end
end

end
if (z1_Thursday_auto == "Prog2") then
if z1_time_1 <= z1_time_2 then
if z1_time_1 <= currentTime and currentTime <= z1_time_2 then
z1_heat_mode= z1_heat_mode_1_2_prog2;
end
else
if not (z1_time_2 < currentTime and currentTime < z1_time_1) then
z1_heat_mode= z1_heat_mode_1_2_prog2;
end
end
if z1_time_2 <= z1_time_3 then
if z1_time_2 <= currentTime and currentTime <= z1_time_3 then
z1_heat_mode= z1_heat_mode_2_3_prog2;
end
else
if not (z1_time_3 < currentTime and currentTime < z1_time_2) then
z1_heat_mode= z1_heat_mode_2_3_prog2;
end
end
if z1_time_3 <= z1_time_4 then
if z1_time_3 <= currentTime and currentTime <= z1_time_4 then
z1_heat_mode= z1_heat_mode_3_4_prog2;
end
else
if not (z1_time_4 < currentTime and currentTime < z1_time_3) then
z1_heat_mode= z1_heat_mode_3_4_prog2;
end
end
if z1_time_4 <= z1_time_5 then
if z1_time_4 <= currentTime and currentTime <= z1_time_5 then
z1_heat_mode= z1_heat_mode_4_5_prog2;
end
else
if not (z1_time_5 < currentTime and currentTime < z1_time_4) then
z1_heat_mode= z1_heat_mode_4_5_prog2;
end
end
if z1_time_5 <= z1_time_6 then
if z1_time_5 <= currentTime and currentTime <= z1_time_6 then
z1_heat_mode= z1_heat_mode_5_6_prog2;
end
else
if not (z1_time_6 < currentTime and currentTime < z1_time_5) then
z1_heat_mode= z1_heat_mode_5_6_prog2;
end
end
if z1_time_6 <= z1_time_1 then
if z1_time_6 <= currentTime and currentTime <= z1_time_1 then
z1_heat_mode= z1_heat_mode_6_1_prog2;
end
else
if not (z1_time_1 < currentTime and currentTime < z1_time_6) then
z1_heat_mode= z1_heat_mode_6_1_prog2;
end
end

end

end
if (currentDate.wday == 6 ) then
if z1_Friday_auto == "Confort" or z1_Friday_auto == "Eco" or z1_Friday_auto == "Hors-gel" or z1_Friday_auto == "Arret" then
z1_heat_mode = z1_Friday_auto;
end
if (z1_Friday_auto == "Prog1") then
if z1_time_1 <= z1_time_2 then
if z1_time_1 <= currentTime and currentTime <= z1_time_2 then
z1_heat_mode= z1_heat_mode_1_2_prog1;
end
else
if not (z1_time_2 < currentTime and currentTime < z1_time_1) then
z1_heat_mode= z1_heat_mode_1_2_prog1;
end
end
if z1_time_2 <= z1_time_3 then
if z1_time_2 <= currentTime and currentTime <= z1_time_3 then
z1_heat_mode= z1_heat_mode_2_3_prog1;
end
else
if not (z1_time_3 < currentTime and currentTime < z1_time_2) then
z1_heat_mode= z1_heat_mode_2_3_prog1;
end
end
if z1_time_3 <= z1_time_4 then
if z1_time_3 <= currentTime and currentTime <= z1_time_4 then
z1_heat_mode= z1_heat_mode_3_4_prog1;
end
else
if not (z1_time_4 < currentTime and currentTime < z1_time_3) then
z1_heat_mode= z1_heat_mode_3_4_prog1;
end
end
if z1_time_4 <= z1_time_5 then
if z1_time_4 <= currentTime and currentTime <= z1_time_5 then
z1_heat_mode= z1_heat_mode_4_5_prog1;
end
else
if not (z1_time_5 < currentTime and currentTime < z1_time_4) then
z1_heat_mode= z1_heat_mode_4_5_prog1;
end
end
if z1_time_5 <= z1_time_6 then
if z1_time_5 <= currentTime and currentTime <= z1_time_6 then
z1_heat_mode= z1_heat_mode_5_6_prog1;
end
else
if not (z1_time_6 < currentTime and currentTime < z1_time_5) then
z1_heat_mode= z1_heat_mode_5_6_prog1;
end
end
if z1_time_6 <= z1_time_1 then
if z1_time_6 <= currentTime and currentTime <= z1_time_1 then
z1_heat_mode= z1_heat_mode_6_1_prog1;
end
else
if not (z1_time_1 < currentTime and currentTime < z1_time_6) then
z1_heat_mode= z1_heat_mode_6_1_prog1;
end
end

end
if (z1_Friday_auto == "Prog2") then
if z1_time_1 <= z1_time_2 then
if z1_time_1 <= currentTime and currentTime <= z1_time_2 then
z1_heat_mode= z1_heat_mode_1_2_prog2;
end
else
if not (z1_time_2 < currentTime and currentTime < z1_time_1) then
z1_heat_mode= z1_heat_mode_1_2_prog2;
end
end
if z1_time_2 <= z1_time_3 then
if z1_time_2 <= currentTime and currentTime <= z1_time_3 then
z1_heat_mode= z1_heat_mode_2_3_prog2;
end
else
if not (z1_time_3 < currentTime and currentTime < z1_time_2) then
z1_heat_mode= z1_heat_mode_2_3_prog2;
end
end
if z1_time_3 <= z1_time_4 then
if z1_time_3 <= currentTime and currentTime <= z1_time_4 then
z1_heat_mode= z1_heat_mode_3_4_prog2;
end
else
if not (z1_time_4 < currentTime and currentTime < z1_time_3) then
z1_heat_mode= z1_heat_mode_3_4_prog2;
end
end
if z1_time_4 <= z1_time_5 then
if z1_time_4 <= currentTime and currentTime <= z1_time_5 then
z1_heat_mode= z1_heat_mode_4_5_prog2;
end
else
if not (z1_time_5 < currentTime and currentTime < z1_time_4) then
z1_heat_mode= z1_heat_mode_4_5_prog2;
end
end
if z1_time_5 <= z1_time_6 then
if z1_time_5 <= currentTime and currentTime <= z1_time_6 then
z1_heat_mode= z1_heat_mode_5_6_prog2;
end
else
if not (z1_time_6 < currentTime and currentTime < z1_time_5) then
z1_heat_mode= z1_heat_mode_5_6_prog2;
end
end
if z1_time_6 <= z1_time_1 then
if z1_time_6 <= currentTime and currentTime <= z1_time_1 then
z1_heat_mode= z1_heat_mode_6_1_prog2;
end
else
if not (z1_time_1 < currentTime and currentTime < z1_time_6) then
z1_heat_mode= z1_heat_mode_6_1_prog2;
end
end

end

end
if (currentDate.wday == 7 ) then
if z1_Saturday_auto == "Confort" or z1_Saturday_auto == "Eco" or z1_Saturday_auto == "Hors-gel" or z1_Saturday_auto == "Arret" then
z1_heat_mode = z1_Saturday_auto;
end
if (z1_Saturday_auto == "Prog1") then
if z1_time_1 <= z1_time_2 then
if z1_time_1 <= currentTime and currentTime <= z1_time_2 then
z1_heat_mode= z1_heat_mode_1_2_prog1;
end
else
if not (z1_time_2 < currentTime and currentTime < z1_time_1) then
z1_heat_mode= z1_heat_mode_1_2_prog1;
end
end
if z1_time_2 <= z1_time_3 then
if z1_time_2 <= currentTime and currentTime <= z1_time_3 then
z1_heat_mode= z1_heat_mode_2_3_prog1;
end
else
if not (z1_time_3 < currentTime and currentTime < z1_time_2) then
z1_heat_mode= z1_heat_mode_2_3_prog1;
end
end
if z1_time_3 <= z1_time_4 then
if z1_time_3 <= currentTime and currentTime <= z1_time_4 then
z1_heat_mode= z1_heat_mode_3_4_prog1;
end
else
if not (z1_time_4 < currentTime and currentTime < z1_time_3) then
z1_heat_mode= z1_heat_mode_3_4_prog1;
end
end
if z1_time_4 <= z1_time_5 then
if z1_time_4 <= currentTime and currentTime <= z1_time_5 then
z1_heat_mode= z1_heat_mode_4_5_prog1;
end
else
if not (z1_time_5 < currentTime and currentTime < z1_time_4) then
z1_heat_mode= z1_heat_mode_4_5_prog1;
end
end
if z1_time_5 <= z1_time_6 then
if z1_time_5 <= currentTime and currentTime <= z1_time_6 then
z1_heat_mode= z1_heat_mode_5_6_prog1;
end
else
if not (z1_time_6 < currentTime and currentTime < z1_time_5) then
z1_heat_mode= z1_heat_mode_5_6_prog1;
end
end
if z1_time_6 <= z1_time_1 then
if z1_time_6 <= currentTime and currentTime <= z1_time_1 then
z1_heat_mode= z1_heat_mode_6_1_prog1;
end
else
if not (z1_time_1 < currentTime and currentTime < z1_time_6) then
z1_heat_mode= z1_heat_mode_6_1_prog1;
end
end

end
if (z1_Saturday_auto == "Prog2") then
if z1_time_1 <= z1_time_2 then
if z1_time_1 <= currentTime and currentTime <= z1_time_2 then
z1_heat_mode= z1_heat_mode_1_2_prog2;
end
else
if not (z1_time_2 < currentTime and currentTime < z1_time_1) then
z1_heat_mode= z1_heat_mode_1_2_prog2;
end
end
if z1_time_2 <= z1_time_3 then
if z1_time_2 <= currentTime and currentTime <= z1_time_3 then
z1_heat_mode= z1_heat_mode_2_3_prog2;
end
else
if not (z1_time_3 < currentTime and currentTime < z1_time_2) then
z1_heat_mode= z1_heat_mode_2_3_prog2;
end
end
if z1_time_3 <= z1_time_4 then
if z1_time_3 <= currentTime and currentTime <= z1_time_4 then
z1_heat_mode= z1_heat_mode_3_4_prog2;
end
else
if not (z1_time_4 < currentTime and currentTime < z1_time_3) then
z1_heat_mode= z1_heat_mode_3_4_prog2;
end
end
if z1_time_4 <= z1_time_5 then
if z1_time_4 <= currentTime and currentTime <= z1_time_5 then
z1_heat_mode= z1_heat_mode_4_5_prog2;
end
else
if not (z1_time_5 < currentTime and currentTime < z1_time_4) then
z1_heat_mode= z1_heat_mode_4_5_prog2;
end
end
if z1_time_5 <= z1_time_6 then
if z1_time_5 <= currentTime and currentTime <= z1_time_6 then
z1_heat_mode= z1_heat_mode_5_6_prog2;
end
else
if not (z1_time_6 < currentTime and currentTime < z1_time_5) then
z1_heat_mode= z1_heat_mode_5_6_prog2;
end
end
if z1_time_6 <= z1_time_1 then
if z1_time_6 <= currentTime and currentTime <= z1_time_1 then
z1_heat_mode= z1_heat_mode_6_1_prog2;
end
else
if not (z1_time_1 < currentTime and currentTime < z1_time_6) then
z1_heat_mode= z1_heat_mode_6_1_prog2;
end
end

end

end
end


fibaro:sleep(1000);
fibaro:setGlobal("z1_heat_mode", z1_heat_mode);

if (debug) then
local mode = "init";
if (currentDate.wday == 1 ) then
mode = z1_Sunday_auto;
end
if (currentDate.wday == 2 ) then
mode = z1_Monday_auto;
end
if (currentDate.wday == 3 ) then
mode = z1_Tuesday_auto;
end
if (currentDate.wday == 4 ) then
mode = z1_Wednesday_auto;
end
if (currentDate.wday == 5 ) then
mode = z1_Thursday_auto;
end
if (currentDate.wday == 6 ) then
mode = z1_Friday_auto;
end
if (currentDate.wday == 7 ) then
mode = z1_Saturday_auto;
end

if (z1_heat_engine == "Auto") then
fibaro:debug("Le mode du thermostat est réglé sur: " ..z1_heat_engine.." . Le mode auto est réglé sur "..mode);
end
if (z1_heat_engine ~= "Auto") then
fibaro:debug("Le mode du thermostat est réglé sur:" ..z1_heat_engine);
end
fibaro:debug("Le mode de chauffage est: " ..z1_heat_mode);
fibaro:call(ID_virtual_module, "setProperty", "ui.Label3.value", z1_heat_mode)
fibaro:sleep(15000)
end

Mise en oeuvre du module virtuel pour le radiateur: 

Tout d'abord, il faut créer deux variables globales prédéfinies avec les valeurs suivantes: 

rad_ch_1_mode = Auto, Manuel

rad_ch_1_status = Confort, Eco, Hors-gel, Arret

variables radiateur

 

 

Ensuite, il faut créer un module virtuel avec les boutons suivants, attention à  bien reporter votre N° de module virtuel dans les boutons et veiller à  la cohérence des ID des boutons et le code lua de chaque bouton: 

 

Le label:

Radiateur1

 
Bouton Auto:

Radiateur2


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

--mise à  jour des variables prédéfinies
local status_auto = fibaro:getGlobal("z1_heat_mode");
fibaro:setGlobal("rad_ch_1_mode", "Auto");
fibaro:setGlobal("rad_ch_1_status", status_auto);
--affichage des logs et debug
fibaro:debug("Mode Auto");
fibaro:log("Mode Auto");
--mise à  jour de l'affichage du module virtuel
fibaro:call(40, "setProperty", "ui.label_0_0.value", "Auto -> " ..status_auto);

Bouton Confort:

Radiateur3


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

--mise à  jour des variables prédéfinies
fibaro:setGlobal("rad_ch_1_status", "Confort");
fibaro:setGlobal("rad_ch_1_mode", "Manuel");
--affichage des logs et debug
fibaro:debug("Mode Confort");
fibaro:log("Mode Confort");
--mise à  jour de l'affichage du module virtuel
fibaro:call(40, "setProperty", "ui.label_0_0.value", "Manuel -> Confort");

Bouton Eco:

Radiateur4


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

--mise à  jour des variables prédéfinies
fibaro:setGlobal("rad_ch_1_status", "Eco");
fibaro:setGlobal("rad_ch_1_mode", "Manuel");
--affichage des logs et debug
fibaro:debug("Mode Eco");
fibaro:log("Mode Eco");
--mise à  jour de l'affichage du module virtuel
fibaro:call(40, "setProperty", "ui.label_0_0.value", "Manuel -> Eco");

Bouton Hors-gel:

Radiateur5


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

--mise à  jour des variables prédéfinies
fibaro:setGlobal("rad_ch_1_status", "Hors-gel");
fibaro:setGlobal("rad_ch_1_mode", "Manuel");
--affichage des logs et debug
fibaro:debug("Mode Hors-gel");
fibaro:log("Mode Hors-gel");
--mise à  jour de l'affichage du module virtuel
fibaro:call(40, "setProperty", "ui.label_0_0.value", "Manuel -> Hors-gel");

Bouton Arret:

Radiateur6


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

--mise à  jour des variables prédéfinies
fibaro:setGlobal("rad_ch_1_status", "Arret");
fibaro:setGlobal("rad_ch_1_mode", "Manuel");
--affichage des logs et debug
fibaro:debug("Mode Arret");
fibaro:log("Mode Arret");
--mise à  jour de l'affichage du module virtuel
fibaro:call(40, "setProperty", "ui.label_0_0.value", "Manuel -> Arret");

Et enfin copier le main loop suivant, en y indiquant vos paramètres utilisateurs. 

--[[
%% properties
%% globals
--]]
-- LUA - heat Radiator V2.0.0
-- 
-- 
-------------------------------------------------------------------------------------------------------------
--                                               USER SETTINGS :                                           --
-------------------------------------------------------------------------------------------------------------

---------------------
-- General settings:
---------------------
local debug = true;  --activater le debug mode
local radiator_mode = "rad_ch_1_mode"   -- variable globale à  déclarer avec les valeurs Auto et Manuel
local radiator_status = "rad_ch_1_status"   -- variable globale à  déclarer avec les valeurs Confort, Eco, Hors-gel et Arret
local ID_virtual_module = "40"
---------------------
-- Relay FGBS-221 settings:
---------------------
local ID_relay_1 = 200;     -- diode - connectée sur O1                
local ID_relay_2 = 201;     -- diode + connectée sur O2

-----------------------------------------------------------------------------------------
--Window sensor: Stopper le radiateur quand une fenêtre qui y est associée est ouverture
-----------------------------------------------------------------------------------------
local active_mode_sensor = true; --ou false --activater ou désactiver le mode. True = stopper le chauffage quand la fenêtre est ouverte
local ID_window_sensor = {10}; --ID device du capteur d'ouverture associé au radiateur (il peut y en avoir plusieurs)


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

local mode = fibaro:getGlobal(radiator_mode); 
local status = fibaro:getGlobal(radiator_status);
local status_auto = fibaro:getGlobal("z1_heat_mode");
local id;
local window_status = 0;
local temp;

if active_mode_sensor then
	for i=1, #ID_window_sensor do
		id = tonumber(ID_window_sensor[i]);
		temp = fibaro:getValue(id, "value");
    fibaro:debug(id.. " et " ..temp);
		if temp == "1" then window_status = 1; end
	end
end
	
if debug then
  fibaro:debug(window_status.. "Etat actuel = "..mode.. " --> " ..status);
  if active_mode_sensor then
  	if window_status == 1 then
    	fibaro:debug("Une fenêtre est ouverte");
    end
  	if window_status == 0 then
    	fibaro:debug("Les fenêtres associées au radiateur sont fermées");
    end
  end
end

if window_status == 1 then
	if debug then
		fibaro:debug("Une des fenêtres associées au radiateur est ouverte, le radiateur est à  l'arrêt");
	end
	fibaro:call(ID_virtual_module, "setProperty", "ui.label_0_0.value", "Fenêtre ouverte, Arrêt");
	fibaro:call(ID_relay_1, 'turnOff');
	fibaro:call(ID_relay_2, 'turnOn');
    -- temporisation de 5 minutes, ensuite le script check de nouveau et remet l'état de chauffage précédent si la fenêtre est fermée
	fibaro:sleep(300000);  
  	if mode == "Auto" then status = status_auto; end
	if status == "Confort" then 
			fibaro:call(ID_relay_1, 'turnOff'); 
			fibaro:call(ID_relay_2, 'turnOff'); 
			fibaro:call(ID_virtual_module, "setProperty", "ui.label_0_0.value", mode.. " -> Confort" );
	end 
  	if status == "Eco" then 
			fibaro:call(ID_relay_1, 'turnOn'); 
			fibaro:call(ID_relay_2, 'turnOn'); 
			fibaro:call(ID_virtual_module, "setProperty", "ui.label_0_0.value", mode.. " -> Eco" );
	end 

	if status == "Hors-gel" then 
			fibaro:call(ID_relay_1, 'turnOn'); 
			fibaro:call(ID_relay_2, 'turnOff'); 
			fibaro:call(ID_virtual_module, "setProperty", "ui.label_0_0.value", mode.. " -> Hors-gel" );
	end 

	if status == "Arret" then 
			fibaro:call(ID_relay_1, 'turnOff'); 
			fibaro:call(ID_relay_2, 'turnOn'); 
			fibaro:call(ID_virtual_module, "setProperty", "ui.label_0_0.value", mode.. " -> Arret" );
	end 

end

if mode == "Auto" then
	fibaro:setGlobal("rad_ch_1_status", status_auto);
  	if status == "Confort" then 
			fibaro:call(ID_relay_1, 'turnOff'); 
			fibaro:call(ID_relay_2, 'turnOff'); 
			fibaro:call(ID_virtual_module, "setProperty", "ui.label_0_0.value", mode.. " -> Confort" );
	end 
  	if status == "Eco" then 
			fibaro:call(ID_relay_1, 'turnOn'); 
			fibaro:call(ID_relay_2, 'turnOn'); 
			fibaro:call(ID_virtual_module, "setProperty", "ui.label_0_0.value", mode.. " -> Eco" );
	end 

	if status == "Hors-gel" then 
			fibaro:call(ID_relay_1, 'turnOn'); 
			fibaro:call(ID_relay_2, 'turnOff'); 
			fibaro:call(ID_virtual_module, "setProperty", "ui.label_0_0.value", mode.. " -> Hors-gel" );
	end 

	if status == "Arret" then 
			fibaro:call(ID_relay_1, 'turnOff'); 
			fibaro:call(ID_relay_2, 'turnOn'); 
			fibaro:call(ID_virtual_module, "setProperty", "ui.label_0_0.value", mode.. " -> Arret" );
	end 
  
end  

--mise a jour de l'affichage du module virtuel
fibaro:call(ID_virtual_module, "setProperty", "ui.label_0_0.value", mode.. " -> " ..status);

--temporisation pour ne pas solliciter trop souvent le HC2
fibaro:sleep(3000)

ATTENTION: il peut être observé un décalage de quelques secondes entre le mode demandé et le mode en cours, c'est normal cela est dà» aux temps d'attente dans les main loop. Idem, attention également à  la tempo dans la partie ouverture de fenêtre qui peut dérouter...

 

Vous pouvez trouver un exemple de câblage du fgs-221 ici: 

http://domotique-info.fr/...lote-et-fibaro/



Une partie des icônes est disponible ici: http://www.touteladomotique.com/forum/viewtopic.php?f=89&t=11666 

Merci à  benjynet! 

 

 

J'espère ne pas avoir laissé traîner de bug je suis preneur de tout retour!

  • Like 1
  • Upvote 1
Posté(e)

Si ça peut profiter à  tout le monde c'est l'essentiel :) ! et si quelqu'un se sent l'âme de réduire le code via des boucles je suis pas contre car j'avoue que pour le moment c'est un peu lourd...

 

Pour l'instant c'est toujours en cours de test chez moi, mais l'ensemble des tests que j'ai réalisé étaient concluants!

Posté(e)

Ouch, ça c'est du code. Perso, j'ai fait beaucoup plus simple, mes besoins étant très certainement différents. Je gère uniquement 3 possibilités, soit je travaille, soit je suis en repos à  la maison, soit je suis parti en vacance. Les heures sont positionnées en fonction de mon rythme de vie. Je ne gère pour le moment que le sèche serviette de la salle de bain. Bien évidement il faut au préalable déclarer un virtual device pour les 4 ordres comme vu précédemment.

Voilà  ce que ça donne :

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

local consigne = "non initialisée";   -- initialisation de la variable consigne à  "vide"
local sourceTrigger = fibaro:getSourceTrigger();

if (sourceTrigger["type"] == "autostart") then
 while true do
 local jour = os.date("%w");    -- récupération du jour actuel 0 est le dimanche, 6 le samedi
 local heure = os.date("%H:%M");    -- récupération de l'heure actuelle
 local mode = fibaro:getGlobalValue("mode_occupation"); 
 local startSource = fibaro:getSourceTrigger();
  if (mode == "travail") then  -- on test si on est en période de travail
  -- chauffage matin tous les jours de la semaine sauf weekend
   if ((jour == "1" or jour == "2" or jour == "3" or jour == "4" or jour == "5") and (heure == "06:00")) then
   consigne = "reveil semaine";
   fibaro:call(16, "pressButton", "1");  -- module virtuel CONF
   -- chauffage matin weekend
   elseif ((jour == "6" or jour == "0") and (heure == "07:30")) then
   consigne = "reveil weekend";
   fibaro:call(16, "pressButton", "1");  -- module virtuel CONF
   -- arrêt chauffage départ travail
   elseif ((jour == "2" or jour == "4" or jour == "5")  and (heure == "07:30")) then
   consigne = "départ travail";
   fibaro:call(16, "pressButton", "2");  -- module virtuel ECO
   -- reprise chauffage retour travail
   elseif ((jour == "2" or jour == "4" or jour == "5")  and (heure == "17:30")) then
   consigne = "retour travail";
   fibaro:call(16, "pressButton", "1");  -- module virtuel CONF
   -- coupure pour la nuit tous les jours de la semaine y compris le week-end
   elseif (heure == "21:00") then
   consigne = "dodo";
   fibaro:call(16, "pressButton", "2");  -- module virtuel ECO
   end
  elseif (mode == "repos") then  -- si on n'est pas en période de travail on test si on est en repos
   if (heure == "07:30") then
   consigne = "réveil repos";
   fibaro:call(16, "pressButton", "1");  -- module virtuel CONF
   elseif (heure == "21:00") then
   consigne = "dodo repos";
   fibaro:call(16, "pressButton", "2");  -- module virtuel ECO
   end
  elseif (mode == "vacances") then   -- si on n'est pas en période de travail ni en repos on test si on est en vacances
   consigne = "maison en veille";
   fibaro:call(16, "pressButton", "3");  -- module virtuel HG
  else -- si mode différent de travail, repos ou vacances c'est qu'on n'est pas en période de chauffage
  consigne = "chauffage éteint";
  fibaro:call(16, "pressButton", "4");  -- module virtuel OFF
  end
fibaro:debug("on est le jour n°" .. jour .. " et il est " .. heure);
fibaro:debug("consigne actuelle : " .. consigne .. " - mode sélectionné : " .. mode);  -- affichage de la variable consigne
fibaro:sleep(60*1000);
end

-- démarrage de la scène manuel et forçage du chauffage quelque soit la consigne
else
local jour = os.date("%w");    -- récupération du jour actuel 0 est le dimanche, 6 le samedi
local heure = os.date("%H:%M");    -- récupération de l'heure actuelle
local mode = fibaro:getGlobalValue("mode_occupation");
local startSource = fibaro:getSourceTrigger();
 if (startSource["type"] == "other") then
 fibaro:call(16, "pressButton", "1");  -- module virtuel CONF
 fibaro:debug("forçage manuel en mode confort");
 consigne = "marche forçée";
 fibaro:debug("consigne actuelle : " .. consigne .. " - mode sélectionné : " .. mode);  -- affichage de la variable consigne
 end
end
Posté(e)

Effectivement une scène comme la tienne fonctionne tout aussi bien. En fait, je voulais pouvoir contrôler le passage dans n'importe quel mode n'importe quand sans devoir revenir dans le code. Du coup mon prog1 correspond àune journée travaillée, et prog2 àun repos. En auto, la semaine ça bascule en prog1 automatiquement et prog2 le WE. Si je pars en vacances, je peux forcer le mode Eco sur le thermostat virtuel et si tous les chauffages sont en Auto alors la maison passe en Eco. Une fois l'hivers passé, un clic sur arrêt et tous les chauffages en auto passent àl'arrêt.

Posté(e)

L'intérêt de la box et du code LUA, c'est de pouvoir adapter selon ses besoins   :60:

Ma solution se rapproche de celle de @benjynet : j'ai un script court et j'utilise des variables globales

 

Je me sers de 2 périphériques virtuels pour gérer les variables globales

gallery_12_6_12683.png

Pour faire simple, en été le chauffage est arrêté

 

gallery_12_6_8506.png

Pour présent et absent, ma scène LUA gère selon les heures de la journée

Week-end : (on est "à  la campagne") passage en mode eco 24H/24H

Vacances : passage en mode hors-gel 24H/24H

Retour que j'ai ajouté récemment : activé à  distance pour tout remettre en chauffe

 

J'ai ajouté 2 modules virtuels.... çà  commence à  faire usine à  gaz, mais c'est pratique

gallery_12_6_2810.png

L'heure du réveil est assez régulière, mais il y a des exceptions

Avec ce module virtuel ma compagne peut programmer elle même l'heure du réveil (au 1/4 d'heure)

"Chauffe à " correspond à  l'heure du passage du mode éco au mode confort, calculée automatiquement en fonction d'un dernier module virtuel

Et c'est cette troisième variable/valeur qui est prise en compte par mon script chauffage

 

gallery_12_6_1501.png

J'ai ajouté ce dernier module virtuel, car lorsqu'il fait très froid, la durée de montée en température du mode éco au mode confort augmente

Il déclenche une scène qui recalcule l'heure de "préchauffe" du module précédent

Il est rarement utilisé, mais c'est une possibilité

Posté(e)

Pour ma part, j'ai un fonctionnement très similaire à  celui de benjynet, c'est à  dire que j'ai trois programmations :

- Normal : pour une semaine de travail classic. Pour résumer, la programmation est en confort un peu avant le lever, de 6h à  7h et le soir de 18 à  23h. Le reste du temps est en Eco.

- Congés : Confort de 8h à  23h30.

- Absent : Eco 24/24.

Les températures de confort de chaque pièces peuvent être réglée indépendamment. La température Eco est unique pour la maison. Je n'ai pas de température Hors-Gel car mon chat reste systématiquement dans la maison et je n'ai pas envie qu'il gèle.

Tout comme d'autres, je n'utilise pas le panneau de chauffage de la HC2 car j'ai des radiateur commandés en fil pilote (pour info, je ne leur donne que 2 ordres : Marche ou Arrêt, ce qui me permet de piloter 2 radiateurs avec un

FGS-221).

 

Tout ceci se programme depuis 1 seul module. J'ai voulu faire le plus simple possible de façon à  ce que ma femme l'utilise lorsqu'elle est en RTT. Pour ça, ce n'est pas encore gagné :).

Voici à  quoi cela ressemble :

Gestion chauffage

 

Pour chaque pièce, j'affiche la consigne de confort programmée, la température actuelle de la programmation actuelle (soit la température de confort, soit la température Eco) et le relevé de température actuel.

J'ai mis des slidebar pour régler les température de 15 à  25° avec un pas de 0.1. Ce n'est pas super pratique mais plus fun (avant j'avais mis 2 boutons pour augmenter ou diminuer la consigne par pallier de 0.5°).

 

Pour les trois boutons de programmation, j'utilise le code suivant qui est répéter pour chacun des boutons :

fibaro:setGlobal('prog_house', 2);
local text = "Congés";
fibaro:log(text);
fibaro:call(67, "setProperty", "ui.lblProgMaison.value", text);

--Notification mail
fibaro:call(2, "sendDefinedEmailNotification", "3");
fibaro:call(68, "sendDefinedEmailNotification", "3");

-- Notification Push
pushingbox =  Net.FHttp("api.pushingbox.com");
pushingbox:GET("/pushingbox?devid=v5E160xxxxxxxxx");

--Notification Push Fibaro
fibaro:call(27, "sendDefinedPushNotification", "3");
fibaro:call(69, "sendDefinedPushNotification", "3");

J'utilise la variable prog_house permet de définir la programmation Normal, congés ou Absent.

J'envoie plusieurs notifications de façon à  être certain de les recevoir (c'est plus des tests que de la parano).

 

Voici le code d'un des slides :

local slide = fibaro:get(67, "ui.slidSalon.value"); 
local consigne = slide + 150;
local consigneA = fibaro:getGlobal('consigneA_salon'); 
local temp = tonumber(fibaro:getValue(14,"value")); 
local text = "Conf:"..(tonumber(consigne)/10).."° Cons:"..(tonumber(consigneA)/10).."° Temp:"..temp.."°";
fibaro:call(67, "setProperty", "ui.lblTempSalon.value", text);

fibaro:setGlobal('consigne_salon', consigne);

la variable consigneA correspond à  la consigne actuelle, c'est à  dire la température Eco ou la consigne de confort en fonction du jour, de l'heure et de la programmation de la maison.

 

Et code du main loop:

-- Mise à  jour des slider s'ils ne sont pas à  la même valeur que la consigne
local temp;
local slide; 

-- Salon
consigne = fibaro:getGlobal('consigne_salon');
slide = fibaro:get(67, "ui.slidSalon.value"); 
if (tonumber(slide) + 150) ~= tonumber(consigne) then
  fibaro:call(67, "setProperty", "ui.slidSalon.value", tostring(consigne-150)); 
end

-- Entrée
consigne = fibaro:getGlobal('consigne_entree');
slide = fibaro:get(67, "ui.slidEntree.value"); 
if (tonumber(slide) + 150) ~= tonumber(consigne) then
  fibaro:call(67, "setProperty", "ui.slidEntree.value", tostring(consigne-150)); 
end

-- Salle de bain
consigne = fibaro:getGlobal('consigne_sdb');
slide = fibaro:get(67, "ui.slidSdb.value"); 
if (tonumber(slide) + 150) ~= tonumber(consigne) then
  fibaro:call(67, "setProperty", "ui.slidSdb.value", tostring(consigne-150)); 
end

-- Chambre 1 Parents
consigne = fibaro:getGlobal('consigne_chambre1');
slide = fibaro:get(67, "ui.slidChambre1.value"); 
if (tonumber(slide) + 150) ~= tonumber(consigne) then
  fibaro:call(67, "setProperty", "ui.slidChambre1.value", tostring(consigne-150)); 
end

-- Chambre 2 Rachel
consigne = fibaro:getGlobal('consigne_chambre2');
slide = fibaro:get(67, "ui.slidChambre2.value"); 
if (tonumber(slide) + 150) ~= tonumber(consigne) then
  fibaro:call(67, "setProperty", "ui.slidChambre2.value", tostring(consigne-150)); 
end



--------------------------------------------------

-- Mise à  jour du texte
local consigne; 
local consigneA; 
local temp; 
local text;
-- Salon
consigne =  fibaro:getGlobal('consigne_salon'); 
consigneA = fibaro:getGlobal('consigneA_salon'); 
temp = tonumber(fibaro:getValue(14,"value")); 
text = "Conf:"..(tonumber(consigne)/10).."° Cons:"..(tonumber(consigneA)/10).."° Temp:"..temp.."°";
fibaro:call(67, "setProperty", "ui.lblTempSalon.value", text);

-- Entrée
consigne =  fibaro:getGlobal('consigne_entree'); 
consigneA = fibaro:getGlobal('consigneA_entree'); 
temp = tonumber(fibaro:getValue(41,"value")); 
text = "Conf:"..(tonumber(consigne)/10).."° Cons:"..(tonumber(consigneA)/10).."° Temp:"..temp.."°";
fibaro:call(67, "setProperty", "ui.lblTempEntree.value", text);

-- Sdb
consigne =  fibaro:getGlobal('consigne_sdb'); 
consigneA = fibaro:getGlobal('consigneA_sdb'); 
temp = tonumber(fibaro:getValue(44,"value")); 
text = "Conf:"..(tonumber(consigne)/10).."° Cons:"..(tonumber(consigneA)/10).."° Temp:"..temp.."°";
fibaro:call(67, "setProperty", "ui.lblTempSdb.value", text);

-- Chambre Parents
consigne =  fibaro:getGlobal('consigne_chambre1'); 
consigneA = fibaro:getGlobal('consigneA_chambre1'); 
temp = fibaro:getGlobal("TH_Parents")/10;		-- Thermostat Zibase
text = "Conf:"..(tonumber(consigne)/10).."° Cons:"..(tonumber(consigneA)/10).."° Temp:"..temp.."°";
fibaro:call(67, "setProperty", "ui.lblTempChambre1.value", text);

-- Chambre 2 Rachel
consigne =  fibaro:getGlobal('consigne_chambre2'); 
consigneA = fibaro:getGlobal('consigneA_chambre2'); 
temp = tonumber(fibaro:getValue(60,"value")); 
text = "Conf:"..(tonumber(consigne)/10).."° Cons:"..(tonumber(consigneA)/10).."° Temp:"..temp.."°";
fibaro:call(67, "setProperty", "ui.lblTempChambre2.value", text);

fibaro:sleep(5000);

Certaines parties du code sont répétées entre le main loop et les sliders. le HC2 ne propose pas encore de faire des fonctions globales.

 

 

Ce module virtuel ne permet que de choisir le programme de la maison et les consignes de confort de chaque pièce.

 

J'ai donc une scène qui donne les ordres aux radiateurs :

--[[
%% properties

%% globals
--]]

-- Fonction Eco_Confort 
-- Retourne 0 si heure Eco ou 1 si Confort
function Eco_Confort() 
	local cDate = os.date("*t"); 
	local blnConfort = 0;
	local prog_house = fibaro:getGlobal("prog_house");
  	local hhcc = cDate.hour + cDate.min / 60;
 
  	--fibaro:debug("jour "..cDate.wday);
  
	if (tonumber(prog_house) == 0) then 
    	prog_house = 1;	-- Valeur par défaut
   	end
	-- Cas Normal (Travail la semaine, repos le week end)
	if (tonumber(prog_house) == 1) then
    	-- 1ier jour = Dimanche (jour 1)
    	-- Donc ci-dessous =  du lundi au vendredi
		if (cDate.wday >= 2 and cDate.wday <= 6) then
				-- de 6h00 à  7h15 ou de 18h00 à  23h30
			if ((hhcc>=5.75 and hhcc<=7) 
				or (hhcc>=18 and hhcc<23)) then
        		fibaro:debug("Normal : Semaine de 5h45 à  7h00 ou de 18h00 à  23h00");
				blnConfort = 1;
			end 
		else
			if (hhcc>8 and hhcc<23) then
        		fibaro:debug("Normal : WE de 8h à  23h");
				blnConfort = 1;
			end
		end
	-- Cas Repos (A la maison)
	elseif (tonumber(prog_house) == 2) then
		if (hhcc>8 and hhcc<=23.99) then
      		fibaro:debug("Congés : de 8h à  23h59");
			blnConfort = 1;
		end	
	-- Cas Absent (de la maison)
	else 
    	fibaro:debug("Absent : de 0h à  23h59");
		blnConfort = 0;
	end
  	fibaro:setGlobal("eco_confort", blnConfort);
	return blnConfort;
end
        
-- Fonction Get_Consigne
-- Retourne la consigne en °C en fonction de la pièce et de la consigne actuelle Eco ou Confort
function Get_Consigne(piece) 
	local consigne;
	if (Eco_Confort()==1) then
		if (piece=="Salon") then
			consigne = fibaro:getGlobal("consigne_salon");
		elseif (piece=="Entrée") then
			consigne = fibaro:getGlobal("consigne_entree");
		elseif (piece=="Chambre1") then
			consigne = fibaro:getGlobal("consigne_chambre1");
		elseif (piece=="Chambre2") then
			consigne =  fibaro:getGlobal("consigne_chambre2");
		elseif (piece=="Chambre3") then
			consigne = fibaro:getGlobal("consigne_chambre3");
		elseif (piece=="Sdb") then
			consigne = fibaro:getGlobal("consigne_sdb");
		else
			consigne = fibaro:getGlobal("consigne_eco");
		end
	else
		consigne = fibaro:getGlobal("consigne_eco");
	end
	return consigne;
end


-- Fonction Gestion_Chauffages
-- Ordonne ON/OFF aux chauffages
function Gestion_Chauffages()
	local ctemp, cconsigne;
	-- salon
	local room = fibaro:getRoomID(1);
	ctemp = tonumber(fibaro:getValue(14,"value"));  	
  	cconsigne = tonumber(Get_Consigne("Salon"))/10;
  	fibaro:setGlobal('consigneA_salon', cconsigne*10);
  	fibaro:debug("Salon - Température="..ctemp..", Consigne="..cconsigne);
	if (ctemp >= cconsigne) then
    	if (fibaro:getValue(18, "value")=="1") or (fibaro:getValue(21, "value")=="1") then
          	fibaro:debug("Chauffage salon OFF");
          	fibaro:call(18, 'turnOff');		-- Chaufface salon droit
      	  	fibaro:sleep(100);
          	fibaro:call(21, 'turnOff');		-- Chaufface salon gauche
     	end
	else
    	if (fibaro:getValue(18, "value")=="0") or (fibaro:getValue(21, "value")=="0") then
    		fibaro:debug("Chauffage salon ON");
			fibaro:call(18, 'turnOn');		-- Chaufface salon droit
      		fibaro:sleep(100);
    		fibaro:call(21, 'turnOn');		-- Chaufface salon gauche
      	end
	end
  
    -- entrée
    ctemp = tonumber(fibaro:getValue(41,"value"));  
  	cconsigne = tonumber(Get_Consigne("Entrée"))/10;
  	fibaro:setGlobal('consigneA_entree', cconsigne*10);
  	fibaro:debug("Entrée - Température="..ctemp..", Consigne="..cconsigne);
	if (ctemp >= cconsigne) then 
    	if (fibaro:getValue(52, "value")=="1") then
          fibaro:debug("Chauffage Entrée OFF");
          fibaro:call(52, 'turnOff');		-- Chaufface entrée
          fibaro:call(63, "pressButton", "1");	-- Chauffage Amis
      	end
	else
    	if (fibaro:getValue(52, "value")=="0") then
    		fibaro:debug("Chauffage Entrée ON");
			fibaro:call(52, 'turnOn');		-- Chaufface entrée
    		fibaro:call(63, "pressButton", "2");	-- Chauffage Amis
     	end
	end

    -- salle de bain
    ctemp = tonumber(fibaro:getValue(44,"value"));  
  	cconsigne = tonumber(Get_Consigne("Sdb"))/10;
  	fibaro:setGlobal('consigneA_sdb', cconsigne*10);
  	fibaro:debug("Sdb - Température="..ctemp..", Consigne="..cconsigne);
	if (ctemp >= cconsigne) then 
      	if (fibaro:getValue(49, "value")=="0") then
    		fibaro:debug("Chauffage Sdb OFF");
			fibaro:call(49, 'turnOn');		-- Chaufface Sdb - Inversé car gestion fil pilote
        end
	else
    	if (fibaro:getValue(49, "value")=="1") then
    		fibaro:debug("Chauffage Sdb ON");
			fibaro:call(49, 'turnOff');		-- Chaufface Sdb - Inversé car gestion fil pilote
      	end
	end  

    -- Chambre Rachel
    ctemp = tonumber(fibaro:getValue(60,"value"));  
  	cconsigne = tonumber(Get_Consigne("Chambre2"))/10;
  	fibaro:setGlobal('consigneA_chambre2', cconsigne*10);
  	fibaro:debug("Rachel - Température="..ctemp..", Consigne="..cconsigne);
	if (ctemp >= cconsigne) then 
    	if (fibaro:getValue(55, "value")=="0") then
    		fibaro:debug("Chauffage Rachel OFF");
			fibaro:call(55, 'turnOn');		-- Chaufface Rachel - Inversé car gestion fil pilote
     	end
	else
    	if (fibaro:getValue(55, "value")=="1") then
    		fibaro:debug("Chauffage Rachel ON");
			fibaro:call(55, 'turnOff');		-- Chaufface Rachel - Inversé car gestion fil pilote
     	end
	end  

  	-- Chambre Parents
  	ctemp = fibaro:getGlobal("TH_Parents")/10;		-- Thermostat Zibase
  	cconsigne = tonumber(Get_Consigne("Chambre1"))/10;
  	fibaro:setGlobal('consigneA_chambre1', cconsigne*10);
  	fibaro:debug("Parents - Température="..ctemp..", Consigne="..cconsigne);
	if (ctemp >= cconsigne) then 
    	fibaro:debug("Chauffage Parents OFF");
		fibaro:call(65, "pressButton", "1");	-- Chauffage Parents
	else
		fibaro:call(65, "pressButton", "2");	-- Chauffage Parents
    	fibaro:debug("Chauffage Parents ON");
	end  
end

Gestion_Chauffages();

Le lancement en boucle toutes les minutes de cette scène est géré par une autre scène mais ça ne sert à  rien, il faudrait que j'intègre cette boucle dans cette scène de façon à  en avoir qu'une (scène).

Autre axes d'amélioration : les heures de début et de fin des programmations "Normal" et "Congés" sont "en dur" dans le code; je devrais les mettre en variables globales.

  • Upvote 1
Posté(e) (modifié)

bonsoir,

 

Je vois que vous etes des champion du monde de code LUA perso j'essaye déjà  de faire fonctionner mon module virtuel avec un code tout simple ( à  priori ).

Quand j'allume et j'eteind mes module 21 et 22 séparément, j'ai bien l'allumage, l'extinction et le mode hors gel ( je n'arrive pas a avoir de mode eco, que j'ai pourtant sur le radiateur ( Sauter ) Bref...)

 

j'ai donc créé un module virtuel 3 boutons ( confort hors gel et arrêt )

 

m5tb.png
 
C'est a partir de la que tout fout l'camp
 
admettons que je sois 21 et 22 sur off donc en mode confort.
je clic sur hors gel, là  tout va bien il change le 21 sur on et ne touche pas au 22
 
Maintenant, je clic sur Arrêt, j'entends "clic clac" dans le module fibaro je VOIS le 21 sur OFF et Le 22 sur OFF au lieu de ON, mais en fait le radiateur m'indique sur son écran qu'il est en HORS GEL c'est à  dire 21 sur ON et 22 sur OFF, et si je veux changer l'état du 21 sur ON, le module Fibaro ne fait aucun bruit comme si il était resté sur ON et le 22 n'a pas changer d'état.
 
Je ne sait pas si mes explications sont clair,
- je ne sais pas si mes codes sont bon
- si oui existe il une temporisation, j'ai l'impression qu'il n'arrive pas a changer ses deux relais en même temps.
- et pourquoi je n'arrive pas a obtenir le mode confort via le fil pilote quand 21 et 22 sont sur ON mon radiateur est en mode hors gel.
 
Merci par avance.
 
PS j'ai vérifié le câblage du radiateur et des diodes tout a l'air nickel
Modifié par moicphil
Thibault, merci d'utiliser la galerie pour les photos. http://www.domotique-fibaro.fr/index.php/topic/89-utilisation-de-la-galerie-photo/
Posté(e)

@franckg16,

 

Ta solution est intéressante, mais j'avais pu lire que les ordres marche/arrêt n'étaient pas très bon pour les thermostats de radiateurs ? (je n'ai aucune idée de la fiabilité de cet avis)

Posté(e)

Bon c'est à  ce moment là  ou je me fait tout petit.... en fait l'ID de mon deuxième module n'était pas 22 mais 23  :15:

par contre lorsque les deux sont sur ON je n'ai pas de mode eco le radiateur est éteint.

 

Bon histoire que mon intervention sert à  quelques chose,

 

fibaro:call(16, "pressButton", "2")

 

- dans ton code Benjynet, tu appel un Module "16", il s'agit de l'ID de ton module virtuel où tu a créé tes 4 modes ?

- et le pressbutton 2, s'agit il de l'ID du mode eco dans ton module virtuel ?

 

- je n'arrive pas à  saisir à  quoi sert le Main loop avec le bouton Label 

 

Merci

Posté(e)

Merci

 

Donc le Main loop permet de récupérer certaines informations sur le module Virtuel

 

Par contre après avoir recopié textuellement ton tuto en changeant bien évidement les noms et ID, je n'arrive pas à  récupérer le Label : eco confort ou arrêt.

cette fois j'ai bien vérifié les ID, les minuscule et Majuscule, les espaces.

 

J'ai vraiment l'impression de ne jamais y arriver du premier coup, c'est dingue

 

Est il possible que les modules du FGS221 n'apparaissent pas dans l'appli mobile, pour ne garder que le module virtuel ?

Posté(e)

Une réponse rapide (si besoin je compléterai plus tard dans la journée)

Le script dans main loop est exécuté en permanence, au contraire des scripts qui sont actionnés par les boutons

Dans mon exemple, le main loop permet de récupérer le contenu d'une variable globale qui est modifiée par les boutons, mais aussi par d'autres modules virtuels, par des scènes ou directement par le panneau de variables

Cette variable globale doit être créée auparavant avec le panneau de variable

Si tu ne modifies pas la valeur de cette variable globale en dehors de ton module virtuel, le main loop n'est pas nécessaire

Posté(e)

fibaro:call(16, "pressButton", "2")

 

- dans ton code Benjynet, tu appel un Module "16", il s'agit de l'ID de ton module virtuel où tu a créé tes 4 modes ?

- et le pressbutton 2, s'agit il de l'ID du mode eco dans ton module virtuel ?

 

Exactement !

 

Si t'as utilisé mon script attention je n'ai pas de label moi, je me fis uniquement à  l'affichage des icônes qui indiquent pour chaque radiateur le mode dans lequel il est. Pour ce qui est du Label tu dois, comme le dis i-magin créer une variable globale dans ton panneau de variable qui sera mise à  jour par le mainloop.

Pour ce qui est de l'appli mobile tu te crées un nouvel utilisateur dans le panneau de contrôle d'accès qui ne sera pas admin forcément et tu lui donnes les droits que tu veux dans "editer les droits d'accès" pour les modules et les scènes.

Personnellement je n'utilise l'admin que pour gérer la box, si je ne dois que l'utiliser je passe par mon accès et ma femme le sien. De cette façon l'affichage n'est pas encombré par tous ces modules qui "ne servent à  rien".

Pour la gestion du chauffage ma politique est que les radiateurs se gèrent eux-même au niveau régulation (je ne vois pas l'intérêt d'avoir la possibilité de changer la température avec le HC2, une fois qu'elle est réglée c'est fait une fois pour toute). Ensuite dans le script les heures sont "en dur" car notre edt ne change pas beaucoup et les conditions sont faite avec des = et non des > ou < comme ça si on veut forcer le chauffage, on peut le faire sans que le script ne vient reforcer un mode derrière et si on oublie de le remettre en "auto" disons, au prochain test de l'heure, le radiateur fonctionnera selon le script. Là  bien évidement je ne parle que de ma salle de bain, les autres radiateurs ont une cassette de programmation pour le moment.

Je pense m'orienter vers un script par radiateur ou zone. Donc en ce qui me concerne un pour la salle de bain, un pour la salle d'eau, un pour chaque chambre (soit 5) et un pour la zone jour (cuisine, salon, sam).

Posté(e)

@aliasing

Le "main loop" n'est pas indispensable dans la gestion de ton chauffage

Je suppose que tu vas changer le mode de chauffage (selon les 4 ordres) en passant par ton module virtuel... et si tu utilises des scènes, elles s’appuieront sur ton module virtuel

 

Tu peux donc mettre les lignes "fibaro:call(78,"setProperty","ui.Label1.value", "xxxx")" dans chaque bouton

Un exemple pour le mode confort :

fibaro:call(75, "turnOff");
fibaro:call(77, "turnOff");
fibaro:setGlobal("chauffagechb", "confort")
fibaro:call(78,"setProperty","ui.Label1.value","confort")

Pour la dernière ligne :

- 78 est l'id du périphérique virtuel
- "ui.Label1.value" : Label1 doit correspondre scrupuleusement à  l'ID du label
- "confort" : c'est le texte qui sera affiché dans le label
 
Si tu choisis cette solution, tu peux supprimer toutes les lignes du main loop
Le seul petit inconvénient, c'est lors d'un redémarrage de la box ou de modifications-sauvegardes du module virtuel : la ligne label sera remise à  zéro (mais heureusement pas la variable globale) : il suffira de cliquer sur le bouton du mode chauffage voulu pour faire apparaître le mode de chauffage dans le label
Posté(e)

@i-magin, pour répondre àton intérogation sur les ordres ON/OFF (avec des modules type FGS-211) sur les radiaateurs : j'utilise cette solution sur les radiateurs non électronique (radiant ou grille-pain) depuis 5 ans et je n'ai jamais eu de problème. Ce sont de vieux radiateurs. A noter que je n'utilise leur thermostat que pour leur dire de chauffer au max ; le relevé de température est géré par des thermostat zwave dans chaque pièce.

Par contre, j'ai utilisé les ordres ON/OFF sur un sèche serviette plus moderne avec gestion fil pilote et il n'a pas trop aimé ça : ça a marché quelques mois mais après le chauffe serviette restait dans l'état "je ne chauffe pas" bien que son thermostat était au max et qu'il était bien alimenté car le voyant était bien allumé. Depuis que je le gère avec son fil pilote, il fonctionne très bien.

  • Upvote 1
Posté(e)

merci messieurs, le brouillard commence àce dissiper, et puis àforce de pratique, je vais finir par apprendre la logique LUA

Posté(e)

je reviens pour une petite question en fait mon radiateur, un Sauter Baladi, est un radiateur avec fil pilote 6 ordres ( adret, hors gel, eco, confort-1°, confort-2°) le seul problème, je n'arrive qu'àavoir : arrêt, hors gel et confort.

Y a t il une solution pour au moins avoir le mode eco ?

Posté(e)

Comme l'a écrit @benjynet, les ordres eco sont :

Eco : 21-22 On

Pourrais-tu mettre une nouvelle copie d'écran, avec le bouton eco (il manque dans ton message précédent) ... et si possible le bouton (le plus proche sur l'image) qui fonctionne ?

  • Upvote 1
Posté(e)

le probleme c'est que ce n'est même plus un probleme de programmation, si je mets les deux sur ON ( sans passer par le module virtuel, mais directement sur les" inters" du module, mon radiateur prends l'ordre de s'arreter.

le cablage est bon je l'ai verifié plusieurs fois le sens des diodes aussi.

serait il possible que mon radiateur n'accepte pas ce type de configuration ?

Posté(e)

Non c'est pas possible, c'est une norme commune àtous les radiateurs. J'ai un sèche-serviette sauter ventilo et ça marche très bien avec le montage du lien que j'ai donné. Si ton montage est bon, On/On doit donner ECO et Off/Off confort, t'es sur de pas avoir un soucis électrique quelque part ?

Posté(e)

je viens de relire la notice de mon radiateur, il me dit que lorsque je passe du mode confort au mode eco via le fil pilote il y a un delay de 12 secondes, une chose que je viens d'apprendre, par contre lorsque j'attends, au lieu de basculer en eco il bascule en confort, j'ai reseter le radiateur c'est pareil, le cablage est bien celui de planete domotique. je reverifierai demain.

×
×
  • Créer...