Aller au contenu

Sous Fonction Lua


zeldoi5

Recommended Posts

Bonjour,

 

j'ai dans mon script de gestion automatisé de mes volets beaucoup de lignes : 4 groupes de volets. Pour chaque volets, j'ai mes boucles, tests, re-tests, ...

J'aimerai créer une sous-fonction que j’appellerai pour chacun de mes volets, ce qui allègerait le code et mes debug nécessaires.

 

Est il possible de gérer une telle sous-fonction dans une scène LUA ?

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

Oula...

 

Je vais coller mes prémisses de code, relativement simplifié... maismême simplifié, ça risque de piquer les yeux !

 

 

local currentDate = os.date("*t");
local status_present = fibaro:getGlobalValue("PRESENCE");

fibaro:debug(" Lancement Fermeture Selective GLOBALE");
fibaro:debug(" ->Statut volets RdC : "..fibaro:getGlobalValue("GLOBALE_FERM_RDC"));
fibaro:debug(" ->Statut volets 1er : "..fibaro:getGlobalValue("GLOBALE_FERM_1ER"));

--Initialisation des variables de scène
local jour = "";
local mois = "";
local annee = "";
local saison = "";

local voletCuisine = "";
local voletSalon   = "";
local voletChambre = "";
local voletJardin  = "";

local tempCuisine = tonumber(fibaro:getGlobalValue("OS439156759_V1"))/10;
local tempSalon   = fibaro:getValue(177, "value");
local tempChambre = fibaro:getValue(71, "value")
local tempJardin  = fibaro:getValue(159, "value");

local heure = currentDate.hour;
local minute = currentDate.min;
local annee = currentDate.year;

fibaro:setGlobal("MsgSMS", "");    --Initialisation SMS

if( currentDate.wday == 2 ) then jour = "Lundi"; end
if( currentDate.wday == 3 ) then jour = "Mardi"; end
if( currentDate.wday == 4 ) then jour = "Mercredi"; end
if( currentDate.wday == 5 ) then jour = "Jeudi"; end
if( currentDate.wday == 6 ) then jour = "Vendredi"; end
if( currentDate.wday == 7 ) then jour = "Samedi"; end
if( currentDate.wday == 1 ) then jour = "Dimanche"; end

if( currentDate.month == 1 ) then mois = "JANVIER";   saison = "hiver"; end
if( currentDate.month == 2 ) then mois = "FEVRIER";   saison = "hiver"; end
if( currentDate.month == 3 ) then mois = "MARS";      saison = "hiver"; end
if( currentDate.month == 4 ) then mois = "AVRIL";     saison = "hiver"; end
if( currentDate.month == 5 ) then mois = "MAI";       saison = "été";   end
if( currentDate.month == 6 ) then mois = "JUIN";      saison = "été";   end
if( currentDate.month == 7 ) then mois = "JUILLET";   saison = "été";   end
if( currentDate.month == 8 ) then mois = "AOUT";      saison = "été";   end
if( currentDate.month == 9 ) then mois = "SEPTEMBRE"; saison = "été";   end
if( currentDate.month == 10 ) then mois = "OCTOBRE";  saison = "hiver"; end
if( currentDate.month == 11 ) then mois = "NOVEMBRE"; saison = "hiver"; end
if( currentDate.month == 12 ) then mois = "DECEMBRE"; saison = "hiver"; end

fibaro:debug("Fermeture des volets selective GLOBALE en mode "..status_present..", le "..currentDate.day.."/"..currentDate.month.."/"..annee.." à  "..heure..":"..minute..".");

if( tonumber(fibaro:getGlobalValue("PRESENCE")) == tonumber("1"))
    then status_present = "Présent";
end
if( tonumber(fibaro:getGlobalValue("PRESENCE")) == tonumber("2"))
    then status_present = "Absent";
end
if( tonumber(fibaro:getGlobalValue("PRESENCE")) == tonumber("3"))
    then status_present = "Repos";
end

fibaro:debug(" Analyse de l'état des volets");
voletCuisine = tonumber(fibaro:getGlobalValue("ZIBASE_V15"));
voletSalon   = tonumber(fibaro:getGlobalValue("ZIBASE_V18"));
voletChambre = tonumber(fibaro:getGlobalValue("ZIBASE_V17"));
voletJardin  = tonumber(fibaro:getGlobalValue("ZIBASE_V16"));

