Hello I am connecting a curtain controller using a single relay. The controller needs 1 second (+-0.2sec) to drive to opened and 2 seconds (+-0.2sec) to drive to closed. I am using the PAC to turn the relay on for the required time. My problem is that it does not work every time - more like 3 from 10. The GA "CurtainOpenerSignal" is triggered from a bell press button. We only need fully opened or closed. I originally used the code below........ once (GetLightingState("CurtainOpenerSignal") = ON) then begin if (CurtainLastOpened = false) then begin PulseCBusLevel("Local Network", "Lighting", "CURT.OP - Rumpus curtain motor", 100%, 0, "0:00:01", 0%); CurtainOpened := true end; if (CurtainLastOpened = true) then begin PulseCBusLevel("Local Network", "Lighting", "CURT.OP - Rumpus curtain motor", 100%, 0, "0:00:02", 0%); CurtainOpened := false end; CurtainLastOpened := CurtainOpened; end; I thought maybe it was the way I used the timing and tried this....... once (GetLightingState("CurtainOpenerSignal") = ON) then begin if (CurtainLastOpened = false) then begin SetLightingState("CURT.OP - Rumpus curtain motor", ON); Delay("0:00:01"); SetLightingState("CURT.OP - Rumpus curtain motor", OFF); CurtainOpened := true end; if (CurtainLastOpened = true) then begin SetLightingState("CURT.OP - Rumpus curtain motor", ON); Delay("0:00:02"); SetLightingState("CURT.OP - Rumpus curtain motor", OFF); CurtainOpened := false end; CurtainLastOpened := CurtainOpened; end; Is this too tight a spec to get from the timer function? Also I thought maybe relay bounce?? If no ideas I can put an oscilliscope on the relay & check what is happening. Any help appreciated, regards Jim.