
Le calcul de l’évapotranspiration (EVP) peut être un puissant outil pour la gestion de l’arrosage. Mais qu’est-ce que c’est ? Comment cela fonctionne ? Et surtout, comment le mettre en place sur mon GreenIQ sous Domoticz ?
Nous allons découvrir cela en nous basant sur une publication de « aleph0 » sur le forum EasyDomoticz. Un grand merci à lui !
L’évapotranspiration
Pour faire simple, l’évapotranspiration, c’est la quantité d’eau envoyée dans l’atmosphère par l’évaporation du sol, la transpiration des plantes et l’interception des précipitations (c’est-à-dire les précipitations qui n’atteignent jamais le sol).
Pour réaliser ces calculs, nous allons avoir besoin de différentes données :
- Température
- Humidité
- Pressions Atmosphérique
- Vent
- Pluie
- Rayonnement solaire
Cela fait beaucoup, mais cela permettra une plus grande précision.
Vous avez différents moyens d’obtenir ces valeurs :
- Avoir une station météo
- Les récupérer via un service en Ligne (Type Weather Underground)
Vous vous doutez bien qu’avec une station météo locale, les valeurs seront plus proches de la réalité qu’avec un service en ligne. Il se peut également que le service que vous utilisez n’ait pas toutes les informations dont vous avez besoin. Néanmoins, c’est à vous de voir ce que vous préférez utiliser
Le Script
Voici donc le script complet développé par Aleph0. Il se base sur la méthode de calcul de Penman-Monteith nomée FAO-56 (information disponible ici) qui lui permet d’estimer (il est important de préciser que c’est une estimation et non une mesure) l’humidité de son sol.
-- Script to estimate potential evapotranspiration according to Penman Monteith formula and FAO-56 method
-- Weather sensors for EVP
local dev_P = "Pression atmosphérique" -- Atmospheric pressure (hPa)
local dev_T = "Température Extérieure" -- Outside temperature (°C)
local dev_Hr= "Humidité Extérieure" -- Outside relative humidity (%)
local dev_Rn= "Lux" -- Global sun radiation (lux)
local G = 0 -- Thermal flux to the ground (MJ/h/m²)
local dev_U = "Vent" -- Wind speed (km/h)
local h = 10 -- height of wind speed mesurement (m)
-- Devices for RFU
local dev_RFU="Humidité du sol" -- Dummy device for RFU, of type soil humidity, in cb
local dev_Rain="Pluie" -- Device for rain
local dev_EV1="Arrosage Bas" -- Device for watering electrovalve 1
local flow_EV1=670 -- watering flowrate of EV1 in l/h
local surf_EV1=50 -- surface watered by EV1, in m²
-- Hint : We do RFU calculation only on 1 electrovalve, let's say the main one.
-- For watering, other electrovalves will follow the main one by a %
-- This will *NOT* work if the system is watering a garden + a green house. the soil humidity of the greenhouse
-- have to be calculated independantly as
-- - it never rain inside the greenhouse
-- - the evapotranspiration is much different than outsise
-- Parameters for RFU to cb convertions
local RUmax=320 -- (maximum 320mm de stockable dans le sol)
-- EVP sensor (must be of type rain sensor)
local dev_EVP="EVP" -- Name
-- Uservariables
local uvar_Rain='RFU_lastRain'
local uvar_EVP='RFU_lastEVP'
local uvar_RU='RFU_RU'
local debug=0 -- 0 : no debug ; 1 debug EVP, 2 debug RFU
local frequency_EVP=1 -- script runs every 1 min with local wind meter; can be slowed with stabile wind measurements
local frequency_RFU=5 -- RFU must not be faster than EVP but fast enough in front of watering time
local CmdIdx=1
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
commandArray = {}
time = os.date("*t")
-- Estimation de l'EVP
if (((time.min - 1)% frequency_EVP)==0) then -- Run every "frequency_EVP" minutes.
--Constants
Cn=37 --Hourly steps...
if (timeofday['Daytime']) then
Cd=0.24 --at day and 0.96 at night !!
else
Cd=0.96
end
if debug == 1 then print("Cd="..tostring(Cd)) end
-- reading of sensors
P =otherdevices_barometer[dev_P] -- hPa
T =otherdevices_svalues[dev_T] -- °C
Hr=otherdevices_humidity[dev_Hr] -- %
Rn=otherdevices_svalues[dev_Rn]*0.0079 -- W/m²
U2=otherdevices_windspeed[dev_U] -- km/h
if debug == 1 then
print("Pressure "..tostring(P).." hPa")
print("Temperature "..tostring(T).." °C")
print("Relative humidity "..tostring(Hr).." %")
print("Solar irradiance "..tostring(Rn).." W/m²")
print("Wind speed "..tostring(U2*3.6).." km/h") -- Wind speed is internally stored in m/s
end
-- unit convertions
P=P/10 -- must be in kPa
Hr=Hr/100
Rn=Rn/277.77778 -- must be in MJ/h/m²
U2=U2*4.87/math.log(67.8*h-5.42) -- windspeed at 2m height, in m/s
-- Intermediates calculations
Esat=0.6108*math.exp(17.27*T/(T+237.3)) -- pression de vapeur saturante, en kPa
Ea =Hr*Esat -- pression de vapeur actuelle, en kPa
Delta=4098*Esat/((T+237.3)^2)
Gamma=0.665*P/1000
if debug == 1 then
print("Pressure of saturated vapor "..tostring(Esat).." kPa")
print("Pressure of actual vapor "..tostring(Ea).." kPa")
print("Delta "..tostring(Delta))
print("Gamma "..tostring(Gamma))
end
ET0=(0.408*Delta*(Rn-G)+Gamma*Cn/(T+273)*U2*(Esat-Ea))/(Delta+Gamma*(1+Cd*U2)) -- EVP in mm/h
if debug == 1 or debug == 2 then print("ET0 "..tostring(ET0).." mm/h") end
--Updating the counter
-- EVP_Act=otherdevices_rain[dev_EVP] buggy :( Got an offset at midnight
rate, EVP_Act = string.match(otherdevices_svalues[dev_EVP],"(.-);(.-)$")
if debug == 1 then
print("rate "..tostring(rate))
print("EVP_Act "..tostring(EVP_Act))
print("EVP Ct b4 "..otherdevices_svalues[dev_EVP])
end
commandArray[CmdIdx] = {['UpdateDevice'] = tostring(otherdevices_idx[dev_EVP])..'|0|'..tostring(ET0)..";"..tostring(EVP_Act+ET0*frequency_EVP/60)}
if debug == 1 then
print("EVP Ct Af : "..tostring(otherdevices_idx[dev_EVP])..'|0|'..tostring(ET0)..";"..tostring(EVP_Act+ET0*frequency_EVP/60))
end
CmdIdx=CmdIdx+1
end
-- Estimation du RFU
-- Idée : Toutes les 5 minutes, on fait le bilan
-- RU=RU+Pluie+arrosage-EVP sur la période précédente, limité en maximum (>320) et minimum (<0)
-- Lors d'une demande d'arrosage auto, on envoi suffisament d'eau pour ramener RFU à 0
if ((time.min - 1)%frequency_RFU==0) then
mes_RU=uservariables[uvar_RU]
rate, mes_Rain = string.match(otherdevices_svalues[dev_Rain],"(.-);(.-)$")
rate, mes_EVP = string.match(otherdevices_svalues[dev_EVP],"(.-);(.-)$")
-- Estimation de l'Arrosage, en mm, basé sur le débit nominal d'une ligne d'arrosage, de la surface
-- arrosée et de l'ouverture de l'electrovanne correspondante
if otherdevices[dev_EV1]=="On" then
mes_Arr=flow_EV1/60*frequency_RFU/surf_EV1
else
mes_Arr=0
end
last_Rain = uservariables[uvar_Rain]
last_EVP= uservariables[uvar_EVP]
new_RU=math.max(math.min(mes_RU+mes_Arr+(mes_Rain-last_Rain)-(mes_EVP-last_EVP),RUmax),0)
new_Hs=round(200*(1-new_RU/RUmax))
if debug == 2 then
print("RU : "..mes_RU)
print("Rain : "..mes_Rain-last_Rain)
print("EVP : "..mes_EVP-last_EVP)
print("New RU : "..new_RU)
print("New Hs : "..new_Hs)
end
commandArray[CmdIdx] = {['UpdateDevice'] = tostring(otherdevices_idx[dev_RFU])..'|'..tostring(new_Hs)..'||'}
CmdIdx=CmdIdx+1
-- Updating the variables with the last rain and evp counters being read
commandArray[CmdIdx] = {['Variable:'..uvar_Rain] = tostring(mes_Rain)}
CmdIdx=CmdIdx+1
commandArray[CmdIdx] = {['Variable:'..uvar_EVP] = tostring(mes_EVP)}
CmdIdx=CmdIdx+1
commandArray[CmdIdx] = {['Variable:'..uvar_RU] = tostring(new_RU)}
CmdIdx=CmdIdx+1
end
return commandArray
Explication
C’est donc un très gros script que nous avons là ! Mais ce dernier est aussi extrêmement complet, ce qui offre des données précises et fiables qui pourront (et devront) s’adapter à votre installation
Nous n’allons pas tout détailler, mais nous allons reprendre les explications qu’Alpeh0 à faite sur son post du forum EasyDomoticz pour la solution soit adaptée à vos besoins.
Humidité
Pour calculer l’humidité, voici l’opération qui a lieu :
Nouvelle Humidité = Ancienne Humidité + Pluie + Arrosage – Évaporation
La variable créée pour cette humidité s’appelle « RFU_RU » et elle peut varier entre 0 (lorsque le sol est SEC, sans eau) et RUmax qui dépendra de votre sol.
Il faudra initialiser cette variable selon vos paramètres (Les valeurs de votre sol pour etre exact). Lorsque le sol est saturé en eau, il suffit de donner la valeur de RUmax à votre variable « RFU_RU«
Autre élément à prendre en compte, c’est de connaitre le débit d’une des lignes d’arrosage ainsi que la surface que cette dernière va arroser.
Dans son cas, Aleph0 à initialisé la variable flow_EV1 à 670 (ce qui correspond à 670L/h) et la variable surf_EV1 à 50 (ce qui correspond à 50m²)
Pensez donc bien à adapter toutes ces variables suivant votre sol et votre installation. Une fois que c’est fait, l’humidité est stockée dans une variable qui sera convertie en centibar (cb)
Humidité du sol – Par Aleph0
D’autres variables seront à modifier avec votre paramètres :
- RFU_lastRain
- RFU_lastEVP
- RFU_RU
Le Script : Mise à jour
Le Script sur l’évapotranspiration développé par « aleph0 » date de 2017. Mais il a depuis été mis au gout du jour avec de nouvelles informations et de nouvelles données ! Ce dernier prend désormais en compte une nouvelle chose :
- Coefficient cultural
Il s’agit d’un coefficient qui compare les besoin en eau d’un végétal ou d’une culture. Ce dernier est compris entre 0 et 1.
Comme chaque espèce de plante à besoin d’un apport particulier en eau, et qu’en général, nous avons plus de variétés que d’arroseurs, aleph0 a créé un coefficient moyen qui conviendra à une majorité de plante. Très pratique pour améliorer encore une fois les apports en eau de vos cultures.
Pour ce calcul de coefficient, il a utilisé la fiche d’irrigation du BRL disponible ici.
Voici donc les courbes qu’il a dessinées pour trouver ce coefficient. L’une correspond aux cultures, l’autre au potager lambda.
Si l’on représente cela sous une formule, voici ce qu’il obtient :
Il ne reste donc plus qu’à l’intéger au script :
-- Script to estimate potential evapotranspiration according to Penman Monteith formula and FAO-56 method
-- Weather sensors for EVP
local dev_P = "Pression atmosphérique" -- Atmospheric pressure (hPa)
local dev_T = "Température Extérieure" -- Outside temperature (°C)
local dev_Hr= "Humidité Extérieure" -- Outside relative humidity (%)
local dev_Rn= "Lux" -- Global sun radiation (lux)
local G = 0 -- Thermal flux to the ground (MJ/h/m²)
local dev_U = "Vent" -- Wind speed (km/h)
local h = 10 -- height of wind speed mesurement (m)
-- Devices for RFU
local dev_RFU="Humidité du sol" -- Dummy device for RFU, of type soil humidity, in cb
local dev_Rain="Pluie" -- Device for rain
local dev_EV1="Arrosage Bas" -- Device for watering electrovalve 1
local flow_EV1=670 -- watering flowrate of EV1 in l/h
local surf_EV1=50 -- surface watered by EV1, in m²
-- Hint : We do RFU calculation only on 1 electrovalve, let's say the main one.
-- For watering, other electrovalves will follow the main one by a %
-- This will *NOT* work if the system is watering a garden + a green house. the soil humidity of the greenhouse
-- have to be calculated independantly as
-- - it never rain inside the greenhouse
-- - the evapotranspiration is much different than outsise
-- Parameters for RFU to cb convertions
local RUmax=320 -- (maximum 320mm de stockable dans le sol)
-- EVP sensor (must be of type rain sensor)
local dev_EVP="EVP" -- Name
-- Uservariables
local uvar_Rain='RFU_lastRain'
local uvar_EVP='RFU_lastEVP'
local uvar_RU='RFU_RU'
local debug=0 -- 0 : no debug ; 1 debug EVP, 2 debug RFU
local frequency_EVP=1 -- script runs every 1 min with local wind meter; can be slowed with stabile wind measurements
local frequency_RFU=5 -- RFU must not be faster than EVP but fast enough in front of watering time
local CmdIdx=1
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
commandArray = {}
time = os.date("*t")
-- Estimation de l'EVP
if (((time.min - 1)% frequency_EVP)==0) then -- Run every "frequency_EVP" minutes.
--Constants
Cn=37 --Hourly steps...
if (timeofday['Daytime']) then
Cd=0.24 --at day and 0.96 at night !!
else
Cd=0.96
end
if debug == 1 then print("Cd="..tostring(Cd)) end
-- reading of sensors
P =otherdevices_barometer[dev_P] -- hPa
T =otherdevices_svalues[dev_T] -- °C
Hr=otherdevices_humidity[dev_Hr] -- %
Rn=otherdevices_svalues[dev_Rn]*0.0079 -- W/m²
U2=otherdevices_windspeed[dev_U] -- m/s
if debug == 1 then
print("Pressure "..tostring(P).." hPa")
print("Temperature "..tostring(T).." °C")
print("Relative humidity "..tostring(Hr).." %")
print("Solar irradiance "..tostring(Rn).." W/m²")
print("Wind speed "..tostring(U2*3.6).." km/h") -- Wind speed is internally stored in m/s
end
-- unit convertions
P=P/10 -- must be in kPa
Hr=Hr/100
Rn=Rn/277.77778 -- must be in MJ/h/m²
U2=U2*4.87/math.log(67.8*h-5.42) -- windspeed at 2m height, in m/s
-- Intermediates calculations
Esat=0.6108*math.exp(17.27*T/(T+237.3)) -- pression de vapeur saturante, en kPa
Ea =Hr*Esat -- pression de vapeur actuelle, en kPa
Delta=4098*Esat/((T+237.3)^2)
Gamma=0.665*P/1000
if debug == 1 then
print("Pressure of saturated vapor "..tostring(Esat).." kPa")
print("Pressure of actual vapor "..tostring(Ea).." kPa")
print("Delta "..tostring(Delta))
print("Gamma "..tostring(Gamma))
end
ET0=(0.408*Delta*(Rn-G)+Gamma*Cn/(T+273)*U2*(Esat-Ea))/(Delta+Gamma*(1+Cd*U2)) -- EVP in mm/h
if debug == 1 or debug == 2 then print("ET0 "..tostring(ET0).." mm/h") end
--Updating the counter
-- EVP_Act=otherdevices_rain[dev_EVP] buggy :( Got an offset at midnight
rate, EVP_Act = string.match(otherdevices_svalues[dev_EVP],"(.-);(.-)$")
if debug == 1 then
print("rate "..tostring(rate))
print("EVP_Act "..tostring(EVP_Act))
print("EVP Ct b4 "..otherdevices_svalues[dev_EVP])
end
commandArray[CmdIdx] = {['UpdateDevice'] = tostring(otherdevices_idx[dev_EVP])..'|0|'..tostring(ET0)..";"..tostring(EVP_Act+ET0*frequency_EVP/60)}
if debug == 1 then
print("EVP Ct Af : "..tostring(otherdevices_idx[dev_EVP])..'|0|'..tostring(ET0)..";"..tostring(EVP_Act+ET0*frequency_EVP/60))
end
CmdIdx=CmdIdx+1
end
-- Estimation du RFU
-- Idée : Toutes les 5 minutes, on fait le bilan
-- RU=RU+Pluie+arrosage-EVP sur la période précédente, limité en maximum (>320) et minimum (<0)
-- Lors d'une demande d'arrosage auto, on envoi suffisament d'eau pour ramener RFU sur la cible
if ((time.min - 1)%frequency_RFU==0) then
mes_RU=uservariables[uvar_RU]
rate, mes_Rain = string.match(otherdevices_svalues[dev_Rain],"(.-);(.-)$")
rate, mes_EVP = string.match(otherdevices_svalues[dev_EVP],"(.-);(.-)$")
-- Estimation de l'Arrosage, en mm, basé sur le débit nominal d'une ligne d'arrosage, de la surface
-- arrosée et de l'ouverture de l'electrovanne correspondante
if otherdevices[dev_EV1]=="On" then
mes_Arr=flow_EV1/60*frequency_RFU/surf_EV1
else
mes_Arr=0
end
last_Rain = uservariables[uvar_Rain]
last_EVP= uservariables[uvar_EVP]
-- estimation du coefficient cultural modélisé d'après fiche d'irrigation du BRL
-- choisissez la ligne qui corresponds le mieux à vos cultures
--Kc=0.7*((1-math.cos(2*math.pi/365*(os.date("*t").yday-10)))/2)^2+0.3 -- potager
Kc=0.7*((1-math.cos(2*math.pi/365*os.date("*t").yday))/2)^2+0.3 -- verger
new_RU=math.max(math.min(mes_RU+mes_Arr+(mes_Rain-last_Rain)-Kc*(mes_EVP-last_EVP),RUmax),0)
new_Hs=round(200*(1-new_RU/RUmax))
if debug == 2 then
print("RU : "..mes_RU)
print("Rain : "..mes_Rain-last_Rain)
print("EVP : "..mes_EVP-last_EVP)
print("New RU : "..new_RU)
print("New Hs : "..new_Hs)
end
commandArray[CmdIdx] = {['UpdateDevice'] = tostring(otherdevices_idx[dev_RFU])..'|'..tostring(new_Hs)..'||'}
CmdIdx=CmdIdx+1
-- Updating the variables with the last rain and evp counters being read
commandArray[CmdIdx] = {['Variable:'..uvar_Rain] = tostring(mes_Rain)}
CmdIdx=CmdIdx+1
commandArray[CmdIdx] = {['Variable:'..uvar_EVP] = tostring(mes_EVP)}
CmdIdx=CmdIdx+1
commandArray[CmdIdx] = {['Variable:'..uvar_RU] = tostring(new_RU)}
CmdIdx=CmdIdx+1
end
return commandArray
Ce Script reprend donc le précédent, mais il ajoute quelques lignes à la fin pour prendre en compte ces nouvelles données
L’arrosage
Si vous avez regardé et compris son script, vous remarquerez une variable appelée « dev_EV1 » qui s’avère très importante pour les calculs. Cette dernière correspond en fait à son électrovanne d’arrosage.
Ainsi, cette variable permet de savoir si un arrosage à lieu ou non, et cela sera pris en compte dans le calcul d’estimation de l’humidité du sol.
Dans son post sur le Forum, un second script à été publié. Ce dernier permet de gérer son arrosage et de remonter son état (Arrosage ou Non arrosage). Et c’est dans ce script que la variable « dev_EV1 » est initialisée.
Nous allons donc inclure le script ici, mais notez qu‘il ne pourra pas être utilisé comme tel étant donné que cela dépend de chaque installation !
Nous l’intégrons dans notre article pour que vous puissiez l’analyser, le comprendre et ensuite l’adapter selon vos besoins
--[[
Script pour gérer l'arrosage automatique
Modes :
- Off : Ne fais rien
- Manu : Arrose inconditionnellement pour un temps spécifié dans "Durée arrosage"
- Auto : Arrose en fonction de l'humidité du sol
Les ordres d'ouverture des électrovannes sont passées sous forme de LongPulse à la Wemos de manière à ce que la fermeture
soit assurée même si domoticz ou le wifi plante entre le moment où l'on ouvre et celui où l'on ferme l'électrovanne
Les switches d'electrovannes sont mis à jour sur domoticz par la wemos de manière à pouvoir arrêter manuellement avant l'heure si besoin
Todo :
- Fusionner tous les scripts pour éviter les doublons
--]]
-- Paramètres
local dev_Modes="Mode arrosage" -- Sélecteur du mode d'arrosage (Off/Manu/Auto)
local dev_Duree="Durée arrosage manu (min)" -- Consigne de durée d'arrosage manu
local dev_Start="Arrosage" -- Bouton de demande d'un arrosage
local dev_EV1="Arrosage bas" -- Électrovanne maître (Celle avec qui le RFU est calculé)
local dev_EV2="Arrosage haut" -- Électrovanne esclave
local dev_EV3="Arrosage réserve" -- Électrovanne esclave
local dev_SP="Sécurité pompe" -- Sécurité pompe (On=arrêt pompe)
local dev_reboot="Wemos puit boot" -- switch indiquant un reboot de la wemos
local ratio_EV2_EV1=0.75 -- Rapport entre le temps d'ouverture de EV2 et de EV1
local ratio_EV3_EV1=0 -- Rapport entre le temps d'ouverture de EV3 et de EV1
local addr_Wemos="192.168.1.250" -- Adresse IP de la Wemos
local GPIO_EV1=4 -- GPIO de commande de EV1
local GPIO_EV2=5 -- GPIO de commande de EV2
local GPIO_EV3=0 -- GPIO de commande de EV3
local dev_Hs="Humidité 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_EV1=670 -- watering flowrate of EV1 in l/h (mesuré=625 l/h)
local surf_EV1=50 -- surface watered by EV1, in m²
local RUmax=320 -- (maximum 320mm de stockable dans le sol)
local dev_Npc="Remplissage Puit" -- Niveau en %
local seuil_Npc=75 -- Niveau de remplissage en dessous duquel on commence à réduire l'arrosage
local dev_SrcEau="Source arrosage" -- Origine de l'eau d'arrosage
-- Variables internes
local debug=1
local CmdIdx=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
function open_EV(switch,GPIO,Duree)
--[[
Envoi une commande LongPulse à la wemos et met à jour le statut des switches
domoticz correspondants
Si la durée d'ouverture est < 5s, on n'envoi pas de pulse : L'eau n'a pas le
temps d'arriver aux goutteurs et ça donne une possibilitée simple de condamner
une électrovanne
--]]
if Duree>=5 then
-- Envoi des commandes à la wemos
cmd = "http://"..addr_Wemos.."/control?cmd=LongPulse,"..GPIO..",0,"..tostring(Duree)
if debug==1 then
print("Ouverture de "..switch.." pour "..Duree.." s")
print(cmd)
end
os.execute('curl "'..cmd..'"')
--Les switches domoticz sont mis à jour par le retour d'état de la wemos
else
print("Ouverture de "..switch.." trop courte : Ignoré")
end
end
--------------------------------------------------------------------------------
-- Fin bibliothèque de fonctions --
--------------------------------------------------------------------------------
commandArray = {}
-- L'arrosage est toujours déclenché par le bouton "arrosage", soit manuellement, soit par planning
-- Gestion de l'arrosage
if devicechanged[dev_Start] and
otherdevices[dev_Start] == "On" and
otherdevices[dev_EV1] == "Off" and
otherdevices[dev_EV2] == "Off" and
otherdevices[dev_EV2] == "Off" then
commandArray[CmdIdx] = {[dev_Start] = 'Off'}; CmdIdx=CmdIdx+1
if otherdevices[dev_Modes]=="Manu" then
print("Arrosage demandé en mode Manu")
val_Duree_EV1=round(otherdevices_svalues[dev_Duree]*60,0)
elseif otherdevices[dev_Modes]=="Auto" then
print("Arrosage demandé en mode Auto")
val_Hs=tonumber(otherdevices[dev_Hs])
print("Humidité du sol "..val_Hs.." cb")
if val_Hs>=start_Hs then
-- calcul de la durée d'arrosage nécessaire pour passer de val_Hs à target_Hs
DRu=(val_Hs-target_Hs)/200*RUmax
-- Correction en fonction du niveau du puit
coef=1
if otherdevices[dev_SrcEau]=="Puit" then
val_Npc=tonumber(otherdevices_svalues[dev_Npc])
if val_Npc<seuil_Npc then
coef=math.sqrt(1-(1-val_Npc/seuil_Npc)^2)
end
-- To do : s'assurer que l'eau demandée se trouve bien dans le puit !!
end
val_Duree_EV1=round(coef*DRu*surf_EV1/flow_EV1*3600,0)
if debug==1 then
print("Apport théorique "..DRu.." mm")
print("Niveau du puit "..val_Npc.." %")
print("Coefficient de réduction "..coef)
print("Apport corrigé "..DRu*coef.." mm")
end
else
val_Duree_EV1=0
print("Sol suffisament humide ; inutile d'arroser")
end
else
val_Duree_EV1=0
print("Arrosage demandé en mode Off : Ignoré")
end
val_Duree_EV2=round(ratio_EV2_EV1*val_Duree_EV1,0)
val_Duree_EV3=round(ratio_EV3_EV1*val_Duree_EV1,0)
--[[
Hint : Sur mon installation, on peut ouvrir toutes les electrovannes
simulatannément. Ce n'est pas le cas partout, vérifier le débit
d'eau maximal disponible avant de faire ça
--]]
open_EV(dev_EV1,GPIO_EV1,val_Duree_EV1)
open_EV(dev_EV2,GPIO_EV2,val_Duree_EV2)
open_EV(dev_EV3,GPIO_EV3,val_Duree_EV3)
end
-- Desactivation du planning en mode manu ou Off
-- Todo : On ne gère ici qu'une seule ligne de planning. Améliorer pour les gérer toutes s'il y en a plusieurs
if devicechanged[dev_Modes] then
if otherdevices[dev_Modes]=="Auto" then
-- En auto, on active la plannification
cmd = "http://localhost:8080/json.htm?type=command¶m=enabletimer&idx=6"
if debug==1 then print(cmd) end
os.execute('curl "'..cmd..'" &')
else
-- En manu ou off, on desactive la plannification
cmd = "http://localhost:8080/json.htm?type=command¶m=disabletimer&idx=6"
if debug==1 then print(cmd) end
os.execute('curl "'..cmd..'" &')
-- Si on passe en mode Off, on arrête immédiatement un arrosage en cours
if otherdevices[dev_Modes]=="Off" then
commandArray[CmdIdx] = {[dev_EV1] = 'Off'}; CmdIdx=CmdIdx+1
commandArray[CmdIdx] = {[dev_EV2] = 'Off'}; CmdIdx=CmdIdx+1
commandArray[CmdIdx] = {[dev_EV3] = 'Off'}; CmdIdx=CmdIdx+1
end
end
end
--[[
En cas de reboot de la wemos, pendant un arrosage ça arrête l'arrosage :(
Il faut faire qqch, mais quoi ?...
- Renvoyer l'état des EV : le LongPulse a été oublié par le reboot
- Relancer une demande d'arrosage ? Pas sûr que ça reprenne selon l'humiditée déjà atteinte...
--]]
return commandArray
C’est un long script qui permet à Aleph0 de gérer son arrosage efficacement ! Pour votre utilisation, vous n’aurez surement pas besoin de quelque chose d’aussi avancé, mais si vous souhaitez mettre en place un système à base D’Évapotranspiration, vous pouvez le réutiliser.
Conclusion
Avec ce script, il est possible d’ajouter l’évapotranspiration à votre contrôleur d’arrosage GreenIq sous Domoticz ou à tout autre système d’arrosage ! Cela permettra d’optimiser l’apport en eau de vos plantes et cultures, et de faire des économies pour arroser uniquement lorsque c’est nécessaire.
Cet article reprend le très bon post de « aleph0 » sur le forum easydomoticz. Merci à lui de nous avoir autorisé à réutiliser ses données, scripts et images pour que l’on puisse les partager avec notre communauté !
Ses différents scripts sont commentés, ce qui est très pratique pour analyser et comprendre le fonctionnement de chaque variable ou fonction et ensuite l’adapté à votre installation.
Néanmoins vous vous en doutez, il faudra avoir quelques connaissances et des notions en code pour comprendre et bien exploiter ce Script !