Auto garden irrigation
Posted: Friday 26 August 2016 8:12
I made a LUA script to automatically irrigate your garden when it hasn't rained for a few days.
Everything can be adjusted with user variables, how many dry days (from 1-7), the maximum rainfall in those days, the irrigation time and period, the months it needs to run and the minimum temperature. It uses weather underground and saves the amount of rain during the day at the end of the day itself.
The script is working fine and gives a notification during the day that it is going to irrigate the garden, it also gives a notification when irrigation has started. You can enable and disable the notification with a user variable.
I haven't got the garden irrigation my self yet(using a dummy switch atm ), but will arrange that next season (just moved to this house )
But if someone can use my script, it's dutch but I think it might be understandable for other languages, here it is: (use a script_time_xxxx for it)
I'll keep the start topic up to date when I made any changes to it
Everything can be adjusted with user variables, how many dry days (from 1-7), the maximum rainfall in those days, the irrigation time and period, the months it needs to run and the minimum temperature. It uses weather underground and saves the amount of rain during the day at the end of the day itself.
The script is working fine and gives a notification during the day that it is going to irrigate the garden, it also gives a notification when irrigation has started. You can enable and disable the notification with a user variable.
I haven't got the garden irrigation my self yet(using a dummy switch atm ), but will arrange that next season (just moved to this house )
But if someone can use my script, it's dutch but I think it might be understandable for other languages, here it is: (use a script_time_xxxx for it)
Code: Select all
-- Script om te bepalen of de tuin gesproeid dient te worden omdat het lang droog geweest is in de zomer! --
---------------------------------------------------------------------------------------------------------------------------------------------------
-- Aangemaakt op 05-07-2016 door Martijn --
versie = "0.4" -- Versie 08-07-2016
---------------------------------------------------------------------------------------------------------------------------------------------------
-- Laatste wijzigingen:
-- Aan de hand van weersvoorspelling en vochtigheid kan dit script het sproeien met 1 dag uitstellen
-- Aantal droge dagen waarna gesproeid kan worden kan nu worden ingesteld, tot een maximum van 7
--
---------------------------------------------------------------------------------------------------------------------------------------------------
--
-- Aan te maken user variables:
-- SPROEI_dagteller - integer - 0 ; teller om aantal mm per dag bij te houden
-- SPROEI_aantaldagen - integer - 5 ; aantal droge dagen waarna gesproeid moet worden - Max is 7!
-- SPROEI_sproeitijd - string - 19:00 ; tijd waarop sproeier moet beginnen
-- SPROEI_sproeiminuten - integer - 30 ; aantal minuten dat sproeier actief moet zijn, per dag
-- SPROEI_aantalmm - integer - 2 ; maximum aantal mm regen afgelopen 5 dagen
-- SPROEI_minimumbuitentemp - integer - 18 ; Minimum buitentemperatuur op ingesteld sproeitijd waarbij er gesproeid mag worden (niet sproeien bij koude dagen!!)
-- SPROEI_devicetemp - string - Wu Wind ; Weather Underground windmeter naam dient hier ingevuld te worden
-- SPROEI_devicerain - string - Wu Rain ; Weather Underground regenmeter naam dient hier ingevuld te worden
-- SPROEI_deviceweather - string - Wu Weather ; Weather Underground geeft weersvoorspelling af
-- SPROEI_schakelaar - string - Tuin sproeien ; Benaming van schakelaar waarmee sproeier actief wordt
-- SPROEI_dag1 - integer - 1 ; Database waarde waarin opgeslagen wordt hoeveel mm regen er die dag is gevallen, wordt elke 5 dagen dus veranderd!
-- SPROEI_dag2 - integer - 1 ; Database waarde waarin opgeslagen wordt hoeveel mm regen er die dag is gevallen, wordt elke 5 dagen dus veranderd!
-- SPROEI_dag3 - integer - 1 ; Database waarde waarin opgeslagen wordt hoeveel mm regen er die dag is gevallen, wordt elke 5 dagen dus veranderd!
-- SPROEI_dag4 - integer - 1 ; Database waarde waarin opgeslagen wordt hoeveel mm regen er die dag is gevallen, wordt elke 5 dagen dus veranderd!
-- SPROEI_dag5 - integer - 1 ; Database waarde waarin opgeslagen wordt hoeveel mm regen er die dag is gevallen, wordt elke 5 dagen dus veranderd!
-- SPROEI_dag6 - integer - 1 ; Database waarde waarin opgeslagen wordt hoeveel mm regen er die dag is gevallen, wordt elke 5 dagen dus veranderd!
-- SPROEI_dag7 - integer - 1 ; Database waarde waarin opgeslagen wordt hoeveel mm regen er die dag is gevallen, wordt elke 5 dagen dus veranderd!
-- SPROEI_notification - integer - 1 ; Notificatie aan en uitzetten
-- SPROEI_beginmaand - integer - 5 ; Eerste maand waarin sproeiscript actief moet zijn
-- SPROEI_eindmaand - integer - 9 ; Laatste maand waarin sproeiscript actief moet zijn
--
package.path = package.path .. ';' .. '/home/pi/domoticz/scripts/lua/?.lua'
My = require('MyFunc')
--
-- User variables inlezen: --
dagteller = My.GetUserVar("SPROEI_dagteller")
sproeiaantaldagen = My.GetUserVar("SPROEI_aantaldagen")
sproeitijd = My.GetUserVar("SPROEI_sproeitijd")
sproeiminuten = My.GetUserVar("SPROEI_sproeiminuten")
sproeiaantalmm = My.GetUserVar("SPROEI_sproeiaantalmm")
minimumbuitentemp = My.GetUserVar("SPROEI_minimumbuitentemp")
devicetemp = My.GetUserVar("SPROEI_devicetemp")
devicerain = My.GetUserVar("SPROEI_devicerain")
deviceweather = My.GetUserVar("SPROEI_deviceweather")
notification = My.GetUserVar("SPROEI_notification")
beginmaand = My.GetUserVar("SPROEI_beginmaand")
eindmaand = My.GetUserVar("SPROEI_eindmaand")
-- Buitentemperatuur bepalen --
Wu_Dev_Temp = otherdevices_svalues[devicetemp]
buitentemperatuur = My.GetValue(Wu_Dev_Temp,5)
-- Benaming schakelaar wat de sproeier activeert --
schakelaar = My.GetUserVar("SPROEI_schakelaar")
--
commandArray = {}
print ("______________________________________________________________________")
-- Als er nu gesproeid worden, aantal minuten tellen en de rest overslaan --
if (otherdevices[schakelaar] == 'On') then
tijdverschil = My.Round(My.TimeDiff(os.time(),otherdevices_lastupdate[schakelaar])/60,0)
if tijdverschil == sproeiminuten then
print("Sproeien is gereed en sproeier zal weer uitgeschakeld worden!")
commandArray[schakelaar] = 'Off'
goto einde
end
print("Bezig met sproeien! Aantal minuten te gaan: " .. sproeiminuten-tijdverschil .. ".")
goto einde
end
--
print ("Tuinsproeiscript by Martijn, versie " .. versie .. ".")
-- Bepalen of we in de sproeimaanden zitten: --
if (tonumber(os.date("%m")) < beginmaand) or (tonumber(os.date("%m")) > eindmaand) then
print ("Tuinsproeiscript is niet actief, buiten sproeiseizoen!")
goto einde
end
--
-- Weersvoorspelling gebruiken om te bepalen of er vandaag gesproeid moet worden: --
sTempCurrent, sHumidity, sHumidityStatus, sPressure, sForecast = otherdevices_svalues[deviceweather]:match("([^;]+);([^;]+);([^;]+);([^;]+);([^;]+)")
sForecast = tonumber(sForecast);
sHumidity = tonumber(sHumidity);
sHumidityStatus = tonumber(sHumidityStatus);
-- Forecast heeft status nummmers, de volgende statuswaardes worden hieraan gekoppeld: --
if sForecast == 0 then
voorspelling = "Geen info"
end
if sForecast == 1 then
voorspelling = "Zonnig"
end
if sForecast == 2 then
voorspelling = "Deels bewolkt"
end
if sForecast == 3 then
voorspelling = "Bewolkt"
end
if sForecast == 4 then
voorspelling = "Regen"
end
if sForecast > 4 then
voorspelling = "Onbekend"
end
print("Weersvoorspelling is: " .. voorspelling .. ". Vochtigheidspercentage is: " .. sHumidity .. "%.");
--
-- Vochtigheidsstatus heeft status nummmers, de volgende statuswaardes worden hieraan gekoppeld: --
if sHumidityStatus == 0 then
vochtigheid = "Normaal"
end
if sHumidityStatus == 1 then
vochtigheid = "Comfortabel"
end
if sHumidityStatus == 2 then
vochtigheid = "Droog"
end
if sHumidityStatus == 3 then
vochtigheid = "Vochtig"
end
if sHumidityStatus > 3 then
vochtigheid = "Onbekend"
end
print("Status vochtigheid is: " .. vochtigheid .. ".");
--
-- Aantal mm regen van vadaag ophalen: --
sRainmeterCurrent, sRainmeterTotal = otherdevices_svalues[devicerain]:match("([^;]+);([^;]+)")
sRainmeterTotal = tonumber(sRainmeterTotal);
print("Totale hoeveelheid regen vandaag is: " .. sRainmeterTotal .. "mm. ");
--
-- Zodra het 23.55u is -> opslaan hoeveel mm regen er vandaag is gevallen --
if os.date("%H:%M") == "23:55" then
-- Dagteller eerst tellen: --
dagteller = dagteller+1
if dagteller == 1 then
commandArray['Variable:SPROEI_dag1'] = tostring(sRainmeterTotal);
end
if dagteller == 2 then
commandArray['Variable:SPROEI_dag2'] = tostring(sRainmeterTotal);
end
if dagteller == 3 then
commandArray['Variable:SPROEI_dag3'] = tostring(sRainmeterTotal);
end
if dagteller == 4 then
commandArray['Variable:SPROEI_dag4'] = tostring(sRainmeterTotal);
end
if dagteller == 5 then
commandArray['Variable:SPROEI_dag5'] = tostring(sRainmeterTotal);
end
if dagteller == 6 then
commandArray['Variable:SPROEI_dag6'] = tostring(sRainmeterTotal);
end
if dagteller == 7 then
commandArray['Variable:SPROEI_dag7'] = tostring(sRainmeterTotal);
end
if dagteller >= sproeiaantaldagen then
-- Dagteller resetten! -
dagteller = 0
end
-- Tellerwaarde opslaan in User variable: --
commandArray['Variable:SPROEI_dagteller'] = tostring(dagteller);
end
--
-- Aantal mm regen optellen van laatste 5 dagen --
-- Dagen inlezen: --
dag1 = My.GetUserVar("SPROEI_dag1")
dag2 = My.GetUserVar("SPROEI_dag2")
dag3 = My.GetUserVar("SPROEI_dag3")
dag4 = My.GetUserVar("SPROEI_dag4")
dag5 = My.GetUserVar("SPROEI_dag5")
dag6 = My.GetUserVar("SPROEI_dag6")
dag7 = My.GetUserVar("SPROEI_dag7")
--
if sproeiaantaldagen == 1 then
sproeiaantalmmberekend = dag1
end
if sproeiaantaldagen == 2 then
sproeiaantalmmberekend = dag1+dag2
end
if sproeiaantaldagen == 3 then
sproeiaantalmmberekend = dag1+dag2+dag3
end
if sproeiaantaldagen == 4 then
sproeiaantalmmberekend = dag1+dag2+dag3+dag4
end
if sproeiaantaldagen == 5 then
sproeiaantalmmberekend = dag1+dag2+dag3+dag4+dag5
end
if sproeiaantaldagen == 6 then
sproeiaantalmmberekend = dag1+dag2+dag3+dag4+dag5+dag6
end
if sproeiaantaldagen == 7 then
sproeiaantalmmberekend = dag1+dag2+dag3+dag4+dag5+dag6+dag7
end
-- Uren uit huidige tijd en sproeitijd trekken om te gebruiken als vergelijking: --
uurtijd, minutentijd = os.date("%H:%M"):match("([^;]+):([^;]+)")
uurtijdsproeien,minutentijdsproeien = sproeitijd:match("([^;]+):([^;]+)")
uurtijd = tonumber(uurtijd)
uurtijdsproeien = tonumber(uurtijdsproeien)
--
print("Hoeveelheid regen de afgelopen " .. sproeiaantaldagen .. " dagen: " .. sRainmeterTotal+sproeiaantalmmberekend .. "mm.")
if (sproeiaantalmmberekend+sRainmeterTotal <= sproeiaantalmm) and (buitentemperatuur >= minimumbuitentemp) then
if (sRainmeterTotal <= sproeiaantalmmberekend+sRainmeterTotal) then
if sForecast > 3 and sHumidityStatus == 3 and daguitgesteld == 0 and uurtijd >= uurtijdsproeien-2 then -- Indien regen voorspeld is, sproeien 1 dag uitstellen!
daguitgesteld = 1
uitsteldag = os.date("%w")
if notification==1 then
commandArray['SendNotification'] = ('Er is de ' .. sproeiaantaldagen.. ' afgelopen dagen minder dan ' .. sproeiaantalmm .. 'mm regen gevallen, echter de tuin wordt vandaag nog niet gesproeid omdat er regen voor morgen voorspeld is!')
end
end
-- Indien vandaag uitgesteld wordt, doorgaan naar einde: --
if daguitgesteld == 1 and os.date("%w")== uitsteldag then
print("Sproeien van de tuin wordt vandaag uitgesteld ivm weersvoorspelling!")
goto einde
end
if os.date("%H:%M") == sproeitijd then
print("Tuinsproeier wordt voor " .. sproeiminuten .. " minuten ingeschakeld!")
commandArray[schakelaar] = 'On'
if notification==1 then
commandArray['SendNotification'] = ('Er is de ' .. sproeiaantaldagen.. ' afgelopen dagen minder dan ' .. sproeiaantalmm .. 'mm regen gevallen, de tuin wordt nu ' .. sproeiminuten .. ' minuten gesproeid!')
end
else
if os.date("%H:%M") == "13:00" and notification==1 then
commandArray['SendNotification'] = ('Er is de ' .. sproeiaantaldagen.. ' afgelopen dagen minder dan ' .. sproeiaantalmm .. 'mm regen gevallen, de tuin zal vanavond om ' .. sproeitijd .. ' gesproeid worden, mits het droog blijft vandaag.')
end
print("De tuin zal vandaag om " .. sproeitijd .. " gesproeid worden, mits het droog blijft!")
end
end
else
if (buitentemperatuur < minimumbuitentemp) and (sproeiaantalmmberekend+sRainmeterTotal <= sproeiaantalmm) then
print("Er wordt niet gesproeid, weinig regen gevallen, maar te koud om te sproeien.")
end
if (sproeiaantalmmberekend+sRainmeterTotal > sproeiaantalmm) and (buitentemperatuur >= minimumbuitentemp) then
print("Er wordt niet gesproeid, er is meer dan " .. sproeiaantalmm .. "mm regen gevallen.")
end
if (buitentemperatuur < minimumbuitentemp) and (sproeiaantalmmberekend+sRainmeterTotal > sproeiaantalmm) then
print("Er wordt niet gesproeid, er is teveel regen gevallen en is het te koud!.")
end
end
::einde::
print ("______________________________________________________________________")
-- Einde script --