diff --git a/app/client/alarm.html b/app/client/alarm.html index 569d8b5..8eef62a 100644 --- a/app/client/alarm.html +++ b/app/client/alarm.html @@ -3,6 +3,12 @@

Temperatura

+ {{#with state}} + {{#if alarmTriggered}} + + + {{/if}} + {{/with}} {{#with last_reading}}
{{ all_temperatures }}
{{pretty_time created_at}}
diff --git a/app/client/alarm.js b/app/client/alarm.js index e43f56d..87c107a 100644 --- a/app/client/alarm.js +++ b/app/client/alarm.js @@ -25,14 +25,17 @@ function last_sensor_reading() { Template.alarm.helpers({ last_reading: last_sensor_reading, + state: function() { + return Meteor.zoblak.client.controller_state().state; + }, pretty_time: function(time) { return moment(time).format("DD.MM.YYYY, HH:mm") }, all_temperatures: function() { - var result=""; + var result = ""; var temperatures = last_sensor_reading().temperatures; - for(var i in temperatures) { + for (var i in temperatures) { result += '' + parseFloat(temperatures[i]).toFixed(1) + ' °C '; } return result; @@ -42,6 +45,10 @@ Template.alarm.helpers({ Template.alarm.events({ 'click #run_alarm_settings': function() { Modal.show('alarm_settings'); + }, + 'click #stop_alarm': function() { + let controller_id = Meteor.zoblak.client.controller_state().controller_id; + Meteor.call('stopTheAlarm', controller_id); } }); diff --git a/app/client/app.less b/app/client/app.less index d0eab3f..d1708cb 100644 --- a/app/client/app.less +++ b/app/client/app.less @@ -23,3 +23,19 @@ cursor: pointer; } } + + + +@media all and (orientation: portrait) { + #alarm_image { + width: 90%; + cursor: pointer; + } +} + +@media all and (orientation: landscape) { + #alarm_image { + width: 40%; + cursor: pointer; + } +} diff --git a/app/public/images/alarm.gif b/app/public/images/alarm.gif new file mode 100644 index 0000000..ec897bc Binary files /dev/null and b/app/public/images/alarm.gif differ diff --git a/app/server/api.js b/app/server/api.js index 4b174d8..a36b172 100644 --- a/app/server/api.js +++ b/app/server/api.js @@ -97,20 +97,6 @@ reactToSensorData = function(nextSensorReading) { } } -Api.addRoute('alarm/:id/stop', { - authRequired: false -}, { - post: function() { - var state = Meteor.zoblak.server.controller_state(controller_id); - ControllerState.update(state._id, { - '$set': { - 'state.alarmTriggered': false, - 'state.alarmStopped': new Date() - } - }); - } -}); - Api.addRoute('state/:id', { authRequired: false }, { diff --git a/app/server/methods.js b/app/server/methods.js index ac3f77f..847d028 100644 --- a/app/server/methods.js +++ b/app/server/methods.js @@ -1,4 +1,3 @@ - function setOutValveTo(controller_id, nextState) { var state = Meteor.zoblak.server.controller_state(controller_id); ControllerState.update(state._id, { @@ -173,6 +172,12 @@ function saveAlarmSettings(controller_id, minTemperature, maxTemperature, timeou }); } + +// there are three states of alarm: +// 1. normal ( state.alarmTriggered: false, state.alarmStopped: null ) +// 2. triggered ( state.alarmTriggered: true, state.alarmStopped: null ) +// 3. silenced ( state.alarmTriggered: false, state.alarmStopped: (sometime) ) + function reactToAlarmData(controller_id) { var reading = last_sensor_reading(controller_id); var state = Meteor.zoblak.server.controller_state(controller_id); @@ -181,7 +186,7 @@ function reactToAlarmData(controller_id) { var minTemperature = function(temperatures) { // if it gets a lot colder than absolute zero we will // we will have more problems than the bug in this code - if(size(temperatures) <= 0) return -1000; + if (temperatures.length <= 0) return -1000; var minimal = parseFloat(temperatures[0]); for (var i in temperatures) { if (parseFloat(temperatures[i]) < minimal) { @@ -193,7 +198,7 @@ function reactToAlarmData(controller_id) { var maxTemperature = function(temperatures) { // obviously - hell is not supported in this version - if(size(temperatures) <= 0) return 1000; + if (temperatures.length <= 0) return 1000; var maximal = parseFloat(temperatures[0]); for (var i in temperatures) { if (parseFloat(temperatures[i]) > maximal) { @@ -213,12 +218,17 @@ function reactToAlarmData(controller_id) { var minutesSinceLastPhoneContact = state.lastPhoneContact ? moment(state.lastPhoneContact).diff(moment(new Date()), 'minutes') : -1; var phoneSilent = config.timeoutPhone && minutesSinceLastPhoneContact > config.timeoutPhone; + + if (tooCold || tooHot || boxSilent || phoneSilent) { - soundTheAlarm(tooCold, tooHot, boxSilent, phoneSilent); + var alarmSilenced = !!state.state.alarmStopped; + if (!alarmSilenced) soundTheAlarm(controller_id, tooCold, tooHot, boxSilent, phoneSilent); + } else { + stopTheAlarm(controller_id, true); } } -function soundTheAlarm(tooCold, tooHot, boxSilent, phoneSilent) { +function soundTheAlarm(controller_id, tooCold, tooHot, boxSilent, phoneSilent) { var state = Meteor.zoblak.server.controller_state(controller_id); var reason = { tooHot: tooHot, @@ -262,7 +272,18 @@ function sendAlarmingSms(reason, numbers) { } } - +function stopTheAlarm(controller_id, everythingIsBackToNormal = false) { + // time of alarm stopped is reset so that scheduled job can raise the alarm + // again + var timeOfStopping = (everythingIsBackToNormal) ? null : new Date(); + var state = Meteor.zoblak.server.controller_state(controller_id); + ControllerState.update(state._id, { + '$set': { + 'state.alarmTriggered': false, + 'state.alarmStopped': timeOfStopping + } + }); +} function last_sensor_reading(controller_id) { var result = null; @@ -293,5 +314,6 @@ Meteor.methods({ clearLog: clearLog, saveControllerConfig: saveControllerConfig, requestNewPicture: requestNewPicture, - saveAlarmSettings: saveAlarmSettings + saveAlarmSettings: saveAlarmSettings, + stopTheAlarm: stopTheAlarm });