Rules with "now.getHourOfDay" working inconsistently

But it doesn’t.
Every time the rule runs, you turn on the light, then start a new timer to turn it off. That does not stop, cancel or destroy any existing timer. That variable is just a handle, a pointer, a reference to an independent timer.
Must be like a disco with all those flashing lights.
See “Rules DSL” example

It looks to see if there is an existing running timer before making a new one.