zeldoi5 Posté(e) le 27 juillet 2015 Signaler Posté(e) le 27 juillet 2015 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 ? 1
jojo Posté(e) le 27 juillet 2015 Signaler Posté(e) le 27 juillet 2015 poste-nous ton code actuel, ce sera plus facile. A priori, on peut sans problème exécuter une fonction avec différents paramètres
zeldoi5 Posté(e) le 27 juillet 2015 Auteur Signaler Posté(e) le 27 juillet 2015 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.
trainkill666 Posté(e) le 27 juillet 2015 Signaler Posté(e) le 27 juillet 2015 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")]; 1
zeldoi5 Posté(e) le 27 juillet 2015 Auteur Signaler Posté(e) le 27 juillet 2015 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...
trainkill666 Posté(e) le 27 juillet 2015 Signaler Posté(e) le 27 juillet 2015 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")) ?
zeldoi5 Posté(e) le 27 juillet 2015 Auteur Signaler Posté(e) le 27 juillet 2015 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 ...
pepite Posté(e) le 27 juillet 2015 Signaler Posté(e) le 27 juillet 2015 salut, Inspire toi de @mprinfo : http://www.domotique-fibaro.fr/index.php/topic/4726-scene-lua-ouverture-et-fermeture-des-volets/ mais en LUA quelle aventure ;-) Et sinon tu as tenté GEA, tout ce que tu souhaites se fait avec ;-)
mprinfo Posté(e) le 27 juillet 2015 Signaler Posté(e) le 27 juillet 2015 @trainkill666 toujours au top même pendant les vacances 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 1
zeldoi5 Posté(e) le 27 juillet 2015 Auteur Signaler Posté(e) le 27 juillet 2015 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...
trainkill666 Posté(e) le 27 juillet 2015 Signaler Posté(e) le 27 juillet 2015 @ 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.
mprinfo Posté(e) le 27 juillet 2015 Signaler Posté(e) le 27 juillet 2015 @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
trainkill666 Posté(e) le 27 juillet 2015 Signaler Posté(e) le 27 juillet 2015 @ Pascal En parlant de Steven, bizarre, Imperihome est enfin compatible HC2 depuis plusieurs jours et il n'y a aucun sujet de sa part, il n'est plus souvent sur le forum ?
zeldoi5 Posté(e) le 28 juillet 2015 Auteur Signaler Posté(e) le 28 juillet 2015 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 ). 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 1
mprinfo Posté(e) le 28 juillet 2015 Signaler Posté(e) le 28 juillet 2015 il faut utilisé des fonctions cela limite les boucles
Messages recommandés