Encore un arrosage automatique !

Forum dédié aux bricolages d'objets connectés IOT et leurs communications avec DomoticZ :
- Remplacement de firmware des prises, modules relais ...
- Fabrication à base d'ESP8266, de NodeMCU, de Weemos et consorts ...
aleph0
Messages : 328
Inscription : 27 avr. 2016, 08:06
Localisation : Hérault (34)

Re: Encore un arrosage automatique !

Message par aleph0 »

J'avais trouvé ça dans une documentation lorsque je m'étais renseigné sur les méthodes de calcul, à l'époque. Je vais tenter de te la retrouver.

Envoyé de mon moto g(6) en utilisant Tapatalk

hestia
Messages : 397
Inscription : 12 sept. 2018, 22:36

Re: Encore un arrosage automatique !

Message par hestia »

Après avoir vu bcp de doc, j'ai trouvé ça
https://ariege.chambre-agriculture.fr/f ... on_sol.pdf
avec
Screenshot 2022-01-10 201414.png
Screenshot 2022-01-10 201414.png (186.54 Kio) Consulté 4330 fois
Screenshot 2022-01-10 201507.png
Screenshot 2022-01-10 201507.png (339.58 Kio) Consulté 4330 fois
c'est un peu mouillé pour faire des boules en ce moment :D
J'ai une étude de sol qui dit que j'ai du remblai limoneux sur 1,3m et ensuite du limoneux-marneux jusqu'à plus de 3 m.
Donc si je prends 1,8 (terre limoneuse) * 130 m = 234 mm
Je ne sais pas quoi faire de la 2eme couche..., si je prends 1 * (300 - 130) = 170 mm
Soit 400 mm ?
Comme c'est pour du gazon au plus les racines seraient de 60 cm (ce sera un record).
hestia
Messages : 397
Inscription : 12 sept. 2018, 22:36

Re: Encore un arrosage automatique !

Message par hestia »

voici les scripts fait en dzVents: 1 pour l'EVP et 1 pour le RFU avec partir des scripts d'aleph0
pour l'EVP

Code : Tout sélectionner

-- Script to estimate potential evapotranspiration according to Penman Monteith formula and FAO-56 method
--
-- 17/12/2021 - inital from https://domoticz.com/forum/viewtopic.php?p=249287#p249287
-- 02/01/2022 - result in a user variable and a counter updated via json to avoid "complication"
-- 12/01/2022 - some fix
-- 29/01/2022 - change RFX counter to increment as result that give abnormal values
-- 18/03/2022 - add a custom sensor to save the EVP no rounded for tracability

-- Weather sensors for EVP
local dev_barometer = 2336      -- Atmospheric pressure (hPa)
local dev_temperature = 2336    -- Outside temperature (°C)
local dev_humidity = 2336       -- Relative humidity (%)
local dev_Rn = 1911             -- Global sun radiation (Lux)
local dev_U = 2338              -- Wind speed (m/s)

local cst_G = 0                 -- Thermal flux to the ground (MJ/h/m²)
local cst_h = 5                 -- Height of wind speed mesurement (m) !!!
local Cn = 37                   -- Hou  rly steps...


-- EVP result in mm user variables and device to create w the GUI
local uv_EVP_noRounded = 17     -- Result of the day no rounded in a user variable
local uv_EVP_rounded = 33       -- Result rounded in a user variable
local uv_EVP_deltaNoRounded = 37-- Result delta no rounded in a user variable, resetted by RFU script

local dev_EVP_countIncr = 2476  -- Result rounded for UX in a incremental counter (divider = 10) -- comment if not used
local dev_EVP_custom = 2520     -- Result not rounded for tracking in a custom counter -- comment if not used

local dev_EVP_rain = 2475       -- Result rounded for UX in a rain counter -- comment if not used

-------------
local dev_EVP_countIncrOLD = 2423  -- Result rounded for UX in a incremental counter (divider = 10) -- comment if not used
--------


local TIME_INTERVAL = 'every 5 minutes except at 00:00-01:00' -- issue with counter after 00:00, to limit issue ; not necessary by night

local TEST = 203  -- to uncomment to use: launch the script w/o waiting


