Encore un arrosage automatique !

Vos échanges, bricolages, idées et questions concernant l'ESP8266, les NodeMCU,Weemos, et consort
aleph0
Messages : 226
Enregistré le : 27 avr. 2016, 08:06
Localisation : Hérault (34)

Encore un arrosage automatique !

Message par aleph0 » 02 févr. 2017, 23:01

Bonjour à tous !

Je viens de domotiser l'arrosage du jardin, et je voudrais partager ça avec vous. Mon jardin est actuellement équipé de 2 réseaux d'arrosages avec des électrovannes 24v pilotées par un programmateur rainbird, alimentées par un surpresseur pompant dans un puit. Je souhaitais l'intégrer sous domoticz pour pouvoir tenir compte de la méteo de manière à économiser l'eau en été.

Image

Le cahier des charges est le suivant :
1 Estimer l'humidité du sol sur la base de l'évapotranspiration, de la pluie et de l'arrosage. J'ai en effet de gros doutes sur la fiabilité des capteurs d'humidités pas cher pour arduino, et les capteurs professionnels sont trop cher pour moi. J'ai donc mis en place la méthode de calcul de Penman-Monteith telle que décrite ici http://edis.ifas.ufl.edu/pdffiles/ae/ae45900.pdf qui permet d'estimer l'humidité du sol sur la base de données météo
2 Suivre le niveau du puit (HC-SR04)
3 Déclencher l'arrosage si besoin et calculer la durée d'arrosage en fonction de l'humidité du sol et de la quantité d'eau restante dans le puit
4 Estimer la quantité d'eau pompée (FS400A ; 1 pouce, 0..3,6m3/h)
5 Assurer la sécurité anti-désamorçage de la pompe
6 S'assurer de pouvoir couper l'arrosage en cas de perte de contact avec domoticz pendant l'arrosage
7 (bonus) assurer un mode dégradé d'arrosage par timer en cas de perte de contact prolongée avec domoticz (l

Pour les fonctions 6 et 7, j'ai choisi de commander les électrovannes par une wemos d1 utilisant esp-easy. La fonction Longpulse permet à domoticz d'envoyer dans le même message l'ordre d'ouverture et de fermeture à la wemos. En cas de plantage ultérieur de domoticz, la wemoz sais déjà quand fermer les vannes.

Pour la fonction 5, on ira lire l'état du contacteur de pompe avec un contact auxiliaire et on le comparera au débitmètre. Si le débit reste faible pendant trop longtemps alors que la pompe tourne, on activera un relai coupant l'alimentation de la pompe

Voici un détail du circuit réalisé :
Image

Image

Détail du breadboard :
Image

Capteur de niveau :
Image

Boîtier final sans l'alimentation :
Image
Modifié en dernier par aleph0 le 04 avr. 2017, 14:22, modifié 3 fois.

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 » 02 févr. 2017, 23:12

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 :

Image

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 :

Image

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
Modifié en dernier par aleph0 le 31 mars 2017, 22:42, modifié 1 fois.

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

Re: Encore un arrosage automatique !

Message par aleph0 » 31 mars 2017, 22:41

Il y a bien longtemps que j'ai commencé ce fil, et que je ne l'ai pas fini ! L'été approchant, peut-être il intéressera des gens !

Voici donc le script qui gère les électrovannes. Le principe est le suivant :

