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 @@ -
{{ _('Set the default value for the fan speed slider.') }}
-{{ _('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.') }}
+{{ _('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.') }}