Skip to content

Commit 8783d10

Browse files
committedJan 21, 2025
Added support for PrintTimeGenius plugin
Closes #191
1 parent b38b75a commit 8783d10

File tree

4 files changed

+35
-17
lines changed

4 files changed

+35
-17
lines changed
 

‎octoprint_octopod/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ def get_assets(self):
232232
# progress-hook
233233
def on_print_progress(self, storage, path, progress):
234234
# progress 0 - 100
235-
self._job_notifications.on_print_progress(self._settings, progress)
235+
self._job_notifications.on_print_progress(self._settings, progress, self._printer)
236236
self._live_activities.on_print_progress(self._settings, self._printer)
237237

238238
# EventHandlerPlugin mixin

‎octoprint_octopod/base_notification.py

+28-4
Original file line numberDiff line numberDiff line change
@@ -242,15 +242,25 @@ def _send_arbitrary_notification(self, settings, message, image):
242242
return self._alerts.send_alert(settings, apns_token, url, printer_name, message, None, image) < 300
243243

244244
def _is_printer_printing(self, printer):
245-
completion = None
245+
(completion, print_time_in_seconds, print_time_left_in_seconds) = self._get_progress_data(printer)
246+
# Check that we are in the middle of a print
247+
return not(completion is None or completion == 0 or completion == 100)
248+
249+
def _get_progress_data(self, printer, reported_progress=None):
250+
completion = None if reported_progress is None else reported_progress
251+
print_time_in_seconds = None
252+
print_time_left_in_seconds = None
246253
current_data = printer.get_current_data()
247254
if "progress" in current_data and current_data["progress"] is not None \
248255
and "completion" in current_data["progress"] and current_data["progress"][
249256
"completion"] is not None:
250-
completion = current_data["progress"]["completion"]
257+
print_time_left_in_seconds = current_data["progress"]["printTimeLeft"]
258+
print_time_in_seconds = current_data["progress"]["printTime"]
259+
completion = current_data["progress"]["completion"] if reported_progress is None else reported_progress
260+
# Ugly hack - PrintTimeGenius changed reported completion so we need to use their conversion function
261+
completion = self._convert_progress(completion, print_time_in_seconds, print_time_left_in_seconds)
262+
return completion, print_time_in_seconds, print_time_left_in_seconds
251263

252-
# Check that we are in the middle of a print
253-
return not(completion is None or completion == 0 or completion == 100)
254264

255265
@staticmethod
256266
def _get_server_url(settings):
@@ -262,3 +272,17 @@ def _get_server_url(settings):
262272
if server_url.endswith('/'):
263273
server_url = server_url[:-1]
264274
return server_url
275+
276+
def _convert_progress(self, progress, print_time, time_left):
277+
"""
278+
PrintTimeGenius plugin changed the way progress is calculated. If this plugin is installed then the reported
279+
progress by OctoPrint might be wrong and hence needs to be calculated based on printing time.
280+
"""
281+
if print_time is None or time_left is None:
282+
return progress
283+
# Check if PrintTimeGenius plugin is installed and enabled
284+
print_time_genius_plugin = self._plugin_manager.plugins.get("PrintTimeGenius")
285+
if print_time_genius_plugin is not None and print_time_genius_plugin.enabled and time_left > 0:
286+
return print_time / (print_time + time_left) * 100
287+
return progress
288+

‎octoprint_octopod/job_notifications.py

+4-6
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ def __init__(self, logger, ifttt_alerts, plugin_manager):
1010
BaseNotification.__init__(self, logger, plugin_manager)
1111
self._ifttt_alerts = ifttt_alerts
1212

13-
def on_print_progress(self, settings, progress):
13+
def on_print_progress(self, settings, progress, printer):
14+
(completion, print_time_in_seconds, print_time_left_in_seconds) = self._get_progress_data(printer, progress)
15+
progress = round(completion) if completion is not None else progress
1416
progress_type = settings.get(["progress_type"])
1517
if progress_type == '0':
1618
# Print notification disabled
@@ -60,13 +62,9 @@ def send_print_job_notification(self, settings, printer, event_payload, server_u
6062
url = url + '/v1/push_printer'
6163

6264
# Gather information about progress completion of the job
63-
completion = None
6465
was_printing = False
6566
current_data = printer.get_current_data()
66-
if "progress" in current_data and current_data["progress"] is not None \
67-
and "completion" in current_data["progress"] and current_data["progress"][
68-
"completion"] is not None:
69-
completion = current_data["progress"]["completion"]
67+
(completion, print_time_in_seconds, print_time_left_in_seconds) = self._get_progress_data(printer)
7068

7169
current_printer_state_id = event_payload["state_id"]
7270
if not test:

‎octoprint_octopod/live_activities.py

+2-6
Original file line numberDiff line numberDiff line change
@@ -136,14 +136,10 @@ def __get_service_url(self, settings):
136136

137137
def __get_notification_data(self, settings, printer):
138138
url = self.__get_service_url(settings)
139-
completion = None
140-
print_time_left_in_seconds = None
141139
current_data = printer.get_current_data()
142140
printer_status = None
143-
if "progress" in current_data and current_data["progress"] is not None \
144-
and "completion" in current_data["progress"] and current_data["progress"]["completion"] is not None:
145-
completion = round(current_data["progress"]["completion"])
146-
print_time_left_in_seconds = current_data["progress"]["printTimeLeft"]
141+
(completion, print_time_in_seconds, print_time_left_in_seconds) = self._get_progress_data(printer)
142+
completion = round(completion) if completion is not None else None
147143

148144
if "state" in current_data and current_data["state"] is not None:
149145
printer_status = current_data["state"]["text"]

0 commit comments

Comments
 (0)
Please sign in to comment.