Skip to content

Commit aad7330

Browse files
committed
New Version 1.7.0rc1
- E #246 EventBus-Events to support MQTT-Topics - E #186 multiple templates (with field selection) - E #191 Include PTFE tube length for remaining check - E #221 Preview of QR-Code - E #207 Define IP/URL for QR-Code generation - E #220 Output of database id in QR-Code view - E #236, B #228 Output of total spools in tab-view - E Output of database id in QR-Code and in table - B #245 Show last weight digit - B #235 custom colorname not stored - B #225 copy was disabled during printing
1 parent 39d1a3a commit aad7330

13 files changed

+545
-107
lines changed

README.md

+57
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,63 @@ At the meantime you need to uninstall and install the version you like from the
8585

8686
see [Release-Overview](https://github.com/OllisGit/OctoPrint-SpoolManager/releases/)
8787

88+
89+
---
90+
# Developer - Section
91+
92+
## Events
93+
Plugin sends the following custom events to the eventbus like this:
94+
95+
eventManager().fire(eventKey, eventPayload)
96+
97+
| EventKeys |
98+
| ------------------------------------ |
99+
| plugin_spoolmanager_spool_weight_updated_after_print |
100+
| plugin_spoolmanager_spool_selected |
101+
| plugin_spoolmanager_spool_deselected |
102+
| plugin_spoolmanager_spool_added |
103+
| plugin_spoolmanager_spool_deleted |
104+
105+
HINT: In combination with the [MQTT Plugin](https://github.com/OctoPrint/OctoPrint-MQTT) you can subscribe e.g. to this topic:
106+
```
107+
octoPrint/event/plugin_spoolmanager_spool_deselected
108+
```
109+
110+
111+
**Payload**
112+
113+
_spool_added_, _spool_selected_
114+
```javascript
115+
{
116+
'databaseId': 23,
117+
'toolId': 1,
118+
'spoolName':'Fancy Spool',
119+
'material':'ABS',
120+
'colorName':'dark red',
121+
'remainingWeight': 1234
122+
}
123+
```
124+
_spool_deselected_
125+
```javascript
126+
{
127+
'toolId': 1
128+
}
129+
```
130+
_spool_deleted_
131+
```javascript
132+
{
133+
'databaseId': 23
134+
}
135+
```
136+
Other Plugins could listen to this events in there python-code like this:
137+
138+
eventmanager.subscribe("plugin_spoolmanager_spool_selected", self._myEventListener)
139+
140+
or use `octoprint.plugin.EventHandlerPlugin` with something like this:
141+
142+
def on_event(self, event, payload):
143+
if event == "plugin_spoolmanager_spool_selected":
144+
## do something usefull
88145
---
89146

90147
### Used UI-Tools

octoprint_SpoolManager/DatabaseManager.py

+7
Original file line numberDiff line numberDiff line change
@@ -872,6 +872,13 @@ def loadDatabaseMetaInformations(self, databaseSettings = None):
872872
"externalSpoolItemCount": externalSpoolItemCount
873873
}
874874

875+
def loadFirstSingleSpool(self, withReusedConnection=False):
876+
def databaseCallMethode():
877+
return SpoolModel.select().limit(1)[0]
878+
879+
return self._handleReusableConnection(databaseCallMethode, withReusedConnection, "loadFirstSingleSpool")
880+
881+
875882
def loadSpool(self, databaseId, withReusedConnection=False):
876883
def databaseCallMethode():
877884
return SpoolModel.get_or_none(databaseId)

octoprint_SpoolManager/__init__.py

+52-11
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@
1111

1212
from octoprint_SpoolManager.DatabaseManager import DatabaseManager
1313
# from octoprint_SpoolManager.Odometer import FilamentOdometer
14+
1415
from octoprint_SpoolManager.newodometer import NewFilamentOdometer
1516

1617
from octoprint_SpoolManager.api import Transformer
1718
from octoprint_SpoolManager.api.SpoolManagerAPI import SpoolManagerAPI
1819
from octoprint_SpoolManager.common import StringUtils
1920
from octoprint_SpoolManager.common.SettingsKeys import SettingsKeys
21+
from octoprint_SpoolManager.common.EventBusKeys import EventBusKeys
2022

2123
class SpoolmanagerPlugin(
2224
SpoolManagerAPI,
@@ -62,7 +64,6 @@ def initialize(self):
6264
self._logger.info("Done initializing")
6365
pass
6466

65-
6667
################################################################################################### public functions
6768

6869
def checkRemainingFilament(self, forToolIndex=None):
@@ -134,6 +135,12 @@ def _sendMessageToClient(self, type, title, message, autoclose=False):
134135
message=message,
135136
autoclose=autoclose))
136137