local LOG_DEBUG = 0 -- 0 =>ERROR / 1 => FORCE / 2 => DEBUG
local LOG_LEVEL
local LOGGING
if LOG_DEBUG == 2 then
    LOGGING = domoticz.LOG_DEBUG
    LOG_LEVEL = domoticz.LOG_DEBUG
elseif LOG_DEBUG == 1 then
    LOGGING = domoticz.LOG_FORCE
    LOG_LEVEL = domoticz.LOG_FORCE
else
    LOGGING = domoticz.LOG_ERROR
    LOG_LEVEL = domoticz.LOG_INFO
end

return {
    logging =   {   level   =   LOGGING,
	            },
	on =    {
        devices  = {TEST},
        timer    = {TIME_INTERVAL}
            },

	execute = function(dz, item, triggerInfo)
        _G.logMarker =  dz.moduleLabel -- set logmarker to scriptname 
    	local _u = dz.utils
    	
    local openURLAfterSec = 3
            	
    local function logWrite(str, level)
        if level == nil then level = LOG_LEVEL end
        dz.log(tostring(str), level)
    end


    local function jsonCounter(p_IDX, p_value)
        logWrite('IDX= ' .. p_IDX .. ' value= ' .. p_value)
        local cmd = '/json.htm?type=command&param=udevice&idx=' .. p_IDX .. '&svalue=' .. p_value
        local url = 'http://127.0.0.1:8080' .. cmd
        logWrite('url= ' .. url)
        dz.openURL(url).afterSec(openURLAfterSec) -- to avoid error w several openURL at the same time ?
        openURLAfterSec = openURLAfterSec + 1
        return
    end
    
    
    local function jsonCounterIncr(p_IDX, p_incr)
        logWrite('IDX= ' .. p_IDX .. ' incr= ' .. p_incr)
        local cmd = '/json.htm?type=command&param=udevice&idx=' .. p_IDX .. '&nvalue=0&svalue=' .. p_incr
        local url = 'http://127.0.0.1:8080' .. cmd
        logWrite('url= ' .. url)
        dz.openURL(url).afterSec(openURLAfterSec) -- to avoid error w several openURL at the same time ?
        openURLAfterSec = openURLAfterSec + 1
        return
    end

---------------------------

-- reading of sensors 
    local P = dz.devices(dev_barometer).barometer
    local T = dz.devices(dev_temperature).temperature
    local Hr = dz.devices(dev_humidity).humidity
    local Rn = (dz.devices(dev_Rn).lux) * 0.0079 -- W/m²
    local U2 = dz.devices(dev_U).speedMs

    local Cd
    if dz.time.isDayTime then
        Cd=0.24 -- at day
    else
        Cd=0.96 -- at night
    end

--[[
    logWrite('P:  ' .. P)
    logWrite('T:  ' .. T)
    logWrite('Hr: ' .. Hr)
    logWrite('Rn: ' .. Rn)
    logWrite('U2: ' .. U2)
    logWrite('Cn: ' .. Cn)
    logWrite('Cd: ' .. Cd)
    logWrite('cst_h:' .. cst_h)
--]]

-- 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*cst_h-5.42) -- windspeed at 2m height, in m/s

--[[   
    logWrite("P':  " .. P)
    logWrite("Hr': " .. Hr)
    logWrite("Rn': " .. Rn)
    logWrite("U2': " .. U2)
--]]

-- Intermediates calculations
    local Esat  = 0.6108*math.exp(17.27*T/(T+237.3)) -- saturated vapor pressure (kPa)
    local Ea    = Hr*Esat                            -- current vapor pressure (kPa)
    local Delta = 4098*Esat/((T+237.3)^2)
    local Gamma = 0.665*P/1000

    logWrite("Pressure of saturated vapor: "..Esat.." kPa")
    logWrite("Pressure of actual vapor: "..Ea.." kPa")
    logWrite("Delta: ".. Delta)
    logWrite("Gamma: "..Gamma)
    
    local ET0=(0.408*Delta*(Rn-cst_G)+Gamma*Cn/(T+273)*U2*(Esat-Ea))/(Delta+Gamma*(1+Cd*U2)) -- EVP in mm/h
    logWrite("ET0 => ".. ET0 .." mm/h", dz.LOG_FORCE)
---------------------------------------

