add a limiter
This commit is contained in:
parent
7612b7081c
commit
30ee76bf7e
@ -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"
|
||||||
__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
|
||||||
}
|
}
|
@ -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 () {
|
||||||
|
@ -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>
|
||||||
|
Loading…
Reference in New Issue
Block a user