add a limiter

This commit is contained in:
ntoff 2017-09-05 03:52:55 +10:00
parent 7612b7081c
commit 30ee76bf7e
3 changed files with 78 additions and 14 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,24 @@ class FanSliderPlugin(octoprint.plugin.StartupPlugin,
octoprint.plugin.SettingsPlugin, octoprint.plugin.SettingsPlugin,
octoprint.plugin.AssetPlugin): octoprint.plugin.AssetPlugin):
def on_after_startup(self):
self.fanSpeed = self._settings.get(["fanSpeed"])
self.minSpeed = self._settings.get(["minSpeed"])
self.maxSpeed = self._settings.get(["maxSpeed"])
def get_settings_defaults(self): def get_settings_defaults(self):
return dict(fanSpeed=100) return dict(
fanSpeed=100,
minSpeed=0,
maxSpeed=100
)
def on_settings_save(self, data):
octoprint.plugin.SettingsPlugin.on_settings_save(self, data)
self.fanSpeed = self._settings.get(["fanSpeed"])
self.minSpeed = self._settings.get(["minSpeed"])
self.maxSpeed = self._settings.get(["maxSpeed"])
def get_assets(self): def get_assets(self):
return dict( return dict(
@ -22,10 +40,27 @@ class FanSliderPlugin(octoprint.plugin.StartupPlugin,
dict(type="settings", custom_bindings=False) dict(type="settings", custom_bindings=False)
] ]
def rewrite_m106(self, comm_instance, phase, cmd, cmd_type, gcode, *args, **kwargs):
if gcode and gcode.startswith('M106'):
getcontext().prec = 5 #sets precision for "Decimal" not sure if this'll cause conflicts, ideas?
self.minPWM = Decimal( Decimal(self.minSpeed) * Decimal(255) / Decimal(100) )
self.maxPWM = Decimal( Decimal(self.maxSpeed) * Decimal(255) / Decimal(100) )
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 +73,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"
def __plugin_load__():
global __plugin_implementation__
__plugin_implementation__ = __plugin_implementation__ = FanSliderPlugin()
global __plugin_hooks__
__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

@ -12,11 +12,13 @@ $(function() {
self.control = parameters[2]; self.control = parameters[2];
self.settings = parameters[3]; 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 () { fanPWM = ko.pureComputed(function () {
return Math.round(fanSpeed() * 255 / 100); self.speed = fanSpeed() * 255 / 100
return self.speed;
}); });
//send gcode to set fan speed //send gcode to set fan speed
sendFanSpeed = function () { sendFanSpeed = function () {

View File

@ -1,9 +1,7 @@
<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">
@ -11,8 +9,30 @@
<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.fanSpeed">
<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, this is useful if your slicer doesn\'t allow min / max fan speeds.') }}</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 set by the slicer which is below this value will be increased to meet this speed.') }}</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 set by the slicer which is above this value will be decreased to meet this speed.') }}</span>
</div>
</div>
<p><i>{{ _('NOTE: The min/max setting has no effect when you are printing from an SD card attached directly to the printer as the gcode does not pass through OctoPrint. In the case of printing from SD, you will be required to use a slicer that allows for seting the min / max speed.') }}</i></p>
</form> </form>
</div> </div>