Nico882 Posté(e) le 22 avril 2016 Signaler Posté(e) le 22 avril 2016 Bonsoir à tous, voici 3 jours que je me débats avec la création d'une scène chargée de gérer la filtration de ma piscine. l'objectif est le suivant : toutes les 6 heures, je mets en route ma pompe de piscine pour un temps donné. ce dernier est calculé en fonction de la température de piscine. --[[ %% autostart %% properties %% events %% globals --]] local sourceTrigger = fibaro:getSourceTrigger(); local Temps_cycle = 5 --6h*60min/h=>360min function tempFunc() local currentDate = os.date("*t"); local startSource = fibaro:getSourceTrigger(); local Temps_cycle = 5 --5min fibaro:debug('Temps de cycle :'..Temps_cycle..'min') --récupération de la température de l'eau de piscine local Temp_eau = fibaro:getValue(178, "value") fibaro:debug('Température de l\'eau :'..Temp_eau..'°C') --évaluation du temps de filtration pour les 6 heures à venir -- température divisée par 2 local Quart_Temps_Filtration = 1*60*1000 --1 min --local Quart_Temps_Filtration = Temp_eau/4/2*60*60*1000 --en ms fibaro:debug('Temps de filtration sur les '..(Temps_cycle/60)..'h en cours : '..(Quart_Temps_Filtration/1000/60) ..'min') -- traitement des différents cas de gestion de la filtration local Etat_Commande_Filtration = fibaro:getGlobalValue('Filtration_Piscine') fibaro:debug('Etat de la commande de filtration : '..Etat_Commande_Filtration) fibaro:debug('démarrage de la fonction') if(Etat_Commande_Filtration == "Arrêt") then fibaro:call(107, "turnOff"); fibaro:debug('Etat de la pompe (boucle arrêt) : '..fibaro:getValue(107, "value")) else -- cas de la marche forcée if (Etat_Commande_Filtration == "Marche Forcée") then fibaro:call(107, "turnOn"); fibaro:debug('Etat de la pompe (boucle marche forcée): '..fibaro:getValue(107, "value")) else -- cas du programme de filtration if (Etat_Commande_Filtration == "Programme") then fibaro:debug('écart modulo temps de cycle :'..(math.floor(os.time()/60)-math.floor(1460955600/60))%Temps_cycle) if ( (math.floor(os.time()/60)-math.floor(1460955600/60))%Temps_cycle == 0 ) then --démarrage de la pompe fibaro:call(107, "turnOn"); fibaro:debug('Etat de la pompe (boucle programme1): '..fibaro:getValue(107, "value")) setTimeout(function() local temp_Etat_Pompe, temp_derniere_modif_pompe = fibaro:get(107, "value"); -- condition pour arrêt de la pompe if (os.time() - temp_derniere_modif_pompe >= (Quart_Temps_Filtration/1000)) then fibaro:debug('heure courante : '..os.time()) fibaro:debug('heure dernier changement état pompe : '..temp_derniere_modif_pompe) fibaro:debug('temps écart :'..(os.time() - temp_derniere_modif_pompe)) fibaro:debug('temps de filtration : '..(Quart_Temps_Filtration/1000)) fibaro:call(107, "turnOff"); end end, Quart_Temps_Filtration) end fibaro:debug('Etat de la pompe (boucle programme): '..fibaro:getValue(107, "value")) end --fin if Programme end --fin if marche forcée end --fin if arrêt end -- fin de la fonction tempfunc() setTimeout(tempFunc, 1*60*1000) if (sourceTrigger["type"] == "autostart") then fibaro:debug(sourceTrigger["type"]) tempFunc() end mon problème c'est que la scène que je voudrais bien évidemment récurrente ne s'exécute que 2 fois et... plus rien! j'ai bidouillé pas mal de chose mais rien y fait. je pense que ça doit venir du double "settimeout" imbriqué dans mes fonctions qui génère ce problème. si c'est le cas, j'ai un autre problème qui se profile... je ne vois pas comment faire autrement ^^ si un expert à l’Å“il plus acéré que le mien, je suis preneur d'un peu d'aide. merci d'avance.
jojo Posté(e) le 22 avril 2016 Signaler Posté(e) le 22 avril 2016 en efet, le c'est le double timeout qui doit poser problème. Pourrais-tu décrire ce que tu veux faire exactement / le flux de ton programme ?
Nico882 Posté(e) le 22 avril 2016 Auteur Signaler Posté(e) le 22 avril 2016 tout d'abord merci beaucoup de prendre du temps pour me lire et me répondre. alors l'idée : la filtration (pompe) est possède 3 états : Arrêt (total) ; Marche forcée (h24 en marche) ; Programme (temps de filtration en fonction de la température de l'eau) donc dans la première partie de mon programme je récupère les différentes valeurs de device et de variable : (j'ai ajouté des commentaires dans le code) local sourceTrigger = fibaro:getSourceTrigger(); function tempFunc() local currentDate = os.date("*t"); -- je récupère l'heure du système local startSource = fibaro:getSourceTrigger(); --je récupère l'heure de démarrage de la scène qui devient mon point de départ du cycle local Temps_cycle = 5 --pour l'essai mon temps de cycle est fixé à 5min. en définitive 360min (6h) fibaro:debug('Temps de cycle :'..Temps_cycle..'min') --récupération de la température de l'eau de piscine local Temp_eau = fibaro:getValue(178, "value") fibaro:debug('Température de l\'eau :'..Temp_eau..'°C') --évaluation du temps de filtration pour les 6 heures à venir -- température divisée par 2 local Quart_Temps_Filtration = 1*60*1000 -- pour l'essai j'ai mis 1 min de filtration --local Quart_Temps_Filtration = Temp_eau/4/2*60*60*1000 --le vrai calcul du temps de filtration quand les essais seront concluant est ici fibaro:debug('Temps de filtration sur les '..(Temps_cycle/60)..'h en cours : '..(Quart_Temps_Filtration/1000/60) ..'min') local Etat_Commande_Filtration = fibaro:getGlobalValue('Filtration_Piscine') -- je récupère l'état de la variable global ("Arrêt";"Marche forcée","Programme) fibaro:debug('Etat de la commande de filtration : '..Etat_Commande_Filtration) une fois que j'ai tous les éléments, je programme 3 conditions imbriquées pour gérer les 3 états possibles de filtration. enfin dans la 3ème condition (qui correspond à mon choix "Programme"), j'y insère une nouvelle condition qui permet de démarrer la pompe à l'instant exact d'un début de cycle (soit tous les 6 heures). j'utilise alors la fonction settimeout pour l'arrêt de la pompe à l'issu d'un certain temps de fonctionnement (le temps calculé en début de programme). enfin j'utilise la fonction settimeout une nouvelle fois pour permettre l'exécution de toute la fonction "tempFunc()" en arrière plan. est-ce que c'est suffisamment clair?
jojo Posté(e) le 22 avril 2016 Signaler Posté(e) le 22 avril 2016 ça m'a l'air bien copliqué tout ça. Je suis du style keep it simple.... donc tu as un VD avec 3 boutons, pour définir l'état de la filtration (le VD change la valeur d'une variable) : arrêt : la pompe ne peut pas démarrer marche : la pompe tourne et ne s'arrête jamais, ou après une durée fix programme : elle démarre à 0h00, 6h00, 12h00, 18h00 pour une durée qui dépend de la température (et qui ne peut pas dépasser 6h00) utilises-tu GEA ?
pepite Posté(e) le 22 avril 2016 Signaler Posté(e) le 22 avril 2016 @jojo, j'ai compris ca aussi. En partant de la scene, je ferais plutot avec la variable Filtration en trigger de la scene. Comme ceci non ? --[[ %% autostart %% properties %% events %% globals Filtration_Piscine --]] local currentDate = os.date() local Etat_Commande_Filtration = fibaro:getGlobalValue('Filtration_Piscine') fibaro:debug("Démarrage de la Scène Filtration_Piscine : " ..currentDate) function GetInfo() fibaro:debug('Etat de la commande de filtration : '..Etat_Commande_Filtration) local Temps_cycle = 5 --5min fibaro:debug('Temps de cycle :'..Temps_cycle..'min') --récupération de la température de l'eau de piscine local Temp_eau = fibaro:getValue(178, "value") fibaro:debug("Température de l'eau :"..Temp_eau..'°C') --évaluation du temps de filtration pour les 6 heures à venir -- température divisée par 2 local Quart_Temps_Filtration = 1*60*1000 --1 min --local Quart_Temps_Filtration = Temp_eau/4/2*60*60*1000 --en ms fibaro:debug('Temps de filtration sur les '..(Temps_cycle/60)..'h en cours : '..(Quart_Temps_Filtration/1000/60) ..'min') end if (Etat_Commande_Filtration == "Arrêt") then fibaro:call(107, "turnOff") fibaro:debug('Etat de la pompe (boucle arrêt) : '..fibaro:getValue(107, "value")) elseif (Etat_Commande_Filtration == "Marche Forcée") then fibaro:call(107, "turnOn"); fibaro:debug('Etat de la pompe (boucle marche forcée): '..fibaro:getValue(107, "value")) else GetInfo() fibaro:debug('écart modulo temps de cycle :'..(math.floor(os.time()/60)-math.floor(1460955600/60))%Temps_cycle) if ((math.floor(os.time()/60)-math.floor(1460955600/60))%Temps_cycle == 0 ) then --démarrage de la pompe fibaro:call(107, "turnOn"); fibaro:debug('Etat de la pompe (boucle programme1): '..fibaro:getValue(107, "value")) setTimeout( function() local temp_Etat_Pompe, temp_derniere_modif_pompe = fibaro:get(107, "value") -- condition pour arrêt de la pompe if (os.time() - temp_derniere_modif_pompe >= (Quart_Temps_Filtration/1000)) then fibaro:debug('heure courante : '..os.time()) fibaro:debug('heure dernier changement état pompe : '..temp_derniere_modif_pompe) fibaro:debug('temps écart :'..(os.time() - temp_derniere_modif_pompe)) fibaro:debug('temps de filtration : '..(Quart_Temps_Filtration/1000)) fibaro:call(107, "turnOff") end end, Quart_Temps_Filtration) fibaro:debug('Etat de la pompe (boucle programme): '..fibaro:getValue(107, "value")) end end Sinon, pui, si tu utilises GEA, ca se tente aussi comme le dit @jojo ca ferait une scene de moins ;-)
Indyana Posté(e) le 22 avril 2016 Signaler Posté(e) le 22 avril 2016 Ca serait pas un truc comme ça? --[[ %% autostart %% properties %% events %% globals --]] local sourceTrigger = fibaro:getSourceTrigger(); local Temps_cycle = 5 --6h*60min/h=>360min function tempFunc() local currentDate = os.date("*t"); local startSource = fibaro:getSourceTrigger(); local Temps_cycle = 5 --5min fibaro:debug('Temps de cycle :'..Temps_cycle..'min') local Temp_eau = fibaro:getValue(178, "value") --récupération de la température de l'eau de piscine fibaro:debug('Température de l\'eau :'..Temp_eau..'°C') local Quart_Temps_Filtration = 1*60*1000 --1 min --local Quart_Temps_Filtration = Temp_eau/4/2*60*60*1000 -- --évaluation du temps de filtration pour les 6 heures àvenir en ms fibaro:debug('Temps de filtration sur les '..(Temps_cycle/60)..'h en cours : '..(Quart_Temps_Filtration/1000/60) ..'min') -- traitement des différents cas de gestion de la filtration local Etat_Commande_Filtration = fibaro:getGlobalValue('Filtration_Piscine') fibaro:debug('Etat de la commande de filtration : '..Etat_Commande_Filtration) fibaro:debug('démarrage de la fonction') if(Etat_Commande_Filtration == "Arrêt") then fibaro:call(107, "turnOff"); fibaro:debug('Etat de la pompe (boucle arrêt) : '..fibaro:getValue(107, "value")) end -- cas de la marche forcée if (Etat_Commande_Filtration == "Marche Forcée") then fibaro:call(107, "turnOn"); fibaro:debug('Etat de la pompe (boucle marche forcée): '..fibaro:getValue(107, "value")) end -- cas du programme de filtration if (Etat_Commande_Filtration == "Programme") then fibaro:debug('écart modulo temps de cycle :'..(math.floor(os.time()/60)-math.floor(1460955600/60))%Temps_cycle) if ((math.floor(os.time()/60)-math.floor(1460955600/60))%Temps_cycle == 0 ) then --démarrage de la pompe fibaro:call(107, "turnOn"); fibaro:debug('Etat de la pompe (boucle programme1): '..fibaro:getValue(107, "value")) fibaro:sleep(Quart_Temps_Filtration); fibaro:debug('heure courante : '..os.time()) fibaro:debug('heure dernier changement état pompe : '..temp_derniere_modif_pompe) fibaro:debug('temps écart :'..(os.time() - temp_derniere_modif_pompe)) fibaro:debug('temps de filtration : '..(Quart_Temps_Filtration/1000)) fibaro:call(107, "turnOff"); end end fibaro:debug('Etat de la pompe (boucle programme): '..fibaro:getValue(107, "value")) setTimeout(tempFunc, 1*60*1000) end if (sourceTrigger["type"] == "autostart") then fibaro:debug(sourceTrigger["type"]) tempFunc() end
Nico882 Posté(e) le 26 avril 2016 Auteur Signaler Posté(e) le 26 avril 2016 Bonjour à tous, @jojo : oui c'est exactement cela. bonne synthèse c'est tout de suite beaucoup plus clair ^^ du coup, je me retrouve avec 2 solutions : - @pépite propose une variable en trigger déclencheur. ce la nécessite que je modifie une variable dédiée tous les x temps de rafraîchissement souhaité. j'ai essayé ça fonctionne mais je galère à faire modifier une variable global régulièrement - @Indyana propose une version du code initial qui intègre une fonction sleep au lieu du timeout et une simplification sérieuse des conditions imbriquées. j'ai essayé ça fonctionne parfaitement. du coup, je vais partir sur cette version. cela donne cela au final : --[[ %% autostart %% properties %% events %% globals Filtration_Piscine --]] local sourceTrigger = fibaro:getSourceTrigger(); function tempFunc() local currentDate = os.date("*t"); local startSource = fibaro:getSourceTrigger(); local Temps_cycle = 6*60 --6h*60min/h=>360min fibaro:debug('Temps de cycle :'..Temps_cycle..'min') local Temp_eau = fibaro:getValue(178, "value") --récupération de la température de l'eau de piscine fibaro:debug('Température de l\'eau :'..Temp_eau..'°C') local Quart_Temps_Filtration = Temp_eau/4/2*60*60*1000 --évaluation du temps de filtration pour les 6 heures à venir en ms fibaro:debug('Temps de filtration sur les '..(Temps_cycle/60)..'h en cours : '..(Quart_Temps_Filtration/1000/60) ..'min') -- traitement des différents cas de gestion de la filtration local Etat_Commande_Filtration = fibaro:getGlobalValue('Filtration_Piscine') fibaro:debug('Etat de la commande de filtration : '..Etat_Commande_Filtration) if(Etat_Commande_Filtration == "Arrêt") then fibaro:call(107, "turnOff"); fibaro:debug('Etat de la pompe (boucle arrêt) : '..fibaro:getValue(107, "value")) end -- cas de la marche forcée if (Etat_Commande_Filtration == "Marche Forcée") then fibaro:call(107, "turnOn"); fibaro:debug('Etat de la pompe (boucle marche forcée): '..fibaro:getValue(107, "value")) end -- cas du programme de filtration if (Etat_Commande_Filtration == "Programme") then fibaro:debug('écart modulo temps de cycle :'..(math.floor(os.time()/60)-math.floor(1460955600/60))%Temps_cycle) if ((math.floor(os.time()/60)-math.floor(1460955600/60))%Temps_cycle == 0 ) then --démarrage de la pompe fibaro:call(107, "turnOn"); fibaro:debug('Etat de la pompe (boucle programme1): '..fibaro:getValue(107, "value")) local temp_Etat_Pompe, temp_derniere_modif_pompe = fibaro:get(107, "value"); fibaro:sleep(Quart_Temps_Filtration); fibaro:debug('heure courante : '..os.time()) fibaro:debug('heure dernier changement état pompe : '..temp_derniere_modif_pompe) fibaro:debug('temps écart : '..(os.time() - temp_derniere_modif_pompe)) fibaro:debug('temps de filtration : '..(Quart_Temps_Filtration/1000)) fibaro:call(107, "turnOff"); end fibaro:debug('Etat de la pompe (boucle programme): '..fibaro:getValue(107, "value")) end setTimeout(tempFunc, 5*60*1000) end -- fin de la fonction if (sourceTrigger["type"] == "autostart") then fibaro:debug(sourceTrigger["type"]) tempFunc() end ça fonctionne sur les temps très court et forcé, je vais le laisser une journée pour vérifier le comportement normal maintenant. je vous remercie de m'avoir aider sur ce sujet. je m'attaque maintenant la gestion de la désinfection et j'espère bien pouvoir poster un petit tuto complet sur la gestion global piscine avec HC2 d'ici un petit mois. encore merci
pepite Posté(e) le 26 avril 2016 Signaler Posté(e) le 26 avril 2016 super ! heuu je n'ai rien propose, c'est toi qui utilises ta variable globale filtration_piscine ;-)
Messages recommandés