-- with RFX meter
    local lastEVPUpdateInSec, EVP_delta, EVP_prevNoRouded, EVP_prevRounded, EVP_newNoRound, EVP_newRounded, EVP_last, EVP_deltaRounded

    lastEVPUpdateInSec = dz.variables(uv_EVP_noRounded).lastUpdate.secondsAgo
    logWrite('EVP updated ' .. lastEVPUpdateInSec .. ' sec ago')
    
    EVP_delta = ET0 * lastEVPUpdateInSec / 3600
    logWrite('EVP_delta => ' .. EVP_delta .. ' mm', dz.LOG_FORCE)
    
-- to user variable
    local EVP_deltaPrev = dz.variables(uv_EVP_deltaNoRounded).value
    logWrite('EVP_deltaPrev => ' .. EVP_deltaPrev .. ' mm', dz.LOG_FORCE)
    local EVP_deltaNew = EVP_deltaPrev + EVP_delta   
    logWrite('EVP_deltaNew => ' .. EVP_deltaNew .. ' mm', dz.LOG_FORCE)
    dz.variables(uv_EVP_deltaNoRounded).set(EVP_deltaNew)    


    if dz.variables(uv_EVP_noRounded).lastUpdate.isToday then
        logWrite('Same day')
        EVP_prevNoRouded = dz.variables(uv_EVP_noRounded).value
        logWrite('EVP_prevNoRouded: ' .. EVP_prevNoRouded)
        
        EVP_newNoRound = EVP_prevNoRouded + EVP_delta
        
        EVP_prevRounded = dz.variables(uv_EVP_rounded).value
        logWrite('EVP_prevRounded: ' .. EVP_prevRounded)
        
    else
        logWrite('New day')
        
        EVP_newNoRound = EVP_delta

        EVP_prevRounded = 0
    end

    logWrite('EVP => ' .. EVP_newNoRound .. ' mm', dz.LOG_FORCE)
    
-- to user variable
    dz.variables(uv_EVP_noRounded).set(EVP_newNoRound)

-- to custom sensor    
    if dev_EVP_custom ~= nil then
        jsonCounterIncr(dev_EVP_custom, EVP_newNoRound)
    end
    
    EVP_newRounded = math.floor(EVP_newNoRound * 10) / 10
    logWrite('EVP_newRounded: ' .. EVP_newRounded)
    dz.variables(uv_EVP_rounded).set(EVP_newRounded)
    
-- to a rain counter
    if dev_EVP_rain ~= nil then
        logWrite('Update rain counter' .. dz.devices(dev_EVP_rain).name)
        dz.devices(dev_EVP_rain).updateRain(_u.round(ET0 * 100,3), EVP_newRounded) -- updateRain(rate, counter): Function. (rate in mm * 100 per hour, counter is total in mm)
    end
    

-- to increment counter 
    if dev_EVP_countIncr ~= nil then
        logWrite('Update incr counter' .. dz.devices(dev_EVP_countIncr).name)
        EVP_deltaRounded = EVP_newRounded - EVP_prevRounded
        logWrite('EVP_deltaRounded: ' .. EVP_deltaRounded)
    
        jsonCounterIncr(dev_EVP_countIncrOLD, EVP_deltaRounded * 10) -- Divider
        --dz.devices(dev_EVP_countIncr).updateCounter(EVP_deltaRounded)
        
        jsonCounterIncr(dev_EVP_countIncr, EVP_deltaRounded * 10) -- Divider
        
    end
    
    logWrite("*** FIN ***")
    
end
}
pour le RFU

Code : Tout sélectionner

--[[ 
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)

from https://domoticz.com/forum/viewtopic.php?p=249287#p249287

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é.

--  RFU: Réserve Facilement Utilisable ou confort hydrique

ajouter coefficient cultural: https://easydomoticz.com/forum/viewtopic.php?p=69436&sid=6bd466a6a7862e21dee9adc66beaec48#p69436

https://fr.wikipedia.org/wiki/R%C3%A9serve_utile_en_eau_d%27un_sol
https://en.wikipedia.org/wiki/Available_water_capacity



-- 28/12/2021 - initial

--]]

local RU_MAX = 420 -- 
local wateredSurface = 40 -- m2


-- Actual values updated in other scripts
--local uv_EVP_day = 17               -- user variable for actual EVP (day)
local uv_EVP_deltaNoRounded = 37    -- user variable EVP delta no rounded from EVP script, resetted by RFU script

