..:: Domotique Store : Le Blog ::..
Domoticz Guides et Tutoriels Tous les articles

GreenIQ sous domoticz : Mesurer l’évapotranspiration avec un script

GreenIQ sous domoticz : Mesurer l’évapotranspiration avec un script

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)

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&param=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&param=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 !

1
0
Lucas

Je suis Lucas, un jeune motion designer & développeur web. J'ai rejoint l'équipe Planète-domotique pour approfondir mes connaissances dans le milieu des objets connectés et particulièrement ceux de la domotique. J'utilise mes compétences pour gérer la communauté du site au travers du Blog et des Réseaux Sociaux. Je m'occupe également du marketing de la boutique en créant les opérations promotionnelles et les différents visuels Mon objectif est d'écrire des articles clairs et utiles pour aider la communauté à comprendre et utiliser les objets connectés liés à la domotique en toute simplicité

Laisser un commentaire