Cleaning up old logic and files

This commit is contained in:
vitormhenrique
2020-10-19 21:48:04 +01:00
parent ea736e190f
commit 3bc81440f4
26 changed files with 2931 additions and 2573 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View 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 */

View 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

File diff suppressed because one or more lines are too long

View 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"]
});
});

View File

@@ -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"]
});
});