fibaro:setGlobal("MsgSMS","SMS-Volets Fermeture Globale Selective, mode "..status_present..", le "..currentDate.day.."/"..currentDate.month.."/"..annee.." à  "..heure..":"..minute..". Saison : "..saison);


if( tostring(status_present) == tostring("Présent"))    ------- Présent -------
then
    if ( tostring(saison) == tostring("hiver"))        ------- Présent Hiver -------
    then
        -- voletCuisine - Présent Hiver

        -- voletSalon - Présent Hiver

        -- voletChambre - Présent Hiver

        -- voletJardin - Présent Hiver
    elseif ( tostring(saison) == tostring("été"))        ------- Présent Eté -------
    then
        -- voletCuisine - Présent Hiver
        ferme("voletCuisine", saison, status_present);
        -- voletSalon - Présent Hiver

        -- voletChambre - Présent Hiver

        -- voletJardin - Présent Hiver
    end
elseif ( tostring(status_present) == tostring("Absent"))    ------- Absent -------
then
    if ( tostring(saison) == tostring("hiver"))        ------- Absent Hiver -------
    then
        -- voletCuisine - Absent Hiver

        -- voletSalon - Absent Hiver

        -- voletChambre - Absent Hiver

        -- voletJardin - Absent Hiver
    elseif ( tostring(saison) == tostring("été"))        ------- Absent Eté -------
    then
        -- voletCuisine - Absent Hiver

        -- voletSalon - Absent Hiver

        -- voletChambre - Absent Hiver

        -- voletJardin - Absent Hiver
    end
elseif ( tostring(status_present) == tostring("Repos"))    ------- Repos -------
then
    if ( tostring(saison) == tostring("hiver"))        ------- Repos Hiver -------
    then
        -- voletCuisine - Repos Hiver

        -- voletSalon - Repos Hiver

        -- voletChambre - Repos Hiver

        -- voletJardin - Repos Hiver
    elseif ( tostring(saison) == tostring("été"))        ------- Repos Eté -------
    then
        -- voletCuisine - Repos Hiver

        -- voletSalon - Repos Hiver

        -- voletChambre - Repos Hiver

        -- voletJardin - Repos Hiver
    end
end

function ferme(volet, saison, statut)

    local statut_volet;
    local temp;
    local call_button;
    local zibase_id;

    if (tostring(volet) == tostring("voletCuisine"))
    then
        statut_volet     = tonumber(fibaro:getGlobalValue("ZIBASE_V15"));
        temp             = tonumber(fibaro:getGlobalValue("OS439156759_V1"))/10;
        call_button        = 40;
        zibase_id        = tostring("ZIBASE_V15");
    elseif (tostring(volet) == tostring("voletSalon"))
    then
        statut_volet       = tonumber(fibaro:getGlobalValue("ZIBASE_V18"));
        temp             = fibaro:getValue(177, "value");
        call_button        = 43;
        zibase_id        = tostring("ZIBASE_V18");
    elseif (tostring(volet) == tostring("voletChambre"))
    then
        statut_volet     = tonumber(fibaro:getGlobalValue("ZIBASE_V17"));
        temp             = fibaro:getValue(71, "value")
        call_button        = 42;
        zibase_id        = tostring("ZIBASE_V17");
    elseif (tostring(volet) == tostring("voletJardin"))
    then
        statut_volet      = tonumber(fibaro:getGlobalValue("ZIBASE_V16"));
        temp             = fibaro:getValue(159, "value");
        call_button        = 41;
        zibase_id        = tostring("ZIBASE_V17");
    end

    fibaro:debug(volet.." ouvert en "..statut.."/"..saison);
    if (tostring(saison) == tostring("été"))
    then
        if (tonumber(statut_volet) == tonumber("0"))        --Volet Ouvert
        then
            --Action de fermeture
        elseif (tonumber(statut_volet) == tonumber("25"))    --Volet 25% Ouvert
        then
            --Action de fermeture
        elseif (tonumber(statut_volet) == tonumber("95"))    --Volet 50% Ouvert
        then
            --Action de fermeture
        elseif (tonumber(statut_volet) == tonumber("100"))    --Volet Fermé
        then
            --Aucune Action de fermeture
        end
    elseif (tostring(saison) == tostring("hiver"))
    then
        if (tonumber(statut_volet) == tonumber("0"))        --Volet Ouvert
        then
            --Action de fermeture
        elseif (tonumber(statut_volet) == tonumber("25"))    --Volet 25% Ouvert
        then
            --Action de fermeture
        elseif (tonumber(statut_volet) == tonumber("95"))    --Volet 50% Ouvert
        then
            --Action de fermeture
        elseif (tonumber(statut_volet) == tonumber("100"))    --Volet Fermé
        then
            --Aucune Action de fermeture
        end
    end
