Thanks for the response.
From a perspective of triggering, for my purpose it really does have to be a time, there is no physical trigger available. E.g. on a weekday, I want the living room lights to turn off at 8am as that is when my wife leaves for work.
It needs to be a variable time, because there are other sensors at play. For example if the living room is still occupied (e.g. its a holiday) and motion is detected, keep the lights on until 5 minutes after motion was last detected. The only way I could see to implement that is as shown in the rule - if the room is occupied, increment the time by 5 minutes so the rule runs again. If the room has been occupied in the last 5 minutes, increment the time. I also want to add additional logic so that if the room is occupied, but it is bright outside, turn the lights off anyway, as they are not needed.
The general idea is, other than exceptional circumstances, you never have to mess with the lights, they look after themselves, based on time, motion and light level. Obviously simple automation can't handle that.
The other reason I ditched simple automation, was that I have another variable that sets the colour temperature I want for the hue lights depending on the time of day. The rule that turns the lights on automatically uses this variable to set them to the right colour immediately. Again, simple automation couldn't do that.
Finally, I deleted all the simple automation events I had, even the ones that I didn't want to add additional logic to, as I was finding crosstalk between simple automation and the rule machine (e.g. for some bizarre reason I couldn't even fathom, simple automation would turn my kitchen lights off, which would trigger the living room lights to come on, even though there was absolutely nothing in common between the two). I figured I'd switch to all rules, even for simple tasks and just ditch simple automation.
As I said, what's weird is that rules using a specific time work flawlessly. Rules that use a variable time work fine (even the rule running again after the time is iterated works fine), but they frequently just aren't triggered at all (or, occasionally, are triggered at the wrong time).