--local dev_rain = 2334 -- device for actual rain
local uv_rain = 28 -- user variable for rain (day)
local dev_watering1 = 1897 -- device for actual watering 1/2 (pelouse 1)
local dev_watering2 = 1899 -- device for actual watering 2/2 (pelouse 2)
local dev_RU = 2319 -- device for RFU (custom) 
local dev_RFU_cb = 2328

-- Values from the previous run (mm) updated in this script
local uv_EVPPrevious = 21 -- user variable for previous EVP
local uv_rainPrevious = 20 -- user variable for previous Rain
local uv_RU = 22 -- user variable for previous RFU
local uv_wateringPrevious = 19 -- user variable for previous Watering

--local TIME_INTERVAL = 'every 5 minutes except at 00:00-01:00' -- issue with counter after 00:00, to limit issue ; not necessary by night

--local TEST = 207 -- a dummy switch to trigger the script w/o waiting (for testing)


local LOG_DEBUG = 2         -- 0 =>ERROR / 1 => FORCE / 2 => DEBUG
local LOG_LEVEL
local LOGGING
if LOG_DEBUG == 2 then
    LOGGING = domoticz.LOG_DEBUG
    LOG_LEVEL = domoticz.LOG_DEBUG
elseif LOG_DEBUG == 1 then
    LOGGING = domoticz.LOG_FORCE
    LOG_LEVEL = domoticz.LOG_FORCE
else
    LOGGING = domoticz.LOG_ERROR
    LOG_LEVEL = domoticz.LOG_INFO
end

return {
    logging =   {
                level =   LOGGING
                },
	on =        {
            devices  = {TEST},
            timer    = {TIME_INTERVAL},
            variables = {uv_EVP_deltaNoRounded}
            },
	execute = function(dz, item, triggerInfo)
        _G.logMarker =  dz.moduleLabel -- set logmarker to scriptname 
    	local _u = dz.utils
            	
    local function logWrite(str, level)
        if level == nil then level = LOG_LEVEL end
        dz.log(tostring(str), level)
    end

---------------------------
    logWrite("*** START ***")

    --local EVPActual = _u.round(dz.variables(uv_EVP_day).value, 3)
    --local EVPPrevious = dz.variables(uv_EVPPrevious).value
    local EVPDelta = dz.variables(uv_EVP_deltaNoRounded).value
    logWrite('EVPDelta: ' .. EVPDelta .. ' mm', dz.LOG_FORCE)
    --logWrite('EVPActual: ' .. EVPActual .. ' EVPPrevious: ' .. EVPPrevious .. ' mm')

       
    local rainActual    
    if uv_rain ~= nil then
        rainActual = _u.round(dz.variables(uv_rain).value, 3)
    elseif dev_rain ~= nil then
        rainActual = _u.round(dz.devices(dev_rain).rain, 3)
    else
        logWrite('rainActual not defined', dz.LOG_ERROR)
    end
    
    local newDay = false
    if dz.variables(uv_rainPrevious).lastUpdate.isToday then
        logWrite('Same day')
    else
        logWrite('New day')
        newDay = true
    end

    local rainPrevious = _u.round(dz.variables(uv_rainPrevious).value, 3)
    
    
    logWrite('rainActual: ' .. rainActual .. ' rainPrevious: ' .. rainPrevious .. ' mm')    
    if rainActual < rainPrevious then
        logWrite('rainActual < rainPrevious: ' .. rainActual .. ' < ' .. rainPrevious .. ' mm')
        if not newDay then
            logWrite('rain data issue ' .. rainActual .. ' < ' .. rainPrevious, dz.LOG_ERROR)
        end
        rainPrevious = 0
    end    

    local wateringActualVol = _u.round(dz.devices(dev_watering1).counter + dz.devices(dev_watering2).counter, 3)
    logWrite('wateringActualVol: ' .. wateringActualVol .. ' m3')
    local wateringActualAera = _u.round(wateringActualVol / wateredSurface * 1000, 3) -- to mm in m2
    local wateringPreviousArea = _u.round(dz.variables(uv_wateringPrevious).value, 3)
 
    local RUPrevious = _u.round(dz.variables(uv_RU).value, 3)


    logWrite('wateringActualAera: ' .. wateringActualAera .. ' wateringPreviousArea: ' .. wateringPreviousArea .. ' mm')
    logWrite('RUPrevious: ' .. RUPrevious .. ' mm')
    
    local RUActual
    --RUActual = RUPrevious + (wateringActualAera - wateringPreviousArea) + (rainActual - rainPrevious) - (EVPActual - EVPPrevious)
    RUActual = RUPrevious + (wateringActualAera - wateringPreviousArea) + (rainActual - rainPrevious) - EVPDelta
    
    logWrite('RUActual: ' .. RUActual)  
    if RUActual < 0 then
        RUActual = 0
        logWrite('RU Actual reset to 0')
    elseif
        RUActual > RU_MAX then
        RUActual = RU_MAX
        logWrite('RU Actual set to RU MAX: ' .. RU_MAX)
    end
    
    if RUActual > RUPrevious then
        --logWrite('RU Actual > Previous ; RU ' .. RUActual .. '= RU ' .. RUPrevious .. ' + watering (' .. wateringActualAera .. ' - ' .. wateringPreviousArea .. ') + rain (' .. rainActual .. ' - ' .. rainPrevious .. ') - EVP (' .. EVPActual .. ' - ' .. EVPPrevious .. ')', dz.LOG_FORCE)      
        logWrite('RU Actual > Previous ; RU ' .. RUActual .. '= RU ' .. RUPrevious .. ' + watering (' .. wateringActualAera .. ' - ' .. wateringPreviousArea .. ') + rain (' .. rainActual .. ' - ' .. rainPrevious .. ') - EVP (' .. EVPDelta .. ')', dz.LOG_FORCE)   
    end
    
    dz.devices(dev_RU).updateCustomSensor(_u.round(RUActual,1))

    local soilMoisture = _u.round(200 * (1 - RUActual / RU_MAX),0)
    logWrite('RFU: ' .. soilMoisture .. ' cb')
    dz.devices(dev_RFU_cb).updateSoilMoisture(soilMoisture)
    
    dz.variables(uv_RU).set(RUActual)
    --dz.variables(uv_EVPPrevious).set(EVPActual)
    dz.variables(uv_EVP_deltaNoRounded).set(0).silent() -- reset after being used
    dz.variables(uv_rainPrevious).set(rainActual)
    dz.variables(uv_wateringPrevious).set(wateringActualAera)

    logWrite("*** FIN ***")
    
end
}
Screenshot 2022-03-29 233643.png
Screenshot 2022-03-29 233643.png (26.88 Kio) Consulté 4108 fois
Utilisation d'un compteur incremental pour l'EVP pour pouvoir mettre une custom icon
et un custom sensor pour le RFU également avec une icone