end


setTimeout(function()
    fibaro:debug(" --> Envoi SMS rappel");
    fibaro:setGlobal("FreeSms_Ben", tostring(fibaro:getGlobalValue("MsgSMS")));
    --fibaro:setGlobal("MsgSMS", "");    --RéInitialisation SMS
end, 10000)
--fibaro:debug(" MAJ Variable d'environnement à  : fermes");
fibaro:setGlobal("GLOBALE_FERM_1ER", "fermes");
fibaro:setGlobal("GLOBALE_FERM_RDC", "fermes");
fibaro:setGlobal("GLOBALE_FERMETURE", "fermes");

 

 

La fonction est définie à  la ligne 137...

Elle est appelée en ligne 86.

Lien vers le commentaire
Partager sur d’autres sites

Bonjour zeldoi5

 

Voici une version un peu simplifiée de ton code de la ligne 1 à  62 qui donne le même résultat, si je n'ai pas fait d'erreur :

    local currentDate = os.date("*t");
         
    fibaro:debug(" Lancement Fermeture Selective GLOBALE");
    fibaro:debug(" ->Statut volets RdC : "..fibaro:getGlobalValue("GLOBALE_FERM_RDC"));
    fibaro:debug(" ->Statut volets 1er : "..fibaro:getGlobalValue("GLOBALE_FERM_1ER"));
     
    --Initialisation des variables de scène
	local definirjour = { "Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"};
	local jour = definirjour[currentDate.wday];
	local definirmois = { "JANVIER", "FEVRIER", "MARS", "AVRIL", "MAI", "JUIN", "JUILLET", "AOUT", "SEPTEMBRE", "OCTOBRE", "NOVEMBRE", "DECEMBRE"};
	local mois = definirmois[currentDate.month];	
	local definirsaison = { "hiver", "hiver", "hiver", "hiver", "été", "été", "été", "été", "été", "hiver", "hiver", "hiver"};
	local saison = definirsaison[currentDate.month];		
    local annee = currentDate.year;
    local heure = currentDate.hour;
    local minute = currentDate.min; 
 
    local voletCuisine = "";
    local voletSalon   = "";
    local voletChambre = "";
    local voletJardin  = "";
     
    local tempCuisine = tonumber(fibaro:getGlobalValue("OS439156759_V1"))/10;
    local tempSalon   = fibaro:getValue(177, "value");
    local tempChambre = fibaro:getValue(71, "value")
    local tempJardin  = fibaro:getValue(159, "value");
        
    fibaro:setGlobal("MsgSMS", "");    --Initialisation SMS
     
    fibaro:debug("Fermeture des volets selective GLOBALE en mode "..status_present..", le "..currentDate.day.."/"..currentDate.month.."/"..annee.." à  "..heure..":"..minute..".");
     
	local definirpresence = { "Présent", "Absent", "Repos" };
	local status_present = definirpresence[ tonumber(fibaro:getGlobalValue("PRESENCE")];	
  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

Ah cool !

Merci trainkill666 pour les definirjour/definirmois/definirsaison !

Je ne savais pas qu'on pouvait faire ça !

 

Par contre, ça n'était pas trop la demande :$ (désolé!).

La sub-fonction définie en l.137, et appelée l.86...

Lien vers le commentaire
Partager sur d’autres sites

C'est toujours ça de pris ;)  .

 

Tu souhaites que la fonction ferme(...) soit simplifiée pour qu'il n'y ai pas le test pour chaque volets de la ligne avec

if (tostring(volet) == tostring("voletCuisine"))

jusque

(tostring(volet) == tostring("voletJardin"))

?

Lien vers le commentaire
Partager sur d’autres sites

Non pas forcément simplifiée... mais appelée de manière générique...

 

Quand tu appelles la fonction debug :

fibaro:debug("

 

C'est pareils : elle est formalisée quelque part... Comment formaliser une fonction/sous-fonction pour pouvoir l'appeler de manière générique ? Je ferai ainsi une fonction

  • function ferme(volet, saison, statut)

qui appelera les boutons de mes VD (qui eux déclenchent les périphériques qui vont bien sur ma Zibase)

 

J'essayerai de mettre un exemple plus concret ...

Lien vers le commentaire
Partager sur d’autres sites

@trainkill666 toujours au top même pendant les vacances :D

 

ligne 13 on peut faire mieux 05 à  09 = été sinon hiver

	
local mois = definirmois[currentDate.month];	
local definirsaison = "hiver"
if mois >= 5 and mois <= 9 then
   definirsaison = "été"
end

j'ai pas testé il y aura peut être besoin d'un tonumber mais je pense pas

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

Z'êtes au top messieurs ;)

Je ne sais pas trop ce que je ferai sans ce forum :$

 

Jusqu'à  maintenant, je faisais sans ce magnifique outils qu'est GEA... mais je sens que je vais devoir m'y mettre !

 

Je vais essayer encore deux trois trucs avec mon script...

Lien vers le commentaire
Partager sur d’autres sites

@ pascal

Merci :) , les vacances ne sont malheureusement pas avant 1 mois.

 

@zeldoi5

Est-ce en partie une réponse à  ta question :

local verifparametres = function(volet)
	local veriftemp
	local definirtemp = {voletSalon = 177, voletChambre = 71, voletJardin = 159}
	local definirbutton = {voletCuisine = 40, voletSalon = 43, voletChambre = 42, voletJardin = 41}
	local definirzibase = {voletCuisine = "ZIBASE_V15", voletSalon = "ZIBASE_V18", voletChambre = "ZIBASE_V17", voletJardin = "ZIBASE_V16"}
	if volet == "voletCuisine" then
		veriftemp = tonumber(fibaro:getGlobalValue("OS439156759_V1"))/10
	else
		veriftemp = fibaro:getValue(definirtemp[volet], "value")
	end
	return tonumber(fibaro:getGlobalValue(definirzibase[volet])), veriftemp, definirbutton[volet], definirzibase[volet]
end


function ferme(volet, saison, statut)


local statut_volet, temp, call_button, zibase_id = verifparametres(volet) -- remplace la ligne 138 à  168

Semble être fonctionnel. ;)

 

