Durée d'action d'un switch et activations successives

Vous avez des questions concernant les scripts dans Domoticz, posez vos questions ici, quelque soit le langage nous tenterons des réponses pertinentes ...
Répondre
garycooper
Messages : 215
Enregistré le : 07 août 2017, 23:58

Durée d'action d'un switch et activations successives

Message par garycooper »

Bonjour à tous, j'ai adapté à mon installation le script d'aleph0 https://easydomoticz.com/forum/viewtopi ... =24&t=3437 concernant l'arrosage automatique (les électrovannes doivent être ouvertes successivement car mon réseau ne permet pas l'alimentation simultanées de mes 4 électrovannes). Malheureusement, je n'arrive pas à avoir ce que je souhaite. J'ai mis des print pour voir si tous les calculs sont corrects et tout est calculé normalement. Par contre, lorsque je lance le script, l'électrovanne A s'ouvre bien si l'humidité du sol le nécessite, mais elle ne se referme pas après la durée calculée ("val_Duree_EVA" dans le script). Egalement, même si je ferme l'électrovanne A, l'électrovanne B ne s'ouvre pas alors qu'en théorie elle devrait.
Voilà mon script complet :

Code : Tout sélectionner

--[[ 
Script pour gérer l'arrosage automatique
Modes :
    - Off :  Ne fais rien
    - Manu : Arrose inconditionnellement selon la scène "arrosage"
    - Auto : Arrose en fonction de l'humidité du sol

Les ordres d'ouverture des électrovannes se font successivement
--]]

-- Paramètres
local dev_Modes="Mode arrosage"     		-- Sélecteur du mode d'arrosage (Off/Manu/Auto)
local scene="Arrosage" 		    		-- Scène avec programmation d'une séquence séquence d'arrosage
local prg_arrosage="Programmateur arrosage"  	-- Switch de plage de programmation de l'arrosage

local dev_EVA="Zone A"        	    		-- Électrovanne maître (Celle avec qui le RFU est calculé)
local dev_EVB="Zone B"	            		-- Électrovanne d arrosage zone B
local dev_EVC="Zone C"		    		-- Électrovanne d arrosage zone C
local dev_EVD="Zone D"		    		-- Électrovanne d arrosage zone D

local dev_Hs="Humidite du sol"      		-- Capteur d'humidité du sol
local start_Hs=25                  		-- Seuil d'humidité (cb) pour déclencher un arrosage
local target_Hs=20                  		-- Cible d'humidité (cb) pour l'arrosage

local flow_EVA=2580                 		-- Débit du circuit zone A en l/h
local surf_EVA=90                   		-- surface arrosée par l'électrovanne A, en m²
local flow_EVB=2460                 		-- Débit du circuit zone B en l/h
local surf_EVB=90                   		-- surface arrosée par l'électrovanne B, en m²
local flow_EVC=3180                 		-- Débit du circuit zone C en l/h
local surf_EVC=90                   		-- surface arrosée par l'électrovanne C, en m²
local flow_EVD=600                  		-- Débit du circuit zone D en l/h
local surf_EVD=30                   		-- surface arrosée par l'électrovanne D, en m²

local RUmax=270                     		-- (maximum 270mm de stockable dans le sol)


-- Variables internes
local debug=1

--------------------------------------------------------------------------------
--                     Bibliothèque de fonctions                              --
--------------------------------------------------------------------------------

function round(num, dec)
    if num == 0 then
        return 0
    else
        local mult = 10^(dec or 0)
        return math.floor(num * mult + 0.5) / mult
    end
end

--------------------------------------------------------------------------------
--                    Fin bibliothèque de fonctions                           --
--------------------------------------------------------------------------------

commandArray = {}

-- Gestion de l'arrosage
-- Si le mode d'arrosage est mis sur Manu, déclenchement d'une scène d arrosage puis, chaque électrovanne sera gérée manuellement

   if devicechanged[dev_Modes] == 'Manu' then
	print("Declenchement d'une scene d arrosage automatique")
	commandArray['Scene:Arrosage']='On'
   end

