diff --git a/octoprint_fanspeedslider/__init__.py b/octoprint_fanspeedslider/__init__.py index 7cb3e58..09d104b 100644 --- a/octoprint_fanspeedslider/__init__.py +++ b/octoprint_fanspeedslider/__init__.py @@ -1,6 +1,8 @@ # coding=utf-8 from __future__ import absolute_import +from decimal import * +import re import octoprint.plugin class FanSliderPlugin(octoprint.plugin.StartupPlugin, @@ -8,8 +10,19 @@ class FanSliderPlugin(octoprint.plugin.StartupPlugin, octoprint.plugin.SettingsPlugin, octoprint.plugin.AssetPlugin): + def on_after_startup(self): + self.get_settings_updates() + 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): return dict( @@ -20,12 +33,35 @@ class FanSliderPlugin(octoprint.plugin.StartupPlugin, def get_template_configs(self): return [ 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): return dict( fanspeedslider=dict( - displayName="Fan Speed Slider", + displayName="Fan Speed Control", displayVersion=self._plugin_version, # version check: github repository @@ -38,8 +74,15 @@ class FanSliderPlugin(octoprint.plugin.StartupPlugin, pip="https://github.com/ntoff/OctoPrint-FanSpeedSlider/archive/{target_version}.zip" ) ) -__plugin_name__ = "Fan Speed Slider" -__plugin_implementation__ = FanSliderPlugin() -__plugin_hooks__ = { + +__plugin_name__ = "Fan Speed Control" + +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 } \ No newline at end of file diff --git a/octoprint_fanspeedslider/static/js/fanslider.js b/octoprint_fanspeedslider/static/js/fanslider.js index efcd923..192e9c9 100644 --- a/octoprint_fanspeedslider/static/js/fanslider.js +++ b/octoprint_fanspeedslider/static/js/fanslider.js @@ -7,20 +7,20 @@ $(function() { function FanSliderPluginViewModel(parameters) { var self = this; - self.printerstate = parameters[0]; - self.loginstate = parameters[1]; - self.control = parameters[2]; - self.settings = parameters[3]; + self.settings = parameters[0]; + self.control = parameters[1]; + self.loginState = parameters[2]; + + fanSpeed = ko.observable(undefined); - //default to 100% fan speed - fanSpeed = ko.observable(undefined); //convert percentage into PWM - fanPWM = ko.pureComputed(function () { - return Math.round(fanSpeed() * 255 / 100); + self.fanPWM = ko.pureComputed(function () { + 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 sendFanSpeed = function () { - self.control.sendCustomCommand({ command: "M106 S" + fanPWM() }); + self.control.sendCustomCommand({ command: "M106 S" + self.fanPWM() }); }; //extra classes $("#control > div.jog-panel").eq(0).addClass("controls"); @@ -54,12 +54,11 @@ $(function() { } //retrieve settings self.onBeforeBinding = function() { - fanSpeed(self.settings.settings.plugins.fanspeedslider.fanSpeed()); + fanSpeed(self.settings.settings.plugins.fanspeedslider.defaultFanSpeed()); } } OCTOPRINT_VIEWMODELS.push([ FanSliderPluginViewModel, - - ["printerStateViewModel", "loginStateViewModel", "controlViewModel", "settingsViewModel"] + ["settingsViewModel", "controlViewModel", "loginStateViewModel"] ]); }); \ No newline at end of file diff --git a/octoprint_fanspeedslider/templates/fanspeedslider_settings.jinja2 b/octoprint_fanspeedslider/templates/fanspeedslider_settings.jinja2 index b23d2cf..c05a308 100644 --- a/octoprint_fanspeedslider/templates/fanspeedslider_settings.jinja2 +++ b/octoprint_fanspeedslider/templates/fanspeedslider_settings.jinja2 @@ -1,18 +1,38 @@ -

{{ _('Fan Speed Slider') }}

-
-

{{ _('Set the default value for the fan speed slider.') }}

-
+

{{ _('Fan Speed Control') }}

+

{{ _('Set the default value for the speed slider.') }}

- + %
- {{ _('This value does not 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.') }} + {{ _('The default value the slider will be set to when opening OctoPrint\'s UI') }}
+

{{ _('The settings below can be used to limit the fan\'s output without having to re-slice and re-upload your gcode.') }}

+
+ +
+
+ + % +
+ {{ _('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.') }} +
+
+
+ +
+
+ + % +
+ {{ _('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.') }} +
+
+

{{ _('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.') }}

diff --git a/setup.py b/setup.py index 1c9c839..f1ce404 100644 --- a/setup.py +++ b/setup.py @@ -14,7 +14,7 @@ plugin_package = "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 -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 # module