Aller au contenu

Messages recommandés

Posté(e)

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.

 

Posté(e)

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 ?

Posté(e)

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?

Posté(e)

ç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) :

  1. arrêt : la pompe ne peut pas démarrer
  2. marche : la pompe tourne et ne s'arrête jamais, ou après une durée fix
  3. 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 ?

Posté(e)

@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 ;-)

Posté(e)

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
Posté(e)

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  :huh:

 

- @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

×
×
  • Créer...