The important thing to realize about Timers is that they don’t stop your Rule from running. A Timer will schedule a bit of code to run at some later time. Once a Timer is created the rest of your Rule immediately executes.
So what you need to do is schedule each of these events to take place at the times you want them to. NOTE: please use How to use code fences when posting code or logs.
executeCommandLine(“curl -X POST httxx://maker.ifttt.com/trigger/downoff/with/key/xxxxxxxxxx”)
createTimer(now.plusSeconds(3), [ | executeCommandLine(“curl -X POST httxx://maker.ifttt.com/trigger/upon/with/key/xxxxxxxxxx”) ])
createTimer(now.plusSeconds(3+30), [ | executeCommandLine(“curl -X POST httxx://maker.ifttt.com/trigger/upoff/with/key/xxxxxxxxxx”) ])
createTimer(now.plusSeconds(3+30+3), [ | executeCommandLine(“curl -X POST https://maker.ifttt.com/trigger/downon/with/key/xxxxxxxxxx”) ])
createTimer(now.plusSeconds(3+30+3+20), [ | executeCommandLine(“curl -X POST https://maker.ifttt.com/trigger/downoff/with/key/xxxxxxxxxx”) ])
Notice how I add the previous number of seconds to how long you want to wait between the commands. Notice though that because we don’t hold on to the Timer in a global variable we cannot cancel the commands or reschedule them. They will run no matter what, but that is what you are asking for. It gets more complicated when you want to cancel these scheduled commands or otherwise manage the Timers.