Skip to content

Commit 54de212

Browse files
authored
Merge pull request #24 from brycesub/2_0_features
removed snooze, added sleep/wake timer
2 parents 59c12bd + 44d2bdc commit 54de212

File tree

7 files changed

+180
-47
lines changed

7 files changed

+180
-47
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
silvia-pi.log*
2+
*.log
23
*.pyc
34
PID.*
45
kill.sh

config.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@
1010
# Default goal temperature
1111
set_temp = 221.
1212

13-
# Default alarm time
14-
snooze = '07:00'
13+
# Default sleep/wake times
14+
sched_enabled = True
15+
wake_time = '06:30'
16+
sleep_time = '10:00'
1517

1618
# Main loop sample rate in seconds
1719
sample_time = 0.1

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ bottle
22
cheroot
33
RPi.GPIO
44
spidev
5+
schedule

silvia-pi-logrotate

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,21 @@
66
missingok
77
notifempty
88
}
9+
10+
/root/silvia-pi/scheduler.log {
11+
rotate 7
12+
daily
13+
compress
14+
copytruncate
15+
missingok
16+
notifempty
17+
}
18+
19+
/root/silvia-pi/pid.log {
20+
rotate 7
21+
daily
22+
compress
23+
copytruncate
24+
missingok
25+
notifempty
26+
}

silvia-pi.py

Lines changed: 105 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,65 @@
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+
361
def 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

www/index.html

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,17 +41,19 @@ <h5 class="text-right">Current Temp: <span id="curtemp">00.00</span> °F</h5>
4141
</div>
4242
</form>
4343
</div>
44-
<div class="col-xs-5">
44+
<div class="col-xs-6">
4545
<form class="form-inline" onsubmit="return false">
4646
<div class="form-group">
47-
<label for="inputSnooze">Wakeup Timer: </label>
48-
<input type="time" class="form-control" id="inputSnooze" style="width:120px">
49-
<button id="btnSnooze" class="btn btn-primary" style="display:none">Snooze</button>
50-
<button id="btnSnoozeC" class="btn btn-danger" style="display:none">Cancel Snooze</button>
47+
<label id="labelWake" for="inputWake">Wakeup: </label>
48+
<input type="time" class="form-control" id="inputWake" style="width:120px">
49+
<label id="labelSleep" for="inputSleep">Sleep: </label>
50+
<input type="time" class="form-control" id="inputSleep" style="width:120px">
51+
<button id="btnTimerDisable" class="btn btn-danger" style="display:none">Disable Timer</button>
52+
<button id="btnTimerEnable" class="btn btn-primary" style="display:none">Enable Timer</button>
5153
</div>
5254
</form>
5355
</div>
54-
<div class="col-xs-3">
56+
<div class="col-xs-2">
5557
<form class="form-inline" onsubmit="return false">
5658
<div class="form-group">
5759
<button id="toggleadv" class="btn btn-info">Advanced Stats</button>

www/js/index.js

Lines changed: 43 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ function refreshinputs() {
1616
timeout: 500,
1717
success: function ( resp ) {
1818
$("#inputSetTemp").val( resp.settemp );
19-
$("#inputSnooze").val( resp.snooze );
19+
$("#inputSleep").val( resp.sleep_time );
20+
$("#inputWake").val( resp.wake_time );
2021
}
2122
});
2223
}
@@ -70,16 +71,38 @@ $(document).ready(function(){
7071
);
7172
});
7273

73-
$("#btnSnooze").click(function(){
74-
$.post("/snooze",{ snooze: $("#inputSnooze").val() });
75-
$("#btnSnooze").hide();
76-
$("#btnSnoozeC").show();
74+
$("#inputSleep").change(function(){
75+
$.post(
76+
"/setsleep",
77+
{ sleep: $("#inputSleep").val() }
78+
);
79+
});
80+
81+
$("#inputWake").change(function(){
82+
$.post(
83+
"/setwake",
84+
{ wake: $("#inputWake").val() }
85+
);
86+
});
87+
88+
$("#btnTimerDisable").click(function(){
89+
$.post("/scheduler",{ scheduler: "False" });
90+
$("#inputWake").hide();
91+
$("#labelWake").hide();
92+
$("#inputSleep").hide();
93+
$("#labelSleep").hide();
94+
$("#btnTimerDisable").hide();
95+
$("#btnTimerEnable").show();
7796
});
7897

79-
$("#btnSnoozeC").click(function(){
80-
$.post("/resetsnooze");
81-
$("#btnSnooze").show();
82-
$("#btnSnoozeC").hide();
98+
$("#btnTimerEnable").click(function(){
99+
$.post("/scheduler",{ scheduler: "True" });
100+
$("#inputWake").show();
101+
$("#labelWake").show();
102+
$("#inputSleep").show();
103+
$("#labelSleep").show();
104+
$("#btnTimerDisable").show();
105+
$("#btnTimerEnable").hide();
83106
});
84107

85108
});
@@ -90,12 +113,18 @@ setInterval(function() {
90113
url: "/allstats",
91114
timeout: 500,
92115
success: function ( resp ) {
93-
if (resp.snoozeon == true) {
94-
$("#btnSnooze").hide();
95-
$("#btnSnoozeC").show();
116+
if (resp.sched_enabled == true) {
117+
$("#inputWake").show();
118+
$("#inputSleep").show();
119+
$("#btnTimerSet").show();
120+
$("#btnTimerDisable").show();
121+
$("#btnTimerEnable").hide();
96122
} else {
97-
$("#btnSnooze").show();
98-
$("#btnSnoozeC").hide();
123+
$("#inputWake").hide();
124+
$("#inputSleep").hide();
125+
$("#btnTimerSet").hide();
126+
$("#btnTimerDisable").hide();
127+
$("#btnTimerEnable").show();
99128
}
100129
curtemp.append(new Date().getTime(), resp.tempf);
101130
settemp.append(new Date().getTime(), resp.settemp);

0 commit comments

Comments
 (0)