Ne lâches pas l'affaire si vite, on en est qu'au début de ce sujet.

 

Le script de mprinfo peut également t'aider comme le dit pépite.

Lien vers le commentaire
Partager sur d’autres sites

@zeldoi5 Un lorrain ça lâche pas l'affaire comme cela. En plus tu es de Nancy on est voisin.

Te laisse pas avoir par la facilité de GEA

Personnellement je n'utilise pas GEA je préfère faire mes propre script en lua

C'est plus cool et instructif avec le temps on peut faire des petits scripts en 10mn. Bravo au père Steven qui est l'auteur de GEA (sinon il va me mordre lol)

Envoyé de mon SM-G900F en utilisant Tapatalk

Lien vers le commentaire
Partager sur d’autres sites

Semble être fonctionnel. ;)

 

Ne lâches pas l'affaire si vite, on en est qu'au début de ce sujet.

 

Le script de mprinfo peut également t'aider comme le dit pépite.

 

 

Faut que je regarde à  tête reposée... Je n'abandonne pas ! (un lorrain n'abandonne pas :D  ).

 

Je posterai également mon script LUA qui traite la fermeture des volets en fonction de plusieurs paramètres :

- premier paramètre : l'heure

- second : le statut de présence

- troisème : la température de la pièce

- quatrième : l'état en % de fermeture du volet...

 

--> ça fait vite des boucle de if then elseif while ...

et ça devient vite chiant à  débugger :(

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

×
×
  • Créer...