Encore un arrosage automatique !

Vos échanges, bricolages, idées et questions concernant l'ESP8266, les NodeMCU,Weemos, et consort
aleph0
Messages : 316
Enregistré le : 27 avr. 2016, 08:06
Localisation : Hérault (34)

Re: Encore un arrosage automatique !

Message par aleph0 »

Oops, @garycooper : C'est seulement maintenant que je vois ton message d'avril de l'an dernier :-( As-tu résolu ton problème depuis tout ce temps ?

boggiz
Messages : 15
Enregistré le : 04 mars 2019, 14:56
Localisation : IdF

Re: Encore un arrosage automatique !

Message par boggiz »

Bonsoir,
@garycooper Je vous remercie pour votre réponse. En fin d'arrosage je mettrai donc le capteur 'humidité du sol' à 20cB.
Avez vous écrit le script d'arrosage pour vos 4 EV l'an dernier ? Parce que durant les 10 jours d’arrêt du forum j'ai écrit le mien en dzvents pour 4 EVs :

Code : Tout sélectionner

--[[ 
Fonctionnement:
+ Le programme calcule la durée d'arrosage nécessaire a chacun des réseaux A,B,C,D une fois
  pour toute. La durée de l'arrosage peut atteindre 2h00 ou +
+ Dés détection de la demande d'arrosage manuelle ou planifiée le programme enchaine
  l'ouverture et la fermeture des vannes automatiquement dans l'ordre A, B, C,  D.
+ En passant l'interrupteur "Arrosage Start" sur OFF l'arrosage en cours s'arrete mais 
  il redemarrera par le circuit A apres un nouvel appui sur Start ou planifié.
+ La carte 4CH JJX-KG03 a été programmée en mode 3: Verrouillé. Il ne peut y avoir qu'un
  seul relai actif en meme temps cad activer l'un désactive automatiquement les 3 autres,
  c'est la raison pour laquelle on ne trouve dans le code aucun switchOFF pour les EV.
+ La carte KR2201-A 1CH (220v) a été programmée en mode 3: verrouillage sur 2 boutons séparés 
+ L'état des Push on off n'est pas lisible un push on toujours a ON un push off toujours a OFF
+ Le timer se recale automatiquement à minute pleine hh:mm:00 ce qui veut dire qu'une durée
  d'arrosage WateringTime de 60s peut en fait durer 119s. 
--]]

 return {
        on = {
            timer = { "every minute" },      -- Le timer s'active à hh:mm:00 toutes les minutes
            variables = { "Etat Arrosage" } },
        data = {
	        -- Variables globales  persistentes mémorisant l'heure de début d'arrosage
            -- -1= arrosage jamais démarré; 0= arrosage terminé; 'autre'= arrosage en cours;            
		    TimeStartA = { initial = -1 },
		    TimeStartB = { initial = -1 },
		    TimeStartC = { initial = -1 },
		    TimeStartD = { initial = -1 },
		    -- Variables durée d'arrosage en secondes 60 étant le minimum
            WateringTimeA= { initial= 300 },  -- en secondes 20mn = 1200
            WateringTimeB= { initial= 300 },
            WateringTimeC= { initial= 300 },
            WateringTimeD= { initial= 300 } },
    	logging = {
			-- level	 =   domoticz.LOG_DEBUG, -- Seulement un niveau peut être actif; commenter les autres
			-- level	=   domoticz.LOG_INFO, 
			-- level	=   domoticz.LOG_ERROR,											
			-- level	=   domoticz.LOG_DEBUG,
			-- level	=   domoticz.LOG_MODULE_EXEC_INFO,
		    marker = '==>' },

        execute = function(dz, item)
            
            local function logWrite(str)
                if str == 'TimeStart' then
                    dz.log('TimeStartA '.. dz.data.TimeStartA)
                    dz.log('TimeStartB '.. dz.data.TimeStartB)
                    dz.log('TimeStartC '.. dz.data.TimeStartC)
                    dz.log('TimeStartD '.. dz.data.TimeStartD)
                end
            end

            local dev_Hs="Humidité du sol"      -- Capteur d'humidité du sol
            -- Constantes
            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 RUmax= 320
              
            local flow_EV1= 670         -- watering flowrate of EV1 in l/h (mesuré=625 l/h)
            local surf_EV1= 50          -- surface watered by EV1, in m²
            local ratioB= 1             -- Ratios à adapter en fonction de la taille de 
            local ratioC= 1             -- chacune des parcelles à arroser   
            local ratioD= 1

            local t= 0
            if (dz.variables('Etat Arrosage').value == 'En cours') then
                if (dz.data.TimeStartA == -1) then
                    -- Calcul du temps d'Arrosage
                    -- ne DOIT etre executé qu'une fois durant toute la période d'arrosage
                    print("Calcul de la durée d'arrosage")
                    val_Hs= dz.devices('Humidité du sol').moisture   -- de la parcelle de reference
                    dz.log("Humidité du sol "..val_Hs.." cb")
        
                    if val_Hs>=start_Hs then
                        -- calcul du quota d'arrosage nécessaire pour passer de val_Hs à target_Hs
                        DRu= (val_Hs-target_Hs)/200 * RUmax      -- Apport théorique d'eau en mm
                        print("Apport théorique "..DRu.." mm")
                
                        -- Durées d'arrosage de chacune des parcelles en secondes
                        dz.data.WateringTimeA= dz.utils.round(DRu*surf_EV1/flow_EV1*3600)
                        dz.data.WateringTimeB= dz.data.WateringTimeA * ratioB
                        dz.data.WateringTimeC= dz.data.WateringTimeA * ratioC
                        dz.data.WateringTimeD= dz.data.WateringTimeA * ratioD
                    else
                        print("Sol suffisament humide ; inutile d'arroser")
                        dz.variables('Etat Arrosage').set ('Terminé')
                        return
                    end                    
                    
                    -- Arrosage accepté
                    -- on attend 2 secondes que le 220v soit présent sur K2 avant de demarrer l'arrosage
                    dz.devices('Arrosage circuit A').switchOn().afterSec(2)  -- arrosage en cours 
                    dz.data.TimeStartA = os.time() 
                elseif (dz.data.TimeStartA > 0) then
                    t = os.difftime(os.time(), dz.data.TimeStartA) 
                    print('Arrosage circuit A en cours depuis : ' .. dz.utils.round(t) .. '/'..dz.data.WateringTimeA..' secondes')
                    if (t >= dz.data.WateringTimeA) then
                        -- Le timer à claqué: Arret arrosage circuitA
                        dz.data.TimeStartA = 0
                    end
                end  -- StartA
            

                -- arrosage B ne peut démarrer que si A est terminé
                if (dz.data.TimeStartB == -1) and (dz.data.TimeStartA == 0) then
                    -- Début arrosage demandé
                    dz.data.TimeStartB = os.time()
                    dz.devices('Arrosage circuit B').switchOn() -- arrosage en cours  
                elseif (dz.data.TimeStartB > 0) then
                    t = os.difftime(os.time(), dz.data.TimeStartB) 
                    print('Arrosage circuit B en cours depuis : ' .. dz.utils.round(t) .. '/'..dz.data.WateringTimeB..' secondes')
                    if (t >= dz.data.WateringTimeB) then
                        -- Le timer à claqué: Arret arrosage Arret arrosage circuitB
                        dz.data.TimeStartB = 0
                    end
                end   -- StartB         
            
                 
                if (dz.data.TimeStartC == -1) and (dz.data.TimeStartB == 0) then
                    -- Début arrosage demandé
                    dz.data.TimeStartC = os.time()
                    dz.devices('Arrosage circuit C').switchOn() -- arrosage en cours  
                elseif (dz.data.TimeStartC > 0) then
                    t = os.difftime(os.time(), dz.data.TimeStartC)
                    print('Arrosage circuit C en cours depuis : ' .. dz.utils.round(t) ..'/'..dz.data.WateringTimeC..' secondes')
                    if (t >= dz.data.WateringTimeC) then
                        -- Le timer à claqué: Arret arrosage Arret arrosage circuitC
                        dz.data.TimeStartC = 0
                    end
                end-- StartC

                
                if (dz.data.TimeStartD == -1) and (dz.data.TimeStartC == 0) then
                    -- Début arrosage demandé
                    dz.data.TimeStartD = os.time()
                    dz.devices('Arrosage circuit D').switchOn() -- arrosage en cours  
                elseif (dz.data.TimeStartD > 0) then
                    t = os.difftime(os.time(), dz.data.TimeStartD) 
                    print('Arrosage circuit D en cours depuis : ' .. dz.utils.round(t) .. '/'..dz.data.WateringTimeD..' secondes')
                    if (t >= dz.data.WateringTimeD) then
                        dz.data.TimeStartD = 0 
                        -- la séquence d'arrosage est TERMINEE
                        dz.devices('Arrosage Stop').switchOff()  -- coupure du 24v arret arrosage circuitD
                        dz.variables('Etat Arrosage').set ('Terminé')
                    end                   
                end -- StartD

                --logWrite('TimeStart')
                
            end -- état en cours
        
            if (dz.variables('Etat Arrosage').value == 'Terminé') then 
                -- l'inter d'arrosage est passé a OFF soit Arret d’urgence ou séquence d’arrosage terminée
                -- Le relai alim coupe le 24v des EV et éteind la LED "en service"
                dz.data.initialize ('TimeStartA')  -- retour a la valeur -1
                dz.data.initialize ('TimeStartB')
                dz.data.initialize ('TimeStartC')
                dz.data.initialize ('TimeStartD')
                --logWrite('TimeStart') 
            end -- état Terminé
            
        end  -- execute
}       
Merci à aleph0 pour ses conseils et ses scripts qui m'ont largement inspirés ...
Domoticz 2020.2 sur NAS Synology DS215+
RFXcom

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

