diff --git a/octoprint_fanspeedslider/__init__.py b/octoprint_fanspeedslider/__init__.py index 7cb3e58..2b6be64 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,24 @@ class FanSliderPlugin(octoprint.plugin.StartupPlugin, octoprint.plugin.SettingsPlugin, 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): - 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): return dict( @@ -20,12 +38,29 @@ class FanSliderPlugin(octoprint.plugin.StartupPlugin, def get_template_configs(self): return [ 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): return dict( fanspeedslider=dict( - displayName="Fan Speed Slider", + displayName="Fan Speed Control", displayVersion=self._plugin_version, # version check: github repository @@ -38,8 +73,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..1a431f1 100644 --- a/octoprint_fanspeedslider/static/js/fanslider.js +++ b/octoprint_fanspeedslider/static/js/fanslider.js @@ -12,11 +12,13 @@ $(function() { self.control = parameters[2]; self.settings = parameters[3]; - //default to 100% fan speed - fanSpeed = ko.observable(undefined); + fanSpeed = ko.observable(undefined); + //convert percentage into PWM fanPWM = ko.pureComputed(function () { - return Math.round(fanSpeed() * 255 / 100); + self.speed = fanSpeed() * 255 / 100 + + return self.speed; }); //send gcode to set fan speed sendFanSpeed = function () { diff --git a/octoprint_fanspeedslider/templates/fanspeedslider_settings.jinja2 b/octoprint_fanspeedslider/templates/fanspeedslider_settings.jinja2 index b23d2cf..4ca7b1f 100644 --- a/octoprint_fanspeedslider/templates/fanspeedslider_settings.jinja2 +++ b/octoprint_fanspeedslider/templates/fanspeedslider_settings.jinja2 @@ -1,9 +1,7 @@ -

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

-
-

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

-
+

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

+

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

@@ -11,8 +9,30 @@ %
- {{ _('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, this is useful if your slicer doesn\'t allow min / max fan speeds.') }}

+
+ +
+
+ + % +
+ {{ _('Any value set by the slicer which is below this value will be increased to meet this speed.') }} +
+
+
+ +
+
+ + % +
+ {{ _('Any value set by the slicer which is above this value will be decreased to meet this speed.') }} +
+
+

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