commit
ce10fc7e3b
@ -1,6 +1,8 @@
|
|||||||
# coding=utf-8
|
# coding=utf-8
|
||||||
from __future__ import absolute_import
|
from __future__ import absolute_import
|
||||||
|
|
||||||
|
from decimal import *
|
||||||
|
import re
|
||||||
import octoprint.plugin
|
import octoprint.plugin
|
||||||
|
|
||||||
class FanSliderPlugin(octoprint.plugin.StartupPlugin,
|
class FanSliderPlugin(octoprint.plugin.StartupPlugin,
|
||||||
@ -8,8 +10,19 @@ class FanSliderPlugin(octoprint.plugin.StartupPlugin,
|
|||||||
octoprint.plugin.SettingsPlugin,
|
octoprint.plugin.SettingsPlugin,
|
||||||
octoprint.plugin.AssetPlugin):
|
octoprint.plugin.AssetPlugin):
|
||||||
|
|
||||||
|
def on_after_startup(self):
|
||||||
|
self.get_settings_updates()
|
||||||
|
|
||||||
def get_settings_defaults(self):
|
def get_settings_defaults(self):
|
||||||
return dict(fanSpeed=100)
|
return dict(
|
||||||
|
defaultFanSpeed=100,
|
||||||
|
minSpeed=0,
|
||||||
|
maxSpeed=100
|
||||||
|
)
|
||||||
|
|
||||||
|
def on_settings_save(self, data):
|
||||||
|
octoprint.plugin.SettingsPlugin.on_settings_save(self, data)
|
||||||
|
self.get_settings_updates()
|
||||||
|
|
||||||
def get_assets(self):
|
def get_assets(self):
|
||||||
return dict(
|
return dict(
|
||||||
@ -20,12 +33,35 @@ class FanSliderPlugin(octoprint.plugin.StartupPlugin,
|
|||||||
def get_template_configs(self):
|
def get_template_configs(self):
|
||||||
return [
|
return [
|
||||||
dict(type="settings", custom_bindings=False)
|
dict(type="settings", custom_bindings=False)
|
||||||
]
|
]
|
||||||
|
|
||||||
|
def get_settings_updates(self):
|
||||||
|
self.defaultFanSpeed = self._settings.get(["defaultFanSpeed"])
|
||||||
|
self.minSpeed = self._settings.get(["minSpeed"])
|
||||||
|
self.maxSpeed = self._settings.get(["maxSpeed"])
|
||||||
|
|
||||||
|
getcontext().prec=5 #sets precision for "Decimal" not sure if this'll cause conflicts, ideas?
|
||||||
|
self.minPWM = round( Decimal(self.minSpeed) * Decimal(2.55), 2 )
|
||||||
|
self.maxPWM = round( Decimal(self.maxSpeed) * Decimal(2.55), 2 )
|
||||||
|
|
||||||
|
def rewrite_m106(self, comm_instance, phase, cmd, cmd_type, gcode, *args, **kwargs):
|
||||||
|
if gcode and gcode.startswith('M106'):
|
||||||
|
fanPwm = re.search("S(\d+.\d+)", cmd)
|
||||||
|
if fanPwm and fanPwm.group(1):
|
||||||
|
fanPwm = fanPwm.group(1)
|
||||||
|
if Decimal(fanPwm) < self.minPWM and Decimal(fanPwm) != 0:
|
||||||
|
self._logger.info("fan pwm value " + str(fanPwm) + " is below threshold, increasing to " + str(self.minPWM))
|
||||||
|
cmd = "M106 S" + str(self.minPWM)
|
||||||
|
return cmd,
|
||||||
|
elif Decimal(fanPwm) > self.maxPWM:
|
||||||
|
self._logger.info("fan pwm value " + str(fanPwm) + " is above threshold, decreasing to " + str(self.maxPWM))
|
||||||
|
cmd = "M106 S" + str(self.maxPWM)
|
||||||
|
return cmd,
|
||||||
|
|
||||||
def get_update_information(self):
|
def get_update_information(self):
|
||||||
return dict(
|
return dict(
|
||||||
fanspeedslider=dict(
|
fanspeedslider=dict(
|
||||||
displayName="Fan Speed Slider",
|
displayName="Fan Speed Control",
|
||||||
displayVersion=self._plugin_version,
|
displayVersion=self._plugin_version,
|
||||||
|
|
||||||
# version check: github repository
|
# version check: github repository
|
||||||
@ -38,8 +74,15 @@ class FanSliderPlugin(octoprint.plugin.StartupPlugin,
|
|||||||
pip="https://github.com/ntoff/OctoPrint-FanSpeedSlider/archive/{target_version}.zip"
|
pip="https://github.com/ntoff/OctoPrint-FanSpeedSlider/archive/{target_version}.zip"
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
__plugin_name__ = "Fan Speed Slider"
|
|
||||||
__plugin_implementation__ = FanSliderPlugin()
|
__plugin_name__ = "Fan Speed Control"
|
||||||
__plugin_hooks__ = {
|
|
||||||
|
def __plugin_load__():
|
||||||
|
global __plugin_implementation__
|
||||||
|
__plugin_implementation__ = __plugin_implementation__ = FanSliderPlugin()
|
||||||
|
|
||||||
|
global __plugin_hooks__
|
||||||
|
__plugin_hooks__ = {
|
||||||
|
"octoprint.comm.protocol.gcode.queuing": __plugin_implementation__.rewrite_m106,
|
||||||
"octoprint.plugin.softwareupdate.check_config": __plugin_implementation__.get_update_information
|
"octoprint.plugin.softwareupdate.check_config": __plugin_implementation__.get_update_information
|
||||||
}
|
}
|
@ -7,20 +7,20 @@ $(function() {
|
|||||||
function FanSliderPluginViewModel(parameters) {
|
function FanSliderPluginViewModel(parameters) {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
self.printerstate = parameters[0];
|
self.settings = parameters[0];
|
||||||
self.loginstate = parameters[1];
|
self.control = parameters[1];
|
||||||
self.control = parameters[2];
|
self.loginState = parameters[2];
|
||||||
self.settings = parameters[3];
|
|
||||||
|
fanSpeed = ko.observable(undefined);
|
||||||
|
|
||||||
//default to 100% fan speed
|
|
||||||
fanSpeed = ko.observable(undefined);
|
|
||||||
//convert percentage into PWM
|
//convert percentage into PWM
|
||||||
fanPWM = ko.pureComputed(function () {
|
self.fanPWM = ko.pureComputed(function () {
|
||||||
return Math.round(fanSpeed() * 255 / 100);
|
self.speed = fanSpeed() * 255 / 100 //don't forget to limit this to 2 decimal places at some point.
|
||||||
|
return self.speed;
|
||||||
});
|
});
|
||||||
//send gcode to set fan speed
|
//send gcode to set fan speed
|
||||||
sendFanSpeed = function () {
|
sendFanSpeed = function () {
|
||||||
self.control.sendCustomCommand({ command: "M106 S" + fanPWM() });
|
self.control.sendCustomCommand({ command: "M106 S" + self.fanPWM() });
|
||||||
};
|
};
|
||||||
//extra classes
|
//extra classes
|
||||||
$("#control > div.jog-panel").eq(0).addClass("controls");
|
$("#control > div.jog-panel").eq(0).addClass("controls");
|
||||||
@ -54,12 +54,11 @@ $(function() {
|
|||||||
}
|
}
|
||||||
//retrieve settings
|
//retrieve settings
|
||||||
self.onBeforeBinding = function() {
|
self.onBeforeBinding = function() {
|
||||||
fanSpeed(self.settings.settings.plugins.fanspeedslider.fanSpeed());
|
fanSpeed(self.settings.settings.plugins.fanspeedslider.defaultFanSpeed());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
OCTOPRINT_VIEWMODELS.push([
|
OCTOPRINT_VIEWMODELS.push([
|
||||||
FanSliderPluginViewModel,
|
FanSliderPluginViewModel,
|
||||||
|
["settingsViewModel", "controlViewModel", "loginStateViewModel"]
|
||||||
["printerStateViewModel", "loginStateViewModel", "controlViewModel", "settingsViewModel"]
|
|
||||||
]);
|
]);
|
||||||
});
|
});
|
@ -1,18 +1,38 @@
|
|||||||
<h4>{{ _('Fan Speed Slider') }}</h4>
|
<h3>{{ _('Fan Speed Control') }}</h3>
|
||||||
<div>
|
|
||||||
<p>{{ _('Set the default value for the fan speed slider.') }}</p>
|
|
||||||
</div>
|
|
||||||
<div>
|
<div>
|
||||||
<form class="form-horizontal">
|
<form class="form-horizontal">
|
||||||
|
<p>{{ _('Set the default value for the speed slider.') }}</p>
|
||||||
<div class="control-group">
|
<div class="control-group">
|
||||||
<label class="control-label">{{ _('Default Value') }}</label>
|
<label class="control-label">{{ _('Default Value') }}</label>
|
||||||
<div class="controls">
|
<div class="controls">
|
||||||
<div class="input-append">
|
<div class="input-append">
|
||||||
<input type="number" min="0" max="100" class="input-mini" data-bind="value: settings.plugins.fanspeedslider.fanSpeed">
|
<input type="number" min="0" max="100" class="input-mini" data-bind="value: settings.plugins.fanspeedslider.defaultFanSpeed">
|
||||||
<span class="add-on">%</span>
|
<span class="add-on">%</span>
|
||||||
</div>
|
</div>
|
||||||
<span class="help-inline">{{ _('This value does <i><b>not</b></i> affect the maximum or minimum speed of the fan. To limit the power the fan will use during a print, see your slicer\'s min / max fan speed setting.') }}</span>
|
<span class="help-block">{{ _('The default value the slider will be set to when opening OctoPrint\'s UI') }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<p>{{ _('The settings below can be used to limit the fan\'s output without having to re-slice and re-upload your gcode.') }}</p>
|
||||||
|
<div class="control-group">
|
||||||
|
<label class="control-label">{{ _('Minimum Speed') }}</label>
|
||||||
|
<div class="controls">
|
||||||
|
<div class="input-append">
|
||||||
|
<input type="number" min="0" max="100" class="input-mini" data-bind="value: settings.plugins.fanspeedslider.minSpeed">
|
||||||
|
<span class="add-on">%</span>
|
||||||
|
</div>
|
||||||
|
<span class="help-block">{{ _('Any value sent which is below this value will be increased to meet this speed. Useful if your fan doesn\'t work below a certain threshold.') }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="control-group">
|
||||||
|
<label class="control-label">{{ _('Maximum Speed') }}</label>
|
||||||
|
<div class="controls">
|
||||||
|
<div class="input-append">
|
||||||
|
<input type="number" min="0" max="100" class="input-mini" data-bind="value: settings.plugins.fanspeedslider.maxSpeed">
|
||||||
|
<span class="add-on">%</span>
|
||||||
|
</div>
|
||||||
|
<span class="help-block">{{ _('Any value sent which is above this value will be decreased to meet this speed. Useful if your fan is too strong on full speed.') }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<p><i>{{ _('NOTE: The min/max setting has no effect when you are printing from an SD card that is attached directly to the printer as the gcode does not pass through OctoPrint.') }}</i></p>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
2
setup.py
2
setup.py
@ -14,7 +14,7 @@ plugin_package = "octoprint_fanspeedslider"
|
|||||||
plugin_name = "OctoPrint-FanSpeedSlider"
|
plugin_name = "OctoPrint-FanSpeedSlider"
|
||||||
|
|
||||||
# The plugin's version. Can be overwritten within OctoPrint's internal data via __plugin_version__ in the plugin module
|
# The plugin's version. Can be overwritten within OctoPrint's internal data via __plugin_version__ in the plugin module
|
||||||
plugin_version = "0.1.2"
|
plugin_version = "0.1.3"
|
||||||
|
|
||||||
# The plugin's description. Can be overwritten within OctoPrint's internal data via __plugin_description__ in the plugin
|
# The plugin's description. Can be overwritten within OctoPrint's internal data via __plugin_description__ in the plugin
|
||||||
# module
|
# module
|
||||||
|
Loading…
Reference in New Issue
Block a user