So the bit that got missed from my second earlier message, if you just want them to fade on and off a bit for three seconds, have you considered ola_recorder:
Or do you need more interactivity of the levels or duration?
Do you want a complete number of cycles to fit in the 3 seconds, or just for it to guarantee it goes off at 3 seconds?
What happens next, should the script do something again in the future, or is that it until someone runs it again?
There are a few ways to achieve what you want in code, but the simplest may be to track when you want it to finish, so for example within the init of SimpleFadeController, you could store this into a variable:
datetime.datetime.now() + datetime.timedelta(milliseconds=total_time)
Which will be the time to finish, then within UpdateDmx you could check if your expiry time is <= datetime.datetime.now() and use that to decide whether to run the normal for loop or to set everything to 0 and then stop the wrapper or wait for the next action.