Pour les infos météo j'utilise wunderground qui permet d'avoir accès à des stations météo (je trouve plus précis pour la pluie car ce sont des valeurs réelles par rapport à un service de météo général), du coup, je ne sais pas la hauteur de la mesure du vent :(
Pièces jointes
RU3.zip
(201.31 Kio) Téléchargé 234 fois
EVP3.zip
(531.47 Kio) Téléchargé 202 fois
aleph0
Messages : 328
Inscription : 27 avr. 2016, 08:06
Localisation : Hérault (34)

Re: Encore un arrosage automatique !

Message par aleph0 »

Merci pour les scripts en dzvent, c'est sympa de voir son travail repris et amélioré par la communauté :-)
hestia a écrit : 29 mars 2022, 23:45 du coup, je ne sais pas la hauteur de la mesure du vent :(
Si tu intérroge une station de particulier, c'est en général à 2 ou 3m du sol. Pour une station officielle (aéroport, etc...) c'est plutôt 10m
aleph0
Messages : 328
Inscription : 27 avr. 2016, 08:06
Localisation : Hérault (34)

Re: Encore un arrosage automatique !

Message par aleph0 »

hestia a écrit : 10 janv. 2022, 20:31 J'ai une étude de sol qui dit que j'ai du remblai limoneux sur 1,3m et ensuite du limoneux-marneux jusqu'à plus de 3 m.
Donc si je prends 1,8 (terre limoneuse) * 130 m = 234 mm
Je ne sais pas quoi faire de la 2eme couche..., si je prends 1 * (300 - 130) = 170 mm
Soit 400 mm ?
Comme c'est pour du gazon au plus les racines seraient de 60 cm (ce sera un record).
J'avais pas vu ton message, désolé pour la réponse tardive :-/. Ne te préoccupe pas de la couche profonde : Elle ne concernera que les arbres et, à cette profondeur, ils savent se débrouiller pour aller chercher l'eau dont ils ont besoin : Pas besoin d'une grande précision dans l'arrosage des arbres. Pour le gazon, considère seulement la 1ere couche en réglant sur 234 mm initialement, puis si besoin tu ajusteras en observant si l'arrosage correspond bien au besoin de ton gazon
hestia
Messages : 397
Inscription : 12 sept. 2018, 22:36

Re: Encore un arrosage automatique !

Message par hestia »

aleph0 a écrit : 30 mars 2022, 09:06 Merci pour les scripts en dzvent, c'est sympa de voir son travail repris et amélioré par la communauté :-)
hestia a écrit : 29 mars 2022, 23:45 du coup, je ne sais pas la hauteur de la mesure du vent :(
Si tu intérroge une station de particulier, c'est en général à 2 ou 3m du sol. Pour une station officielle (aéroport, etc...) c'est plutôt 10m
Merci pour l'info.
En regardant de plus prêt, je peux savoir assez de précision où se trouvent les stations que j'utilise et avec google maps savoir si c'est une maison ou non.
Dans 2 cas, c'est une maison donc 2 ou 3 m.
Dans un cas il est plus probable que ce soit sur le toit d'un immeuble collectif (3 étages) que sur le parking...donc plus de 10 m
hestia a écrit : 10 janv. 2022, 20:31 Pour le gazon, considère seulement la 1ere couche en réglant sur 234 mm initialement, puis si besoin tu ajusteras en observant si l'arrosage correspond bien au besoin de ton gazon
Merci, avec cette valeur cela paraît plus cohérent par rapport à une mesure avec le doigt :lol:
Dernière modification par Keros le 31 mars 2022, 20:19, modifié 1 fois.
Raison : Merci de grouper les réponses dans un seul message
hestia
Messages : 397
Inscription : 12 sept. 2018, 22:36

Re: Encore un arrosage automatique !

Message par hestia »

@aleph0
j'ai mis en oeuvre l'EVP et le RFU et j'aurais besoin d'avis sur les ordres de grandeurs...
En avril l'EVP est de l'ordre de 3 mm/j, soit 90 mm pour le mois
En mai l'EVP est de l'ordre de 6 mm/j, soit 90 mm pour 15j
Pour la pluie:
avril: 60 mm
mai: 5 mm
Pas d'arrosage
je comprends que le sol a perdu 90 + 90 - 60 - 5 = 115 mm d'eau par m2
Le RFU est passé de plus de 200 à moins de 100

Le RU MAX est à 230 mm

D'après les calculs du script de l'eau nécessaire:
RFU: 102 cb
start_Hs: 25cb
target_Hs: 20cb
wateringNeed_mm: 94.3
wateringNeed_L: 2829.0

Il faut remettre les 100 mm perdus, soit pour 30 m2, 3 m3
c'est toute ma cuve d'eau de pluie :-(

Ces ordres de grandeurs sont-il justes?
Le RFU MAX n'est-il pas trop grand? C'est de la pelouse...

Autre question:
D'où vient le 200 dans cette formule ?
new_Hs=round(200*(1-new_RU/RUmax))
aleph0
Messages : 328
Inscription : 27 avr. 2016, 08:06
Localisation : Hérault (34)

Re: Encore un arrosage automatique !

Message par aleph0 »

Salut !

Pour les ordres de grandeurs de l'EVP, tout dépends de ta localisation et de ta météo, mais les chiffres que tu cites ne me choquent pas. Ci-dessous la mienne pour le centre hérault :Image

Je ne sais pas si tu as implémenté la dernière modif que j'ai publié pour tenir compte du coefficient cultural : La plupart des cultures n'ont besoin que d'une fraction de l'EVP, qui varie au cours de l'année et de leur cycle de croissance. Ceci dit, pour un gazon, il devrait être proche de 1 pour être au mieux de sa forme, par définition même de l'EVP. Ça vaudrait quand même le coup de fouiller la question, ce que je n'ai pas fait n'ayant pas de gazon.

Toujours sur les ordres de grandeur, je te confirme qu'on ne fais pas grand chose avec 3m3. En ce moment je passe ~750l/j pour 160m² de potager bâché. Et en regardant la tête des plantes, je ne suis pas sur-estimé. Si on fait le ratio de surface, ça fait ~4m3/mois pour 30m² ; pour peu qu'on ne soit pas dans la même région ça colle.

Enfin, si tu pense que le script n'est pas ajusté, tu as deux paramètres sur lesquels jouer :
- le RU_max de ton sol (mais ça, je crois que tu l'as déjà ajusté). Il définit la capacité de "l'éponge" que constitue le sol pour retenir les eaux de pluie ou d'arrosage lorsqu'il pleut plus que ne le nécessite les plantes. Si tu trouve que le script met trop de temps pour redémarrer les arrosages après une pluie, diminue le RU_max, s'il redémarre trop vite, augmente le
- le cst_adj qui te permet demander au script d'arroser plus ou moins. cst_adj=1 donnera exactement la quantité calculée ; 1.2 donnera 20% de plus ; 0.8 donnera 20% de moins

Dans la formule new_Hs=round(200*(1-new_RU/RUmax)), le 200 provient de la définition des cb pour mesurer l'humidité du sol : 0 cb=sol saturé ; 200 cb = sol totalement sec (voir p. ex https://www.agriexpo.online/fr/prod/spe ... 51842.html)
hestia
Messages : 397
Inscription : 12 sept. 2018, 22:36

Re: Encore un arrosage automatique !

Message par hestia »

Merci pour ce retour
Pour les ordres de grandeur, je suis près de Paris et donc je constate que c'est cohérent, hier il faisait chaud (entre 20° et 28°, moy = 25°) et j'ai perdu 7,7 mm (EVP), pas de pluie!

Pour le coef cultural, en cherchant rapidement, vu ici http://documentation.2ie-edu.org/cdi2ie ... um_id=2780 "la méthode de Penman-Monteith comme méthode privilégiée d'estimation de ET0 du gazon, et donc pour servir de base à la détermination des coefficients culturaux"
Donc mon gazon pourrait être ma référence

Pour la tête de mon gazon, il n'a pas l'air sec
gazon.png
gazon.png (2.11 Mio) Consulté 3628 fois
et pourtant ça indique dangereusement sec
RFU-cb.png
RFU-cb.png (30.45 Kio) Consulté 3628 fois
Si j'augmente le RU_Max il faut aussi que j'augmente le RFU actuel, sinon ça affiche encore plus sec...
=> calculer une valeur...

Le cst_adj : pas trouvé dans les scripts ni le topic :?:
Si c'est le coef par rapport à la capacité du puits, j'en ai fait un rapide pour ma cuve: je ne prends pas plus d' 1/15 de ce qui reste dans la cuve pour tenir 15 jours... en attendant mieux
aleph0
Messages : 328
Inscription : 27 avr. 2016, 08:06
Localisation : Hérault (34)

Re: Encore un arrosage automatique !

Message par aleph0 »

Ah oui, là c'est pas bon !! Y'a clairement un décalage entre le script et la réalité. As-tu initialisé le RFU actuel à RU_max un jour où tu pouvais observer des flaques d'eau dans ton jardin ? C'est le plus facile pour caler le script sur l'état "saturé". Car il agit comme un bilan apport-pertes, mais à un moment donné il faut l'initialiser sur une valeur connue.

Je viens de voir que le cst_adj est une modif ultérieure que je n'ai pas publiée :? voici l'impact :

script EVP :
  • définir la variable en entête :

Code : Tout sélectionner

local cst_adj=1.0                   -- Coefficient à ajuster pour arroser + ou -
  • Modifier la formule mes_Arr (mesure de l'arrosage) par

Code : Tout sélectionner

mes_Arr=flow_EV1/60*frequency_RFU/surf_EV1/cst_adj
Script Arrosage
  • définir la variable en entête (Attention à rester cohérent entre les 2 scripts, ou alors passer par un device ou une uservariable) :

Code : Tout sélectionner

local cst_adj=1.0                   -- Coefficient à ajuster pour arroser + ou -
  • Modifier la formule de calcul de la durée d'arrosage

Code : Tout sélectionner

val_Duree_EV1=round(coef*cst_adj*DRu*surf_EV1/flow_EV1*3600,0)
Répondre