Page 1 of 1

Auto garden irrigation

Posted: Friday 26 August 2016 8:12
by martk
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)

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 --
I'll keep the start topic up to date when I made any changes to it :)

Re: Auto garden irrigation

Posted: Friday 26 August 2016 17:58
by Derik
mmm have a garden system to..
Only what is your hardware on the water side?

Looks great...

Re: Auto garden irrigation

Posted: Monday 29 August 2016 6:41
by martk
Thanks for the compliment ;). I don't have any hardware yet :p

I'm using a dummy on/off switch atm, but I was thinking to just use a relay switch or something else, to turn it on/off. Next spring i'll install the hardware.

Re: Auto garden irrigation

Posted: Sunday 08 January 2017 14:27
by eddypoot
I have implmented your irrigation solution. However, i get some errors:

2017-01-08 14:23:00.398 Error: EventSystem: in /usr/local/domoticz/var/scripts/lua/script_time_tuinsproeier.lua: ...al/domoticz/var/scripts/lua/script_time_tuinsproeier.lua:35: module 'MyFunc' not found:
no field package.preload['MyFunc']
no file '/usr/local/share/lua/5.2/MyFunc.lua'
no file '/usr/local/share/lua/5.2/MyFunc/init.lua'
no file '/usr/local/lib/lua/5.2/MyFunc.lua'
no file '/usr/local/lib/lua/5.2/MyFunc/init.lua'
no file './MyFunc.lua'
no file '/Volume1/@appstore/domoticz/var/scripts/lua/MyFunc.lua'
no file '/usr/local/lib/lua/5.2/MyFunc.so'
no file '/usr/local/lib/lua/5.2/loadall.so'
no file './MyFunc.so'

I am running Domoticz V3.6312 on Synology DS213+ DSM 6.0.2

Any help will be apreciated

Re: Auto garden irrigation

Posted: Friday 20 January 2017 11:28
by maluko
hi guys

like you want see the hardware from irrigation, i post my new project to controll my valves, its wifi (esp8266) and comunicate with domoticz that give order to start.
in the photos can see the lcd but its only option for now, because it will do a new button board with led status.
have too a lux sensor.
i will see if your script can help me to have a system more complete.

Image
Image

thanks