From f203119656e1e6ef01e20723616b04e3a00d38d0 Mon Sep 17 00:00:00 2001 From: Senad Uka Date: Sun, 14 Feb 2016 10:34:54 +0100 Subject: [PATCH] finished scheduled close after opening --- app/.meteor/packages | 1 + app/.meteor/versions | 1 + app/client/state.html | 4 +-- app/client/state.js | 38 ++++++++++++++----------- app/server/api.js | 5 ++++ app/server/methods.js | 65 +++++++++++++++++++++++++++++++++++++++++++ app/server/startup.js | 10 ++----- 7 files changed, 99 insertions(+), 25 deletions(-) create mode 100644 app/server/methods.js 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) { } }); - + }