On implémente 3 mode : Off, Manu et Auto, que l'on peut voir sur le screenshot du premier post
- En mode Off, on ne fait rien et si on passe sur Off pendant un arrosage, on ferme immédiatement les vannes
- En mode Manu, lors d'un appui sur le bouton "Arrosage", on déclenche immédiatement un arrosage pour la durée spécifiée dans le thermostat "Durée arrosage manu (min)" Ben oui, je n'ai trouvé que les thermostat pour pouvoir rentrer une consigne :( Si quelqu'un à une idée pour pouvoir changer l'unité, ou faire ça mieux ?
- En mode Auto, un planning active le bouton "Arrosage" tous les jours au coucher du soleil. Mais l'ouverture des vannes n'est déclenchée que si l'humidité du sol est en dessous d'un seuil, et pour une durée calculée pour ramener l'humidité sur une valeur cible. Ces deux valeurs sont à adapter à votre sol et vos plantes. Pour commencer, j'ai mis 25cb pour commencer l'arrosage et 20cb comme valeur cible. On verra cet été pour le régler plus finement !

Pour pouvoir calculer le temps d'arrosage en fonction des seuils d'humidité, on a besoin de connaître le débit d'eau du réseau principal, ainsi que la surface arrosée par ce réseau.

Enfin, comme j'arrose soit depuis un puit, soit depuis l'eau de ville, j'ai mis en place un sélecteur de source (Puit/Village) pour que domoticz puisse rationner l'eau de puit si jamais il est trop bas

Script device :

Code : Tout sélectionner

--[[ 
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
Ah, j'oubliais : Quand on passe de Auto à Manu, ça désactive le planning, et inversement, ça le réactive...
Modifié en dernier par aleph0 le 04 avr. 2017, 14:49, modifié 2 fois.

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

Re: Encore un arrosage automatique !

Message par aleph0 » 31 mars 2017, 22:45

Et pour finir, le script qui gère le niveau du puit :

- Calcul du niveau moyen sur 10 min
- Élimination des mesures manifestement incorrectes
- Active la sécurité pompe si le niveau est trop bas :

Scrip device :

Code : Tout sélectionner

-- Script pour afficher le niveau du puit en % (100%=plein)
-- en prenant la valeur moyenne des mesures sur 10min

local dev_Ncm="Niveau Puit"         -- Niveau en cm
local dev_Npc="Remplissage Puit"    -- Niveau en %

local dev_SP="Sécurité pompe"       -- Sécurité pompe (On=arrêt pompe)
local var_Ncm="old_puit"            -- Variable stockant le niveau du puit précédent
local ect_Ncm=10                    -- variation de niveau tolérée entre 2 mesures en cm (1min d'intervale)
                                    -- En pompage, la variation réelle ne peut pas excéder 4cm/min
                                    -- A voir le remplissage en période de grosse averses

local Nmin=335  -- Niveau min du puit en cm
local Nbas=325  -- Niveau du puit pour activer la sécurité pompe
local Nmax=40   -- Niveau max du puit en cm. Il s'agit du niveau du trop plein
                -- en cas de fortes pluies, le niveau peut dépasser le trop plein
                -- on en tiens compte dans les tolérances.

local debug = 0
local CmdIdx=1

commandArray = {}

-- Calcul du remplissage du puit
if devicechanged[dev_Ncm] then
    val_Ncm=tonumber(otherdevices_svalues[dev_Ncm])
    old_Ncm=uservariables[var_Ncm]
    
    if debug == 1 then
        print("Niveau puit actuel "..val_Ncm.." cm")
        print("Ancien niveau puit "..old_Ncm.." cm")
    end
    
    -- On ne prends en compte une mesure du niveau du puit que si elle est
    -- comprise entre le niveau min et le niveau max (avec une tolérance)
    -- et si la variation entre 2 mesures successive est < ect_Ncm
    if val_Ncm>=Nmax-10 and val_Ncm<=Nmin+1 and math.abs(val_Ncm-old_Ncm)<=ect_Ncm then
        val_Npc=100*(1-(val_Ncm-Nmax)/(Nmin-Nmax))
        old_Npc=tonumber(otherdevices_svalues[dev_Npc])
        
        if debug == 1 then 
            print("Ancien puit "..old_Npc.." %")
            print("Remplissage puit "..val_Npc.." %")
        end
        
        -- On prends la moyenne glissante sur 10min
        commandArray[CmdIdx] = {['UpdateDevice'] = tostring(otherdevices_idx[dev_Npc]).."|0|"..tostring((val_Npc+9*old_Npc)/10)}
        CmdIdx=CmdIdx+1
        commandArray[CmdIdx] = {['Variable:'..var_Ncm] = tostring(val_Ncm)}; CmdIdx=CmdIdx+1
        
        -- Si le puis est plus bas que Nbas, on active la sécurité pompe pour éviter le désamorçage
        if val_Ncm>=Nbas and otherdevices[dev_SP]=="Off" then
            print("Niveau puit trop bas, activation de la sécurité pompe")
            commandArray[CmdIdx] = {[dev_SP] = 'On'}; CmdIdx=CmdIdx+1
        end
    else
        print("Erreur : Niveau puit hors limites, pas de mise à jour du remplissage")
        print("Mesure actuelle   "..val_Ncm.." cm")
        print("Mesure précédente "..old_Ncm.." cm")
    end
end

return commandArray


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.


stephdes
Messages : 263
Enregistré le : 06 oct. 2016, 20:50

Re: Encore un arrosage automatique !

Message par stephdes » 03 avr. 2017, 15:26

Salut Aleph0 !

Super projet et beaucoup d'infos dans tes postes. Je te remercie vivement pour tout. Je pense que cela va me servir comme base pour un projet de gestion d'eau également.

A bientôt ! ;)
MiniPC W10 + RFXCom 433e Ext1013 + RFLINK R45; 1 temp Bresser + 4 Banggood, lumières+volets+prises:Blyss
Autre modules volets chinois - RM Mini3 + RM PRO 2
Conso élec : OWL 180+ -- 2 Wattmètres OTIO
Imperihome+Sarah+MDAH+Domoticz (merci easydomoticz !)

godinperson
Messages : 1
Enregistré le : 08 juin 2017, 21:41

Re: Encore un arrosage automatique !

Message par godinperson » 08 juin 2017, 21:51

Intense ton projet. Je vais m'y référer.

Je veux m'installer une petite serre et contrôler l'humidité et la température par domoticz ainsi que possiblement l'arrosage. Je commences le tout vers le milieu de l'été

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

Re: Encore un arrosage automatique !

Message par aleph0 » 10 juin 2017, 16:55

Content que ça te serve !

Méfie toi quand même que la formule que j'utilise pour l'évaporation est valable pour une culture en plein champ ; je suis pas sûr du tout que l'évaporation d'une plante en serre soit similaire !

gawel3164
Messages : 266
Enregistré le : 07 janv. 2016, 19:51

Re: Encore un arrosage automatique !

Message par gawel3164 » 06 juil. 2017, 09:26

j'ai une installation ressemblant à la tienne pour mon arrosage, mais je ne connaissais pas la fonction Longpulse. Merci de me l'avoir faite découvrir, car très utile dans ce cas là! ;)
Domoticz 4.10717/RFlink V1.1_R48/ prises: DIO, SCS/caméras IP/station météo Auriol/sondes Oregon/PIR/ZK1PA/Relevé compteur Gaz/téléinfo EDF/Mysensors:RGB-3D,Temp.,IR/Arrosage autonome/Google home/ ESP: IR,Temp.,relai,distance,OLED/Withings Ws30

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

Re: Encore un arrosage automatique !

Message par garycooper » 08 août 2017, 00:09

Salut aleph, je suis en pleine construction d'un projet similaire mais en raspberry (premier projet). J'arrive à commander la carte relais en ssh et maintenant, je vais essayer de faire la programmation dans domoticz. J'ai un réseau d'arrosage enterré connecté au réseau de ville (compteur de jardin donc pas d'assainissement à payer dessus), j'ai donc simplement 4 électrovannes à faire ouvrir à heure fixe sauf si de la pluie est annoncée dans les heures à venir.
Je cherche un script en. py donc si quelqu'un à ça sous le coude, ce serait sympa.
De même, je n'arrive pas à recevoir mon code API avec weather underground. Si quelqu'un a la soluce 8-)
Merci pour votre aide

Le ptit Nicolas
Messages : 89
Enregistré le : 24 janv. 2017, 14:21
Localisation : 31
Contact :

Re: Encore un arrosage automatique !

Message par Le ptit Nicolas » 10 août 2017, 11:16

Pour le capteur de niveau, il ne vaudrait mieux pas un JSN-SR04T pour avoir moins de problème d'humidité :
Image
La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.
Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi ! Les Shadocks

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