Encore un arrosage automatique !

Vos échanges, bricolages, idées et questions concernant l'ESP8266, les NodeMCU,Weemos, et consort
hestia
Messages : 36
Enregistré le : 12 sept. 2018, 22:36

Re: Encore un arrosage automatique !

Message par hestia » 13 sept. 2018, 23:38

Bonjour
aleph0, projet impressionnant, surtout avec Penman-Monteith!
Serait-il possible d'avoir un peu plus d'information sur la partie matérielle car ce sont des choix délicats à faire : électrovanne et relai en particulier ; ces composants ont-ils bien résisté?
Serait-il possible d'avoir le code du Wemos également, à moins que ce ne soit sur un autre forum?
Je comprends que le principe se base sur le passé ; cela aurait-il du sens de regarder aussi le futur: je n'arrose pas s'il va bientôt pleuvoir...

Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


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

Re: Encore un arrosage automatique !

Message par aleph0 » 18 sept. 2018, 21:34

Bonsoir !

Concernant les électrovannes, j'ai gardé les rainbirds qui étaient pilotées par mon ancien programmateur avant que je ne domotise l'arrosage. C'est du bon matériel et pas trop cher : A mon potager, j'en ai de cette marque en service depuis plus de 10 ans sans maintenance particulière.
Concernant les relais de commande, j'ai utilisé une carte générique 4 relai de chez banggoods (https://www.banggood.com/5V-4-Channel-R ... 87987.html). J'ai pas beaucoup de recul, ça fonctionne seulement depuis 1.5 ans et pour l'instant ça donne pas de signes de faiblesse.

La wemos marche avec espeasy, je posterai un screenshot de la config ds qqes jours car je ne suis pas à la maison actuellement

Ça se base effectivement sur le passé pour savoir quoi faire. C'est pas trop gênant car le sol agit comme une éponge : Si on arrose juste avant une pluie, le trop d'eau sera retranché de l'arrosage du lendemain, et ça fait pas de mal aux plantes d'avoir un peu plus d'eau que nécessaire de temps en temps !

hestia
Messages : 36
Enregistré le : 12 sept. 2018, 22:36

Re: Encore un arrosage automatique !

Message par hestia » 18 sept. 2018, 23:20

Merci pour la réponse rapide

pour les électrovannes, il existe des "électrovannes normalement fermées" qui se ferment quand il n'y a plus de courant (ce que j'ai compris), je n'ai pas bien vue comment étaient les rainbirds.
J'ai la carte de relais même si ce n'est pas urgent car de moins en moins besoin d'arroser en ce moment. Pas d'urgence donc pour le wemos

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

Re: Encore un arrosage automatique !

Message par aleph0 » 18 sept. 2018, 23:30

Oui, ces vannes d'arrosage existent en deux versions :
- 24v ac normalement fermées, qu'on utilise si on a l'électricité
- 9v DC bistables qu'on utilise sur pile

Pour le projet décrit ici, on utilise les 24v normalement fermées, elles sont plus simples a piloter

Envoyé de mon T5 en utilisant Tapatalk

Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Doudy
Messages : 181
Enregistré le : 07 mai 2016, 17:23

Re: Encore un arrosage automatique !

Message par Doudy » 03 mai 2019, 09:34

Projet très intéressant pour moi
;)
PI 3 = RFXCOM
PI 3 + Touchscreen 7" affichage Domoticz
RFXCOM 433
Domoticz Version: 4.10717 - Python Version: 3.5.3

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

Re: Encore un arrosage automatique !

Message par aleph0 » 06 mai 2019, 21:05

Bonjour à tous

Voilà 3 ans que j'ai domotisé l'arrosage du jardin avec le calcul de l'évapotranspiration pour estimer les besoin en eau des plantes. Le système fonctionne toujours bien, il peut désormais être considérée comme éprouvé. Cette méthode est déjà bien optimisée, mais peut encore être améliorée : l'EVP calculée ici, selon la méthode de Penman-Monteith estime les besoin en eau d'une culture de référence, en l'occurence une pelouse bien entretenue. Selon ce que l'on cultive, les besoins en eau peuvent être différent de cette culture de référence. Dans les calculs, on peut en tenir compte avec ce qu'on appèle le "Coefficient cultural" : il s'agit d'un coefficient entre 0 et 1 qui compare les besoin en eau d'une culture donnée avec la culture de référence pour le calcul de l'EVP. Les coeficients cultureaux pour diverses plantes ont été estimés par le BRL et peuvent être téléchargés ici : https://www.brl.fr/fr/memento-irrigatio ... e-278.html