Re: Encore un arrosage automatique !

Message par garycooper »

Bonjour, oui j'ai fini par m'en sortir en l'intégrant directement dans le script lua. J'ai dû tricher car je n'arrivais pas à faire ouvrir l'électrovanne B après la fermeture de l'électrovanne A. En gros, ça calcule le temps d'ouverture pour chaque électrovanne et j'ai créé des temporisations qui correspondent au temps d'ouverture calculé de l'électrovanne précédente ou du cumul des temps d'ouverture. L'objectif est ainsi de décaler le temps d'ouverture de l'électrovanne. J'ai également complété mon installation avec 3 autres électrovannes pour arroser mon bananier (il a souffert de la chaleur l'année dernière), la pelouse au pied de mon mûrier et des massifs de plantes aromatiques (celles-ci sont arrosées depuis un récupérateur d'eau). Pour cette nouvelle installation, je suis parti sur une durée fixe d'arrosage car je n'ai que 2 arroseurs et une surface à arroser d'environ 7m². Je verrai si je fais évoluer ou non mais il ne devrait pas y avoir une grosse consommation d'eau sur ces points d'arrosage. Le script complet est le suivant :

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 d'arrosage
local prg_arrosage="Programmateur arrosage"  	-- Switch de plage de programmation de l'arrosage

