But a Hue app using the API is already polling the bridge, at whatever the heartbeat is set to. So, when the heartbeat fires, you read the cache, inspect you light's state, and store its "reachable" value, which is false if the light is physically off, and true if it is physically on. The next time through the loop, check it again. If it was false and is now true, bingo: the light was just turned on, so send it a command to set the color you want.
Because the API uses heartbeat-based polling, not callbacks or interrupts, this is the best you can do to detect external changes (like a light being physically switched on or off, or a light being changed by some other application, IFTTT rule, etc.) You do have control over the heartbeat interval of resources by type, so you can poll the lights more frequently to be able to react more quickly.