Problème : Chaque espèce a des besoins spécifiques, mais nous n'avons qu'un ou deux réseaux d'arrosage pour beaucoup plus d'espèces. Il nous faut donc choisir un coefficient moyen, qui conviendra globalement aux différentes plantes.

J'ai synthétisé les coef culturaux du BRL en deux indicateurs : l'un pour le potager, l'autre pour le verger. Dans les graphiques ci-dessous, on voit les coef séparés des différentes cultures, ainsi que la courbe moyenne que j'ai choisi pour chacun d'eux (Kc) :

Image
Image

Si on appelle n le numéro du jour dans l'année, ça nous donne :
Image
En gros, c'est les mêmes courbes mais celle du potager est décalée de 10j...

Une fois ceci déterminé, il est tout simple de l'intégrer au script d'arrosage : Ce sont les lignes 140 à 146 rajoutées au script initial :

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]       -- 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
Voilà ! Bons arrosages optimisés ;-)

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

Re: Encore un arrosage automatique !

Message par garycooper » 23 mai 2019, 21:58

Bonjour aleph0, ton (tes) scripts m'intéressent fortement pour optimiser l'arrosage de mon gazon. Côté matériel, mon arrosage vient du réseau de ville (compteur spécifique pour le jardin sans que l'assainissement ne soit facturé, vu que c'est de l'irrigation). J'ai 4 électrovannes rainbird pilotées par l'intermédiaire d'un sonoff 4ch pro R2 intégré à Domoticz.
Pour la partie "Station météo", je n'ai pas de matériel à proprement parlé donc j'utilise les données issues de l'API DarkSky.
J'ai donc un capteur de luminosité appelé "Lux" (unité UVI), un capteur "Vent" (qui indique la direction du vent et la vitesse en km/h), un capteur "Pluie" (unité mm avec 1 décimale) et les autres données (T°, % humidité, pression atmosphérique) sont indiquées par un capteur appelé "Station Météo".

Pour faire fonctionner ton script "EVP", j'ai donc créé un capteur "Humidite de sol" et interrupteur/commutateur "Arrosage" avec les positions "Auto" ou "Off". Si je souhaite arroser manuellement, soit je lance la scène que j'avais paramétré, soit je pilote directement les électrovannes concernées.
J'ai créé les variables de type chaîne "RFU_lastRain", "RFU_lastEVP" et "RFU_RU".
A chaque lancement de script, j'ai le défaut
2019-05-23 21:55:10.647 Status: LUA: Cd=0.96
2019-05-23 21:55:10.647 Error: EventSystem: in /home/pi/domoticz/scripts/lua/script_time_evaporation.lua: /home/pi/domoticz/scripts/lua/script_time_evaporation.lua:79: attempt to perform arithmetic on field '?' (a string value)
La ligne 79 correspond à

Code : Tout sélectionner

    Rn=otherdevices_svalues[dev_Rn]*0.0079 -- W/m²
Je ne comprends d'où vient le blocage. Pourrais-tu m'indiquer une piste STP ?

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

Re: Encore un arrosage automatique !

Message par aleph0 » 23 mai 2019, 22:40

Ça vient sûrement du fait que mon capteur "Lux" contient un simple nombre et le tien doit être plus complexe. Met un print("lux",otherdevices_svalues[dev_Rn]) juste avant la ligne qui cause l'erreur et poste le résultat, ça nous donneras sûrement une idée

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



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

Re: Encore un arrosage automatique !

Message par garycooper » 24 mai 2019, 20:24

Bonjour aleph0, désolé pour la réponse tardive, je ne m'attendais pas à une réponse si rapide !
J'ai le message d'erreur suivant :

Code : Tout sélectionner

2019-05-24 20:48:09.432 Status: LUA: Cd=0.24
2019-05-24 20:48:09.432 Status: LUA: Lux0.0;0.0
2019-05-24 20:48:09.432 Error: EventSystem: in /home/pi/domoticz/scripts/lua/script_time_evaporation.lua: /home/pi/domoticz/scripts/lua/script_time_evaporation.lua:81: attempt to perform arithmetic on field '?' (a string value)
En sachant que la valeur de Lux indiquée est correcte.

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

Re: Encore un arrosage automatique !

Message par aleph0 » 25 mai 2019, 08:00

C'est bien ce qu'il me semblait : il y'a 2 valeurs dans le capteur Lux, en l'occurrence 0.0 et 0.0. Il faut trouver la signification de chaque valeurs pour savoir laquelle prendre dans le script.

Peux tu refaire la manip de jour pour qu'on ait que chose que 0 ?

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


Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Répondre