11#!/usr/bin/python
22
3+ def scheduler (dummy ,state ):
4+ import time
5+ import sys
6+ import schedule
7+ from datetime import datetime
8+
9+ sys .stdout = open ("scheduler.log" , "a" , buffering = 0 )
10+ sys .stderr = open ("scheduler.err.log" , "a" , buffering = 0 )
11+
12+ print "Starting scheduler thread ..."
13+
14+ last_wake = 0
15+ last_sleep = 0
16+ last_sched_switch = 0
17+
18+ while True :
19+
20+ if last_wake != state ['wake_time' ] or last_sleep != state ['sleep_time' ] or last_sched_switch != state ['sched_enabled' ]:
21+ schedule .clear ()
22+
23+ if state ['sched_enabled' ] == True :
24+ schedule .every ().day .at (state ['sleep_time' ]).do (gotosleep ,1 ,state )
25+ schedule .every ().day .at (state ['wake_time' ]).do (wakeup ,1 ,state )
26+
27+ nowtm = float (datetime .now ().hour ) + float (datetime .now ().minute )/ 60.
28+ sleeptm = state ['sleep_time' ].split (":" )
29+ sleeptm = float (sleeptm [0 ]) + float (sleeptm [1 ])/ 60.
30+ waketm = state ['wake_time' ].split (":" )
31+ waketm = float (waketm [0 ]) + float (waketm [1 ])/ 60.
32+
33+ if waketm < sleeptm :
34+ if nowtm >= waketm and nowtm < sleeptm :
35+ wakeup (1 ,state )
36+ else :
37+ gotosleep (1 ,state )
38+ elif waketm > sleeptm :
39+ if nowtm < waketm and nowtm >= sleeptm :
40+ gotosleep (1 ,state )
41+ else :
42+ wakeup (1 ,state )
43+
44+ else :
45+ wakeup (1 ,state )
46+
47+ last_wake = state ['wake_time' ]
48+ last_sleep = state ['sleep_time' ]
49+ last_sched_switch = state ['sched_enabled' ]
50+
51+ schedule .run_pending ()
52+
53+ time .sleep (1 )
54+
55+ def wakeup (dummy ,state ):
56+ state ['is_awake' ] = True
57+
58+ def gotosleep (dummy ,state ):
59+ state ['is_awake' ] = False
60+
361def he_control_loop (dummy ,state ):
462 from time import sleep
5- from datetime import datetime , timedelta
663 import RPi .GPIO as GPIO
764 import config as conf
865
@@ -14,15 +71,9 @@ def he_control_loop(dummy,state):
1471
1572 try :
1673 while True :
17- if state ['snoozeon' ] == True :
18- now = datetime .now ()
19- dt = datetime .strptime (state ['snooze' ],'%H:%M' )
20- if dt .hour == now .hour and dt .minute == now .minute :
21- state ['snoozeon' ] = False
22-
2374 avgpid = state ['avgpid' ]
2475
25- if state ['snoozeon' ] :
76+ if state ['is_awake' ] == False :
2677 state ['heating' ] = False
2778 GPIO .output (conf .he_pin ,0 )
2879 sleep (1 )
@@ -56,6 +107,9 @@ def pid_loop(dummy,state):
56107 import PID as PID
57108 import config as conf
58109
110+ sys .stdout = open ("pid.log" , "a" , buffering = 0 )
111+ sys .stderr = open ("pid.err.log" , "a" , buffering = 0 )
112+
59113 def c_to_f (c ):
60114 return c * 9.0 / 5.0 + 32.0
61115
@@ -187,25 +241,40 @@ def post_settemp():
187241 except :
188242 abort (400 ,'Invalid number for set temp.' )
189243
190- @get ('/snooze' )
191- def get_snooze ():
192- return str (state ['snooze' ])
244+ @get ('/is_awake' )
245+ def get_is_awake ():
246+ return str (state ['is_awake' ])
247+
248+ @post ('/scheduler' )
249+ def set_sched ():
250+ sched = request .forms .get ('scheduler' )
251+ if sched == "True" :
252+ state ['sched_enabled' ] = True
253+ elif sched == "False" :
254+ state ['sched_enabled' ] = False
255+ state ['is_awake' ] = True
256+ else :
257+ abort (400 ,'Invalid scheduler setting. Expecting True or False' )
193258
194- @post ('/snooze ' )
195- def post_snooze ():
196- snooze = request .forms .get ('snooze ' )
259+ @post ('/setwake ' )
260+ def set_wake ():
261+ wake = request .forms .get ('wake ' )
197262 try :
198- datetime .strptime (snooze ,'%H:%M' )
263+ datetime .strptime (wake ,'%H:%M' )
199264 except :
200265 abort (400 ,'Invalid time format.' )
201- state ['snoozeon' ] = True
202- state ['snooze' ] = snooze
203- return str (snooze )
266+ state ['wake_time' ] = wake
267+ return str (wake )
204268
205- @post ('/resetsnooze' )
206- def reset_snooze ():
207- state ['snoozeon' ] = False
208- return True
269+ @post ('/setsleep' )
270+ def set_sleep ():
271+ sleep = request .forms .get ('sleep' )
272+ try :
273+ datetime .strptime (sleep ,'%H:%M' )
274+ except :
275+ abort (400 ,'Invalid time format.' )
276+ state ['sleep_time' ] = sleep
277+ return str (sleep )
209278
210279 @get ('/allstats' )
211280 def allstats ():
@@ -235,25 +304,36 @@ def healthcheck():
235304
236305 manager = Manager ()
237306 pidstate = manager .dict ()
238- pidstate ['snooze' ] = conf .snooze
239- pidstate ['snoozeon' ] = False
307+ pidstate ['is_awake' ] = True
308+ pidstate ['sched_enabled' ] = conf .sched_enabled
309+ pidstate ['sleep_time' ] = conf .sleep_time
310+ pidstate ['wake_time' ] = conf .wake_time
240311 pidstate ['i' ] = 0
241312 pidstate ['settemp' ] = conf .set_temp
242313 pidstate ['avgpid' ] = 0.
243314
315+ print "Starting Scheduler thread..."
316+ s = Process (target = scheduler ,args = (1 ,pidstate ))
317+ s .daemon = True
318+ s .start ()
319+
320+ print "Starting PID thread..."
244321 p = Process (target = pid_loop ,args = (1 ,pidstate ))
245322 p .daemon = True
246323 p .start ()
247324
325+ print "Starting HE Control thread..."
248326 h = Process (target = he_control_loop ,args = (1 ,pidstate ))
249327 h .daemon = True
250328 h .start ()
251329
330+ print "Starting REST Server thread..."
252331 r = Process (target = rest_server ,args = (1 ,pidstate ))
253332 r .daemon = True
254333 r .start ()
255334
256335 #Start Watchdog loop
336+ print "Starting Watchdog..."
257337 piderr = 0
258338 weberr = 0
259339 weberrflag = 0
@@ -262,7 +342,7 @@ def healthcheck():
262342 lasti = pidstate ['i' ]
263343 sleep (1 )
264344
265- while p .is_alive () and h .is_alive () and r .is_alive ():
345+ while p .is_alive () and h .is_alive () and r .is_alive () and s . is_alive () :
266346 curi = pidstate ['i' ]
267347 if curi == lasti :
268348 piderr = piderr + 1
0 commit comments