I just wanted to drop in and say this is an awesome build! Excellent job Hunter! I somehow missed this thread until recently (I think because I was so engrossed in my own project). I finally read through the whole thing, and I'm super impressed.
One thing that might make things cleaner for scheduling is to use the Time.Alarms library
. I used it in my project, and it's nice that you don't have to check time in the loop to catch things. It also makes it easy to change the schedule. If you read the docs, you can adjust the library to do up to 255 timers. It has quite a bit of functionality.
Here is an example. This one line below would be executed at startup and creates a schedule that'll run a routine called "lightsOn" every day at 11:00am.
The lightsOn routine could look like this:
digitalWrite(pwrLightPin, HIGH); // this turns the relay on
That's it — super easy! It also opens the doors to making it pretty easy to edit the schedule through a menu, and saving that in EEPROM.