Skip to content

Commit

Permalink
New Verison 1.7.1
Browse files Browse the repository at this point in the history
#33, #27, #24, #16 major bug. after resuming a multi extruder print the tracked material is assigned to tool0
  • Loading branch information
OllisGit committed Jan 29, 2021
1 parent 46b8561 commit 5237c4d
Show file tree
Hide file tree
Showing 3 changed files with 128 additions and 39 deletions.
157 changes: 119 additions & 38 deletions octoprint_filamentmanager/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@

from .api import FilamentManagerApi
from .data import FilamentManager
from .odometer import FilamentOdometer
from .newodometer import NewFilamentOdometer
# from .odometer import FilamentOdometer


class FilamentManagerPlugin(FilamentManagerApi,
Expand All @@ -31,7 +32,8 @@ class FilamentManagerPlugin(FilamentManagerApi,
def __init__(self):
self.client_id = None
self.filamentManager = None
self.filamentOdometer = None
# self.filamentOdometer = None
self.myFilamentOdometer = None
self.lastPrintState = None

self.odometerEnabled = False
Expand All @@ -49,8 +51,13 @@ def get_client_id():

self.client_id = get_client_id()

self.filamentOdometer = FilamentOdometer()
self.filamentOdometer.set_g90_extruder(self._settings.get_boolean(["feature", "g90InfluencesExtruder"]))
# self.filamentOdometer = FilamentOdometer()
# self.filamentOdometer.set_g90_extruder(self._settings.get_boolean(["feature", "g90InfluencesExtruder"]))

self.myFilamentOdometer = NewFilamentOdometer()
self.myFilamentOdometer.set_g90_extruder(self._settings.get_boolean(["feature", "g90InfluencesExtruder"]))

self.alreadyCanceled = False

db_config = self._settings.get(["database"], merged=True)
migrate_schema_version = False
Expand Down Expand Up @@ -119,6 +126,9 @@ def migrate_database_schema(self, target, current):
self.filamentManager.initialize()

def on_after_startup(self):
self.odometerEnabled = self._settings.get_boolean(["enableOdometer"])
self.pauseEnabled = self._settings.get_boolean(["autoPause"])

# subscribe to the notify channel so that we get notified if another client has altered the data
# notify is not available if we are connected to the internal sqlite database
if self.filamentManager is not None and self.filamentManager.notify is not None:
Expand Down Expand Up @@ -198,7 +208,11 @@ def on_settings_save(self, data):
# we have to recalculate the pause thresholds
self.update_pause_thresholds()

self.filamentOdometer.set_g90_extruder(self._settings.get_boolean(["feature", "g90InfluencesExtruder"]))
# self.filamentOdometer.set_g90_extruder(self._settings.get_boolean(["feature", "g90InfluencesExtruder"]))
self.myFilamentOdometer.set_g90_extruder(self._settings.get_boolean(["feature", "g90InfluencesExtruder"]))

self.odometerEnabled = self._settings.get_boolean(["enableOdometer"])
self.pauseEnabled = self._settings.get_boolean(["autoPause"])

# AssetPlugin

Expand All @@ -223,42 +237,102 @@ def get_template_configs(self):
# EventHandlerPlugin

def on_event(self, event, payload):
if event == Events.PRINTER_STATE_CHANGED:
self.on_printer_state_changed(payload)

def on_printer_state_changed(self, payload):
if payload['state_id'] == "PRINTING":
if self.lastPrintState == "PAUSED":
# resuming print
self.filamentOdometer.reset_extruded_length()
else:
# starting new print
self.filamentOdometer.reset()
self.odometerEnabled = self._settings.get_boolean(["enableOdometer"])
self.pauseEnabled = self._settings.get_boolean(["autoPause"])
self._logger.debug("Printer State: %s" % payload["state_string"])
self._logger.debug("Odometer: %s" % ("On" if self.odometerEnabled else "Off"))
self._logger.debug("AutoPause: %s" % ("On" if self.pauseEnabled and self.odometerEnabled else "Off"))
elif self.lastPrintState == "PRINTING":
# print state changed from printing => update filament usage
self._logger.debug("Printer State: %s" % payload["state_string"])
if self.odometerEnabled:
self.odometerEnabled = False # disabled because we don't want to track manual extrusion
self.update_filament_usage()

# update last print state
self.lastPrintState = payload['state_id']
# if event == Events.PRINTER_STATE_CHANGED:
# self.on_printer_state_changed(payload)

if Events.PRINT_STARTED == event:
self.alreadyCanceled = False
self._printJobStarted(payload)
elif Events.PRINT_PAUSED == event:
self.alreadyCanceled = True
self._printJobPaused()
elif Events.PRINT_RESUMED == event:
self.alreadyCanceled = True
self._printJobResumed()
elif Events.PRINT_DONE == event:
self._printJobFinished()
elif Events.PRINT_FAILED == event:
if self.alreadyCanceled == False:
self._printJobFinished()
elif Events.PRINT_CANCELLED == event:
self.alreadyCanceled = True
self._printJobFinished()
pass

def _printJobStarted(self, payload):

# starting new print
# self.filamentOdometer.reset()
self.myFilamentOdometer.reset()

self.odometerEnabled = self._settings.get_boolean(["enableOdometer"])
self.pauseEnabled = self._settings.get_boolean(["autoPause"])
self._logger.debug("Printer started")
self._logger.debug("Odometer: %s" % ("On" if self.odometerEnabled else "Off"))
self._logger.debug("AutoPause: %s" % ("On" if self.pauseEnabled and self.odometerEnabled else "Off"))

pass

def _printJobPaused(self):
# do nothing
pass

def _printJobResumed(self):
# do nothing
pass

def _printJobFinished(self):
self.update_filament_usage()
pass

# def on_printer_state_changed(self, payload):
# if payload['state_id'] == "PRINTING":
# if self.lastPrintState == "PAUSED":
# # resuming print
# # no idea why on pausing the extruded length should be reseted self.filamentOdometer.reset_extruded_length()
# pass
# else:
# # starting new print
# # self.filamentOdometer.reset()
# self.myFilamentOdometer.reset()
# self.odometerEnabled = self._settings.get_boolean(["enableOdometer"])
# self.pauseEnabled = self._settings.get_boolean(["autoPause"])
# self._logger.debug("Printer State: %s" % payload["state_string"])
# self._logger.debug("Odometer: %s" % ("On" if self.odometerEnabled else "Off"))
# self._logger.debug("AutoPause: %s" % ("On" if self.pauseEnabled and self.odometerEnabled else "Off"))
# elif self.lastPrintState == "PRINTING":
# # print state changed from printing => update filament usage
# self._logger.debug("Printer State: %s" % payload["state_string"])
# if self.odometerEnabled:
# self.odometerEnabled = False # disabled because we don't want to track manual extrusion
# self.update_filament_usage()
#
# # update last print state
# self.lastPrintState = payload['state_id']

def update_filament_usage(self):
printer_profile = self._printer_profile_manager.get_current_or_default()
extrusion = self.filamentOdometer.get_extrusion()
numTools = min(printer_profile['extruder']['count'], len(extrusion))
# extrusion = self.filamentOdometer.get_extrusion()
extrusion = self.myFilamentOdometer.getExtrusionAmount()

printerProfileToolCount = printer_profile['extruder']['count']
self._logger.info("Updating Filament usage for octoprint configured toolcount: {toolCount}"
.format(toolCount=str(printerProfileToolCount)))

self._logger.info("Filament tracked toolcount: {toolCount}"
.format(toolCount=str(len(extrusion))))

self._logger.info("Filament tracked values: {trackedValues}"
.format(trackedValues=str(extrusion)))

numTools = min(printerProfileToolCount, len(extrusion))

def calculate_weight(length, profile):
radius = profile["diameter"] / 2 # mm
volume = (length * PI * radius * radius) / 1000 # cm³
return volume * profile["density"] # g


for tool in range(0, numTools):
self._logger.info("Filament used: {length} mm (tool{id})"
.format(length=str(extrusion[tool]), id=str(tool)))
Expand All @@ -284,7 +358,7 @@ def calculate_weight(length, profile):
spool_string = "{name} - {material} ({vendor})"
spool_string = spool_string.format(name=spool["name"], material=spool["profile"]["material"],
vendor=spool["profile"]["vendor"])
self._logger.debug("Updated remaining filament on spool '{spool}' from {old}g to {new}g ({diff}g)"
self._logger.info("Updated remaining filament on spool '{spool}' from {old}g to {new}g ({diff}g)"
.format(spool=spool_string, old=str(old_value), new=str(new_value),
diff=str(new_value - old_value)))
except Exception as e:
Expand All @@ -297,18 +371,24 @@ def calculate_weight(length, profile):
self.on_data_modified("spools", "update")

# Protocol hook

def filament_odometer(self, comm_instance, phase, cmd, cmd_type, gcode, *args, **kwargs):
if self.odometerEnabled:
self.filamentOdometer.parse(gcode, cmd)
# is enabled in plugin settings and is currently prining

if self.odometerEnabled and self._printer.is_printing():
# self.filamentOdometer.parse(gcode, cmd)
self.myFilamentOdometer.processGCodeLine(cmd)

if self.pauseEnabled and self.check_threshold():
self._logger.info("Filament is running out, pausing print")
self._printer.pause_print()

def check_threshold(self):
extrusion = self.filamentOdometer.get_extrusion()
tool = self.filamentOdometer.get_current_tool()
# extrusion = self.filamentOdometer.get_extrusion()
extrusion = self.myFilamentOdometer.getExtrusionAmount()
# tool = self.filamentOdometer.get_current_tool()
tool = self.myFilamentOdometer.getCurrentTool()
threshold = self.pauseThresholds.get("tool%s" % tool)

return (threshold is not None and extrusion[tool] >= threshold)

def update_pause_thresholds(self):
Expand All @@ -324,6 +404,7 @@ def threshold(spool):
if spool is not None:
self.pauseThresholds["tool%s" % selection["tool"]] = threshold(spool)
except ZeroDivisionError:
tool = selection["tool"]
self._logger.warn("ZeroDivisionError while calculating pause threshold for tool{tool}, "
"pause feature not available for selected spool".format(tool=tool))

Expand Down
8 changes: 8 additions & 0 deletions octoprint_filamentmanager/odometer.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,15 @@ def reset(self):
self.totalExtrusion = [0.0]
self.maxExtrusion = [0.0]
self.currentTool = 0
self.parseCount = 0

def reset_extruded_length(self):
tools = len(self.maxExtrusion)
self.maxExtrusion = [0.0] * tools
self.totalExtrusion = [0.0] * tools

def parse(self, gcode, cmd):
self.parseCount = self.parseCount + 1
if gcode is None:
return

Expand All @@ -57,6 +59,12 @@ def parse(self, gcode, cmd):
elif gcode == "G92": # set position
e = self._get_float(cmd, self.regexE)
if e is not None:

print("*****")
print(str(self.parseCount))
print(cmd)
print("*****")

self.lastExtrusion[self.currentTool] = e
elif gcode == "M82": # set extruder to absolute mode
self.relativeExtrusion = False
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
plugin_identifier = "filamentmanager"
plugin_package = "octoprint_filamentmanager"
plugin_name = "OctoPrint-FilamentManager"
plugin_version = "1.7.0"
plugin_version = "1.7.1"
plugin_description = "Manage your spools and keep track of remaining filament on them"
plugin_author = "Sven Lohrmann, Olli"
plugin_author_email = "ollisgit@gmail.com, malnvenshorn@gmail.com"
Expand Down

0 comments on commit 5237c4d

Please sign in to comment.