Any way to reboot device programmatically without root?
You could use AutoInput with Tasker. 
AutoInput can create list with recorded screen touches for reboot, and with Tasker you can schedule action at the time you want, without root access.