Irrigation Controller need help with Master Valves

Hi OH Community,

I have a slight issue with a Rule that i need to run my irrigation for my house.

I have the below that works but the rule contains 3 x Master Valves (Commented in code) that need to come on while certain valves are running. I have ordered then so the masters can be on for a clock time.

Anyone got any example of including the master valves or how i could fit them into the code below? so they come on as required without disrupting the sequential time flow of the sub valves.

I did have the master valves all come on at once under the top rule but it seemed to have issues with triggering multiple switches at the same time stamp.

Any help would be grand.

rule "Goudie House Startup"
when
	System started
then
	postUpdate(ScheduleFront_StartTime, "06:00")
	postUpdate(ScheduleBack_StartTime, "07:00")
	postUpdate(ScheduleFront_RunTime, "1")
	postUpdate(ScheduleBack_RunTime, "1")
end


//Front - Rules
rule "Front - Rules"
when
	Item ManualFront received command ON
then

	if (ScheduleFront.state == ON) {

		var FrontRunTime = 1
		var FrontRunTimeMaster = 15 //Need to run the duration of the SubValves
		var DateTime startTime = now
		var DateTime endTime 
		var DateTime endTimeMaster
		

		logInfo("Front - Rules", "Running Front Scheduler")
		logInfo("Front  Rules", "Start Time: " + startTime)
	

		//PIN02 - Mater - Front (Needs to be on for PIN03, 04, 05 06, 07)
		if (FrontRunTime > 0) {
			logInfo("Schedule", "MASTERS - Start Time: " + startTime)
			endTimeMaster = startTime.plusMinutes(FrontRunTimeMaster)
			logInfo("Schedule", "MASTERS - End Time: " + endTimeMaster)
			createTimer(startTime) [| sendCommand(PIN02, ON) ]
			createTimer(endTimeMaster) [| sendCommand(PIN02, OFF) ]
		}
		//PIN03 - Driveway - Bottom - Front
		if (FrontRunTime > 0) {	
                        logInfo("Schedule", "PIN03 Start Time: " + startTime)
                        endTime = startTime.plusMinutes(FrontRunTime)
                        logInfo("Schedule", "PIN03 End Time: " + endTime)
                        createTimer(startTime) [| sendCommand(PIN03, ON) ]
                        createTimer(endTime) [| sendCommand(PIN03, OFF) ]
                        startTime = endTime.plusSeconds(1)			
		}
		//PIN04 - Driveway - Bottom - Back
		if (FrontRunTime > 0) {	
                        logInfo("Schedule", "PIN04 Start Time: " + startTime)
                        endTime = startTime.plusMinutes(FrontRunTime)
                        logInfo("Schedule", "PIN04 End Time: " + endTime)
                        createTimer(startTime) [| sendCommand(PIN04, ON) ]
                        createTimer(endTime) [| sendCommand(PIN04, OFF) ]
                        startTime = endTime.plusSeconds(1)
		}
		//PIN05 - Driveway - Top - Front
		if (FrontRunTime > 0) {	
                        logInfo("Schedule", "PIN05 Start Time: " + startTime)
                        endTime = startTime.plusMinutes(FrontRunTime)
                        logInfo("Schedule", "PIN05 End Time: " + endTime)
                        createTimer(startTime) [| sendCommand(PIN05, ON) ]
                        createTimer(endTime) [| sendCommand(PIN05, OFF) ]
                        startTime = endTime.plusSeconds(1)
		}
		//PIN06	- Driveway - Top - Back
		if (FrontRunTime > 0) {	
                        logInfo("Schedule", "PIN06 Start Time: " + startTime)
                        endTime = startTime.plusMinutes(FrontRunTime)
                        logInfo("Schedule", "PIN06 End Time: " + endTime)
                        createTimer(startTime) [| sendCommand(PIN06, ON) ]
                        createTimer(endTime) [| sendCommand(PIN06, OFF) ]
                        startTime = endTime.plusSeconds(1)
		}
		//PIN07 - Front - House 
		if (FrontRunTime > 0) {	
                        logInfo("Schedule", "PIN07 Start Time: " + startTime)
                        endTime = startTime.plusMinutes(FrontRunTime)
                        logInfo("Schedule", "PIN07 End Time: " + endTime)
                        createTimer(startTime) [| sendCommand(PIN07, ON) ]
                        createTimer(endTime) [| sendCommand(PIN07, OFF) ]
                        startTime = endTime.plusSeconds(1)
		}
		//PIN19 - Master - Front Side (Needs to run when PIN08 on)
		if (FrontRunTime > 0) {	
                        logInfo("Schedule", "PIN19 Start Time: " + startTime)
                        endTime = startTime.plusMinutes(FrontRunTime)
                        logInfo("Schedule", "PIN19 End Time: " + endTime)
                        createTimer(startTime) [| sendCommand(PIN19, ON) ]
                        createTimer(endTime) [| sendCommand(PIN19, OFF) ]
                       startTime = endTime.plusSeconds(1)
		}
		//PIN08 - Front - Side Fence
		if (FrontRunTime > 0) {	
                        logInfo("Schedule", "PIN08 Start Time: " + startTime)
                        endTime = startTime.plusMinutes(FrontRunTime)
                        logInfo("Schedule", "PIN08 End Time: " + endTime)
                        createTimer(startTime) [| sendCommand(PIN08, ON) ]
                        createTimer(endTime) [| sendCommand(PIN08, OFF) ]
                        startTime = endTime.plusSeconds(1)
		}
		//PIN17 - Master - Nature Strip (Needs to run with PIN14 and 15 On)
		if (FrontRunTime > 0) {	
                        logInfo("Schedule", "PIN17 Start Time: " + startTime)
                        endTime = startTime.plusMinutes(FrontRunTime)
                        logInfo("Schedule", "PIN17 End Time: " + endTime)
                        createTimer(startTime) [| sendCommand(PIN17, ON) ]
                        createTimer(endTime) [| sendCommand(PIN17, OFF) ]
                        startTime = endTime.plusSeconds(1)
		}
		//PIN15 - Nauture Strip 
		if (FrontRunTime > 0) {	
                        logInfo("Schedule", "PIN15 Start Time: " + startTime)
                        endTime = startTime.plusMinutes(FrontRunTime)
                        logInfo("Schedule", "PIN15 End Time: " + endTime)
                        createTimer(startTime) [| sendCommand(PIN15, ON) ]
                        createTimer(endTime) [| sendCommand(PIN15, OFF) ]
                        startTime = endTime.plusSeconds(1)
		}
		//PIN14 - Driveway Trees 
		if (FrontRunTime > 0) {	
                        logInfo("Schedule", "PIN14 Start Time: " + startTime)
                        endTime = startTime.plusMinutes(FrontRunTime)
                        logInfo("Schedule", "PIN14 End Time: " + endTime)
                        createTimer(startTime) [| sendCommand(PIN14, ON) ]
                        createTimer(endTime) [| sendCommand(PIN14, OFF) ]
                        startTime = endTime.plusSeconds(1)
		}
	}
end

Thanks

Please a short Thread::sleep between commands to the master valves.

Since they only need to be on for certain zones, just move the command to that if block and use a short Thread::sleep between the master valve and sprinkler.

Also, Design Pattern: Cascading Timers might be useful for you.