-- Si le mode d'arrosage est mis sur Off, cela referme toute électrovanne ouverte ou arrête toute pompe ES

 if (otherdevices[dev_Modes] == 'Off') and
	((otherdevices[dev_EVA] == 'On') or (otherdevices[dev_EVB] == 'On') or (otherdevices[dev_EVC] == 'On') or (otherdevices[dev_EVD] == 'On')) then
		print("Mise a l arret de l arrosage")
		commandArray[dev_EVA]='Off'
		commandArray[dev_EVB]='Off'
		commandArray[dev_EVC]='Off'
		commandArray[dev_EVD]='Off'
 end

    if (otherdevices[dev_Modes]=="Auto") and (devicechanged[prg_arrosage] == 'On') then
        print("Arrosage demande en automatique")
        val_Hs=tonumber(otherdevices[dev_Hs])
        print("Humidite du sol "..val_Hs.." cb")
        
	if val_Hs<=start_Hs then
	print("Sol suffisament humide ; inutile d'arroser")
        else
            -- calcul de la durée d'arrosage nécessaire pour passer de val_Hs à target_Hs
            DRu=(val_Hs-target_Hs)/200*RUmax

        	val_Duree_EVA=(round(DRu*surf_EVA/flow_EVA*3600,0))/60
                val_Duree_EVB=(round(DRu*surf_EVB/flow_EVB*3600,0))/60
                val_Duree_EVC=(round(DRu*surf_EVC/flow_EVB*3600,0))/60
	        val_Duree_EVD=(round(DRu*surf_EVD/flow_EVB*3600,0))/60

            	if debug==1 then
                  print("Apport theorique "..DRu.." mm")
		  print("Arrosage zone A pendant "..val_Duree_EVA.." min")
		  print("Arrosage zone B pendant "..val_Duree_EVB.." min")
		  print("Arrosage zone C pendant "..val_Duree_EVC.." min")
		  print("Arrosage zone D pendant "..val_Duree_EVD.." min")
            	end
           
    
    --[[
           Sur mon installation, les électrovannes doivent être ouvertes
	   séparément car il n'y a pas assez de débit disponible pour ouvrir les 4 électrovannes
    --]]

    		commandArray[dev_EVA] = 'On FOR val_Duree_EVA'
		if devicechanged[dev_EVA] == 'Off' then commandArray[dev_EVB] = 'On FOR val_Duree_EVB' end
		if devicechanged[dev_EVB] == 'Off' then commandArray[dev_EVC] = 'On FOR val_Duree_EVC' end
		if devicechanged[dev_EVB] == 'Off' then commandArray[dev_EVD] = 'On FOR val_Duree_EVD' end
end
end
return commandArray


Je pense que la partie défaillante est celle ci

Code : Tout sélectionner

    		commandArray[dev_EVA] = 'On FOR val_Duree_EVA'
		if devicechanged[dev_EVA] == 'Off' then commandArray[dev_EVB] = 'On FOR val_Duree_EVB' end
		if devicechanged[dev_EVB] == 'Off' then commandArray[dev_EVC] = 'On FOR val_Duree_EVC' end
		if devicechanged[dev_EVB] == 'Off' then commandArray[dev_EVD] = 'On FOR val_Duree_EVD' end
mais je ne trouve pas comment faire pour obtenir ce que je souhaite. Quelqu'un pourrait-il m'aiguiller sur la solution ?
D'un point de vue matériel, mes électrovannes sont commandées via un SONOFF 4CH et pas par un Wemos D1 mini comme dans le tuto d'aleph0.

Merci d'avance

boum
Messages : 110
Enregistré le : 18 janv. 2019, 11:34
Localisation : France

Re: Durée d'action d'un switch et activations successives

Message par boum »

Je ne sais pas si ça résoudra tout, mais déjà :

Code : Tout sélectionner

commandArray[dev_EVA] = 'On FOR ' .. val_Duree_EVA
Domoticz v4.10717 sur Pi³ / Z-Wave / RFXCom

Keros
Messages : 657
Enregistré le : 23 juil. 2019, 20:57

Re: Durée d'action d'un switch et activations successives

Message par Keros »

La remarque de Boum est pertinente : tu essayes de rentrer la valeur 'On FOR val_Duree_EVA'. Cela ne fonctionne pas.

Je pense qu'il te manque l'info pour démarrer les électrovannes avec un retard. La commande est commandArray['xxxxxxxxxxxx']='Off AFTER 30' Infos ici

Le principe pour ton arrosage ressemblerait à ceci :

Mise en route électrovanne A pendant durée_T1.
Mise en route électrovanne B pendant durée_T2 après durée_T1
Mise en route électrovanne C pendant durée_T3 après durée_T1 + durée_T2
etc ...
Modifié en dernier par Keros le 19 mai 2020, 18:14, modifié 1 fois.

vil1driver
Messages : 5624
Enregistré le : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Durée d'action d'un switch et activations successives

Message par vil1driver »

Salut
boum a écrit :
19 mai 2020, 15:00
Je ne sais pas si ça résoudra tout, mais déjà :

Code : Tout sélectionner

commandArray[dev_EVA] = 'On FOR ' .. val_Duree_EVA
+1 pour sortir la variable de la chaîne

Maintenant ce code ne permettra pas ceci
garycooper a écrit :
19 mai 2020, 10:11
les électrovannes doivent être ouvertes successivement car mon réseau ne permet pas l'alimentation simultanées de mes 4 électrovannes
Elles vont s'ouvrir en même temps mais pour des durées différentes