local dev_EVA="Zone A"        	    		-- Electrovanne maître (Celle avec qui le RFU est calculé)
local dev_EVB="Zone B"	            		-- Electrovanne d arrosage zone B
local dev_EVC="Zone C"		    		-- Electrovanne d arrosage zone C
local dev_EVD="Zone D"		    		-- Electrovanne d arrosage zone D
local murier="Murier"                  		-- Electrovanne arrosage murier
local bananier="Bananier"                   	-- Electrovanne arrosage bananier
local aromatiques="Plantes aromatiques"		-- Electrovanne plantes aromatiques

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 val_Duree_bananier=600			-- Durée d'arrosage du bananier (ici 10 min) en secondes
local val_Duree_murier=420			-- Durée d'arrosage du murier (ici 7 min) en secondes
local val_Duree_aromatiques=420			-- Durée d'arrosage des plantes aromatiques (ici 7 min) en secondes

local flow_EVA=2580                 		-- Débit du circuit zone A en l/h
local surf_EVA=110                   		-- 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=110                   		-- 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=110                   		-- 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=40                   		-- 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'
		commandArray[murier]='Off'
		commandArray[bananier]='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)
                val_Duree_EVB=round(DRu*surf_EVB/flow_EVB*3600,0)
                val_Duree_EVC=round(DRu*surf_EVC/flow_EVB*3600,0)
	        val_Duree_EVD=round(DRu*surf_EVD/flow_EVB*3600,0)

            	if debug==1 then
                  print("Apport theorique "..DRu.." mm")
		  print("Arrosage de la zone A pendant "..val_Duree_EVA.." sec")
		  print("Arrosage de la zone B pendant "..val_Duree_EVB.." sec")
		  print("Arrosage de la zone C pendant "..val_Duree_EVC.." sec")
		  print("Arrosage de la zone D pendant "..val_Duree_EVD.." sec")
		  print("Arrosage du bananier pendant "..val_Duree_bananier.." sec")
		  print("Arrosage du murier pendant "..val_Duree_murier.." sec")
		  print("Arrosage des plantes aromatiques pendant "..val_Duree_aromatiques.." sec")
            	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 7 électrovannes
    --]]

