Voici le script d'estimation de l'humidité du sol.
Le principe est le suivant :
1/ Calcul de l'évapotranspiration potentielle (EVP).
C'est la quantité d'eau puisée dans le sol par une culture typique. Pour plus de détail sur la méthode et la théorie, je vous renvoi au pdf mentionné au premier post, il explique tout !
Ce calcul à besoin des données météo : Température, humidité, pression atmosphérique, vent, pluie et rayonnement solaire. Le script ci-dessous ne fait que
lire ces données, qui doivent être présente dans domoticz avant de commencer, soit que l'on possède une station météo, soit que l'on aille chercher les valeurs sur weather underground ou équivalent. Pour le rayonnement solaire, n'ayant pas de capteur, j'utilise l'excellent script de Jmleglise
http://www.domoticz.com/wiki/Real-time_ ... _sensor...
Cette fonction du script met à jour un capteur de type "Rain sensor" qui permet de suivre l'évolution de l'évaporation au jour le jour. Domoticz affichera aussi les valeurs horaires mais elles sont tellement faibles que la précision d'affichage occulte quasiment toute l'information intéressante. L'important est l'accumulation au fil du temps :
Pour ma part, j'utilise une station météo locale. Le vent étant un paramètre très variable, le script fais le calcul de l'évaporation toute les minutes pour coller au plus près aux variations du vent. Ceux qui utiliserai un valeur moyenne venant du web peuvent exécuter leur script plus lentement, par exemple toutes les heures
2/ Calcul de l'humidité du sol
Celle ci ce fait sous la forme d'un bilan, exécuté toutes les 5 minutes :
Nouvelle humidité=Ancienne humidité+Pluie+Arrosage-Évaporation
Par facilité, l'unité utilisée est le mm (qui corresponds à 1l/m²). C'est l'unité disponible pour la pluie, pour l'évaporation.
L'humidité étant limitée en maximum (au bout d'un moment, le sol est saturé d'eau et toute pluie supplémentaire ruisselle au lieu d'être absorbée par le sol) et en minimum (quand le sol est complètement sec, il n'y a plus rien à évaporer). C'est là tout l'intérêt de faire ce script au beau milieu de l'hiver : Ce bilan à besoin d'être initialisé sur une valeur connue pour donner une valeur réaliste, sinon seule sa variation à un sens. La valeur la plus facile à détecter est l'état "saturé", après un bon gros épisode pluvieux ! Le script se recalera dessus tout seul au bout d'un moment, mais la première fois, pour gagner du temps, il est préférable de l'initialiser à la main lorsqu'on constate de visu que le sol est saturé :
La variable à créer pour contenir l'humidité s'appelle RFU_RU, elle varie entre 0 (sol complètement sec, toutes les plantes sont mortes depuis longtemps) et la constante RUmax, qui dépends de votre sol (dans mon cas 320mm). Pour initialiser le bilan un jour de grosse pluie, il suffit de donner manuellement la valeur RUmax à la variable RFU_RU lorsqu'on voit que le sol est saturé.
L'autre difficulté est d'estimer les apports par arrosage, en mm. Un des prè-requis est que domoticz soit informé des arrosages. Ça tombe bien, c'est lui qui va les piloter

Il faut aussi connaître le débit d'au moins une des ligne d'arrosage et la surface arrosée par cette ligne. Chez moi, c'est la ligne EV1, qui débite 670l/h sur 50m². Ces valeurs sont bien entendu à adapter à votre installation.
L’humidité ainsi calculée est stockée dans une variable en mm et convertie en cb (centibar) pour mettre à jour le capteur d'humidité de domoticz :
Dépendances :
- Capteurs météo (Température, Humidité, Vent) ou valeurs récupérées de weather underground ou équivalent
- Luminosité solaire (lux) ou script d'estimation de Jmleglise
http://www.domoticz.com/wiki/Real-time_ ... structions
- Électrovanne d'arrosage (dev_EV1)
- Débit nominal de la ligne d'arrosage pilotée par l'électrovanne ci-dessus (flow_EV1) en l/h
- La surface arrosée par la ligne d'arrosage (surf_EV1) en m²
Variables à créer :
RFU_lastRain : Contient la dernière valeur lue du capteur de pluie
RFU_lastEVP : Contient la dernière valeur lue du capteur d'evp
RFU_RU : Contient l'humidité du sol en mm
Script time:
Code : Tout sélectionner
-- 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
La suite sera le script de gestion des électrovannes d'arrosage