Merge pull request #2 from ntoff/limiter

Limiter
This commit is contained in:
ntoff 2017-09-25 06:24:37 +10:00 committed by GitHub
commit ce10fc7e3b
4 changed files with 87 additions and 25 deletions

View File

@ -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(
@ -22,10 +35,33 @@ class FanSliderPlugin(octoprint.plugin.StartupPlugin,
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
} }

View File

@ -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];
//default to 100% fan speed
fanSpeed = ko.observable(undefined); 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"]
]); ]);
}); });

View File

@ -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>

View File

@ -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