Merge pull request #37 from senaduka/temperature_errors_sensor_filtering
Temperature errors sensor filtering
This commit is contained in:
@@ -7,6 +7,14 @@
|
|||||||
<strong class="bg-danger">{{ pretty_reasons alarmReasons }}</strong>
|
<strong class="bg-danger">{{ pretty_reasons alarmReasons }}</strong>
|
||||||
<img src="/images/alarm.gif" class="img-responsive center-block" id="alarm_image" />
|
<img src="/images/alarm.gif" class="img-responsive center-block" id="alarm_image" />
|
||||||
<button id="stop_alarm" class="btn btn-danger"> <i class="fa fa-ban"></i> Prekini </button>
|
<button id="stop_alarm" class="btn btn-danger"> <i class="fa fa-ban"></i> Prekini </button>
|
||||||
|
|
||||||
|
{{/if}}
|
||||||
|
{{#if alarmStopped}}
|
||||||
|
<strong class="bg-danger">{{ pretty_reasons alarmReasons }}</strong>
|
||||||
|
<br /><br />
|
||||||
|
<div class="bg-warning"> <strong>Alarm prekinut!</strong> Nadzor će se nastaviti kada se temperatura vrati u zadani raspon.
|
||||||
|
</div>
|
||||||
|
<br /><br />
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{/with}}
|
{{/with}}
|
||||||
{{#with last_reading}}
|
{{#with last_reading}}
|
||||||
|
|||||||
@@ -1,30 +1,7 @@
|
|||||||
function sensor_data_collection() {
|
|
||||||
var controllerId = Session.get('controller_id');
|
|
||||||
return SensorData.find({
|
|
||||||
controllerId: controllerId
|
|
||||||
}, {
|
|
||||||
sort: {
|
|
||||||
created_at: -1
|
|
||||||
},
|
|
||||||
limit: 3
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function last_sensor_reading() {
|
|
||||||
var controller = Session.get('controller_id');
|
|
||||||
var result = null;
|
|
||||||
if (controller) {
|
|
||||||
result = sensor_data_collection();
|
|
||||||
}
|
|
||||||
if (result && result.count() > 0) {
|
|
||||||
return result.fetch()[0];
|
|
||||||
} else {
|
|
||||||
return {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Template.alarm.helpers({
|
Template.alarm.helpers({
|
||||||
last_reading: last_sensor_reading,
|
last_reading: Meteor.zoblak.client.last_sensor_reading,
|
||||||
state: function() {
|
state: function() {
|
||||||
return Meteor.zoblak.client.controller_state().state;
|
return Meteor.zoblak.client.controller_state().state;
|
||||||
},
|
},
|
||||||
@@ -33,10 +10,12 @@ Template.alarm.helpers({
|
|||||||
},
|
},
|
||||||
all_temperatures: function() {
|
all_temperatures: function() {
|
||||||
var result = "";
|
var result = "";
|
||||||
var temperatures = last_sensor_reading().temperatures;
|
var temperatures = Meteor.zoblak.client.last_sensor_reading().temperatures;
|
||||||
|
|
||||||
for (var i in temperatures) {
|
for (var i in temperatures) {
|
||||||
result += '' + parseFloat(temperatures[i]).toFixed(1) + ' °C ';
|
var temperature = parseFloat(temperatures[i]).toFixed(1);
|
||||||
|
var temperatureLabel = (Meteor.zoblak.shared.valid_temperature(temperature)) ? temperature : "XX.X";
|
||||||
|
result += '' + temperatureLabel + ' °C ';
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -71,7 +71,27 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<h3>Senzori: </h3>
|
||||||
|
<table class="table">
|
||||||
|
{{#each sensor in sensors }}
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
{{ pretty_temperature sensor.value }}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<label class="switch">
|
||||||
|
<input type="checkbox" checked={{sensor.on}} class="sensor_switch" />
|
||||||
|
<div class="slider round"></div>
|
||||||
|
</label>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{{/each}}
|
||||||
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
<button id="save_settings" class="btn btn-default" name="save_settings" data-dismiss="modal">Zapamti</button>
|
<button id="save_settings" class="btn btn-default" name="save_settings" data-dismiss="modal">Zapamti</button>
|
||||||
|
|||||||
@@ -26,12 +26,33 @@ Template.alarm_settings.helpers({
|
|||||||
var result = config()[property];
|
var result = config()[property];
|
||||||
console.log('returning', result);
|
console.log('returning', result);
|
||||||
return result;
|
return result;
|
||||||
|
},
|
||||||
|
|
||||||
|
pretty_temperature: function(temperature) {
|
||||||
|
var temperatureLabel = (Meteor.zoblak.shared.valid_temperature(temperature)) ? temperature : "XX.X";
|
||||||
|
return '' + temperatureLabel + ' °C ';
|
||||||
|
},
|
||||||
|
|
||||||
|
sensors: function() {
|
||||||
|
var temperatures = Meteor.zoblak.client.last_sensor_reading().temperatures;
|
||||||
|
var enabled = config()['sensorsEnabled'] || {};
|
||||||
|
var sensors = [];
|
||||||
|
for (var index in temperatures) {
|
||||||
|
var is_on = (index in enabled) ? enabled[index] : true; // on by default
|
||||||
|
var value = parseFloat(temperatures[index])
|
||||||
|
sensors.push({
|
||||||
|
value: value,
|
||||||
|
on: is_on
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return sensors;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Template.alarm_settings.events({
|
Template.alarm_settings.events({
|
||||||
'click #save_settings': function() {
|
'click #save_settings': function() {
|
||||||
var controller_id = Meteor.zoblak.client.controller_state().controller_id;
|
var controller_id = Meteor.zoblak.client.controller_state().controller_id;
|
||||||
|
1
|
||||||
var instance = Template.instance();
|
var instance = Template.instance();
|
||||||
var minTemperature = instance.$('#min_temperature').val();
|
var minTemperature = instance.$('#min_temperature').val();
|
||||||
var maxTemperature = instance.$('#max_temperature').val();
|
var maxTemperature = instance.$('#max_temperature').val();
|
||||||
@@ -42,6 +63,15 @@ Template.alarm_settings.events({
|
|||||||
var sms3 = instance.$('#sms3').val();
|
var sms3 = instance.$('#sms3').val();
|
||||||
var sms4 = instance.$('#sms4').val();
|
var sms4 = instance.$('#sms4').val();
|
||||||
|
|
||||||
Meteor.call('saveAlarmSettings', controller_id, minTemperature, maxTemperature, timeoutBox, timeoutPhone, [sms1, sms2, sms3, sms4]);
|
var sensorSwitches = instance.$('.sensor_switch');
|
||||||
|
var enabled = {};
|
||||||
|
|
||||||
|
sensorSwitches.each( function(index,element) {
|
||||||
|
enabled[index] = instance.$(element).is(':checked');
|
||||||
|
} );
|
||||||
|
|
||||||
|
console.log("Enabled: ", enabled);
|
||||||
|
|
||||||
|
Meteor.call('saveAlarmSettings', controller_id, minTemperature, maxTemperature, timeoutBox, timeoutPhone, [sms1, sms2, sms3, sms4] ,enabled);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -58,3 +58,62 @@
|
|||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* The switch - the box around the slider */
|
||||||
|
.switch {
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
width: 60px;
|
||||||
|
height: 34px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Hide default HTML checkbox */
|
||||||
|
.switch input {display:none;}
|
||||||
|
|
||||||
|
/* The slider */
|
||||||
|
.slider {
|
||||||
|
position: absolute;
|
||||||
|
cursor: pointer;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
background-color: #ccc;
|
||||||
|
-webkit-transition: .4s;
|
||||||
|
transition: .4s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider:before {
|
||||||
|
position: absolute;
|
||||||
|
content: "";
|
||||||
|
height: 26px;
|
||||||
|
width: 26px;
|
||||||
|
left: 4px;
|
||||||
|
bottom: 4px;
|
||||||
|
background-color: white;
|
||||||
|
-webkit-transition: .4s;
|
||||||
|
transition: .4s;
|
||||||
|
}
|
||||||
|
|
||||||
|
input:checked + .slider {
|
||||||
|
background-color: #2196F3;
|
||||||
|
}
|
||||||
|
|
||||||
|
input:focus + .slider {
|
||||||
|
box-shadow: 0 0 1px #2196F3;
|
||||||
|
}
|
||||||
|
|
||||||
|
input:checked + .slider:before {
|
||||||
|
-webkit-transform: translateX(26px);
|
||||||
|
-ms-transform: translateX(26px);
|
||||||
|
transform: translateX(26px);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Rounded sliders */
|
||||||
|
.slider.round {
|
||||||
|
border-radius: 34px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider.round:before {
|
||||||
|
border-radius: 50%;
|
||||||
|
}
|
||||||
|
|||||||
@@ -24,6 +24,37 @@ Meteor.zoblak.client = {
|
|||||||
if (!controller.features) return false;
|
if (!controller.features) return false;
|
||||||
|
|
||||||
return controller.features[feature] === true;
|
return controller.features[feature] === true;
|
||||||
|
},
|
||||||
|
|
||||||
|
sensor_data_collection: function() {
|
||||||
|
var controllerId = Session.get('controller_id');
|
||||||
|
return SensorData.find({
|
||||||
|
controllerId: controllerId
|
||||||
|
}, {
|
||||||
|
sort: {
|
||||||
|
created_at: -1
|
||||||
|
},
|
||||||
|
limit: 3
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
last_sensor_reading: function() {
|
||||||
|
var controller = Session.get('controller_id');
|
||||||
|
var result = null;
|
||||||
|
if (controller) {
|
||||||
|
result = Meteor.zoblak.client.sensor_data_collection();
|
||||||
|
}
|
||||||
|
if (result && result.count() > 0) {
|
||||||
|
return result.fetch()[0];
|
||||||
|
} else {
|
||||||
|
return {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Meteor.zoblak.shared = {
|
||||||
|
valid_temperature: function(value) {
|
||||||
|
return (parseFloat(value) > -40 && parseFloat(value) < 50);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -55,7 +86,7 @@ Meteor.zoblak.server = {
|
|||||||
var controller_id = ids[index];
|
var controller_id = ids[index];
|
||||||
try {
|
try {
|
||||||
whatToDo(controller_id);
|
whatToDo(controller_id);
|
||||||
} catch(err) {
|
} catch (err) {
|
||||||
console.log('Cannot call ', whatToDo, controller_id, err);
|
console.log('Cannot call ', whatToDo, controller_id, err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -143,7 +143,7 @@ function saveControllerConfig(controller_id, time, days, manualInflow) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function saveAlarmSettings(controller_id, minTemperature, maxTemperature, timeoutBox, timeoutPhone, smsNumbers) {
|
function saveAlarmSettings(controller_id, minTemperature, maxTemperature, timeoutBox, timeoutPhone, smsNumbers, sensorsEnabled) {
|
||||||
var state = Meteor.zoblak.server.controller_state(controller_id);
|
var state = Meteor.zoblak.server.controller_state(controller_id);
|
||||||
ControllerState.update(state._id, {
|
ControllerState.update(state._id, {
|
||||||
'$set': {
|
'$set': {
|
||||||
@@ -155,7 +155,8 @@ function saveAlarmSettings(controller_id, minTemperature, maxTemperature, timeou
|
|||||||
'config.sms1': smsNumbers[0],
|
'config.sms1': smsNumbers[0],
|
||||||
'config.sms2': smsNumbers[1],
|
'config.sms2': smsNumbers[1],
|
||||||
'config.sms3': smsNumbers[2],
|
'config.sms3': smsNumbers[2],
|
||||||
'config.sms4': smsNumbers[3]
|
'config.sms4': smsNumbers[3],
|
||||||
|
'config.sensorsEnabled': sensorsEnabled
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -186,6 +187,7 @@ reactToAlarmData = function(controller_id) {
|
|||||||
var state = Meteor.zoblak.server.controller_state(controller_id);
|
var state = Meteor.zoblak.server.controller_state(controller_id);
|
||||||
var config = state.config;
|
var config = state.config;
|
||||||
|
|
||||||
|
|
||||||
var minTemperature = function(temperatures) {
|
var minTemperature = function(temperatures) {
|
||||||
// if it gets a lot colder than absolute zero
|
// if it gets a lot colder than absolute zero
|
||||||
// we will have more problems than the bug in this code
|
// we will have more problems than the bug in this code
|
||||||
@@ -197,7 +199,7 @@ reactToAlarmData = function(controller_id) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return minimal;
|
return minimal;
|
||||||
}
|
};
|
||||||
|
|
||||||
var maxTemperature = function(temperatures) {
|
var maxTemperature = function(temperatures) {
|
||||||
// obviously - hell is not supported in this version
|
// obviously - hell is not supported in this version
|
||||||
@@ -209,11 +211,17 @@ reactToAlarmData = function(controller_id) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return maximal;
|
return maximal;
|
||||||
}
|
};
|
||||||
|
|
||||||
var tooCold = config.minTemperature && (minTemperature(reading.temperatures) < config.minTemperature);
|
var temperatures = (reading.temperatures || []).filter(function(temperature, index) {
|
||||||
|
var is_on = (index in config.sensorsEnabled)?config.sensorsEnabled[index]: true;
|
||||||
|
return Meteor.zoblak.shared.valid_temperature(temperature) && is_on;
|
||||||
|
});
|
||||||
|
|
||||||
var tooHot = config.maxTemperature && (maxTemperature(reading.temperatures) > config.maxTemperature);
|
|
||||||
|
var tooCold = config.minTemperature && (minTemperature(temperatures) < config.minTemperature);
|
||||||
|
|
||||||
|
var tooHot = config.maxTemperature && (maxTemperature(temperatures) > config.maxTemperature);
|
||||||
|
|
||||||
var minutesSinceLastBoxContact = reading.lastBoxContact ? moment(new Date()).diff(moment(reading.lastBoxContact), 'minutes') : -1;
|
var minutesSinceLastBoxContact = reading.lastBoxContact ? moment(new Date()).diff(moment(reading.lastBoxContact), 'minutes') : -1;
|
||||||
var boxSilent = config.timeoutBox && minutesSinceLastBoxContact > config.timeoutBox;
|
var boxSilent = config.timeoutBox && minutesSinceLastBoxContact > config.timeoutBox;
|
||||||
|
|||||||
Reference in New Issue
Block a user