-
Notifications
You must be signed in to change notification settings - Fork 64
/
Copy pathControlUnit.agent.nut
117 lines (110 loc) · 3.61 KB
/
ControlUnit.agent.nut
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
// Copyright (c) 2014 Electric Imp
// This file is licensed under the MIT License
// http://opensource.org/licenses/MIT
const TEMPMARGIN = 0.3;
// Checks sensor temperatures, targets and priorities
// and determines wether to turn the heating on or off
function checkTemp(state) {
if (state.sensors.len() == 0) {
return false;
}
local percent = 0;
local total = 0;
foreach (sensor in state.sensors) {
total += sensor.priority*(sensor.temp - sensor.target);
percent += sensor.priority;
}
total /= percent;
server.log(total);
if (total < -TEMPMARGIN) {
return true;
}
return false;
}
// HTTP Request Handlers
function requestHandler(request, response) {
try {
local responseString = "No Valid Command";
local rq = request.query;
local state = server.load();
if ("power" in rq) {
if (rq.power != "off") {
responseString = http.jsonencode(state.sensors);
state.power = "on";
} else {
state.power = "off";
device.send("off", null);
}
}
if (state.power == "off") {
responseString = "Powered off";
} else {
if ("update" in rq) {
if (rq.update in state.sensors) {
local sensor = state.sensors[rq.update];
sensor.bat = rq.bat.tofloat();
sensor.time = date();
sensor.rh = rq.rh.tofloat();
sensor.temp = rq.temp.tofloat();
state.sensors[rq.update] = sensor;
responseString = rq.update + " Sensor data updated " + rq.temp;
} else {
local sensor = {
room = "Room " + state.sensors.len(),
priority = 2,
time = date(),
bat = rq.bat.tofloat(),
rh = rq.rh.tofloat(),
temp = rq.temp.tofloat(),
target = rq.temp.tofloat()
}
state.sensors[rq.update] <- sensor;
responseString = rq.update + " Sensor added " + rq.temp;
}
}
else if ("target" in rq) {
local sensor = state.sensors[rq.target];
sensor.target = rq.temp.tofloat();
sensor.priority = rq.priority.tointeger();
state.sensors[rq.target] = sensor;
responseString = rq.target + " Sensor target changed to " + rq.temp;
}
else if ("room" in rq) {
state.sensors[rq.room].room = rq.name;
responseString = rq.room + " Sensor room changed to " + rq.name;
}
else if ("remove" in rq) {
if (rq.remove == "all") {
state.sensors = {};
} else {
delete state.sensors[rq.remove];
}
responseString = rq.remove + " Sensor deleted";
}
else if ("check" in rq) {
if (rq.check == "all") {
responseString = http.jsonencode(state.sensors);
} else {
responseString = http.jsonencode(state.sensors[rq.check]);
}
}
if (checkTemp(state)) {
device.send("warmer", null);
} else {
device.send("off", null);
}
}
server.save(state);
response.send(200, responseString);
server.log(responseString);
} catch (ex) {
response.send(500, "Error: " + ex);
server.log("Error: " + ex);
}
}
// Initialize state table if it does not exist
state <- server.load();
if (!("sensors" in state)) {
server.save({power="on", sensors={}});
}
http.onrequest(requestHandler);