Auto garden irrigation

Moderator: leecollings

Post Reply
martk
Posts: 24
Joined: Monday 14 March 2016 13:10
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Auto garden irrigation

Post 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 :)
Derik
Posts: 1601
Joined: Friday 18 October 2013 23:33
Target OS: Raspberry Pi / ODroid
Domoticz version: BETA
Location: Arnhem/Nijmegen Nederland
Contact:

Re: Auto garden irrigation

Post by Derik »

mmm have a garden system to..
Only what is your hardware on the water side?

Looks great...
Xu4: Beta Extreme antenna RFXcomE,WU Fi Ping ip P1 Gen5 PVOutput Harmony HUE SolarmanPv OTG Winddelen Alive ESP Buienradar MySensors WOL Winddelen counting RPi: Beta SMAspot RFlinkTest Domoticz ...Different backups
martk
Posts: 24
Joined: Monday 14 March 2016 13:10
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: Auto garden irrigation

Post 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.
eddypoot
Posts: 3
Joined: Friday 01 April 2016 16:28
Target OS: NAS (Synology & others)
Domoticz version: 3.8153
Location: Holland
Contact:

Re: Auto garden irrigation

Post 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
maluko
Posts: 105
Joined: Sunday 02 February 2014 23:57
Target OS: Raspberry Pi / ODroid
Domoticz version:
Location: Portugal
Contact:

Re: Auto garden irrigation

Post 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
Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest