Cleaning up old logic and files
This commit is contained in:
File diff suppressed because it is too large
Load Diff
1894
octoprint_enclosure/old_stuff/__init__.py
Normal file
1894
octoprint_enclosure/old_stuff/__init__.py
Normal file
File diff suppressed because it is too large
Load Diff
230
octoprint_enclosure/old_stuff/static/css/bootstrap-colorpicker.css
vendored
Normal file
230
octoprint_enclosure/old_stuff/static/css/bootstrap-colorpicker.css
vendored
Normal file
@@ -0,0 +1,230 @@
|
||||
/*!
|
||||
* Bootstrap Colorpicker v2.5.1
|
||||
* https://itsjavi.com/bootstrap-colorpicker/
|
||||
*
|
||||
* Originally written by (c) 2012 Stefan Petre
|
||||
* Licensed under the Apache License v2.0
|
||||
* http://www.apache.org/licenses/LICENSE-2.0.txt
|
||||
*
|
||||
*/
|
||||
.colorpicker-saturation {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
background-image: url("../img/bootstrap-colorpicker/saturation.png");
|
||||
cursor: crosshair;
|
||||
float: left;
|
||||
}
|
||||
.colorpicker-saturation i {
|
||||
display: block;
|
||||
height: 5px;
|
||||
width: 5px;
|
||||
border: 1px solid #000;
|
||||
-webkit-border-radius: 5px;
|
||||
-moz-border-radius: 5px;
|
||||
border-radius: 5px;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
margin: -4px 0 0 -4px;
|
||||
}
|
||||
.colorpicker-saturation i b {
|
||||
display: block;
|
||||
height: 5px;
|
||||
width: 5px;
|
||||
border: 1px solid #fff;
|
||||
-webkit-border-radius: 5px;
|
||||
-moz-border-radius: 5px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
.colorpicker-hue,
|
||||
.colorpicker-alpha {
|
||||
width: 15px;
|
||||
height: 100px;
|
||||
float: left;
|
||||
cursor: row-resize;
|
||||
margin-left: 4px;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
.colorpicker-hue i,
|
||||
.colorpicker-alpha i {
|
||||
display: block;
|
||||
height: 1px;
|
||||
background: #000;
|
||||
border-top: 1px solid #fff;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
margin-top: -1px;
|
||||
}
|
||||
.colorpicker-hue {
|
||||
background-image: url("../img/bootstrap-colorpicker/hue.png");
|
||||
}
|
||||
.colorpicker-alpha {
|
||||
background-image: url("../img/bootstrap-colorpicker/alpha.png");
|
||||
display: none;
|
||||
}
|
||||
.colorpicker-saturation,
|
||||
.colorpicker-hue,
|
||||
.colorpicker-alpha {
|
||||
background-size: contain;
|
||||
}
|
||||
.colorpicker {
|
||||
padding: 4px;
|
||||
min-width: 130px;
|
||||
margin-top: 1px;
|
||||
-webkit-border-radius: 4px;
|
||||
-moz-border-radius: 4px;
|
||||
border-radius: 4px;
|
||||
z-index: 2500;
|
||||
}
|
||||
.colorpicker:before,
|
||||
.colorpicker:after {
|
||||
display: table;
|
||||
content: "";
|
||||
line-height: 0;
|
||||
}
|
||||
.colorpicker:after {
|
||||
clear: both;
|
||||
}
|
||||
.colorpicker:before {
|
||||
content: '';
|
||||
display: inline-block;
|
||||
border-left: 7px solid transparent;
|
||||
border-right: 7px solid transparent;
|
||||
border-bottom: 7px solid #ccc;
|
||||
border-bottom-color: rgba(0, 0, 0, 0.2);
|
||||
position: absolute;
|
||||
top: -7px;
|
||||
left: 6px;
|
||||
}
|
||||
.colorpicker:after {
|
||||
content: '';
|
||||
display: inline-block;
|
||||
border-left: 6px solid transparent;
|
||||
border-right: 6px solid transparent;
|
||||
border-bottom: 6px solid #ffffff;
|
||||
position: absolute;
|
||||
top: -6px;
|
||||
left: 7px;
|
||||
}
|
||||
.colorpicker div {
|
||||
position: relative;
|
||||
}
|
||||
.colorpicker.colorpicker-with-alpha {
|
||||
min-width: 140px;
|
||||
}
|
||||
.colorpicker.colorpicker-with-alpha .colorpicker-alpha {
|
||||
display: block;
|
||||
}
|
||||
.colorpicker-color {
|
||||
height: 10px;
|
||||
margin-top: 5px;
|
||||
clear: both;
|
||||
background-image: url("../img/bootstrap-colorpicker/alpha.png");
|
||||
background-position: 0 100%;
|
||||
}
|
||||
.colorpicker-color div {
|
||||
height: 10px;
|
||||
}
|
||||
.colorpicker-selectors {
|
||||
display: none;
|
||||
height: 10px;
|
||||
margin-top: 5px;
|
||||
clear: both;
|
||||
}
|
||||
.colorpicker-selectors i {
|
||||
cursor: pointer;
|
||||
float: left;
|
||||
height: 10px;
|
||||
width: 10px;
|
||||
}
|
||||
.colorpicker-selectors i + i {
|
||||
margin-left: 3px;
|
||||
}
|
||||
.colorpicker-element .input-group-addon i,
|
||||
.colorpicker-element .add-on i {
|
||||
display: inline-block;
|
||||
cursor: pointer;
|
||||
height: 16px;
|
||||
vertical-align: text-top;
|
||||
width: 16px;
|
||||
}
|
||||
.colorpicker.colorpicker-inline {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
float: none;
|
||||
z-index: auto;
|
||||
}
|
||||
.colorpicker.colorpicker-horizontal {
|
||||
width: 110px;
|
||||
min-width: 110px;
|
||||
height: auto;
|
||||
}
|
||||
.colorpicker.colorpicker-horizontal .colorpicker-saturation {
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
.colorpicker.colorpicker-horizontal .colorpicker-color {
|
||||
width: 100px;
|
||||
}
|
||||
.colorpicker.colorpicker-horizontal .colorpicker-hue,
|
||||
.colorpicker.colorpicker-horizontal .colorpicker-alpha {
|
||||
width: 100px;
|
||||
height: 15px;
|
||||
float: left;
|
||||
cursor: col-resize;
|
||||
margin-left: 0px;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
.colorpicker.colorpicker-horizontal .colorpicker-hue i,
|
||||
.colorpicker.colorpicker-horizontal .colorpicker-alpha i {
|
||||
display: block;
|
||||
height: 15px;
|
||||
background: #ffffff;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 1px;
|
||||
border: none;
|
||||
margin-top: 0px;
|
||||
}
|
||||
.colorpicker.colorpicker-horizontal .colorpicker-hue {
|
||||
background-image: url("../img/bootstrap-colorpicker/hue-horizontal.png");
|
||||
}
|
||||
.colorpicker.colorpicker-horizontal .colorpicker-alpha {
|
||||
background-image: url("../img/bootstrap-colorpicker/alpha-horizontal.png");
|
||||
}
|
||||
.colorpicker-right:before {
|
||||
left: auto;
|
||||
right: 6px;
|
||||
}
|
||||
.colorpicker-right:after {
|
||||
left: auto;
|
||||
right: 7px;
|
||||
}
|
||||
.colorpicker-no-arrow:before {
|
||||
border-right: 0;
|
||||
border-left: 0;
|
||||
}
|
||||
.colorpicker-no-arrow:after {
|
||||
border-right: 0;
|
||||
border-left: 0;
|
||||
}
|
||||
.colorpicker.colorpicker-visible,
|
||||
.colorpicker-alpha.colorpicker-visible,
|
||||
.colorpicker-saturation.colorpicker-visible,
|
||||
.colorpicker-hue.colorpicker-visible,
|
||||
.colorpicker-selectors.colorpicker-visible {
|
||||
display: block;
|
||||
}
|
||||
.colorpicker.colorpicker-hidden,
|
||||
.colorpicker-alpha.colorpicker-hidden,
|
||||
.colorpicker-saturation.colorpicker-hidden,
|
||||
.colorpicker-hue.colorpicker-hidden,
|
||||
.colorpicker-selectors.colorpicker-hidden {
|
||||
display: none;
|
||||
}
|
||||
.colorpicker-inline.colorpicker-visible {
|
||||
display: inline-block;
|
||||
}
|
||||
/*# sourceMappingURL=bootstrap-colorpicker.css.map */
|
||||
74
octoprint_enclosure/old_stuff/static/css/enclosure.css
Normal file
74
octoprint_enclosure/old_stuff/static/css/enclosure.css
Normal file
@@ -0,0 +1,74 @@
|
||||
#enclosure-table {
|
||||
table-layout: fixed;
|
||||
width: 100%;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
#enclosure-table th,
|
||||
#enclosure-table td {
|
||||
vertical-align: middle;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
|
||||
#enclosure-table th.temperature_sensor,
|
||||
#enclosure-table td.temperature_sensor {
|
||||
width: 15%;
|
||||
text-align: left;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
#enclosure-table th.temperature_actual,
|
||||
#enclosure-table td.temperature_actual {
|
||||
width: 20%;
|
||||
}
|
||||
|
||||
#enclosure-table th.humidity_actual,
|
||||
#enclosure-table td.humidity_actual {
|
||||
width: 15%;
|
||||
}
|
||||
|
||||
#enclosure-table th.temp_hum_control,
|
||||
#enclosure-table td.temp_hum_control {
|
||||
width: 15%;
|
||||
}
|
||||
|
||||
#enclosure-table th.temperature_target,
|
||||
#enclosure-table td.temperature_target {
|
||||
width: 35%;
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
.glyphs-on {
|
||||
color: blue;
|
||||
text-shadow: 4px 4px 15px blue;
|
||||
}
|
||||
|
||||
.glyphs-off {
|
||||
color: red;
|
||||
text-shadow: 4px 4px 15px red;
|
||||
}
|
||||
|
||||
.enclosure-link{
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.enclosure-link:hover{
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.navbar-enclosure{
|
||||
text-shadow: 0 1px 0 #ccc;
|
||||
color: #333;
|
||||
float: none;
|
||||
padding: 10px 15px 10px;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.ledstrip-div, .neopixel-div{
|
||||
width: 25%;
|
||||
}
|
||||
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 557 B |
Binary file not shown.
|
After Width: | Height: | Size: 488 B |
Binary file not shown.
|
After Width: | Height: | Size: 478 B |
Binary file not shown.
|
After Width: | Height: | Size: 504 B |
Binary file not shown.
|
After Width: | Height: | Size: 4.0 KiB |
5
octoprint_enclosure/old_stuff/static/js/bootstrap-colorpicker.min.js
vendored
Normal file
5
octoprint_enclosure/old_stuff/static/js/bootstrap-colorpicker.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
709
octoprint_enclosure/old_stuff/static/js/enclosure.js
Normal file
709
octoprint_enclosure/old_stuff/static/js/enclosure.js
Normal file
@@ -0,0 +1,709 @@
|
||||
$(function () {
|
||||
function EnclosureViewModel(parameters) {
|
||||
var self = this;
|
||||
|
||||
self.pluginName = "enclosure";
|
||||
|
||||
self.settingsViewModel = parameters[0];
|
||||
self.connectionViewModel = parameters[1];
|
||||
self.printerStateViewModel = parameters[2];
|
||||
|
||||
self.rpi_outputs = ko.observableArray();
|
||||
self.rpi_inputs = ko.observableArray();
|
||||
|
||||
self.settingsOpen = false;
|
||||
|
||||
self.settings_outputs_regular = ko.pureComputed(function () {
|
||||
return ko.utils.arrayFilter(self.settingsViewModel.settings.plugins.enclosure.rpi_outputs(), function (item) {
|
||||
return (item.output_type() === "regular" && !item.toggle_timer());
|
||||
});
|
||||
});
|
||||
|
||||
self.settings_possible_outputs = ko.pureComputed(function () {
|
||||
return ko.utils.arrayFilter(self.settingsViewModel.settings.plugins.enclosure.rpi_outputs(), function (item) {
|
||||
return ((item.output_type() === "regular" && !item.toggle_timer()) || item.output_type() === "gcode_output" || item.output_type() === "shell_output");
|
||||
});
|
||||
});
|
||||
|
||||
self.rpi_inputs_temperature_sensors = ko.pureComputed(function () {
|
||||
return ko.utils.arrayFilter(self.rpi_inputs(), function (item) {
|
||||
return (item.input_type() === "temperature_sensor");
|
||||
});
|
||||
});
|
||||
|
||||
self.settings_temperature_sensors = ko.pureComputed(function () {
|
||||
return ko.utils.arrayFilter(self.settingsViewModel.settings.plugins.enclosure.rpi_inputs(), function (item) {
|
||||
return (item.input_type() === "temperature_sensor");
|
||||
});
|
||||
});
|
||||
|
||||
self.settings_hum_sensors = ko.pureComputed(function () {
|
||||
return ko.utils.arrayFilter(self.settings_temperature_sensors(), function (sensor) {
|
||||
return (self.humidityCapableSensor(sensor.temp_sensor_type()));
|
||||
});
|
||||
});
|
||||
|
||||
self.use_sudo = ko.observable();
|
||||
self.gcode_control = ko.observable();
|
||||
self.neopixel_dma = ko.observable();
|
||||
self.debug = ko.observable();
|
||||
self.debug_temperature_log = ko.observable();
|
||||
self.use_board_pin_number = ko.observable();
|
||||
self.filament_sensor_gcode = ko.observable();
|
||||
self.notification_provider = ko.observable();
|
||||
self.notification_event_name = ko.observable();
|
||||
self.notification_api_key = ko.observable();
|
||||
self.notifications = ko.observableArray([]);
|
||||
|
||||
self.humidityCapableSensor = function(sensor){
|
||||
if (['11', '22', '2302', 'bme280', 'am2320', 'si7021'].indexOf(sensor) >= 0){
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
self.isRegularOutput = function(index_id){
|
||||
return_value = false;
|
||||
if (typeof index_id != 'undefined'){
|
||||
self.settingsViewModel.settings.plugins.enclosure.rpi_outputs().forEach(function (output) {
|
||||
if (output.index_id() == index_id && output.output_type() == "regular") {
|
||||
return_value = true;
|
||||
return false;
|
||||
}
|
||||
});
|
||||
}
|
||||
return return_value;
|
||||
};
|
||||
|
||||
self.linkedTemperatureControl = function(sensor_index){
|
||||
return ko.pureComputed(function () {
|
||||
return ko.utils.arrayFilter(self.rpi_outputs(), function (item) {
|
||||
if (item.linked_temp_sensor){
|
||||
return (item.linked_temp_sensor() == sensor_index && item.output_type() == "temp_hum_control");
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
self.calculateRowSpan = function(index_id){
|
||||
span = self.linkedTemperatureControl(index_id())().length
|
||||
return span == 0 ? 1 : span;
|
||||
};
|
||||
|
||||
self.hasAnySensorWithHumidity = function(){
|
||||
return_value = false;
|
||||
self.rpi_inputs_temperature_sensors().forEach(function (sensor) {
|
||||
if (self.humidityCapableSensor(sensor.temp_sensor_type())) {
|
||||
return_value = true;
|
||||
return false;
|
||||
}
|
||||
});
|
||||
return return_value;
|
||||
};
|
||||
|
||||
self.hasAnyNavbarOutput = function(){
|
||||
return_value = false;
|
||||
self.rpi_outputs().forEach(function (output) {
|
||||
if ((output.output_type()=="regular" || output.output_type()=="gcode_output") && output.show_on_navbar()) {
|
||||
return_value = true;
|
||||
return false;
|
||||
}
|
||||
});
|
||||
return return_value;
|
||||
};
|
||||
|
||||
self.hasAnyNavbarTemperature = function(){
|
||||
return_value = false;
|
||||
self.rpi_inputs_temperature_sensors().forEach(function (sensor) {
|
||||
if (sensor.temp_sensor_navbar()) {
|
||||
return_value = true;
|
||||
return false;
|
||||
}
|
||||
});
|
||||
return return_value;
|
||||
};
|
||||
|
||||
self.hasAnyTemperatureControl = function(){
|
||||
return_value = false
|
||||
self.rpi_outputs().forEach(function (output) {
|
||||
if (output.output_type()=="temp_hum_control") {
|
||||
return_value = true
|
||||
return false;
|
||||
}
|
||||
});
|
||||
return return_value;
|
||||
};
|
||||
|
||||
self.onDataUpdaterPluginMessage = function (plugin, data) {
|
||||
|
||||
if (typeof plugin == 'undefined'){
|
||||
return;
|
||||
}
|
||||
|
||||
if (plugin != "enclosure") {
|
||||
return;
|
||||
}
|
||||
|
||||
if(self.settingsOpen){
|
||||
return;
|
||||
}
|
||||
|
||||
if (data.hasOwnProperty("sensor_data")) {
|
||||
data.sensor_data.forEach(function (sensor_data) {
|
||||
var linked_temp_sensor = ko.utils.arrayFilter(self.rpi_inputs_temperature_sensors(), function (temperature_sensor) {
|
||||
return (sensor_data['index_id'] == temperature_sensor.index_id());
|
||||
}).pop();
|
||||
if (linked_temp_sensor){
|
||||
linked_temp_sensor.temp_sensor_temp(sensor_data['temperature'])
|
||||
linked_temp_sensor.temp_sensor_humidity(sensor_data['humidity'])
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
if (data.hasOwnProperty("set_temperature")) {
|
||||
data.set_temperature.forEach(function (set_temperature) {
|
||||
var linked_temp_control = ko.utils.arrayFilter(self.rpi_outputs(), function (temp_control) {
|
||||
return (set_temperature['index_id'] == temp_control.index_id());
|
||||
}).pop();
|
||||
if (linked_temp_control) {
|
||||
linked_temp_control.temp_ctr_set_value(set_temperature['set_temperature'])
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
if (data.hasOwnProperty("rpi_output_regular")) {
|
||||
data.rpi_output_regular.forEach(function (output) {
|
||||
var linked_output = ko.utils.arrayFilter(self.rpi_outputs(), function (item) {
|
||||
return (output['index_id'] == item.index_id());
|
||||
}).pop();
|
||||
if (linked_output) {
|
||||
linked_output.gpio_status(output['status'])
|
||||
linked_output.auto_shutdown(output['auto_shutdown'])
|
||||
linked_output.auto_startup(output['auto_startup'])
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
if (data.hasOwnProperty("rpi_output_temp_hum_ctrl")) {
|
||||
data.rpi_output_temp_hum_ctrl.forEach(function (output) {
|
||||
var linked_output = ko.utils.arrayFilter(self.rpi_outputs(), function (item) {
|
||||
return (output['index_id'] == item.index_id());
|
||||
}).pop();
|
||||
if (linked_output) {
|
||||
linked_output.gpio_status(output['status'])
|
||||
linked_output.auto_shutdown(output['auto_shutdown'])
|
||||
linked_output.auto_startup(output['auto_startup'])
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
if (data.hasOwnProperty("rpi_output_pwm")) {
|
||||
data.rpi_output_pwm.forEach(function (output) {
|
||||
var linked_output = ko.utils.arrayFilter(self.rpi_outputs(), function (item) {
|
||||
return (output['index_id'] == item.index_id());
|
||||
}).pop();
|
||||
if (linked_output) {
|
||||
linked_output.duty_cycle(output['pwm_value'])
|
||||
linked_output.auto_shutdown(output['auto_shutdown'])
|
||||
linked_output.auto_startup(output['auto_startup'])
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
if (data.hasOwnProperty("rpi_output_neopixel")) {
|
||||
data.rpi_output_neopixel.forEach(function (output) {
|
||||
var linked_output = ko.utils.arrayFilter(self.rpi_outputs(), function (item) {
|
||||
return (output['index_id'] == item.index_id());
|
||||
}).pop();
|
||||
if (linked_output) {
|
||||
linked_output.neopixel_color(output['color'])
|
||||
linked_output.auto_shutdown(output['auto_shutdown'])
|
||||
linked_output.auto_startup(output['auto_startup'])
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
if (data.hasOwnProperty("rpi_output_ledstrip")) {
|
||||
data.rpi_output_ledstrip.forEach(function (output) {
|
||||
var linked_output = ko.utils.arrayFilter(self.rpi_outputs(), function (item) {
|
||||
return (output['index_id'] == item.index_id());
|
||||
}).pop();
|
||||
if (linked_output) {
|
||||
linked_output.ledstrip_color(output['color'])
|
||||
linked_output.auto_shutdown(output['auto_shutdown'])
|
||||
linked_output.auto_startup(output['auto_startup'])
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
if (data.hasOwnProperty("filament_sensor_status")) {
|
||||
data.filament_sensor_status.forEach(function (filament_sensor) {
|
||||
var linked_filament_sensor = ko.utils.arrayFilter(self.rpi_inputs(), function (item) {
|
||||
return (filament_sensor['index_id'] == item.index_id());
|
||||
}).pop();
|
||||
if (linked_filament_sensor) {
|
||||
linked_filament_sensor.filament_sensor_enabled(filament_sensor['filament_sensor_enabled'])
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
if (data.is_msg) {
|
||||
new PNotify({
|
||||
title: "Enclosure",
|
||||
text: data.msg,
|
||||
type: data.msg_type
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
self.isUser = ko.computed(function () {
|
||||
return self.connectionViewModel.loginState.isUser();
|
||||
});
|
||||
|
||||
self.isOperational = ko.computed(function () {
|
||||
return self.connectionViewModel.loginState.isUser() && self.printerStateViewModel.isOperational();
|
||||
});
|
||||
|
||||
|
||||
self.getCleanTemperature = function (temp) {
|
||||
if (temp === undefined || isNaN(parseFloat(temp))) return "-";
|
||||
if (temp < 10) return String("off");
|
||||
return temp;
|
||||
}
|
||||
|
||||
self.getDutyCycle = function (duty_cycle) {
|
||||
if (duty_cycle === undefined || isNaN(parseFloat(duty_cycle))) return "-";
|
||||
if (parseInt(duty_cycle) == 0) return String("off");
|
||||
return duty_cycle;
|
||||
}
|
||||
|
||||
self.bindFromSettings = function(){
|
||||
self.rpi_outputs(self.settingsViewModel.settings.plugins.enclosure.rpi_outputs());
|
||||
self.rpi_inputs(self.settingsViewModel.settings.plugins.enclosure.rpi_inputs());
|
||||
self.use_sudo(self.settingsViewModel.settings.plugins.enclosure.use_sudo());
|
||||
self.gcode_control(self.settingsViewModel.settings.plugins.enclosure.gcode_control());
|
||||
self.neopixel_dma(self.settingsViewModel.settings.plugins.enclosure.neopixel_dma());
|
||||
self.debug(self.settingsViewModel.settings.plugins.enclosure.debug());
|
||||
self.debug_temperature_log(self.settingsViewModel.settings.plugins.enclosure.debug_temperature_log());
|
||||
self.use_board_pin_number(self.settingsViewModel.settings.plugins.enclosure.use_board_pin_number());
|
||||
self.filament_sensor_gcode(self.settingsViewModel.settings.plugins.enclosure.filament_sensor_gcode());
|
||||
self.notification_provider(self.settingsViewModel.settings.plugins.enclosure.notification_provider());
|
||||
self.notification_event_name(self.settingsViewModel.settings.plugins.enclosure.notification_event_name());
|
||||
self.notification_api_key(self.settingsViewModel.settings.plugins.enclosure.notification_api_key());
|
||||
self.notifications(self.settingsViewModel.settings.plugins.enclosure.notifications());
|
||||
};
|
||||
|
||||
self.onBeforeBinding = function () {
|
||||
self.bindFromSettings();
|
||||
};
|
||||
|
||||
self.onSettingsBeforeSave = function() {
|
||||
self.bindFromSettings();
|
||||
};
|
||||
|
||||
self.onStartupComplete = function () {
|
||||
self.settingsOpen = false;
|
||||
};
|
||||
|
||||
self.onSettingsShown = function () {
|
||||
self.settingsOpen = true;
|
||||
};
|
||||
|
||||
self.showColorPicker = function () {
|
||||
$('[name=colorpicker]').colorpicker({
|
||||
format: 'rgb'
|
||||
});
|
||||
}
|
||||
|
||||
self.onSettingsHidden = function () {
|
||||
self.showColorPicker();
|
||||
self.settingsOpen = false;
|
||||
};
|
||||
|
||||
self.getRegularOutputs = function () {
|
||||
return self.rpi_outputs().filter(function (rpi_outputs) {
|
||||
return rpi_outputs.output_type == 'regular';
|
||||
});
|
||||
};
|
||||
|
||||
self.setTemperature = function (item, form) {
|
||||
|
||||
var newSetTemperature = item.temp_ctr_new_set_value();
|
||||
if (form !== undefined) {
|
||||
$(form).find("input").blur();
|
||||
}
|
||||
|
||||
if(self.isNumeric(newSetTemperature)){
|
||||
var request = {set_temperature:newSetTemperature, index_id:item.index_id()};
|
||||
|
||||
$.ajax({
|
||||
url: self.buildPluginUrl("/setEnclosureTempHum"),
|
||||
type: "GET",
|
||||
dataType: "json",
|
||||
data: request,
|
||||
success: function (data) {
|
||||
item.temp_ctr_new_set_value("");
|
||||
item.temp_ctr_set_value(newSetTemperature);
|
||||
self.getUpdateUI();
|
||||
},
|
||||
error: function (textStatus, errorThrown) {
|
||||
new PNotify({
|
||||
title: "Enclosure",
|
||||
text: "Error setting temperature",
|
||||
type: "error"
|
||||
});
|
||||
}
|
||||
});
|
||||
}else{
|
||||
new PNotify({
|
||||
title: "Enclosure",
|
||||
text: "Invalid set temperature",
|
||||
type: "error"
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
self.addRpiOutput = function () {
|
||||
|
||||
var arrRelaysLength = self.settingsViewModel.settings.plugins.enclosure.rpi_outputs().length;
|
||||
|
||||
var nextIndex = arrRelaysLength == 0 ? 1 : self.settingsViewModel.settings.plugins.enclosure.rpi_outputs()[arrRelaysLength - 1].index_id() + 1;
|
||||
|
||||
self.settingsViewModel.settings.plugins.enclosure.rpi_outputs.push({
|
||||
index_id: ko.observable(nextIndex),
|
||||
label: ko.observable("Ouput " + nextIndex),
|
||||
output_type: ko.observable("regular"),
|
||||
shell_script: ko.observable(""),
|
||||
gpio_pin: ko.observable(0),
|
||||
gpio_status: ko.observable(false),
|
||||
hide_btn_ui: ko.observable(false),
|
||||
active_low: ko.observable(true),
|
||||
pwm_temperature_linked: ko.observable(false),
|
||||
toggle_timer: ko.observable(false),
|
||||
toggle_timer_on: ko.observable(0),
|
||||
toggle_timer_off: ko.observable(0),
|
||||
startup_with_server: ko.observable(false),
|
||||
auto_startup: ko.observable(false),
|
||||
controlled_io: ko.observable(0),
|
||||
controlled_io_set_value: ko.observable("Low"),
|
||||
startup_time: ko.observable(0),
|
||||
auto_shutdown: ko.observable(false),
|
||||
shutdown_on_failed: ko.observable(false),
|
||||
shutdown_time: ko.observable(0),
|
||||
linked_temp_sensor: ko.observable(""),
|
||||
alarm_set_temp: ko.observable(0),
|
||||
temp_ctr_type: ko.observable("heater"),
|
||||
temp_ctr_deadband: ko.observable(0),
|
||||
temp_ctr_set_value: ko.observable(0),
|
||||
temp_ctr_new_set_value: ko.observable(""),
|
||||
temp_ctr_default_value: ko.observable(0),
|
||||
temp_ctr_max_temp: ko.observable(0),
|
||||
pwm_frequency: ko.observable(50),
|
||||
pwm_status: ko.observable(50),
|
||||
duty_cycle: ko.observable(0),
|
||||
duty_a: ko.observable(0),
|
||||
duty_b: ko.observable(0),
|
||||
temperature_a: ko.observable(0),
|
||||
temperature_b: ko.observable(0),
|
||||
default_duty_cycle: ko.observable(0),
|
||||
new_duty_cycle: ko.observable(""),
|
||||
neopixel_color: ko.observable("rgb(0,0,0)"),
|
||||
default_neopixel_color: ko.observable(""),
|
||||
new_neopixel_color: ko.observable(""),
|
||||
neopixel_count: ko.observable(0),
|
||||
neopixel_brightness: ko.observable(255),
|
||||
ledstrip_color: ko.observable("rgb(0,0,0)"),
|
||||
default_ledstrip_color: ko.observable(""),
|
||||
new_ledstrip_color: ko.observable(""),
|
||||
ledstrip_gpio_clk: ko.observable(""),
|
||||
ledstrip_gpio_dat: ko.observable(""),
|
||||
microcontroller_address: ko.observable(0),
|
||||
gcode: ko.observable(""),
|
||||
show_on_navbar: ko.observable(false)
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
self.removeRpiOutput = function (data) {
|
||||
self.settingsViewModel.settings.plugins.enclosure.rpi_outputs.remove(data);
|
||||
};
|
||||
|
||||
self.addRpiInput = function () {
|
||||
|
||||
var arrRelaysLength = self.settingsViewModel.settings.plugins.enclosure.rpi_inputs().length;
|
||||
|
||||
var nextIndex = arrRelaysLength == 0 ? 1 : self.settingsViewModel.settings.plugins.enclosure.rpi_inputs()[arrRelaysLength - 1].index_id() + 1;
|
||||
|
||||
self.settingsViewModel.settings.plugins.enclosure.rpi_inputs.push({
|
||||
index_id: ko.observable(nextIndex),
|
||||
label: ko.observable("Input " + nextIndex),
|
||||
input_type: ko.observable("gpio"),
|
||||
gpio_pin: ko.observable(0),
|
||||
input_pull_resistor: ko.observable("input_pull_up"),
|
||||
temp_sensor_type: ko.observable("DS18B20"),
|
||||
temp_sensor_address: ko.observable(""),
|
||||
temp_sensor_temp: ko.observable(""),
|
||||
temp_sensor_humidity: ko.observable(""),
|
||||
ds18b20_serial: ko.observable(""),
|
||||
use_fahrenheit: ko.observable(false),
|
||||
action_type: ko.observable("output_control"),
|
||||
controlled_io: ko.observable(""),
|
||||
controlled_io_set_value: ko.observable("low"),
|
||||
edge: ko.observable("fall"),
|
||||
printer_action: ko.observable("filament"),
|
||||
temp_sensor_navbar: ko.observable(true),
|
||||
filament_sensor_timeout: ko.observable(120),
|
||||
filament_sensor_enabled: ko.observable(true)
|
||||
});
|
||||
};
|
||||
|
||||
self.removeRpiInput = function (definition) {
|
||||
self.settingsViewModel.settings.plugins.enclosure.rpi_inputs.remove(definition);
|
||||
};
|
||||
|
||||
self.turnOffHeater = function (item) {
|
||||
var request = { set_temperature: 0, index_id: item.index_id() };
|
||||
$.ajax({
|
||||
url: self.buildPluginUrl("/setEnclosureTempHum"),
|
||||
type: "GET",
|
||||
dataType: "json",
|
||||
data: request,
|
||||
success: function (data) {
|
||||
self.getUpdateUI();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
self.clearGPIOMode = function () {
|
||||
$.ajax({
|
||||
url: self.buildPluginUrl("/clearGPIOMode"),
|
||||
type: "GET",
|
||||
dataType: "json",
|
||||
success: function (data) {
|
||||
new PNotify({
|
||||
title: "Enclosure",
|
||||
text: "GPIO Mode cleared successfully",
|
||||
type: "success"
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
self.getUpdateUI = function () {
|
||||
$.ajax({
|
||||
url: self.buildPluginUrl("/updateUI"),
|
||||
type: "GET"
|
||||
});
|
||||
};
|
||||
|
||||
self.handleIO = function (item, form) {
|
||||
|
||||
var request = {
|
||||
"status": !item.gpio_status(),
|
||||
"index_id": item.index_id()
|
||||
};
|
||||
|
||||
$.ajax({
|
||||
type: "GET",
|
||||
dataType: "json",
|
||||
data: request,
|
||||
url: self.buildPluginUrl("/setIO"),
|
||||
success: function (data) {
|
||||
self.getUpdateUI();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
self.handleGcode = function (item, form) {
|
||||
var request = {
|
||||
"index_id": item.index_id()
|
||||
};
|
||||
|
||||
$.ajax({
|
||||
type: "GET",
|
||||
dataType: "json",
|
||||
data: request,
|
||||
url: self.buildPluginUrl("/sendGcodeCommand")
|
||||
});
|
||||
};
|
||||
|
||||
self.handleShellOutput = function (item, form) {
|
||||
var request = {
|
||||
"index_id": item.index_id()
|
||||
};
|
||||
|
||||
$.ajax({
|
||||
type: "GET",
|
||||
dataType: "json",
|
||||
data: request,
|
||||
url: self.buildPluginUrl("/sendShellCommand")
|
||||
});
|
||||
};
|
||||
|
||||
self.switchAutoStartUp = function (item) {
|
||||
|
||||
var request = {
|
||||
"status": !item.auto_startup(),
|
||||
"index_id": item.index_id()
|
||||
};
|
||||
$.ajax({
|
||||
type: "GET",
|
||||
dataType: "json",
|
||||
data: request,
|
||||
url: self.buildPluginUrl("/setAutoStartUp"),
|
||||
success: function (data) {
|
||||
self.getUpdateUI();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
self.switchAutoShutdown = function (item) {
|
||||
var request = {
|
||||
"status": !item.auto_shutdown(),
|
||||
"index_id": item.index_id()
|
||||
};
|
||||
$.ajax({
|
||||
type: "GET",
|
||||
dataType: "json",
|
||||
data: request,
|
||||
url: self.buildPluginUrl("/setAutoShutdown"),
|
||||
success: function (data) {
|
||||
self.getUpdateUI();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
self.switchFilamentSensor = function (item) {
|
||||
var request = {
|
||||
"status": !item.filament_sensor_enabled(),
|
||||
"index_id": item.index_id()
|
||||
};
|
||||
$.ajax({
|
||||
type: "GET",
|
||||
dataType: "json",
|
||||
data: request,
|
||||
url: self.buildPluginUrl("/setFilamentSensor"),
|
||||
success: function (data) {
|
||||
self.getUpdateUI();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
self.handlePWM = function (item) {
|
||||
var pwm_value = item.new_duty_cycle();
|
||||
|
||||
pwm_value = parseInt(pwm_value);
|
||||
|
||||
if (pwm_value < 0 || pwm_value > 100 || isNaN(pwm_value)) {
|
||||
item.new_duty_cycle("")
|
||||
new PNotify({
|
||||
title: "Enclosure",
|
||||
text: "Duty Cycle value needs to be between 0 and 100!",
|
||||
type: "error"
|
||||
});
|
||||
} else {
|
||||
var request = { new_duty_cycle: pwm_value, index_id: item.index_id() };
|
||||
$.ajax({
|
||||
type: "GET",
|
||||
dataType: "json",
|
||||
data: request,
|
||||
url: self.buildPluginUrl("/setPWM"),
|
||||
success: function (data) {
|
||||
item.new_duty_cycle("");
|
||||
item.duty_cycle(pwm_value);
|
||||
self.getUpdateUI();
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
self.handleNeopixel = function (item) {
|
||||
|
||||
var index = item.index_id() ;
|
||||
var or_tempStr = item.new_neopixel_color();
|
||||
var tempStr = or_tempStr.replace("rgb(", "");
|
||||
|
||||
var r = parseInt(tempStr.substring(0, tempStr.indexOf(",")));
|
||||
tempStr = tempStr.slice(tempStr.indexOf(",") + 1);
|
||||
var g = parseInt(tempStr.substring(0, tempStr.indexOf(",")));
|
||||
tempStr = tempStr.slice(tempStr.indexOf(",") + 1);
|
||||
var b = parseInt(tempStr.substring(0, tempStr.indexOf(")")));
|
||||
|
||||
if (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255 || isNaN(r) || isNaN(g) || isNaN(b)) {
|
||||
new PNotify({
|
||||
title: "Enclosure",
|
||||
text: "Color needs to follow the format rgb(value_red,value_green,value_blue)!",
|
||||
type: "error"
|
||||
});
|
||||
} else {
|
||||
$.ajax({
|
||||
type: "GET",
|
||||
dataType: "json",
|
||||
data: {
|
||||
"index_id": index,
|
||||
"red": r,
|
||||
"green": g,
|
||||
"blue": b
|
||||
},
|
||||
url: self.buildPluginUrl("/setNeopixel"),
|
||||
success: function (data) {
|
||||
item.new_neopixel_color("");
|
||||
self.getUpdateUI();
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
self.handleLedstripColor = function (item) {
|
||||
var index = item.index_id() ;
|
||||
var or_tempStr = item.new_ledstrip_color();
|
||||
var tempStr = or_tempStr.replace("rgb(", "");
|
||||
|
||||
var r = parseInt(tempStr.substring(0, tempStr.indexOf(",")));
|
||||
tempStr = tempStr.slice(tempStr.indexOf(",") + 1);
|
||||
var g = parseInt(tempStr.substring(0, tempStr.indexOf(",")));
|
||||
tempStr = tempStr.slice(tempStr.indexOf(",") + 1);
|
||||
var b = parseInt(tempStr.substring(0, tempStr.indexOf(")")));
|
||||
if (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255 || isNaN(r) || isNaN(g) || isNaN(b)) {
|
||||
new PNotify({
|
||||
title: "Enclosure",
|
||||
text: "Color needs to follow the format rgb(value_red,value_green,value_blue)!",
|
||||
type: "error"
|
||||
});
|
||||
} else {
|
||||
$.ajax({
|
||||
type: "GET",
|
||||
dataType: "json",
|
||||
data: {
|
||||
"index_id": index,
|
||||
"rgb": or_tempStr
|
||||
},
|
||||
url: self.buildPluginUrl("/setLedstripColor"),
|
||||
success: function (data) {
|
||||
item.new_ledstrip_color("");
|
||||
self.getUpdateUI();
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
self.isNumeric = function (n) {
|
||||
return !isNaN(parseFloat(n)) && isFinite(n);
|
||||
};
|
||||
|
||||
self.buildPluginUrl = function (path) {
|
||||
return window.PLUGIN_BASEURL + self.pluginName + path;
|
||||
};
|
||||
}
|
||||
|
||||
OCTOPRINT_VIEWMODELS.push({
|
||||
construct: EnclosureViewModel,
|
||||
// ViewModels your plugin depends on, e.g. loginStateViewModel, settingsViewModel, ...
|
||||
dependencies: ["settingsViewModel", "connectionViewModel", "printerStateViewModel"],
|
||||
// Elements to bind to, e.g. #settings_plugin_tasmota-mqtt, #tab_plugin_tasmota-mqtt, ...
|
||||
elements: ["#tab_plugin_enclosure", "#settings_plugin_enclosure", "#navbar_plugin_enclosure_1", "#navbar_plugin_enclosure_2"]
|
||||
});
|
||||
|
||||
});
|
||||
@@ -1,709 +0,0 @@
|
||||
$(function () {
|
||||
function EnclosureViewModel(parameters) {
|
||||
var self = this;
|
||||
|
||||
self.pluginName = "enclosure";
|
||||
|
||||
self.settingsViewModel = parameters[0];
|
||||
self.connectionViewModel = parameters[1];
|
||||
self.printerStateViewModel = parameters[2];
|
||||
|
||||
self.rpi_outputs = ko.observableArray();
|
||||
self.rpi_inputs = ko.observableArray();
|
||||
|
||||
self.settingsOpen = false;
|
||||
|
||||
self.settings_outputs_regular = ko.pureComputed(function () {
|
||||
return ko.utils.arrayFilter(self.settingsViewModel.settings.plugins.enclosure.rpi_outputs(), function (item) {
|
||||
return (item.output_type() === "regular" && !item.toggle_timer());
|
||||
});
|
||||
});
|
||||
|
||||
self.settings_possible_outputs = ko.pureComputed(function () {
|
||||
return ko.utils.arrayFilter(self.settingsViewModel.settings.plugins.enclosure.rpi_outputs(), function (item) {
|
||||
return ((item.output_type() === "regular" && !item.toggle_timer()) || item.output_type() === "gcode_output" || item.output_type() === "shell_output");
|
||||
});
|
||||
});
|
||||
|
||||
self.rpi_inputs_temperature_sensors = ko.pureComputed(function () {
|
||||
return ko.utils.arrayFilter(self.rpi_inputs(), function (item) {
|
||||
return (item.input_type() === "temperature_sensor");
|
||||
});
|
||||
});
|
||||
|
||||
self.settings_temperature_sensors = ko.pureComputed(function () {
|
||||
return ko.utils.arrayFilter(self.settingsViewModel.settings.plugins.enclosure.rpi_inputs(), function (item) {
|
||||
return (item.input_type() === "temperature_sensor");
|
||||
});
|
||||
});
|
||||
|
||||
self.settings_hum_sensors = ko.pureComputed(function () {
|
||||
return ko.utils.arrayFilter(self.settings_temperature_sensors(), function (sensor) {
|
||||
return (self.humidityCapableSensor(sensor.temp_sensor_type()));
|
||||
});
|
||||
});
|
||||
|
||||
self.use_sudo = ko.observable();
|
||||
self.gcode_control = ko.observable();
|
||||
self.neopixel_dma = ko.observable();
|
||||
self.debug = ko.observable();
|
||||
self.debug_temperature_log = ko.observable();
|
||||
self.use_board_pin_number = ko.observable();
|
||||
self.filament_sensor_gcode = ko.observable();
|
||||
self.notification_provider = ko.observable();
|
||||
self.notification_event_name = ko.observable();
|
||||
self.notification_api_key = ko.observable();
|
||||
self.notifications = ko.observableArray([]);
|
||||
|
||||
self.humidityCapableSensor = function(sensor){
|
||||
if (['11', '22', '2302', 'bme280', 'am2320', 'si7021'].indexOf(sensor) >= 0){
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
self.isRegularOutput = function(index_id){
|
||||
return_value = false;
|
||||
if (typeof index_id != 'undefined'){
|
||||
self.settingsViewModel.settings.plugins.enclosure.rpi_outputs().forEach(function (output) {
|
||||
if (output.index_id() == index_id && output.output_type() == "regular") {
|
||||
return_value = true;
|
||||
return false;
|
||||
}
|
||||
});
|
||||
}
|
||||
return return_value;
|
||||
};
|
||||
|
||||
self.linkedTemperatureControl = function(sensor_index){
|
||||
return ko.pureComputed(function () {
|
||||
return ko.utils.arrayFilter(self.rpi_outputs(), function (item) {
|
||||
if (item.linked_temp_sensor){
|
||||
return (item.linked_temp_sensor() == sensor_index && item.output_type() == "temp_hum_control");
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
self.calculateRowSpan = function(index_id){
|
||||
span = self.linkedTemperatureControl(index_id())().length
|
||||
return span == 0 ? 1 : span;
|
||||
};
|
||||
|
||||
self.hasAnySensorWithHumidity = function(){
|
||||
return_value = false;
|
||||
self.rpi_inputs_temperature_sensors().forEach(function (sensor) {
|
||||
if (self.humidityCapableSensor(sensor.temp_sensor_type())) {
|
||||
return_value = true;
|
||||
return false;
|
||||
}
|
||||
});
|
||||
return return_value;
|
||||
};
|
||||
|
||||
self.hasAnyNavbarOutput = function(){
|
||||
return_value = false;
|
||||
self.rpi_outputs().forEach(function (output) {
|
||||
if ((output.output_type()=="regular" || output.output_type()=="gcode_output") && output.show_on_navbar()) {
|
||||
return_value = true;
|
||||
return false;
|
||||
}
|
||||
});
|
||||
return return_value;
|
||||
};
|
||||
|
||||
self.hasAnyNavbarTemperature = function(){
|
||||
return_value = false;
|
||||
self.rpi_inputs_temperature_sensors().forEach(function (sensor) {
|
||||
if (sensor.temp_sensor_navbar()) {
|
||||
return_value = true;
|
||||
return false;
|
||||
}
|
||||
});
|
||||
return return_value;
|
||||
};
|
||||
|
||||
self.hasAnyTemperatureControl = function(){
|
||||
return_value = false
|
||||
self.rpi_outputs().forEach(function (output) {
|
||||
if (output.output_type()=="temp_hum_control") {
|
||||
return_value = true
|
||||
return false;
|
||||
}
|
||||
});
|
||||
return return_value;
|
||||
};
|
||||
|
||||
self.onDataUpdaterPluginMessage = function (plugin, data) {
|
||||
|
||||
if (typeof plugin == 'undefined'){
|
||||
return;
|
||||
}
|
||||
|
||||
if (plugin != "enclosure") {
|
||||
return;
|
||||
}
|
||||
|
||||
if(self.settingsOpen){
|
||||
return;
|
||||
}
|
||||
|
||||
if (data.hasOwnProperty("sensor_data")) {
|
||||
data.sensor_data.forEach(function (sensor_data) {
|
||||
var linked_temp_sensor = ko.utils.arrayFilter(self.rpi_inputs_temperature_sensors(), function (temperature_sensor) {
|
||||
return (sensor_data['index_id'] == temperature_sensor.index_id());
|
||||
}).pop();
|
||||
if (linked_temp_sensor){
|
||||
linked_temp_sensor.temp_sensor_temp(sensor_data['temperature'])
|
||||
linked_temp_sensor.temp_sensor_humidity(sensor_data['humidity'])
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
if (data.hasOwnProperty("set_temperature")) {
|
||||
data.set_temperature.forEach(function (set_temperature) {
|
||||
var linked_temp_control = ko.utils.arrayFilter(self.rpi_outputs(), function (temp_control) {
|
||||
return (set_temperature['index_id'] == temp_control.index_id());
|
||||
}).pop();
|
||||
if (linked_temp_control) {
|
||||
linked_temp_control.temp_ctr_set_value(set_temperature['set_temperature'])
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
if (data.hasOwnProperty("rpi_output_regular")) {
|
||||
data.rpi_output_regular.forEach(function (output) {
|
||||
var linked_output = ko.utils.arrayFilter(self.rpi_outputs(), function (item) {
|
||||
return (output['index_id'] == item.index_id());
|
||||
}).pop();
|
||||
if (linked_output) {
|
||||
linked_output.gpio_status(output['status'])
|
||||
linked_output.auto_shutdown(output['auto_shutdown'])
|
||||
linked_output.auto_startup(output['auto_startup'])
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
if (data.hasOwnProperty("rpi_output_temp_hum_ctrl")) {
|
||||
data.rpi_output_temp_hum_ctrl.forEach(function (output) {
|
||||
var linked_output = ko.utils.arrayFilter(self.rpi_outputs(), function (item) {
|
||||
return (output['index_id'] == item.index_id());
|
||||
}).pop();
|
||||
if (linked_output) {
|
||||
linked_output.gpio_status(output['status'])
|
||||
linked_output.auto_shutdown(output['auto_shutdown'])
|
||||
linked_output.auto_startup(output['auto_startup'])
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
if (data.hasOwnProperty("rpi_output_pwm")) {
|
||||
data.rpi_output_pwm.forEach(function (output) {
|
||||
var linked_output = ko.utils.arrayFilter(self.rpi_outputs(), function (item) {
|
||||
return (output['index_id'] == item.index_id());
|
||||
}).pop();
|
||||
if (linked_output) {
|
||||
linked_output.duty_cycle(output['pwm_value'])
|
||||
linked_output.auto_shutdown(output['auto_shutdown'])
|
||||
linked_output.auto_startup(output['auto_startup'])
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
if (data.hasOwnProperty("rpi_output_neopixel")) {
|
||||
data.rpi_output_neopixel.forEach(function (output) {
|
||||
var linked_output = ko.utils.arrayFilter(self.rpi_outputs(), function (item) {
|
||||
return (output['index_id'] == item.index_id());
|
||||
}).pop();
|
||||
if (linked_output) {
|
||||
linked_output.neopixel_color(output['color'])
|
||||
linked_output.auto_shutdown(output['auto_shutdown'])
|
||||
linked_output.auto_startup(output['auto_startup'])
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
if (data.hasOwnProperty("rpi_output_ledstrip")) {
|
||||
data.rpi_output_ledstrip.forEach(function (output) {
|
||||
var linked_output = ko.utils.arrayFilter(self.rpi_outputs(), function (item) {
|
||||
return (output['index_id'] == item.index_id());
|
||||
}).pop();
|
||||
if (linked_output) {
|
||||
linked_output.ledstrip_color(output['color'])
|
||||
linked_output.auto_shutdown(output['auto_shutdown'])
|
||||
linked_output.auto_startup(output['auto_startup'])
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
if (data.hasOwnProperty("filament_sensor_status")) {
|
||||
data.filament_sensor_status.forEach(function (filament_sensor) {
|
||||
var linked_filament_sensor = ko.utils.arrayFilter(self.rpi_inputs(), function (item) {
|
||||
return (filament_sensor['index_id'] == item.index_id());
|
||||
}).pop();
|
||||
if (linked_filament_sensor) {
|
||||
linked_filament_sensor.filament_sensor_enabled(filament_sensor['filament_sensor_enabled'])
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
if (data.is_msg) {
|
||||
new PNotify({
|
||||
title: "Enclosure",
|
||||
text: data.msg,
|
||||
type: data.msg_type
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
self.isUser = ko.computed(function () {
|
||||
return self.connectionViewModel.loginState.isUser();
|
||||
});
|
||||
|
||||
self.isOperational = ko.computed(function () {
|
||||
return self.connectionViewModel.loginState.isUser() && self.printerStateViewModel.isOperational();
|
||||
});
|
||||
|
||||
|
||||
self.getCleanTemperature = function (temp) {
|
||||
if (temp === undefined || isNaN(parseFloat(temp))) return "-";
|
||||
if (temp < 10) return String("off");
|
||||
return temp;
|
||||
}
|
||||
|
||||
self.getDutyCycle = function (duty_cycle) {
|
||||
if (duty_cycle === undefined || isNaN(parseFloat(duty_cycle))) return "-";
|
||||
if (parseInt(duty_cycle) == 0) return String("off");
|
||||
return duty_cycle;
|
||||
}
|
||||
|
||||
self.bindFromSettings = function(){
|
||||
self.rpi_outputs(self.settingsViewModel.settings.plugins.enclosure.rpi_outputs());
|
||||
self.rpi_inputs(self.settingsViewModel.settings.plugins.enclosure.rpi_inputs());
|
||||
self.use_sudo(self.settingsViewModel.settings.plugins.enclosure.use_sudo());
|
||||
self.gcode_control(self.settingsViewModel.settings.plugins.enclosure.gcode_control());
|
||||
self.neopixel_dma(self.settingsViewModel.settings.plugins.enclosure.neopixel_dma());
|
||||
self.debug(self.settingsViewModel.settings.plugins.enclosure.debug());
|
||||
self.debug_temperature_log(self.settingsViewModel.settings.plugins.enclosure.debug_temperature_log());
|
||||
self.use_board_pin_number(self.settingsViewModel.settings.plugins.enclosure.use_board_pin_number());
|
||||
self.filament_sensor_gcode(self.settingsViewModel.settings.plugins.enclosure.filament_sensor_gcode());
|
||||
self.notification_provider(self.settingsViewModel.settings.plugins.enclosure.notification_provider());
|
||||
self.notification_event_name(self.settingsViewModel.settings.plugins.enclosure.notification_event_name());
|
||||
self.notification_api_key(self.settingsViewModel.settings.plugins.enclosure.notification_api_key());
|
||||
self.notifications(self.settingsViewModel.settings.plugins.enclosure.notifications());
|
||||
};
|
||||
|
||||
self.onBeforeBinding = function () {
|
||||
self.bindFromSettings();
|
||||
};
|
||||
|
||||
self.onSettingsBeforeSave = function() {
|
||||
self.bindFromSettings();
|
||||
};
|
||||
|
||||
self.onStartupComplete = function () {
|
||||
self.settingsOpen = false;
|
||||
};
|
||||
|
||||
self.onSettingsShown = function () {
|
||||
self.settingsOpen = true;
|
||||
};
|
||||
|
||||
self.showColorPicker = function () {
|
||||
$('[name=colorpicker]').colorpicker({
|
||||
format: 'rgb'
|
||||
});
|
||||
}
|
||||
|
||||
self.onSettingsHidden = function () {
|
||||
self.showColorPicker();
|
||||
self.settingsOpen = false;
|
||||
};
|
||||
|
||||
self.getRegularOutputs = function () {
|
||||
return self.rpi_outputs().filter(function (rpi_outputs) {
|
||||
return rpi_outputs.output_type == 'regular';
|
||||
});
|
||||
};
|
||||
|
||||
self.setTemperature = function (item, form) {
|
||||
|
||||
var newSetTemperature = item.temp_ctr_new_set_value();
|
||||
if (form !== undefined) {
|
||||
$(form).find("input").blur();
|
||||
}
|
||||
|
||||
if(self.isNumeric(newSetTemperature)){
|
||||
var request = {set_temperature:newSetTemperature, index_id:item.index_id()};
|
||||
|
||||
$.ajax({
|
||||
url: self.buildPluginUrl("/setEnclosureTempHum"),
|
||||
type: "GET",
|
||||
dataType: "json",
|
||||
data: request,
|
||||
success: function (data) {
|
||||
item.temp_ctr_new_set_value("");
|
||||
item.temp_ctr_set_value(newSetTemperature);
|
||||
self.getUpdateUI();
|
||||
},
|
||||
error: function (textStatus, errorThrown) {
|
||||
new PNotify({
|
||||
title: "Enclosure",
|
||||
text: "Error setting temperature",
|
||||
type: "error"
|
||||
});
|
||||
}
|
||||
});
|
||||
}else{
|
||||
new PNotify({
|
||||
title: "Enclosure",
|
||||
text: "Invalid set temperature",
|
||||
type: "error"
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
self.addRpiOutput = function () {
|
||||
|
||||
var arrRelaysLength = self.settingsViewModel.settings.plugins.enclosure.rpi_outputs().length;
|
||||
|
||||
var nextIndex = arrRelaysLength == 0 ? 1 : self.settingsViewModel.settings.plugins.enclosure.rpi_outputs()[arrRelaysLength - 1].index_id() + 1;
|
||||
|
||||
self.settingsViewModel.settings.plugins.enclosure.rpi_outputs.push({
|
||||
index_id: ko.observable(nextIndex),
|
||||
label: ko.observable("Ouput " + nextIndex),
|
||||
output_type: ko.observable("regular"),
|
||||
shell_script: ko.observable(""),
|
||||
gpio_pin: ko.observable(0),
|
||||
gpio_status: ko.observable(false),
|
||||
hide_btn_ui: ko.observable(false),
|
||||
active_low: ko.observable(true),
|
||||
pwm_temperature_linked: ko.observable(false),
|
||||
toggle_timer: ko.observable(false),
|
||||
toggle_timer_on: ko.observable(0),
|
||||
toggle_timer_off: ko.observable(0),
|
||||
startup_with_server: ko.observable(false),
|
||||
auto_startup: ko.observable(false),
|
||||
controlled_io: ko.observable(0),
|
||||
controlled_io_set_value: ko.observable("Low"),
|
||||
startup_time: ko.observable(0),
|
||||
auto_shutdown: ko.observable(false),
|
||||
shutdown_on_failed: ko.observable(false),
|
||||
shutdown_time: ko.observable(0),
|
||||
linked_temp_sensor: ko.observable(""),
|
||||
alarm_set_temp: ko.observable(0),
|
||||
temp_ctr_type: ko.observable("heater"),
|
||||
temp_ctr_deadband: ko.observable(0),
|
||||
temp_ctr_set_value: ko.observable(0),
|
||||
temp_ctr_new_set_value: ko.observable(""),
|
||||
temp_ctr_default_value: ko.observable(0),
|
||||
temp_ctr_max_temp: ko.observable(0),
|
||||
pwm_frequency: ko.observable(50),
|
||||
pwm_status: ko.observable(50),
|
||||
duty_cycle: ko.observable(0),
|
||||
duty_a: ko.observable(0),
|
||||
duty_b: ko.observable(0),
|
||||
temperature_a: ko.observable(0),
|
||||
temperature_b: ko.observable(0),
|
||||
default_duty_cycle: ko.observable(0),
|
||||
new_duty_cycle: ko.observable(""),
|
||||
neopixel_color: ko.observable("rgb(0,0,0)"),
|
||||
default_neopixel_color: ko.observable(""),
|
||||
new_neopixel_color: ko.observable(""),
|
||||
neopixel_count: ko.observable(0),
|
||||
neopixel_brightness: ko.observable(255),
|
||||
ledstrip_color: ko.observable("rgb(0,0,0)"),
|
||||
default_ledstrip_color: ko.observable(""),
|
||||
new_ledstrip_color: ko.observable(""),
|
||||
ledstrip_gpio_clk: ko.observable(""),
|
||||
ledstrip_gpio_dat: ko.observable(""),
|
||||
microcontroller_address: ko.observable(0),
|
||||
gcode: ko.observable(""),
|
||||
show_on_navbar: ko.observable(false)
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
self.removeRpiOutput = function (data) {
|
||||
self.settingsViewModel.settings.plugins.enclosure.rpi_outputs.remove(data);
|
||||
};
|
||||
|
||||
self.addRpiInput = function () {
|
||||
|
||||
var arrRelaysLength = self.settingsViewModel.settings.plugins.enclosure.rpi_inputs().length;
|
||||
|
||||
var nextIndex = arrRelaysLength == 0 ? 1 : self.settingsViewModel.settings.plugins.enclosure.rpi_inputs()[arrRelaysLength - 1].index_id() + 1;
|
||||
|
||||
self.settingsViewModel.settings.plugins.enclosure.rpi_inputs.push({
|
||||
index_id: ko.observable(nextIndex),
|
||||
label: ko.observable("Input " + nextIndex),
|
||||
input_type: ko.observable("gpio"),
|
||||
gpio_pin: ko.observable(0),
|
||||
input_pull_resistor: ko.observable("input_pull_up"),
|
||||
temp_sensor_type: ko.observable("DS18B20"),
|
||||
temp_sensor_address: ko.observable(""),
|
||||
temp_sensor_temp: ko.observable(""),
|
||||
temp_sensor_humidity: ko.observable(""),
|
||||
ds18b20_serial: ko.observable(""),
|
||||
use_fahrenheit: ko.observable(false),
|
||||
action_type: ko.observable("output_control"),
|
||||
controlled_io: ko.observable(""),
|
||||
controlled_io_set_value: ko.observable("low"),
|
||||
edge: ko.observable("fall"),
|
||||
printer_action: ko.observable("filament"),
|
||||
temp_sensor_navbar: ko.observable(true),
|
||||
filament_sensor_timeout: ko.observable(120),
|
||||
filament_sensor_enabled: ko.observable(true)
|
||||
});
|
||||
};
|
||||
|
||||
self.removeRpiInput = function (definition) {
|
||||
self.settingsViewModel.settings.plugins.enclosure.rpi_inputs.remove(definition);
|
||||
};
|
||||
|
||||
self.turnOffHeater = function (item) {
|
||||
var request = { set_temperature: 0, index_id: item.index_id() };
|
||||
$.ajax({
|
||||
url: self.buildPluginUrl("/setEnclosureTempHum"),
|
||||
type: "GET",
|
||||
dataType: "json",
|
||||
data: request,
|
||||
success: function (data) {
|
||||
self.getUpdateUI();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
self.clearGPIOMode = function () {
|
||||
$.ajax({
|
||||
url: self.buildPluginUrl("/clearGPIOMode"),
|
||||
type: "GET",
|
||||
dataType: "json",
|
||||
success: function (data) {
|
||||
new PNotify({
|
||||
title: "Enclosure",
|
||||
text: "GPIO Mode cleared successfully",
|
||||
type: "success"
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
self.getUpdateUI = function () {
|
||||
$.ajax({
|
||||
url: self.buildPluginUrl("/updateUI"),
|
||||
type: "GET"
|
||||
});
|
||||
};
|
||||
|
||||
self.handleIO = function (item, form) {
|
||||
|
||||
var request = {
|
||||
"status": !item.gpio_status(),
|
||||
"index_id": item.index_id()
|
||||
};
|
||||
|
||||
$.ajax({
|
||||
type: "GET",
|
||||
dataType: "json",
|
||||
data: request,
|
||||
url: self.buildPluginUrl("/setIO"),
|
||||
success: function (data) {
|
||||
self.getUpdateUI();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
self.handleGcode = function (item, form) {
|
||||
var request = {
|
||||
"index_id": item.index_id()
|
||||
};
|
||||
|
||||
$.ajax({
|
||||
type: "GET",
|
||||
dataType: "json",
|
||||
data: request,
|
||||
url: self.buildPluginUrl("/sendGcodeCommand")
|
||||
});
|
||||
};
|
||||
|
||||
self.handleShellOutput = function (item, form) {
|
||||
var request = {
|
||||
"index_id": item.index_id()
|
||||
};
|
||||
|
||||
$.ajax({
|
||||
type: "GET",
|
||||
dataType: "json",
|
||||
data: request,
|
||||
url: self.buildPluginUrl("/sendShellCommand")
|
||||
});
|
||||
};
|
||||
|
||||
self.switchAutoStartUp = function (item) {
|
||||
|
||||
var request = {
|
||||
"status": !item.auto_startup(),
|
||||
"index_id": item.index_id()
|
||||
};
|
||||
$.ajax({
|
||||
type: "GET",
|
||||
dataType: "json",
|
||||
data: request,
|
||||
url: self.buildPluginUrl("/setAutoStartUp"),
|
||||
success: function (data) {
|
||||
self.getUpdateUI();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
self.switchAutoShutdown = function (item) {
|
||||
var request = {
|
||||
"status": !item.auto_shutdown(),
|
||||
"index_id": item.index_id()
|
||||
};
|
||||
$.ajax({
|
||||
type: "GET",
|
||||
dataType: "json",
|
||||
data: request,
|
||||
url: self.buildPluginUrl("/setAutoShutdown"),
|
||||
success: function (data) {
|
||||
self.getUpdateUI();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
self.switchFilamentSensor = function (item) {
|
||||
var request = {
|
||||
"status": !item.filament_sensor_enabled(),
|
||||
"index_id": item.index_id()
|
||||
};
|
||||
$.ajax({
|
||||
type: "GET",
|
||||
dataType: "json",
|
||||
data: request,
|
||||
url: self.buildPluginUrl("/setFilamentSensor"),
|
||||
success: function (data) {
|
||||
self.getUpdateUI();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
self.handlePWM = function (item) {
|
||||
var pwm_value = item.new_duty_cycle();
|
||||
|
||||
pwm_value = parseInt(pwm_value);
|
||||
|
||||
if (pwm_value < 0 || pwm_value > 100 || isNaN(pwm_value)) {
|
||||
item.new_duty_cycle("")
|
||||
new PNotify({
|
||||
title: "Enclosure",
|
||||
text: "Duty Cycle value needs to be between 0 and 100!",
|
||||
type: "error"
|
||||
});
|
||||
} else {
|
||||
var request = { new_duty_cycle: pwm_value, index_id: item.index_id() };
|
||||
$.ajax({
|
||||
type: "GET",
|
||||
dataType: "json",
|
||||
data: request,
|
||||
url: self.buildPluginUrl("/setPWM"),
|
||||
success: function (data) {
|
||||
item.new_duty_cycle("");
|
||||
item.duty_cycle(pwm_value);
|
||||
self.getUpdateUI();
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
self.handleNeopixel = function (item) {
|
||||
|
||||
var index = item.index_id() ;
|
||||
var or_tempStr = item.new_neopixel_color();
|
||||
var tempStr = or_tempStr.replace("rgb(", "");
|
||||
|
||||
var r = parseInt(tempStr.substring(0, tempStr.indexOf(",")));
|
||||
tempStr = tempStr.slice(tempStr.indexOf(",") + 1);
|
||||
var g = parseInt(tempStr.substring(0, tempStr.indexOf(",")));
|
||||
tempStr = tempStr.slice(tempStr.indexOf(",") + 1);
|
||||
var b = parseInt(tempStr.substring(0, tempStr.indexOf(")")));
|
||||
|
||||
if (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255 || isNaN(r) || isNaN(g) || isNaN(b)) {
|
||||
new PNotify({
|
||||
title: "Enclosure",
|
||||
text: "Color needs to follow the format rgb(value_red,value_green,value_blue)!",
|
||||
type: "error"
|
||||
});
|
||||
} else {
|
||||
$.ajax({
|
||||
type: "GET",
|
||||
dataType: "json",
|
||||
data: {
|
||||
"index_id": index,
|
||||
"red": r,
|
||||
"green": g,
|
||||
"blue": b
|
||||
},
|
||||
url: self.buildPluginUrl("/setNeopixel"),
|
||||
success: function (data) {
|
||||
item.new_neopixel_color("");
|
||||
self.getUpdateUI();
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
self.handleLedstripColor = function (item) {
|
||||
var index = item.index_id() ;
|
||||
var or_tempStr = item.new_ledstrip_color();
|
||||
var tempStr = or_tempStr.replace("rgb(", "");
|
||||
|
||||
var r = parseInt(tempStr.substring(0, tempStr.indexOf(",")));
|
||||
tempStr = tempStr.slice(tempStr.indexOf(",") + 1);
|
||||
var g = parseInt(tempStr.substring(0, tempStr.indexOf(",")));
|
||||
tempStr = tempStr.slice(tempStr.indexOf(",") + 1);
|
||||
var b = parseInt(tempStr.substring(0, tempStr.indexOf(")")));
|
||||
if (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255 || isNaN(r) || isNaN(g) || isNaN(b)) {
|
||||
new PNotify({
|
||||
title: "Enclosure",
|
||||
text: "Color needs to follow the format rgb(value_red,value_green,value_blue)!",
|
||||
type: "error"
|
||||
});
|
||||
} else {
|
||||
$.ajax({
|
||||
type: "GET",
|
||||
dataType: "json",
|
||||
data: {
|
||||
"index_id": index,
|
||||
"rgb": or_tempStr
|
||||
},
|
||||
url: self.buildPluginUrl("/setLedstripColor"),
|
||||
success: function (data) {
|
||||
item.new_ledstrip_color("");
|
||||
self.getUpdateUI();
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
self.isNumeric = function (n) {
|
||||
return !isNaN(parseFloat(n)) && isFinite(n);
|
||||
};
|
||||
|
||||
self.buildPluginUrl = function (path) {
|
||||
return window.PLUGIN_BASEURL + self.pluginName + path;
|
||||
};
|
||||
}
|
||||
|
||||
OCTOPRINT_VIEWMODELS.push({
|
||||
construct: EnclosureViewModel,
|
||||
// ViewModels your plugin depends on, e.g. loginStateViewModel, settingsViewModel, ...
|
||||
dependencies: ["settingsViewModel", "connectionViewModel", "printerStateViewModel"],
|
||||
// Elements to bind to, e.g. #settings_plugin_tasmota-mqtt, #tab_plugin_tasmota-mqtt, ...
|
||||
elements: ["#tab_plugin_enclosure", "#settings_plugin_enclosure", "#navbar_plugin_enclosure_1", "#navbar_plugin_enclosure_2"]
|
||||
});
|
||||
|
||||
});
|
||||
Reference in New Issue
Block a user