138+
def _sendPayload2EventBus(self, eventKey, eventPayload):
139+
140+
eventName = "plugin_spoolmanager_" + eventKey
141+
self._logger.info("Send Event '"+eventName+"' with payload '"+str(eventPayload)+"' to event-bus")
142+
self._event_bus.fire(eventName, payload=eventPayload)
143+
137144
def _checkForMissingPluginInfos(self, sendToClient=False):
138145

139146
pluginInfo = self._getPluginInformation("filamentmanager")
@@ -275,14 +282,23 @@ def _evaluateRequiredWeight(self, selectedSpools, forToolIndex=None, warnUser=Fa
275282
someAttributesMissing = True
276283
else:
277284
# Benötigtes Gewicht = gewicht(geplante länge, durchmesser, dichte)
278-
requiredWeight = int(self._calculateWeight(filamentLength, diameter, density))
285+
requiredWeight = self._calculateWeight(filamentLength, diameter, density)
279286

280287
# Vorhanden Gewicht = Gesamtgewicht - Verbrauchtes Gewicht
281288
# TODO don't calculate here use the value from the database
282289
remainingWeight = totalWeight - usedWeight
283290

291+
saftyLengthInMM = self._settings.get_int([SettingsKeys.SETTINGS_KEY_SAFETY_LENGTH])
292+
if (saftyLengthInMM != 0):
293+
saftyRequiredWeight = self._calculateWeight(saftyLengthInMM, diameter, density)
294+
self._logger.info("saftyWeight '" + str(saftyRequiredWeight) + "' from saftyLengthInMM '" + str(saftyLengthInMM) + "' calculated")
295+
requiredWeight = requiredWeight + saftyRequiredWeight
296+
297+
self._logger.info("tool" + str(toolIndex) + ", requiredWeight '" + str(requiredWeight) + "', remainingWeight '" + str(remainingWeight) + "'")
298+
284299
notEnough = False
285300
if remainingWeight < requiredWeight and requiredWeight > 0:
301+
self._logger.info("Filament not enough!")
286302
if (warnUser == True):
287303
self._sendMessageToClient(
288304
"warning", "Filament not enough!",
@@ -425,6 +441,7 @@ def _on_printJobStarted(self):
425441
action="reloadTable"
426442
))
427443
# assign the current extrusion to the current selected spools
444+
428445
def commitOdometerData(self):
429446
reload = False
430447
selectedSpools = self.loadSelectedSpools()
@@ -465,6 +482,17 @@ def commitOdometerData(self):
465482
self._logger.info("Tool %d: New spoolUsedWeight: %s" % (toolIndex, str(newUsedWeight)))
466483

467484
self._databaseManager.saveSpool(spoolModel)
485+
486+
eventPayload = {
487+
"toolId": toolIndex,
488+
"databaseId": spoolModel.databaseId,
489+
"spoolName": spoolModel.displayName,
490+
"material": spoolModel.material,
491+
"colorName": spoolModel.colorName,
492+
"remainingWeight": spoolModel.remainingWeight
493+
}
494+
self._sendPayload2EventBus(EventBusKeys.EVENT_BUS_SPOOL_WEIGHT_UPDATED_AFTER_PRINT, eventPayload)
495+
468496
reload = True
469497

