Re: Encore un arrosage automatique !
Publié : 25 mars 2021, 10:47
Oops, @garycooper : C'est seulement maintenant que je vois ton message d'avril de l'an dernier
As-tu résolu ton problème depuis tout ce temps ?
Reprenez le contrôle de votre domotique
https://easydomoticz.com/forum/
Code : Tout sélectionner
--[[
Fonctionnement:
+ Le programme calcule la durée d'arrosage nécessaire a chacun des réseaux A,B,C,D une fois
pour toute. La durée de l'arrosage peut atteindre 2h00 ou +
+ Dés détection de la demande d'arrosage manuelle ou planifiée le programme enchaine
l'ouverture et la fermeture des vannes automatiquement dans l'ordre A, B, C, D.
+ En passant l'interrupteur "Arrosage Start" sur OFF l'arrosage en cours s'arrete mais
il redemarrera par le circuit A apres un nouvel appui sur Start ou planifié.
+ La carte 4CH JJX-KG03 a été programmée en mode 3: Verrouillé. Il ne peut y avoir qu'un
seul relai actif en meme temps cad activer l'un désactive automatiquement les 3 autres,
c'est la raison pour laquelle on ne trouve dans le code aucun switchOFF pour les EV.
+ La carte KR2201-A 1CH (220v) a été programmée en mode 3: verrouillage sur 2 boutons séparés
+ L'état des Push on off n'est pas lisible un push on toujours a ON un push off toujours a OFF
+ Le timer se recale automatiquement à minute pleine hh:mm:00 ce qui veut dire qu'une durée
d'arrosage WateringTime de 60s peut en fait durer 119s.
--]]
return {
on = {
timer = { "every minute" }, -- Le timer s'active à hh:mm:00 toutes les minutes
variables = { "Etat Arrosage" } },
data = {
-- Variables globales persistentes mémorisant l'heure de début d'arrosage
-- -1= arrosage jamais démarré; 0= arrosage terminé; 'autre'= arrosage en cours;
TimeStartA = { initial = -1 },
TimeStartB = { initial = -1 },
TimeStartC = { initial = -1 },
TimeStartD = { initial = -1 },
-- Variables durée d'arrosage en secondes 60 étant le minimum
WateringTimeA= { initial= 300 }, -- en secondes 20mn = 1200
WateringTimeB= { initial= 300 },
WateringTimeC= { initial= 300 },
WateringTimeD= { initial= 300 } },
logging = {
-- level = domoticz.LOG_DEBUG, -- Seulement un niveau peut être actif; commenter les autres
-- level = domoticz.LOG_INFO,
-- level = domoticz.LOG_ERROR,
-- level = domoticz.LOG_DEBUG,
-- level = domoticz.LOG_MODULE_EXEC_INFO,
marker = '==>' },
execute = function(dz, item)
local function logWrite(str)
if str == 'TimeStart' then
dz.log('TimeStartA '.. dz.data.TimeStartA)
dz.log('TimeStartB '.. dz.data.TimeStartB)
dz.log('TimeStartC '.. dz.data.TimeStartC)
dz.log('TimeStartD '.. dz.data.TimeStartD)
end
end
local dev_Hs="Humidité du sol" -- Capteur d'humidité du sol
-- Constantes
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 RUmax= 320
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 ratioB= 1 -- Ratios à adapter en fonction de la taille de
local ratioC= 1 -- chacune des parcelles à arroser
local ratioD= 1
local t= 0
if (dz.variables('Etat Arrosage').value == 'En cours') then
if (dz.data.TimeStartA == -1) then
-- Calcul du temps d'Arrosage
-- ne DOIT etre executé qu'une fois durant toute la période d'arrosage
print("Calcul de la durée d'arrosage")
val_Hs= dz.devices('Humidité du sol').moisture -- de la parcelle de reference
dz.log("Humidité du sol "..val_Hs.." cb")
if val_Hs>=start_Hs then
-- calcul du quota d'arrosage nécessaire pour passer de val_Hs à target_Hs
DRu= (val_Hs-target_Hs)/200 * RUmax -- Apport théorique d'eau en mm
print("Apport théorique "..DRu.." mm")
-- Durées d'arrosage de chacune des parcelles en secondes
dz.data.WateringTimeA= dz.utils.round(DRu*surf_EV1/flow_EV1*3600)
dz.data.WateringTimeB= dz.data.WateringTimeA * ratioB
dz.data.WateringTimeC= dz.data.WateringTimeA * ratioC
dz.data.WateringTimeD= dz.data.WateringTimeA * ratioD
else
print("Sol suffisament humide ; inutile d'arroser")
dz.variables('Etat Arrosage').set ('Terminé')
return
end
-- Arrosage accepté
-- on attend 2 secondes que le 220v soit présent sur K2 avant de demarrer l'arrosage
dz.devices('Arrosage circuit A').switchOn().afterSec(2) -- arrosage en cours
dz.data.TimeStartA = os.time()
elseif (dz.data.TimeStartA > 0) then
t = os.difftime(os.time(), dz.data.TimeStartA)
print('Arrosage circuit A en cours depuis : ' .. dz.utils.round(t) .. '/'..dz.data.WateringTimeA..' secondes')
if (t >= dz.data.WateringTimeA) then
-- Le timer à claqué: Arret arrosage circuitA
dz.data.TimeStartA = 0
end
end -- StartA
-- arrosage B ne peut démarrer que si A est terminé
if (dz.data.TimeStartB == -1) and (dz.data.TimeStartA == 0) then
-- Début arrosage demandé
dz.data.TimeStartB = os.time()
dz.devices('Arrosage circuit B').switchOn() -- arrosage en cours
elseif (dz.data.TimeStartB > 0) then
t = os.difftime(os.time(), dz.data.TimeStartB)
print('Arrosage circuit B en cours depuis : ' .. dz.utils.round(t) .. '/'..dz.data.WateringTimeB..' secondes')
if (t >= dz.data.WateringTimeB) then
-- Le timer à claqué: Arret arrosage Arret arrosage circuitB
dz.data.TimeStartB = 0
end
end -- StartB
if (dz.data.TimeStartC == -1) and (dz.data.TimeStartB == 0) then
-- Début arrosage demandé
dz.data.TimeStartC = os.time()
dz.devices('Arrosage circuit C').switchOn() -- arrosage en cours
elseif (dz.data.TimeStartC > 0) then
t = os.difftime(os.time(), dz.data.TimeStartC)
print('Arrosage circuit C en cours depuis : ' .. dz.utils.round(t) ..'/'..dz.data.WateringTimeC..' secondes')
if (t >= dz.data.WateringTimeC) then
-- Le timer à claqué: Arret arrosage Arret arrosage circuitC
dz.data.TimeStartC = 0
end
end-- StartC
if (dz.data.TimeStartD == -1) and (dz.data.TimeStartC == 0) then
-- Début arrosage demandé
dz.data.TimeStartD = os.time()
dz.devices('Arrosage circuit D').switchOn() -- arrosage en cours
elseif (dz.data.TimeStartD > 0) then
t = os.difftime(os.time(), dz.data.TimeStartD)
print('Arrosage circuit D en cours depuis : ' .. dz.utils.round(t) .. '/'..dz.data.WateringTimeD..' secondes')
if (t >= dz.data.WateringTimeD) then
dz.data.TimeStartD = 0
-- la séquence d'arrosage est TERMINEE
dz.devices('Arrosage Stop').switchOff() -- coupure du 24v arret arrosage circuitD
dz.variables('Etat Arrosage').set ('Terminé')
end
end -- StartD
--logWrite('TimeStart')
end -- état en cours
if (dz.variables('Etat Arrosage').value == 'Terminé') then
-- l'inter d'arrosage est passé a OFF soit Arret d’urgence ou séquence d’arrosage terminée
-- Le relai alim coupe le 24v des EV et éteind la LED "en service"
dz.data.initialize ('TimeStartA') -- retour a la valeur -1
dz.data.initialize ('TimeStartB')
dz.data.initialize ('TimeStartC')
dz.data.initialize ('TimeStartD')
--logWrite('TimeStart')
end -- état Terminé
end -- execute
}
Code : Tout sélectionner
--[[
Script pour gérer l arrosage automatique
Modes :
- Off : Ne fais rien
- Manu : Arrose inconditionnellement selon la scène "arrosage"
- Auto : Arrose en fonction de l'humidité du sol
Les ordres d ouverture des électrovannes se font successivement
--]]
-- Paramètres
local dev_Modes="Mode arrosage" -- Sélecteur du mode d'arrosage (Off/Manu/Auto)
local scene="Arrosage" -- Scène avec programmation d'une séquence d'arrosage
local prg_arrosage="Programmateur arrosage" -- Switch de plage de programmation de l'arrosage
local dev_EVA="Zone A" -- Electrovanne maître (Celle avec qui le RFU est calculé)
local dev_EVB="Zone B" -- Electrovanne d arrosage zone B
local dev_EVC="Zone C" -- Electrovanne d arrosage zone C
local dev_EVD="Zone D" -- Electrovanne d arrosage zone D
local murier="Murier" -- Electrovanne arrosage murier
local bananier="Bananier" -- Electrovanne arrosage bananier
local aromatiques="Plantes aromatiques" -- Electrovanne plantes aromatiques
local dev_Hs="Humidite 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 val_Duree_bananier=600 -- Durée d'arrosage du bananier (ici 10 min) en secondes
local val_Duree_murier=420 -- Durée d'arrosage du murier (ici 7 min) en secondes
local val_Duree_aromatiques=420 -- Durée d'arrosage des plantes aromatiques (ici 7 min) en secondes
local flow_EVA=2580 -- Débit du circuit zone A en l/h
local surf_EVA=110 -- surface arrosée par l électrovanne A, en m²
local flow_EVB=2460 -- Débit du circuit zone B en l/h
local surf_EVB=110 -- surface arrosée par l électrovanne B, en m²
local flow_EVC=3180 -- Débit du circuit zone C en l/h
local surf_EVC=110 -- surface arrosée par l électrovanne C, en m²
local flow_EVD=600 -- Débit du circuit zone D en l/h
local surf_EVD=40 -- surface arrosée par l électrovanne D, en m²
local RUmax=270 -- (maximum 270mm de stockable dans le sol)
-- Variables internes
local debug=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
--------------------------------------------------------------------------------
-- Fin bibliothèque de fonctions --
--------------------------------------------------------------------------------
commandArray = {}
-- Gestion de l'arrosage
-- Si le mode d'arrosage est mis sur Manu, déclenchement d une scène d arrosage puis, chaque électrovanne sera gérée manuellement
if devicechanged[dev_Modes] == 'Manu' then
print("Declenchement d'une scene d arrosage automatique")
commandArray['Scene:Arrosage']='On'
end
-- Si le mode d'arrosage est mis sur Off, cela referme toute électrovanne ouverte ou arrête toute pompe ES
if (otherdevices[dev_Modes] == 'Off') and
((otherdevices[dev_EVA] == 'On') or (otherdevices[dev_EVB] == 'On') or (otherdevices[dev_EVC] == 'On') or (otherdevices[dev_EVD] == 'On')) then
print("Mise a l arret de l arrosage")
commandArray[dev_EVA]='Off'
commandArray[dev_EVB]='Off'
commandArray[dev_EVC]='Off'
commandArray[dev_EVD]='Off'
commandArray[murier]='Off'
commandArray[bananier]='Off'
end
if (otherdevices[dev_Modes]=="Auto") and (devicechanged[prg_arrosage] == 'On') then
print("Arrosage demande en automatique")
val_Hs=tonumber(otherdevices[dev_Hs])
print("Humidite du sol "..val_Hs.." cb")
if val_Hs<=start_Hs then
print("Sol suffisament humide ; inutile d'arroser")
else
-- calcul de la durée d'arrosage nécessaire pour passer de val_Hs à target_Hs
DRu=(val_Hs-target_Hs)/200*RUmax
val_Duree_EVA=round(DRu*surf_EVA/flow_EVA*3600,0)
val_Duree_EVB=round(DRu*surf_EVB/flow_EVB*3600,0)
val_Duree_EVC=round(DRu*surf_EVC/flow_EVB*3600,0)
val_Duree_EVD=round(DRu*surf_EVD/flow_EVB*3600,0)
if debug==1 then
print("Apport theorique "..DRu.." mm")
print("Arrosage de la zone A pendant "..val_Duree_EVA.." sec")
print("Arrosage de la zone B pendant "..val_Duree_EVB.." sec")
print("Arrosage de la zone C pendant "..val_Duree_EVC.." sec")
print("Arrosage de la zone D pendant "..val_Duree_EVD.." sec")
print("Arrosage du bananier pendant "..val_Duree_bananier.." sec")
print("Arrosage du murier pendant "..val_Duree_murier.." sec")
print("Arrosage des plantes aromatiques pendant "..val_Duree_aromatiques.." sec")
end
--[[
Sur mon installation, les électrovannes doivent être ouvertes
séparément car il n'y a pas assez de débit disponible pour ouvrir les 7 électrovannes
--]]
local tempo1=val_Duree_EVA+val_Duree_EVB
local tempo2=tempo1+val_Duree_EVC
local tempo3=tempo2+val_Duree_EVD
local tempo4=tempo3+val_Duree_bananier
local tempo5=tempo4+val_Duree_murier
local tempo6=tempo4+val_Duree_aromatiques
commandArray[1] = {[dev_EVA] = 'On'} -- Ouvre l'électrovanne A
commandArray[2] = {[dev_EVA] = 'Off AFTER ' .. val_Duree_EVA} -- Referme l'électrovanne A après la durée calculée pour la zone A
commandArray[3] = {[dev_EVB] = 'On AFTER ' .. val_Duree_EVA} -- Ouvre l'électrovanne B après la fermeture de l électrovanne A
commandArray[4] = {[dev_EVB] = 'Off AFTER ' .. tempo1} -- Referme l'électrovanne B après la durée calculée pour la zone B
commandArray[5] = {[dev_EVC] = 'On AFTER ' .. tempo1} -- Ouvre l'électrovanne C après la fermeture de l électrovanne B
commandArray[6] = {[dev_EVC] = 'Off AFTER ' .. tempo2} -- Referme l'électrovanne C après la durée calculée pour la zone C
commandArray[7] = {[dev_EVD] = 'On AFTER ' .. tempo2} -- Ouvre l'électrovanne D après la fermeture de l électrovanne C
commandArray[8] = {[dev_EVD] = 'Off AFTER ' .. tempo3} -- Referme l'électrovanne D après la durée calculée pour la zone pour la zone D
commandArray[9] = {[bananier] = 'On AFTER ' .. tempo3} -- Ouvre l'électrovanne du bananier après la fermeture de l électrovanne D
commandArray[10] = {[bananier] = 'Off AFTER ' .. tempo4} -- Referme l'électrovanne du bananier après la durée définie
commandArray[11] = {[murier] = 'On AFTER ' .. tempo4} -- Ouvre l'électrovanne du murier après la fermeture de l électrovanne du bananier
commandArray[12] = {[aromatiques] = 'On AFTER ' .. tempo4} -- Ouvre l'électrovanne des plantes aromatiques après la fermeture de l électrovanne du bananier
commandArray[13] = {[aromatiques] = 'Off AFTER ' .. tempo6} -- Referme l'électrovanne des plantes aromatiques après la durée définie
commandArray[14] = {[murier] = 'Off AFTER ' .. tempo5} -- Referme l'électrovanne du murier après la durée définie
commandArray[15] = {[prg_arrosage] = 'Off AFTER ' .. tempo6} -- Passe le switch de programmateur d arrosage à Off
end
end
return commandArray
Code : Tout sélectionner
local prg_arrosage = 'Programmateur arrosage'
-- retourne le mois en cours
local mois = os.date("%m")
-- retourne le jour actuel
local days = {"dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"}
local jour = days[(os.date("%w")+1)]
-- retourne l'heure actuelle ex: "12:45"
local heure = string.sub(os.date("%X"), 1, 5)
local ete = mois >= '3' and mois < '10'
local heure_arros = heure >= '06:00' and heure < '07:00'
commandArray = {}
if (otherdevices['Mode arrosage'] == 'Auto') and ete and heure_arros then
commandArray[prg_arrosage]='On'
end
if not heure_arros then
commandArray[prg_arrosage] = 'Off'
end
return commandArray
Code : Tout sélectionner
temps = os.date("*t") --produces the table {year = 1998, month = 9, day = 16, yday = 259, wday = 4, hour = 23, min = 48, sec = 10, isdst = false}
mois=temps.month
local days = {"dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"}
local jour = days[temps.wday+1]
heure=temps.hour
bonjour aleph0aleph0 a écrit : 02 févr. 2017, 23:12 [...]
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é.
[...]