local tempo1=val_Duree_EVA+val_Duree_EVB
local tempo2=tempo1+val_Duree_EVC
local tempo3=tempo2+val_Duree_EVD
local tempo4=tempo3+val_Duree_bananier
local tempo5=tempo4+val_Duree_murier
local tempo6=tempo4+val_Duree_aromatiques


		commandArray[1] = {[dev_EVA] = 'On'} 				-- Ouvre l'électrovanne A
		commandArray[2] = {[dev_EVA] = 'Off AFTER ' .. val_Duree_EVA}	-- Referme l'électrovanne A après la durée calculée pour la zone A
		commandArray[3] = {[dev_EVB] = 'On AFTER ' .. val_Duree_EVA}	-- Ouvre l'électrovanne B après la fermeture de l électrovanne A 
		commandArray[4] = {[dev_EVB] = 'Off AFTER ' .. tempo1}		-- Referme l'électrovanne B après la durée calculée pour la zone B
		commandArray[5] = {[dev_EVC] = 'On AFTER ' .. tempo1}		-- Ouvre l'électrovanne C après la fermeture de l électrovanne B 
		commandArray[6] = {[dev_EVC] = 'Off AFTER ' .. tempo2}		-- Referme l'électrovanne C après la durée calculée pour la zone C
		commandArray[7] = {[dev_EVD] = 'On AFTER ' .. tempo2}		-- Ouvre l'électrovanne D après la fermeture de l électrovanne C 
		commandArray[8] = {[dev_EVD] = 'Off AFTER ' .. tempo3}		-- Referme l'électrovanne D après la durée calculée pour la zone pour la zone D
		commandArray[9] = {[bananier] = 'On AFTER ' .. tempo3}          -- Ouvre l'électrovanne du bananier après la fermeture de l électrovanne D 
		commandArray[10] = {[bananier] = 'Off AFTER ' .. tempo4}        -- Referme l'électrovanne du bananier après la durée définie 
		commandArray[11] = {[murier] = 'On AFTER ' .. tempo4}           -- Ouvre l'électrovanne du murier après la fermeture de l électrovanne du bananier 
		commandArray[12] = {[aromatiques] = 'On AFTER ' .. tempo4}      -- Ouvre l'électrovanne des plantes aromatiques après la fermeture de l électrovanne du bananier
		commandArray[13] = {[aromatiques] = 'Off AFTER ' .. tempo6}     -- Referme l'électrovanne des plantes aromatiques après la durée définie 
		commandArray[14] = {[murier] = 'Off AFTER ' .. tempo5}          -- Referme l'électrovanne du murier après la durée définie 
		commandArray[15] = {[prg_arrosage] = 'Off AFTER ' .. tempo6}	-- Passe le switch de programmateur d arrosage à Off	
