diff --git a/app/.meteor/packages b/app/.meteor/packages
index 58f9ed9..3acc393 100644
--- a/app/.meteor/packages
+++ b/app/.meteor/packages
@@ -24,3 +24,4 @@ nimble:restivus
momentjs:moment
selaias:meteor-simpleweather
u2622:persistent-session
+percolate:synced-cron
diff --git a/app/.meteor/versions b/app/.meteor/versions
index e911e96..e6cf2c9 100644
--- a/app/.meteor/versions
+++ b/app/.meteor/versions
@@ -57,6 +57,7 @@ nimble:restivus@0.8.4
npm-mongo@1.4.39_1
observe-sequence@1.0.7
ordered-dict@1.0.4
+percolate:synced-cron@1.3.0
promise@0.5.1
random@1.0.5
rate-limit@1.0.0
diff --git a/app/client/state.html b/app/client/state.html
index 61045c0..ca32d42 100644
--- a/app/client/state.html
+++ b/app/client/state.html
@@ -11,8 +11,8 @@
-
-
+
+
diff --git a/app/client/state.js b/app/client/state.js
index 439cf2b..9b0088f 100644
--- a/app/client/state.js
+++ b/app/client/state.js
@@ -22,30 +22,36 @@ if (Meteor.isClient) {
if (state === 'opening') return "Otvara se";
if (state === 'closing') return "Zatvara se";
if (state === 'closed') return "Zatvoren";
+ },
+
+ water_now_button_class: function () {
+ var stateObject = controller_state();
+ if (stateObject.state && ( stateObject.state.out_valve === 'open' || stateObject.state.out_valve === 'opening' )) {
+ return 'hidden';
+ } else {
+ return '';
+ }
+ },
+ stop_button_class: function () {
+ var stateObject = controller_state();
+ if (stateObject.state && ( stateObject.state.out_valve === 'closed' || stateObject.state.out_valve === 'closing' )) {
+ return 'hidden';
+ } else {
+ return '';
+ }
}
+
});
Template.state.events({
'click #water_now': function() {
- var state = controller_state();
- ControllerState.update(state._id, {
- '$set': {
- 'state.out_valve': 'opening',
- 'time': new Date(),
- 'set_by': 'server'
- }
- });
+ var controller_id = Session.get('controller_id');
+ Meteor.call('openOutValve',controller_id )
},
'click #stop_water_now': function() {
- var state = controller_state();
- ControllerState.update(state._id, {
- '$set': {
- 'state.out_valve': 'closing',
- 'time': new Date(),
- 'set_by': 'server'
- }
- });
+ var controller_id = Session.get('controller_id');
+ Meteor.call('closeOutValve',controller_id )
}
});
diff --git a/app/server/api.js b/app/server/api.js
index a51b182..73bbab7 100644
--- a/app/server/api.js
+++ b/app/server/api.js
@@ -52,6 +52,11 @@ function stateOrDefault(id) {
out_valve: 'closed'
},
time: new Date(),
+ config: {
+ draining_period_amount: 1,
+ draining_period_unit: 'minutes'
+
+ },
set_by: 'server'
});
};
diff --git a/app/server/methods.js b/app/server/methods.js
new file mode 100644
index 0000000..add245e
--- /dev/null
+++ b/app/server/methods.js
@@ -0,0 +1,65 @@
+function controller_state(controller_id) {
+ var result = {}
+ if (controller_id) {
+ result = ControllerState.findOne({
+ controller_id: controller_id
+ });
+ }
+
+ if (!result) {
+ result = {}
+ };
+ return result;
+};
+
+function setOutValveTo(controller_id, nextState) {
+ var state = controller_state(controller_id);
+ ControllerState.update(state._id, {
+ '$set': {
+ 'state.out_valve': nextState,
+ 'time': new Date(),
+ 'set_by': 'server'
+ }
+ });
+}
+
+function openOutValve(controller_id) {
+ setOutValveTo(controller_id, 'opening');
+ var state = controller_state(controller_id);
+ var config = state.config;
+ var jobName = "Close out valve " + state.controller_id + " after draining";
+ console.log("Opening valve ", controller_id, jobName);
+ SyncedCron.remove(jobName);
+ SyncedCron.add({
+ name: jobName,
+ schedule: function(parser) {
+ var time = moment().add(config.draining_period_amount, config.draining_period_unit).toDate();
+ return parser.recur().on(time).fullDate();
+ },
+ job: function() {
+ closeOutValve(controller_id);
+ }
+ });
+ console.log("Finished adding cron ", controller_id);
+}
+
+function closeOutValve(controller_id) {
+ var state = controller_state(controller_id);
+
+ var jobName = "Close out valve " + state.controller_id + " after draining";
+ console.log("Closing valve ", controller_id, jobName);
+ SyncedCron.remove(jobName);
+ setOutValveTo(controller_id, 'closing');
+ console.log("Finished clearing cron ", controller_id);
+}
+
+function clearLog() {
+ console.log("Removing sensor data");
+ SensorData.remove({});
+}
+
+Meteor.methods({
+ openOutValve: openOutValve,
+ closeOutValve: closeOutValve,
+ clearLog: clearLog
+});
diff --git a/app/server/startup.js b/app/server/startup.js
index c54c355..4232b09 100644
--- a/app/server/startup.js
+++ b/app/server/startup.js
@@ -1,14 +1,10 @@
if (Meteor.isServer) {
Meteor.startup(function() {
// code to run on server at startup
-
- return Meteor.methods({
- clearLog: function() {
- return SensorData.remove({});
- }
- });
+ SyncedCron.start();
});
+
// Global API configuration
var Api = new Restivus({
useDefaultAuth: true,
@@ -30,5 +26,5 @@ if (Meteor.isServer) {
}
});
-
+
}