470498
self.myFilamentOdometer.reset_extruded_length()
@@ -597,6 +625,13 @@ def on_sentGCodeHook(self, comm_instance, phase, cmd, cmd_type, gcode, *args, **
597625

598626
def on_event(self, event, payload):
599627

628+
# if (event != "RegisteredMessageReceived"):
629+
# print("*** EVENT: " + event)
630+
#
631+
# if ("plugin_spoolmanager" in event):
632+
# print(payload)
633+
# pass
634+
600635
if (Events.CLIENT_OPENED == event):
601636
self._on_clientOpened(payload)
602637
return
@@ -714,11 +749,14 @@ def get_settings_defaults(self):
714749
settings[SettingsKeys.SETTINGS_KEY_WARN_IF_SPOOL_NOT_SELECTED] = True
715750
settings[SettingsKeys.SETTINGS_KEY_WARN_IF_FILAMENT_NOT_ENOUGH] = True
716751
settings[SettingsKeys.SETTINGS_KEY_CURRENCY_SYMBOL] = "€"
752+
settings[SettingsKeys.SETTINGS_KEY_SAFETY_LENGTH] = 0
717753

718754
## QR-Code
719755
settings[SettingsKeys.SETTINGS_KEY_QR_CODE_ENABLED] = True
720-
settings[SettingsKeys.SETTINGS_KEY_QR_CODE_FILL_COLOR] = "darkgreen"
721-
settings[SettingsKeys.SETTINGS_KEY_QR_CODE_BACKGROUND_COLOR] = "white"
756+
settings[SettingsKeys.SETTINGS_KEY_QR_CODE_USE_URL_PREFIX] = False
757+
settings[SettingsKeys.SETTINGS_KEY_QR_CODE_URL_PREFIX] = None
758+
settings[SettingsKeys.SETTINGS_KEY_QR_CODE_FILL_COLOR] = "#008000"
759+
settings[SettingsKeys.SETTINGS_KEY_QR_CODE_BACKGROUND_COLOR] = "#ffffff"
722760
settings[SettingsKeys.SETTINGS_KEY_QR_CODE_WIDTH] = "100"
723761
settings[SettingsKeys.SETTINGS_KEY_QR_CODE_HEIGHT] = "100"
724762

@@ -756,6 +794,7 @@ def get_settings_defaults(self):
756794
# "password": "illO"
757795
# }
758796

797+
settings["excludedFromTemplateCopy"] = []
759798
return settings
760799

761800
##~~ TemplatePlugin mixin
@@ -838,12 +877,13 @@ def get_update_information(self):
838877
)
839878
)
840879

841-
842-
843-
844-
845-
846-
880+
def register_custom_events(*args, **kwargs):
881+
return [EventBusKeys.EVENT_BUS_SPOOL_WEIGHT_UPDATED_AFTER_PRINT,
882+
EventBusKeys.EVENT_BUS_SPOOL_SELECTED,
883+
EventBusKeys.EVENT_BUS_SPOOL_DESELECTED,
884+
EventBusKeys.EVENT_BUS_SPOOL_ADDED,
885+
EventBusKeys.EVENT_BUS_SPOOL_DELETED
886+
]
847887

848888

849889

@@ -870,7 +910,8 @@ def __plugin_load__():
870910
global __plugin_hooks__
871911
__plugin_hooks__ = {
872912
"octoprint.plugin.softwareupdate.check_config": __plugin_implementation__.get_update_information,
873-
"octoprint.comm.protocol.gcode.sent": __plugin_implementation__.on_sentGCodeHook
913+
"octoprint.comm.protocol.gcode.sent": __plugin_implementation__.on_sentGCodeHook,
874914
# "octoprint.comm.protocol.scripts": __plugin_implementation__.message_on_connect
915+
"octoprint.events.register_custom_events": __plugin_implementation__.register_custom_events
875916
}
876917

0 commit comments

Comments
 (0)