end
end
return commandArray
Mon problème aujourd'hui, c'est mon interrupteur "Programmateur d'arrosage". Je n'arrive pas à l'activer automatiquement de 6h à 7 du matin les mois de Mars à Octobre. J'ai fait ce script de type time, mais le programmateur ne passe jamais à "On" :

Code : Tout sélectionner

local prg_arrosage = 'Programmateur arrosage'

-- retourne le mois en cours
local mois = os.date("%m")
-- retourne le jour actuel
local days = {"dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"}
local jour = days[(os.date("%w")+1)]
-- retourne l'heure actuelle ex: "12:45"
local heure = string.sub(os.date("%X"), 1, 5)
local ete = mois >= '3' and mois < '10'
local heure_arros = heure >= '06:00' and heure < '07:00'

commandArray = {}

	if (otherdevices['Mode arrosage'] == 'Auto') and ete and heure_arros then
		commandArray[prg_arrosage]='On'
	end

	if not heure_arros then
		commandArray[prg_arrosage] = 'Off'
	end

return commandArray

boggiz
Messages : 15
Enregistré le : 04 mars 2019, 14:56
Localisation : IdF

Re: Encore un arrosage automatique !

Message par boggiz »

Bonsoir garycooper ,
depuis l'incendie d'OVH je ne suis plus notifié d'une réponse par easydomoticz !
Je ne suis pas très au fait avec LUA étant novice j'ai démarré directement en Dzvents.
Quel est le type de votre inter d'arrosage parceque j'ai eu le meme genre de souci avec les push on et push off ?
Domoticz 2020.2 sur NAS Synology DS215+
RFXcom

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

Re: Encore un arrosage automatique !

Message par garycooper »

Mon interrupteur et un interrupteur basique de type on/off.
J'ai plutôt le sentiment que c'est la récupération du mois qui déconne parce que j'ai un script similaire pour mon programmateur de chauffage (sans rapatrier le mois) et ça fonctionne parfaitement.

aleph0
Messages : 316
Enregistré le : 27 avr. 2016, 08:06
Localisation : Hérault (34)

Re: Encore un arrosage automatique !

Message par aleph0 »

Il y a plus simple pour récupérer les mois, jours, etc... :

Code : Tout sélectionner

temps = os.date("*t") --produces the table {year = 1998, month = 9, day = 16, yday = 259, wday = 4,  hour = 23, min = 48, sec = 10, isdst = false}

mois=temps.month
local days = {"dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"}
local jour = days[temps.wday+1]
heure=temps.hour
Enfin, je ne pense pas que tu puisse faire simplement des inégalités sur des chaines de type hh:mm. Pour faire ton test heure_arros, vu que tu n'as pas de minutes tu peux simplement tester temps.hour>=6 and temps.hour<7 (ce qui revient à dire temps.hour=6 ;-) ). Si tu avais des minutes, convertis tout en minutes pour le test : par exemple 60*temps.hour+temps.min>=390 pour >=6:30

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

Re: Encore un arrosage automatique !

Message par garycooper »

Je teste ça pour demain matin et je te redis ! Merci

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

Re: Encore un arrosage automatique !

Message par garycooper »

Merci aleph0 ! Ça a marché comme sur des roulettes !

Combo
Messages : 2
Enregistré le : 03 mai 2021, 14:16

Re: Encore un arrosage automatique !

Message par Combo »

Bonjour,
Merci à aleph pour ces scripts qui datent déjà !
J'ai pu les adapter à ma config, mais je rencontre un problème dans le script sur la gestion des électrovannes :
La fonction longpulse ne renvoie pas l'état du switch dans domoticz. En remplaçant longpulse par gpio dans le script,
ça fonctionne. Mais le gpio ne permet pas d'envoyer un temps d'ouverture !
J'utilise un wemos mini avec ESPEasy mega, quelqu'un a-t-il une idée ?

Répondre