Je conseille d'utiliser plutôt after que for..
Première vanne on
Puis off after durée 1
On de la seconde after durée 1
Puis off after durée 1+2
Puis on de la 3ème after durée 1+2
Puis off after durée 1+2+3

Désolé Keros je paraphrase
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien

garycooper
Messages : 215
Enregistré le : 07 août 2017, 23:58

Re: Durée d'action d'un switch et activations successives

Message par garycooper »

Un bon début ! En sortant la variable, l'électrovanne A se referme bien au bon timing. Par contre, l'électrovanne B ne s'ouvre pas après la fermeture de l'électrovanne A. Je vais essayer de modufuer le "FOR" par le AFTER". Ca ne règlera pas le problème mais j'ai effectivement lu qu'il valait mieux privilégier le "AFTER" au "FOR".

garycooper
Messages : 215
Enregistré le : 07 août 2017, 23:58

Re: Durée d'action d'un switch et activations successives

Message par garycooper »

j'ai essayé ça

Code : Tout sélectionner

		commandArray[1] = {[dev_EVA] = 'On'}
		commandArray[2] = {[dev_EVA] = 'Off AFTER' .. val_Duree_EVA}
		if devicechanged[dev_EVA] == 'Off' then
			commandArray[3] = {[dev_EVB] = 'On'}
			commandArray[4] = {[dev_EVB] = 'Off AFTER' .. val_Duree_EVB}
 		end
		if devicechanged[dev_EVB] == 'Off' then
			commandArray[5] = {[dev_EVC] = 'On'}
			commandArray[6] = {[dev_EVC] = 'Off AFTER' .. val_Duree_EVC}
 		end
		if devicechanged[dev_EVC] == 'Off' then
			commandArray[3] = {[dev_EVD] = 'On'}
			commandArray[4] = {[dev_EVD] = 'Off AFTER' .. val_Duree_EVD}
 		end
mais là, même l'électrovanne A ne s'ouvre pas

denis_brasseur
Messages : 553
Enregistré le : 24 déc. 2018, 17:05
Localisation : (26)

Re: Durée d'action d'un switch et activations successives

Message par denis_brasseur »

Manque l"espace après l'ensemble de tes AFTER

Code : Tout sélectionner

commandArray[2] = {[dev_EVA] = 'Off AFTER' .. val_Duree_EVA}
te donne
[dev_EVA] = 'Off AFTERxxx
Il te faut écrire :

Code : Tout sélectionner

commandArray[2] = {[dev_EVA] = 'Off AFTER ' .. val_Duree_EVA}
La syntaxe de commandArray peux egalement etre :

Code : Tout sélectionner

commandArray[#commandArray + 1]= {[dev_EVA] = 'Off AFTER ' .. val_Duree_EVA}
Pi3 + DD PiDrive + RFXtrx433 + AEON Labs ZW090
7 Modules fil pilote ZMNHJD1
2 détecteur fumées CHACON 34131
5 Bresser Capteur thermo/hygro
1 contacteur porte Philio PST02-1A Z
OWL Micro+ CM180
D2L LINKY
FGR-223 "Roller Shutter 3"

garycooper
Messages : 215
Enregistré le : 07 août 2017, 23:58

Re: Durée d'action d'un switch et activations successives

Message par garycooper »

Merci denis_brasseur, ça marche mieux avec l'espace ;) et avec le "AFTER"; l'électrovanne A se ferme bien après la temporisation calculée. Il ne me reste plus qu'à trouver comment enchainer les ouvertures des autres électrovannes.

garycooper
Messages : 215
Enregistré le : 07 août 2017, 23:58

Re: Durée d'action d'un switch et activations successives

Message par garycooper »

Ne trouvant nulle pat comment faire des enchainements successifs, j'ai contourné en me rabattant sur des temporisations :

Code : Tout sélectionner

local tempo1=val_Duree_EVA+val_Duree_EVB
local tempo2=tempo1+val_Duree_EVC
local tempo3=tempo2+val_Duree_EVD

		commandArray[1] = {[dev_EVA] = 'On'}
		commandArray[2] = {[dev_EVA] = 'Off AFTER ' .. val_Duree_EVA}
		commandArray[3] = {[dev_EVB] = 'On AFTER ' .. val_Duree_EVA}
		commandArray[4] = {[dev_EVB] = 'Off AFTER ' .. tempo1}
		commandArray[5] = {[dev_EVC] = 'On AFTER ' .. tempo1}
		commandArray[6] = {[dev_EVC] = 'Off AFTER ' .. tempo2}
		commandArray[7] = {[dev_EVD] = 'On AFTER ' .. tempo2}
		commandArray[8] = {[dev_EVD] = 'Off AFTER ' .. tempo3}

Répondre