From e0df5d33f272a4b4c09dc030c6fe590cbd856ea2 Mon Sep 17 00:00:00 2001 From: Thomas Taugs Date: Tue, 11 Mar 2025 14:49:28 +0100 Subject: [PATCH 1/8] Update README.de.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Einige Kleinigkeiten die mir aufgefallen sind. - einheitlich Bambu Lab - generell Namensgebung korrigiert - die meisten Auflistungen haben ein . am Ende, eigentlich könnte man die weglassen, aber ich habe die, die keine hatten angepasst - Installation Google Chrome oder Microsoft Edge hinzugefügt --- README.de.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/README.de.md b/README.de.md index 1dacfa4..706a733 100644 --- a/README.de.md +++ b/README.de.md @@ -1,8 +1,8 @@ # FilaMan - Filament Management System FilaMan ist ein Filament-Managementsystem für den 3D-Druck. Es verwendet ESP32-Hardware für Gewichtsmessungen und NFC-Tag-Management. -Benutzer können Filamentspulen verwalten, den Status des Automatic Material System (AMS) von Bablulab Druckern überwachen und Einstellungen über eine Weboberfläche vornehmen. -Das System integriert sich nahtlos mit der [Spoolman](https://github.com/Donkie/Spoolman) Filamentverwaltung, zusätzlich mit [Bambulab](https://bambulab.com/en-us) 3D-Druckern und sowie dem [Openspool](https://github.com/spuder/OpenSpool) NFC-TAG Format. +Benutzer können Filamentspulen verwalten, den Status des Automatic Material System (AMS) von Bambu Lab Druckern überwachen und Einstellungen über eine Weboberfläche vornehmen. +Das System integriert sich nahtlos mit der [Spoolman](https://github.com/Donkie/Spoolman) Filamentverwaltung, zusätzlich mit [Bambu Lab](https://bambulab.com/en-us) 3D-Druckern und sowie dem [OpenSpool](https://github.com/spuder/OpenSpool) NFC-TAG Format. ![Scale](./img/scale_trans.png) @@ -16,18 +16,18 @@ Discord Server: [https://discord.gg/vMAx2gf5](https://discord.gg/vMAx2gf5) ### ESP32 Hardware-Funktionen - **Gewichtsmessung:** Verwendung einer Wägezelle mit HX711-Verstärker für präzise Gewichtsverfolgung. - **NFC-Tag Lesen/Schreiben:** PN532-Modul zum Lesen und Schreiben von Filamentdaten auf NFC-Tags. -- **OLED-Display:** Zeigt aktuelles Gewicht, Verbindungsstatus (WiFi, Bambu Lab, Spoolman). +- **OLED-Display:** Zeigt aktuelles Gewicht, Verbindungsstatus (WiFi, BambuLab, Spoolman). - **WLAN-Konnektivität:** WiFiManager für einfache Netzwerkkonfiguration. - **MQTT-Integration:** Verbindet sich mit Bambu Lab Drucker für AMS-Steuerung. -- **NFC-Tag NTAG213 NTAG215:** Verwendung von NTAG213, besser NTAG215 wegen ausreichendem Speicherplatz auf dem Tag +- **NFC-Tag NTAG213 NTAG215:** Verwendung von NTAG213 (144 Bytes - Kapazität), besser NTAG215 (540 Bytes - Kapazität) wegen ausreichendem Speicherplatz auf dem Tag ### Weboberflächen-Funktionen - **Echtzeit-Updates:** WebSocket-Verbindung für Live-Daten-Updates. - **NFC-Tag-Verwaltung:** - Filamentdaten auf NFC-Tags schreiben. - - Verwendet das NFC-Tag-Format von [Openspool](https://github.com/spuder/OpenSpool) - - Ermöglicht automatische Spulenerkennung im AMS -- **Bambulab AMS-Integration:** + - Verwendet das NFC-Tag-Format von [OpenSpool](https://github.com/spuder/OpenSpool). + - Ermöglicht automatische Spulenerkennung im AMS. +- **Bambu Lab AMS-Integration:** - Anzeige der aktuellen AMS-Fachbelegung. - Zuordnung von Filamenten zu AMS-Slots. - Unterstützung für externe Spulenhalter. @@ -36,7 +36,7 @@ Discord Server: [https://discord.gg/vMAx2gf5](https://discord.gg/vMAx2gf5) - Filtern und Auswählen von Filamenten. - Automatische Aktualisierung der Spulengewichte. - Verfolgung von NFC-Tag-Zuweisungen. - - Unterstützt das Spoolman Octoprint Plugin + - Unterstützt das Spoolman Octoprint Plugin. ### Wenn Sie meine Arbeit unterstützen möchten, freue ich mich über einen Kaffee Buy Me A Coffee @@ -122,7 +122,7 @@ Du musst Spoolman auf DEBUG Modus setzten, da man bisher in Spoolman keine CORS ``` ## Schritt-für-Schritt Installation -### Einfache Installation +### Einfache Installation (Google Chrome oder Microsoft Edge) 1. **Gehe auf [FilaMan Installer](https://www.filaman.app/installer.html)** 2. **Stecke dein ESP an den Rechner und klicke Connect** @@ -185,4 +185,4 @@ Dieses Projekt ist unter der MIT-Lizenz lizenziert. Siehe [LICENSE](LICENSE) Dat Der Code kann getestet und die Anwendung kann vom [GitHub Repository](https://github.com/ManuelW77/Filaman) heruntergeladen werden. ### Wenn Sie meine Arbeit unterstützen möchten, freue ich mich über einen Kaffee -Buy Me A Coffee \ No newline at end of file +Buy Me A Coffee -- 2.39.5 From a35e13e01500451f7cb4497cef2c50146e0719ba Mon Sep 17 00:00:00 2001 From: Thomas Taugs Date: Tue, 11 Mar 2025 14:54:43 +0100 Subject: [PATCH 2/8] Update README.md See German-Commit Readme :-) --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 1c97400..fdab418 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ FilaMan is a filament management system for 3D printing. It uses ESP32 hardware for weight measurement and NFC tag management. Users can manage filament spools, monitor the status of the Automatic Material System (AMS) and make settings via a web interface. -The system integrates seamlessly with [Bambulab](https://bambulab.com/en-us) 3D printers and [Spoolman](https://github.com/Donkie/Spoolman) filament management as well as the [Openspool](https://github.com/spuder/OpenSpool) NFC-TAG format. +The system integrates seamlessly with [Bambu Lab](https://bambulab.com/en-us) 3D printers and [Spoolman](https://github.com/Donkie/Spoolman) filament management as well as the [OpenSpool](https://github.com/spuder/OpenSpool) NFC-TAG format. ![Scale](./img/scale_trans.png) @@ -23,13 +23,13 @@ Discord Server: [https://discord.gg/vMAx2gf5](https://discord.gg/vMAx2gf5) - **OLED Display:** Shows current weight, connection status (WiFi, Bambu Lab, Spoolman). - **WiFi Connectivity:** WiFiManager for easy network configuration. - **MQTT Integration:** Connects to Bambu Lab printer for AMS control. -- **NFC-Tag NTAG213 NTAG215:** Use NTAG213, better NTAG215 because of enaught space on the Tag +- **NFC-Tag NTAG213 NTAG215:** Use NTAG213 (Capacity of 144 bytes), better NTAG215 (Capacity of 540 bytes) because of enaught space on the Tag. ### Web Interface Features - **Real-time Updates:** WebSocket connection for live data updates. - **NFC Tag Management:** - Write filament data to NFC tags. - - uses NFC-Tag Format of [Openspool](https://github.com/spuder/OpenSpool) + - uses NFC-Tag Format of [OpenSpool](https://github.com/spuder/OpenSpool) - so you can use it with automatic Spool detection in AMS - **Bambulab AMS Integration:** - Display current AMS tray contents. @@ -40,7 +40,7 @@ Discord Server: [https://discord.gg/vMAx2gf5](https://discord.gg/vMAx2gf5) - Filter and select filaments. - Update spool weights automatically. - Track NFC tag assignments. - - Supports Spoolman Octoprint Plugin + - Supports Spoolman Octoprint Plugin. ### If you want to support my work, i would be happy to get a coffe Buy Me A Coffee @@ -128,7 +128,7 @@ You have to activate Spoolman in debug mode, because you are not able to set COR ## Step-by-Step Installation -### Easy Installation +### Easy Installation (Google Chrome or Microsoft Edge) 1. **Go to [FilaMan Installer](https://www.filaman.app/installer.html)** 2. **Plug you device in and push Connect button** @@ -191,4 +191,4 @@ This project is licensed under the MIT License. See the [LICENSE](LICENSE) file The code can be tested and the application can be downloaded from the [GitHub repository](https://github.com/ManuelW77/Filaman). ### If you want to support my work, i would be happy to get a coffe -Buy Me A Coffee \ No newline at end of file +Buy Me A Coffee -- 2.39.5 From b4dd0d357a4833d22353821d0d7433da4d6a73fe Mon Sep 17 00:00:00 2001 From: ManuelW Date: Wed, 12 Mar 2025 10:01:40 +0100 Subject: [PATCH 3/8] Update README.md --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index fdab418..a8a55ac 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ FilaMan is a filament management system for 3D printing. It uses ESP32 hardware for weight measurement and NFC tag management. Users can manage filament spools, monitor the status of the Automatic Material System (AMS) and make settings via a web interface. -The system integrates seamlessly with [Bambu Lab](https://bambulab.com/en-us) 3D printers and [Spoolman](https://github.com/Donkie/Spoolman) filament management as well as the [OpenSpool](https://github.com/spuder/OpenSpool) NFC-TAG format. +The system integrates seamlessly with [Bambu Lab](https://bambulab.com/en-us) 3D printers and [Spoolman](https://github.com/Donkie/Spoolman) filament management. ![Scale](./img/scale_trans.png) @@ -29,7 +29,6 @@ Discord Server: [https://discord.gg/vMAx2gf5](https://discord.gg/vMAx2gf5) - **Real-time Updates:** WebSocket connection for live data updates. - **NFC Tag Management:** - Write filament data to NFC tags. - - uses NFC-Tag Format of [OpenSpool](https://github.com/spuder/OpenSpool) - so you can use it with automatic Spool detection in AMS - **Bambulab AMS Integration:** - Display current AMS tray contents. -- 2.39.5 From 659dfb86273028664e143a5c2658da235191ba00 Mon Sep 17 00:00:00 2001 From: ManuelW Date: Wed, 12 Mar 2025 10:02:30 +0100 Subject: [PATCH 4/8] Update README.de.md Removed OpenSpool --- README.de.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.de.md b/README.de.md index 706a733..9045e3b 100644 --- a/README.de.md +++ b/README.de.md @@ -2,7 +2,7 @@ FilaMan ist ein Filament-Managementsystem für den 3D-Druck. Es verwendet ESP32-Hardware für Gewichtsmessungen und NFC-Tag-Management. Benutzer können Filamentspulen verwalten, den Status des Automatic Material System (AMS) von Bambu Lab Druckern überwachen und Einstellungen über eine Weboberfläche vornehmen. -Das System integriert sich nahtlos mit der [Spoolman](https://github.com/Donkie/Spoolman) Filamentverwaltung, zusätzlich mit [Bambu Lab](https://bambulab.com/en-us) 3D-Druckern und sowie dem [OpenSpool](https://github.com/spuder/OpenSpool) NFC-TAG Format. +Das System integriert sich nahtlos mit der [Spoolman](https://github.com/Donkie/Spoolman) Filamentverwaltung, zusätzlich mit [Bambu Lab](https://bambulab.com/en-us) 3D-Druckern. ![Scale](./img/scale_trans.png) @@ -25,7 +25,6 @@ Discord Server: [https://discord.gg/vMAx2gf5](https://discord.gg/vMAx2gf5) - **Echtzeit-Updates:** WebSocket-Verbindung für Live-Daten-Updates. - **NFC-Tag-Verwaltung:** - Filamentdaten auf NFC-Tags schreiben. - - Verwendet das NFC-Tag-Format von [OpenSpool](https://github.com/spuder/OpenSpool). - Ermöglicht automatische Spulenerkennung im AMS. - **Bambu Lab AMS-Integration:** - Anzeige der aktuellen AMS-Fachbelegung. -- 2.39.5 From a41ef9e75ac8ed3f218bd19490a21cf6f4936a5a Mon Sep 17 00:00:00 2001 From: tugsi Date: Fri, 14 Mar 2025 17:42:26 +0100 Subject: [PATCH 5/8] =?UTF-8?q?docs:=20update=20changelog=20and=20header?= =?UTF-8?q?=20for=20version=20v1.4.1=20-=20Die=20MQTT-Puffergr=C3=B6=C3=9F?= =?UTF-8?q?e=20auf=2016.384=20Byte=20(16=20KB)=20erh=C3=B6ht.=20Dies=20sol?= =?UTF-8?q?lte=20ausreichen,=20um=20Ihre=2015.403=20Byte=20gro=C3=9Fe=20JS?= =?UTF-8?q?ON-Nutzlast=20mit=20etwas=20mehr=20Spielraum=20zu=20verarbeiten?= =?UTF-8?q?.=20Diese=20=C3=84nderung=20erm=C3=B6glicht=20es=20dem=20MQTT-C?= =?UTF-8?q?lient,=20gr=C3=B6=C3=9Fere=20JSON-Nachrichten=20ohne=20K=C3=BCr?= =?UTF-8?q?zung=20zu=20empfangen=20und=20zu=20verarbeiten.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Einige wichtige Hinweise zu dieser Änderung: Die neue Puffergröße von 16 KB verbraucht mehr RAM, der ESP32 sollte jedoch ausreichend Speicher dafür haben. Die Größe ist auf 16 KB festgelegt, um über die benötigten 15.403 Byte hinaus zusätzlichen Puffer-Overhead bereitzustellen. Diese Änderung betrifft nur den MQTT-Empfangspuffer -- - Die Task-Stack-Größe von 8192 auf 16384 Wörter erhöht, um mehr Speicher für die JSON-Verarbeitung bereitzustellen --- - Erhöhung des Keepalive-Intervalls auf 60 Sekunden - Verbesserte Fehlerbehandlung und Debugging-Ausgaben - Detaillierte Statusmeldungen für die MQTT-Verbindung - Periodische Verbindungsüberprüfung alle 30 Sekunden - Bessere Handhabung von Verbindungsverlusten --- - Verwendung einer eindeutigen Client-ID mit Zufallssuffix - Erhöhung der QoS (Quality of Service) auf 1 für zuverlässigere Übertragung - Einstellung eines Socket-Timeouts von 60 Sekunden - Aktivierung von Clean Session und Will Message - Verbessertes Verbindungs-Logging --- .gitignore | 5 ++ .vscode/extensions.json | 10 +++ data/bambu_filaments.json | 70 ++++++++++++++++ data/favicon.ico | Bin 0 -> 16958 bytes data/header.html.gz | Bin 0 -> 689 bytes data/index.html.gz | Bin 0 -> 1167 bytes data/logo.png.gz | Bin 0 -> 8198 bytes data/own_filaments.json | 31 +++++++ data/rfid.html.gz | Bin 0 -> 1707 bytes data/rfid.js.gz | Bin 0 -> 5860 bytes data/set_spoolman.png.gz | Bin 0 -> 8932 bytes data/spool_in.png.gz | Bin 0 -> 21835 bytes data/spoolman.html | 171 ++++++++++++++++++++++++++++++++++++++ data/spoolman.js.gz | Bin 0 -> 2821 bytes data/style.css.gz | Bin 0 -> 4898 bytes data/upgrade.html.gz | Bin 0 -> 2583 bytes data/waage.html.gz | Bin 0 -> 1658 bytes data/wifi.html.gz | Bin 0 -> 857 bytes src/bambu.cpp | 83 ++++++++++++++---- 19 files changed, 356 insertions(+), 14 deletions(-) create mode 100644 .gitignore create mode 100644 .vscode/extensions.json create mode 100644 data/bambu_filaments.json create mode 100644 data/favicon.ico create mode 100644 data/header.html.gz create mode 100644 data/index.html.gz create mode 100644 data/logo.png.gz create mode 100644 data/own_filaments.json create mode 100644 data/rfid.html.gz create mode 100644 data/rfid.js.gz create mode 100644 data/set_spoolman.png.gz create mode 100644 data/spool_in.png.gz create mode 100644 data/spoolman.html create mode 100644 data/spoolman.js.gz create mode 100644 data/style.css.gz create mode 100644 data/upgrade.html.gz create mode 100644 data/waage.html.gz create mode 100644 data/wifi.html.gz diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..89cc49c --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.pio +.vscode/.browse.c_cpp.db* +.vscode/c_cpp_properties.json +.vscode/launch.json +.vscode/ipch diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..080e70d --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,10 @@ +{ + // See http://go.microsoft.com/fwlink/?LinkId=827846 + // for the documentation about the extensions.json format + "recommendations": [ + "platformio.platformio-ide" + ], + "unwantedRecommendations": [ + "ms-vscode.cpptools-extension-pack" + ] +} diff --git a/data/bambu_filaments.json b/data/bambu_filaments.json new file mode 100644 index 0000000..afe2bc7 --- /dev/null +++ b/data/bambu_filaments.json @@ -0,0 +1,70 @@ +{ + "GFU99": "TPU", + "GFN99": "PA", + "GFN98": "PA-CF", + "GFL99": "PLA", + "GFL96": "PLA Silk", + "GFL98": "PLA-CF", + "GFL95": "PLA High Speed", + "GFG99": "PETG", + "GFG98": "PETG-CF", + "GFG97": "PCTG", + "GFB99": "ABS", + "GFC99": "PC", + "GFB98": "ASA", + "GFS99": "PVA", + "GFS98": "HIPS", + "GFT98": "PPS-CF", + "GFT97": "PPS", + "GFN97": "PPA-CF", + "GFN96": "PPA-GF", + "GFP99": "PE", + "GFP98": "PE-CF", + "GFP97": "PP", + "GFP96": "PP-CF", + "GFP95": "PP-GF", + "GFR99": "EVA", + "GFR98": "PHA", + "GFS97": "BVOH", + "GFA01": "Bambu PLA Matte", + "GFA00": "Bambu PLA Basic", + "GFA09": "Bambu PLA Tough", + "GFA07": "Bambu PLA Marble", + "GFA08": "Bambu PLA Sparkle", + "GFA02": "Bambu PLA Metal", + "GFA05": "Bambu PLA Silk", + "GFS00": "Bambu Support W", + "GFL03": "eSUN PLA+", + "GFL01": "PolyTerra PLA", + "GFL00": "PolyLite PLA", + "GFA50": "Bambu PLA-CF", + "GFS02": "Bambu Support For PLA", + "GFA11": "Bambu PLA Aero", + "GFL04": "Overture PLA", + "GFL05": "Overture Matte PLA", + "GFA12": "Bambu PLA Glow", + "GFA13": "Bambu PLA Dynamic", + "GFA15": "Bambu PLA Galaxy", + "GFS05": "Bambu Support For PLA/PETG", + "GFU01": "Bambu TPU 95A", + "GFU00": "Bambu TPU 95A HF", + "GFG00": "Bambu PETG Basic", + "GFT01": "Bambu PET-CF", + "GFG50": "Bambu PETG-CF", + "GFG60": "PolyLite PETG", + "GFG01": "Bambu PETG Translucent", + "GFB00": "Bambu ABS", + "GFB60": "PolyLite ABS", + "GFB50": "Bambu ABS-GF", + "GFC00": "Bambu PC", + "GFB01": "Bambu ASA", + "GFB61": "PolyLite ASA", + "GFB02": "Bambu ASA-Aero", + "GFS04": "Bambu PVA", + "GFS01": "Bambu Support G", + "GFN03": "Bambu PA-CF", + "GFN04": "Bambu PAHT-CF", + "GFS03": "Bambu Support For PA/PET", + "GFN05": "Bambu PA6-CF", + "GFN08": "Bambu PA6-GF" +} \ No newline at end of file diff --git a/data/favicon.ico b/data/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..14b75860356963e6670a033b5cf907de68e862b9 GIT binary patch literal 16958 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 literal 0 HcmV?d00001 diff --git a/data/index.html.gz b/data/index.html.gz new file mode 100644 index 0000000000000000000000000000000000000000..c1814488e044aa06cb860629d8e6554c281d454f GIT binary patch literal 1167 zcmV;A1aSKwiwFpmSkz|%|7mVyWq2-VbZu+^tyf!b+cp$_&#ySuiybVImSjVRL^9Ck zG8EX_0Zvi$X*iZ>i3>$)BxTnd`rmg*Nsi>(HlTWlMe-xhcfNC>lDrB-C>iDuhO^|= z{fE1!&%ZrDX)7^1OWY3#ltmga8Mp~T&dz|Iq+%8!D^VL})8OONWB5}rT#{I^G+1%A zu9da{WJ+2l3A*OFEz_K>c*a6MxBxD>s{yrh`+? z514Y#01{dD#oo0sC8Lwo1ik}Dv^TSFyD=xI_;R&N;_YjXNuJJ6Vu6qpZEH5 zS@cA1CKuoV=bcYU+=nEI+gwc+D&KVB%J~X1fyShP#MJ_I@De(|=mVSvIXAVy%?&IC z`*I5?cp*b>S!He@BY&B`g#zmvxYDe;9US5h;#C1gXOvz-6)N)ihJq5m&*EQbI_QZw z%_h;#>aX?7^q!vJ^CTv2D@c^WL7llL_0 zBmVYO?7pGlUhtvq`Tw!4u?pKm+XHDlZ-=wv8P~m@CBwVxY_G(-3ujp4gMt~=L{gt9 zg?fbhtQrlbqI?DFPmQHQgC(`5#8|Clap)Wprd^|J4zBN^)?8ZZVv#?4!0xKeLwMnM zHL^XDvF|3_0D>i^kTXM#isdu{!>d~G{+0V>Er8FbS9TI(< z(C(91uh)@xlCCtY>wU{dfS!oc>6BX(pN5G~uV2TH?at%JpW5YY?Iz10(U*)WhCU-s zG?xx?@DjOh#f5im^eLE5EK0uX1L%78fQD1Bx4E*DA{hg|6@?gOQx0|E%KPmleTAnXkscbdNR3Z6a%;zI!man$H8KAuP hmtfm==+od|z1VNHN!)%#5jFph!9S68^8z*u005R^ME(E( literal 0 HcmV?d00001 diff --git a/data/logo.png.gz b/data/logo.png.gz new file mode 100644 index 0000000000000000000000000000000000000000..9681c15346c83ec203a508a5432f9558346a67d5 GIT binary patch literal 8198 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 literal 0 HcmV?d00001 diff --git a/data/own_filaments.json b/data/own_filaments.json new file mode 100644 index 0000000..cd3e43c --- /dev/null +++ b/data/own_filaments.json @@ -0,0 +1,31 @@ +{ + "TPU": "GFU99", + "PA": "GFN99", + "PA-CF": "GFN98", + "PLA": "GFL99", + "PLA Silk": "GFL96", + "PLA-CF": "GFL98", + "PLA High Speed": "GFL95", + "PETG": "GFG99", + "PETG-CF": "GFG98", + "PCTG": "GFG97", + "ABS": "GFB99", + "ABS+HS": "GFB99", + "PC": "GFC99", + "PC/ABS": "GFC99", + "ASA": "GFB98", + "PVA": "GFS99", + "HIPS": "GFS98", + "PPS-CF": "GFT98", + "PPS": "GFT97", + "PPA-CF": "GFN97", + "PPA-GF": "GFN96", + "PE": "GFP99", + "PE-CF": "GFP98", + "PP": "GFP97", + "PP-CF": "GFP96", + "PP-GF": "GFP95", + "EVA": "GFR99", + "PHA": "GFR98", + "BVOH": "GFS97" +} \ No newline at end of file diff --git a/data/rfid.html.gz b/data/rfid.html.gz new file mode 100644 index 0000000000000000000000000000000000000000..4c86b2b9c7b48a4bf94f9059734caab4ad47bd23 GIT binary patch literal 1707 zcmV;c22}YUiwFpmSkz|%|8iz&WG-lQZEOI=S>0~iHWa?kQ*gR*f>n0Y?qWz}18vd* z0g|Su(*?VvB}!sTks3+a@rJ&}o~CzulRe1}Nzs;VNp_lU6OdXW4-e1JcYer5KZGI5 z2~JQLPNE+!Z!hkCeg6jKx?q!|$owFNc{UCR56l2iPL2>fQ9(3DagL=TdK`SbdmH{7 zG^aQ&$T*l&vM7br0g46JgahegdOeD+NT?w6|m|>;H0mt(h zmciO}cG5a{93)hg3@^`6%E-ex!i;7-q?#1!48@=?k>@DGKT|*@z2y!jc#A?`PK*ym6Rw)7XB?)KZ zq0PHnIG{??ScS%@J78TWju$3iYg$MZFFNREmDXT8>sOLOoy&b#uCiY}9y-#F4c8v| z;K-5Z<4xbXV&s^%D7}lx9$U0pcx{W9F4q`4yzCKw18_iZVHtGf%uf|;oi4)~KI@{> zR*8Cy)*8Qnwi#i;L<^1CS)T>FSKXu#+hK10{Xc%3a#z_&JeD&INyo*M`^R5 zI)@lScQ|{xPS!)}-mwIZ`xWbgRGp~~gjyzP(gn0{0H+7&Ei?qC58ngPinVOO;CCOw z80{zMbsTgaRf=PiqvS!JI}DM(5S|EmC?rSwRCt<>_k?D-ezJBGH?h*uv2C<@|G%c! zgl7=Z-&<41_B(1CjVjhvHae5gQ)2K2L#~DsuKMO6wALs*o9hGO(linGR3<1{!eN}M zI7c&*{`HkHz0prR**I-YUVqXxzxeoJ+Clt<{LI&H- zI+Zaa-I?Qn_Q444du3PJTdP}pi@Vtc-cYR>k^g!lXqvjZt3s=erp20(jdYX>X%3nu z$+{bcolI`&I?Qxn+XMEGL13a6gz!goKasLRS&wf>x%M?kkc6t1y*m~}X%7H4FO7p> z@}3c_2#Rwd6tUgEqv#44w?oIQvt@0K0?UlTVSuEd`swrXp|7=zC@-PiaTi;0PU6qT zuU22d*|P3kro~kPDw}DNAi?7t^9&YLWde!BpZ+hUC=;>Z$0t1--U8Pe7|1tU(;IYk z*`arr`#Ymx7q~{5w3cz|4q`zInm3PjyY_XsMx)i;;T~}MfC4m%B1~%I9MG3}Qh%B; z24^(>Y>HTxvB%kaqu5vs0bC)-O}?@{>gL$K=6Rg}R|~yq+c3SS+ijNZmDX5Fu?QxA z|M|85Sawi-U2*kC=nXW4JJUVFnk;&2W0Y{TAQG_BsE9e`zgL+li&=M7JiPAN;nG){ zE1s@z`qo9kc<#*EldQB;>hwY5cl|Qq5zgIfB2iloZm%(nEiZG`|k2p@G-E`9!uf zww;C#DL@}coa_Ih{Mf5H^y+5XQFwexz=gWR8eeqWskLohFA19K!8n*|Q^?Gop&7E! z|Hcky_kL=1P35kn-JP(%F&lnzXA^&0-K3EzO}6HNnY+gZ+t~k_`3KeGSy8wd007%x BK&b!# literal 0 HcmV?d00001 diff --git a/data/rfid.js.gz b/data/rfid.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..46476c185acc4673fc11bedc749cedb1c38732be GIT binary patch literal 5860 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 literal 0 HcmV?d00001 diff --git a/data/set_spoolman.png.gz b/data/set_spoolman.png.gz new file mode 100644 index 0000000000000000000000000000000000000000..d546bd86515b33d27251f8163782a630553d8169 GIT binary patch literal 8932 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 ywD!Aun literal 0 HcmV?d00001 diff --git a/data/spool_in.png.gz b/data/spool_in.png.gz new file mode 100644 index 0000000000000000000000000000000000000000..aebffe0c9e34b96a7be322853e259199554c8670 GIT binary patch literal 21835 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 + + + + + FilaMan - Filament Management Tool + + + + + + + + + + + + +
+

Spoolman API URL / Bambu Credentials

+ +
+
+
Set URL/IP to your Spoolman-Instanz
+ +
If you want to enable sending Spool to Spoolman Octoprint Plugin:
+

+ Send to Octo-Plugin +

+ + + +

+
+
+ +
+
+
Bambu Lab Printer Credentials
+
+
+ + +
+
+ + +
+
+ + +
+
+

If activated, FilaMan will automatically update the next filled tray with the last scanned and weighed spool.

+
+ + +
+
+ + +
+ + +

+
+
+
+
+ + diff --git a/data/spoolman.js.gz b/data/spoolman.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..08a2bb82672aadc9d5c813b0f8594c6acde957ad GIT binary patch literal 2821 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 Xceku}hm5x}9zXssW0n9nH7o!CdB}gT literal 0 HcmV?d00001 diff --git a/data/style.css.gz b/data/style.css.gz new file mode 100644 index 0000000000000000000000000000000000000000..27ad44c46e2fb4ba3b141da358585b9dd46c1c4e GIT binary patch literal 4898 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 UTvE|)pS}3>4;k-a^;}p00C8HHA^-pY literal 0 HcmV?d00001 diff --git a/data/upgrade.html.gz b/data/upgrade.html.gz new file mode 100644 index 0000000000000000000000000000000000000000..7eefe82005fe966781024222928eab66774f0d10 GIT binary patch literal 2583 zcmV+y3h4D8iwFpmSkz|%|8;O@a$#g;E@*UZYyj;V?QYw;^?#m%5zs4pjit2PfG)NS zv`ve4Xw#xe)@>IT1ufAw7n#x}DZANjo@H;b7q~CBb4bb2w_~rx_GA8$Sk&R+`Tn9O z$DDw+7!RwuJ0y3N%U@ihr! zs#M?zx}H(#+^f#KGzt!!h^sWFw`XJ?v#(=9W4;h0uGvbRkr4Q0a!eL9JtI#gTa8Od z3?jZ-5G6w}uQ*vGp0PI?gW(re{0^3#f)IqMV<^#yuSY2A8jOKkJ}Eq7qEPqwo?JN2 z6r=&m@DBi6cK>eL?M?8qN|O&nm84aB1aWo<&&cUXo1AFjh0gR+Q>iCD?Sj})pbo$= zI`n{nBPH>Q0_T_cH~$4)&9a^?be3cw+voVN2P{h$l14znwf#~7o%q0h&609eC{1;y zMi~1j7fkkOItN8FYtwaE!8vG@KxE=k;LMQ8b9gE={-RHJ-|*l<;N`O~_c>eA)yN{X z2;uqCK2EzWF8_KoDd#Tprs3v!(kc77aT>YWP|3(vo9G~|3Is3#0jI7vrDY-()6e$p z8L(~_$az9UqDh);m?X)3P9T62o9jrFNsL`t3Sp9Yb&{noKjYX}#Fif#1etk!ISK0WR|4+VaG; z{on$ZWt6lZ_WAV2psxTP7g4 z$HetFs@^`;ka~$&0mtb4!Iqi#vLhM-ZB|3YU^=t!6a7VWM+S!)lwZGXwG7 zxZ_R~ee^uP(HZn*iZhAzl_--2HX$Kv2?4z!S;$}i_3J<33s<@mp_MflL&;!`wBHJC zWm&K@>?RlGe$3Scy%>}*4N=%-%+sLNMf&7lmS-+TGdHmYyu}Rm`KU*n6)e^6eNQYM zE?&aYz5nhYbzAeZt-lNi(sqVGkr zm41v(cz!~@;r}xL=9|s9ODQY{f`T< z957i>TckW^eDqyn%AxV(P*>d31rKq(9WHlA7*wwPHP4@z1ko)q7Uq1B8RJB77D-4) ztFkqA;%O;aOWfD1)D!Zghvq}vF(0UxN>M3?9XAQBap685NZE07&}a;xx5u zumc_9JbO66zQ*5U_ziPu=~}_=-`dN#QjeCKDI8yJC2RdvTNlxN&PheF4zHIw3~J-lBP(*(B|xVsqV4GSLb_l%vW&s;ADZhm3*rMNCA_Iz=N zd+@tPBI`F0ov7_d`Y`dd@tIGS_hA#ZD6S9UvN~q(Lj0fbST_NPKoHxn-&WRJhJ0FP zHA6mdxYLy>YctgTZ0xp^Qk#por;oY-Yd>6Q0M^BH&J~@-7#?xZPiC3c;Q1A(_Cf0N zI3Bq6b_4GVel+(57RyiW(1SOxC}h2v7FYqmKa>d`73D%7)(Sf8&Y6hnGx7Ui^mQro zq2{08zk8!~`iTKWsu2tU&P!4zz!pDTUO{c=`uSbRNpWzeM9f}cV*dl0JcQ1xsAKS{ zr>CdJo7$97aV#i<+kI$fr8uYHK+zd-$YXna@dKMH0LSTrb1iN}vJtkjb%uMFgJ$11 zECzSa)xWc?nbY>E7dwoi(Q9;B#dp#F1=E{E-dOciuaBJn>-fPs?x>p1?L`E}me=`X zJ*pI79yV(t8o1k-V#=Im2vP`D>>9SVBU?#8we~7DzfgK{`xbDQe=GpZ(<`Z-zWFWXzX8hGh_z@b006}T2Q>fy literal 0 HcmV?d00001 diff --git a/data/waage.html.gz b/data/waage.html.gz new file mode 100644 index 0000000000000000000000000000000000000000..1ec7b06facd796127bf43ea5d4005f3fac7e1a97 GIT binary patch literal 1658 zcmV-=28H<_iwFpmSkz|%|94?wXJsyEbZu+^#aL}`+cpsXo?mel2H3$ODQQ<=aBKrh zmZIB|Hki{D`&L>y+gvD8BPqLHk^jCUCE2nqJIPvL0uqbT-SO_ZSE~Oa3}J>Wg)kiU zU;O<3^6t;uE120#43GNm2LzMTL4Y!F4~TMj1a$Q?v<#9N(+2Gz_;B|o{4r?0k}ShP zFz2|)m9_ySN?Mdey5Omu4N{!*1Vg_#0WP`aOoS$30taW&X)VffD{%OR3wFaKgy8Nn z5(BhkQ}nlYN{N14QkGnT%X`o$1_7sS1F*}Sbm19s#JQXXFw;001o4E;9YI9@f*n?4 zmjcZU(bn|-Nt75<6PrZy+?ES>P0%K@ZYO3rkLRcjSF&@wdh4#p&QNwWnp{bPFc?C8 zAN^&N>>js~r;P9<(k~nD+(pV83)NPmoFE!Ns*=Lt68&AEUXD;;VwLW8qLoJHJ9790 zx(zAEEnB&(K@wT~Y%fcn(x#nx2fhcVXuZwuCJ!4=9=0q^n8OaWR@&L>EK`KGf6(n* z`R5*AE~m93z0L`Eg5%1jeq6hxAD6M(AFFg(xhv&!NCY!x5J)y3Gaam5=U;jU4}z4N zT(D&iCIUa70~35ILvArMJxIu2)aNi|c@JJ{%+4D^yda)U!RUm-OQ@-ee7rG1fnP`Q zH9Zb$MI6nxgod8(b?BhpqVaUIvpO^S#`(VDslW+_ga$pPA0lkw{$aR3o9N}HPBAIf zKx=DBaP9%m<8;=B6RWc@7>+E{wjZ;76bnY$5t*wF2goRql*kxaKC15G3zm(G11xN; z3c~g$_j7=($fug6q{4^tW`ndJllfbbRJp=fW(yO#+Q+y=eZbQdsSC3;(C?V7WsPWUnSjtIB z8+K331v!i4fS;;>8^A2L%YIA*dpX~-IRb;%r>9eB00;}@)0w4dg{6;3xD-6O2Vx0) zS#O4SaG3MW%5<0%ntn75hQ{h5am=QjxgWOyaS)vmp$ca`xN>l;5jw1#XL{L#TfveN zR*zAI3z_>IIj?%~J7$WYuJ|WfWp!db!^%eX8V7a*>$XfzX_R+OXvZ<_+5C73Zk>V! zT38qw3S}Y0dJHUQ)s3RioK~l3uY?~#E|$Nf-OdJ~n_1UWb|HO0IEj*m+mARNspKAQ zcYAIvwZH|eNj@!1FOI+avfwgRi%6)%0}#!WvF^z75HHN9tqFNcW~8Lb(T&=);oh;_ z4X-r4bvvuQ-PAfRWQwgL_=dd^C(HEPyPIn_TbDhnvKG_ME;C9t7I@)(Xu6a!xV6JW z1HY9OiBRqg@?0~>QyQhTUt@)HAMI`*wPnJD!M2Ui-ti1+Z0l}^!3n%PJw1I20NE-G zyEv!FJ3e&EDo*)QvD0j!+k|%P{_Z+GGdB`0;VK5*Be0AvTJ6x?8a<&wTrkawc zND|U=FV`cWe?%dC+i3y1o!ys=ca#Z^o%E$b;s1xVChdYA0Lf8%jPPf)|7t>c^jpk0 zMGy0l^Yylrg>auKkDXlCY!59}X)}JyRl05a-m=%6?>fg3O(ve740utAI)9p=YMOgY zM#F-q>crCY%0>P)r}2awMFg(p(^D@z{cc1)c8<750q+>BOS_5G1c7WygQ~! ze&2BDL$hNXYBJkR^VtScB{3+|t}hHUt#CQzlVx`|)?Fd!)m7kR=XI4aM6trVv-QPf ztIQCz?{lX%6TLQ&B}-u1MM_9fboVo1oo=K zgnv*crvZYXhB5LCt{I_9P-_?=9i+?endFNG)VssV?kB7ATNRxU{O8wy0k8#xQ=An5 E00+4%%K!iX literal 0 HcmV?d00001 diff --git a/data/wifi.html.gz b/data/wifi.html.gz new file mode 100644 index 0000000000000000000000000000000000000000..761fca1a718093519a8141530209067d68894f82 GIT binary patch literal 857 zcmV-f1E%~RiwFpmSkz|%|95F-X)b7VZEOIoR!xuFHW0nyFwL!V{s+oGm}tSE`XTaa3Mi7IgwDk|>M?`KtBdPU`+Ehc}CH-q4d)$(u${V|0rQbZdf1yY2VZG3Dd%;u~3rOne zi+?}nl#Q+qEBFqAqqCWpM!ue`d_9Y_!oVF_Yix)$L}r-nxUgP*i0hGGshio6&FU>g z!0i-Mp3N!Av$0n5ovDvgx@viVN}+Rw(0JIP75}C#ZpH)`qL!{#c-+8V(U*HbB^#Yc zPo3L9#qpB8hX(r%{9viOUnq%+WY>VR6_=MXjY(s@q2j`ytN0gQ7PBJ(bFN|GXV^{x z)n}N9YwzaH$X&?&bY>z)l*|S%^M`>KPXAcG-c7uD>Qlx}E!a8}na)?pi#*+3;tA(2 z6y?^V^?8P`A)b-FV_3KyuE4mFjOvgh-%hja9d^6n$`Ra|fw}!Te6GNTzOh)d3!lcx z2{g|*{Ig1$QsF%M!6o7DL#fGL$@BybWp*jo%LGr*+VIUJ>q6{8kPj@)8Gm;zcmJc| znee6U?SHXtu}em!qe7OqqgcLPantlBU%p*8FIs$haF#vJeek<{l)(4aUN(b8&wT

}PM>c}M07ccg$%au3AEZ9G#xL;<3-$+HM6 z^PN4vHgrGu>7|Md9|>7%nx51X<=6GNVb@94bU-z*xFrwMxdpEw)`i@cGdl!FGgyd> jF$JD4UdMb}O7pBgNkyKGw=A<5|2X^usRilgRtNw9Mi{fI literal 0 HcmV?d00001 diff --git a/src/bambu.cpp b/src/bambu.cpp index 9b9a67b..63d4434 100644 --- a/src/bambu.cpp +++ b/src/bambu.cpp @@ -549,20 +549,47 @@ void reconnect() { uint8_t retries = 0; while (!client.connected()) { Serial.println("Attempting MQTT re/connection..."); + Serial.print("State before connect: "); + Serial.println(client.state()); bambu_connected = false; oledShowTopRow(); - // Attempt to connect - if (client.connect(bambu_serialnr, bambu_username, bambu_accesscode)) { - Serial.println("MQTT re/connected"); + // Generate a random client ID suffix + String clientId = String(bambu_serialnr) + "_" + String(random(0xffff), HEX); + Serial.print("Reconnecting with client ID: "); + Serial.println(clientId); - client.subscribe(report_topic.c_str()); + // Attempt to connect with clean session and will message + if (client.connect(clientId.c_str(), bambu_username, bambu_accesscode, nullptr, 0, true, nullptr)) { + Serial.println("MQTT re/connected"); + + // Subscribe with QoS 1 + if (client.subscribe(report_topic.c_str(), 1)) { + Serial.println("Successfully subscribed to topic with QoS 1: " + report_topic); + } else { + Serial.println("Failed to subscribe to topic: " + report_topic); + } bambu_connected = true; oledShowTopRow(); } else { + int state = client.state(); Serial.print("failed, rc="); - Serial.print(client.state()); - Serial.println(" try again in 5 seconds"); + Serial.print(state); + Serial.print(" ("); + // Print detailed error message + switch(state) { + case -4: Serial.print("MQTT_CONNECTION_TIMEOUT"); break; + case -3: Serial.print("MQTT_CONNECTION_LOST"); break; + case -2: Serial.print("MQTT_CONNECT_FAILED"); break; + case -1: Serial.print("MQTT_DISCONNECTED"); break; + case 1: Serial.print("MQTT_CONNECT_BAD_PROTOCOL"); break; + case 2: Serial.print("MQTT_CONNECT_BAD_CLIENT_ID"); break; + case 3: Serial.print("MQTT_CONNECT_UNAVAILABLE"); break; + case 4: Serial.print("MQTT_CONNECT_BAD_CREDENTIALS"); break; + case 5: Serial.print("MQTT_CONNECT_UNAUTHORIZED"); break; + default: Serial.print("UNKNOWN"); break; + } + Serial.println(") try again in 5 seconds"); bambu_connected = false; oledShowTopRow(); @@ -570,11 +597,9 @@ void reconnect() { vTaskDelay(5000 / portTICK_PERIOD_MS); if (retries > 5) { Serial.println("Disable Bambu MQTT Task after 5 retries"); - //vTaskSuspend(BambuMqttTask); vTaskDelete(BambuMqttTask); break; } - retries++; } } @@ -582,17 +607,32 @@ void reconnect() { void mqtt_loop(void * parameter) { Serial.println("Bambu MQTT Task gestartet"); + unsigned long lastCheck = 0; + for(;;) { if (pauseBambuMqttTask) { vTaskDelay(10000); + continue; } + unsigned long now = millis(); + if (!client.connected()) { + Serial.println("Connection lost, attempting reconnect..."); reconnect(); yield(); esp_task_wdt_reset(); vTaskDelay(100); + continue; } + + // Periodically check connection status + if (now - lastCheck > 30000) { // Check every 30 seconds + Serial.print("MQTT Status Check - Connected: "); + Serial.println(client.connected() ? "Yes" : "No"); + lastCheck = now; + } + client.loop(); yield(); esp_task_wdt_reset(); @@ -617,15 +657,30 @@ bool setupMqtt() { sslClient.setInsecure(); client.setServer(bambu_ip, 8883); + // Generate a random client ID suffix + String clientId = String(bambu_serialnr) + "_" + String(random(0xffff), HEX); + + // MQTT Connection Options + // client.setKeepAlive(60); + // client.setSocketTimeout(60); // Increase socket timeout + + Serial.print("Connecting with client ID: "); + Serial.println(clientId); + // Verbinden mit dem MQTT-Server bool connected = true; - if (client.connect(bambu_serialnr, bambu_username, bambu_accesscode)) + if (client.connect(clientId.c_str(), bambu_username, bambu_accesscode, nullptr, 0, true, nullptr)) { client.setCallback(mqtt_callback); - client.setBufferSize(5120); - // Optional: Topic abonnieren - client.subscribe(report_topic.c_str()); - //client.subscribe(request_topic.c_str()); + client.setBufferSize(16384); // Increased to 16KB to handle larger JSON + + // Subscribe with QoS 1 + if (client.subscribe(report_topic.c_str(), 1)) { + Serial.println("Successfully subscribed to topic with QoS 1: " + report_topic); + } else { + Serial.println("Failed to subscribe to topic: " + report_topic); + } + Serial.println("MQTT-Client initialisiert"); oledShowMessage("Bambu Connected"); @@ -635,7 +690,7 @@ bool setupMqtt() { xTaskCreatePinnedToCore( mqtt_loop, /* Function to implement the task */ "BambuMqtt", /* Name of the task */ - 8192, /* Stack size in words */ + 16384, /* Stack size in words */ NULL, /* Task input parameter */ mqttTaskPrio, /* Priority of the task */ &BambuMqttTask, /* Task handle. */ -- 2.39.5 From 9262865b563126d24ead9bc2bb447210fd5d70a5 Mon Sep 17 00:00:00 2001 From: tugsi Date: Sun, 16 Mar 2025 19:30:37 +0100 Subject: [PATCH 6/8] - X1C MQTT Fix - Spoolman Settings Fix - Spoolman Out Fix - Spoolman In Fix --- html/rfid.js | 242 +++++++++++++++++++++++++++++++------------------- src/bambu.cpp | 121 ++++++++++++++++++------- 2 files changed, 237 insertions(+), 126 deletions(-) diff --git a/html/rfid.js b/html/rfid.js index d0d2f07..12b3d82 100644 --- a/html/rfid.js +++ b/html/rfid.js @@ -53,7 +53,13 @@ function initWebSocket() { // Wenn eine existierende Verbindung besteht, diese erst schließen if (socket) { - socket.close(); + try { + socket.onclose = null; // Remove onclose handler before closing + socket.onerror = null; // Remove error handler + socket.close(); + } catch (e) { + console.error('Error closing existing socket:', e); + } socket = null; } @@ -61,110 +67,80 @@ function initWebSocket() { socket = new WebSocket('ws://' + window.location.host + '/ws'); socket.onopen = function() { + console.log('WebSocket connection established'); isConnected = true; updateConnectionStatus(); startHeartbeat(); // Starte Heartbeat nach erfolgreicher Verbindung }; - socket.onclose = function() { + socket.onclose = function(event) { + console.log('WebSocket connection closed:', event.code, event.reason); isConnected = false; updateConnectionStatus(); - if (heartbeatTimer) clearInterval(heartbeatTimer); + if (heartbeatTimer) { + clearInterval(heartbeatTimer); + heartbeatTimer = null; + } // Nur neue Verbindung versuchen, wenn kein Timer läuft if (!reconnectTimer) { reconnectTimer = setTimeout(() => { + console.log('Attempting to reconnect...'); initWebSocket(); }, RECONNECT_INTERVAL); } }; socket.onerror = function(error) { + console.error('WebSocket error occurred:', error); isConnected = false; updateConnectionStatus(); - if (heartbeatTimer) clearInterval(heartbeatTimer); - - // Bei Fehler Verbindung schließen und neu aufbauen - if (socket) { - socket.close(); - socket = null; + if (heartbeatTimer) { + clearInterval(heartbeatTimer); + heartbeatTimer = null; } }; socket.onmessage = function(event) { - lastHeartbeatResponse = Date.now(); // Aktualisiere Zeitstempel bei jeder Server-Antwort - - const data = JSON.parse(event.data); - if (data.type === 'amsData') { - displayAmsData(data.payload); - } else if (data.type === 'nfcTag') { - updateNfcStatusIndicator(data.payload); - } else if (data.type === 'nfcData') { - updateNfcData(data.payload); - } else if (data.type === 'writeNfcTag') { - handleWriteNfcTagResponse(data.success); - } else if (data.type === 'heartbeat') { - // Optional: Spezifische Behandlung von Heartbeat-Antworten - // Update status dots - const bambuDot = document.getElementById('bambuDot'); - const spoolmanDot = document.getElementById('spoolmanDot'); - const ramStatus = document.getElementById('ramStatus'); + try { + lastHeartbeatResponse = Date.now(); + const data = JSON.parse(event.data); - if (bambuDot) { - bambuDot.className = 'status-dot ' + (data.bambu_connected ? 'online' : 'offline'); - // Add click handler only when offline - if (!data.bambu_connected) { - bambuDot.style.cursor = 'pointer'; - bambuDot.onclick = function() { - if (socket && socket.readyState === WebSocket.OPEN) { - socket.send(JSON.stringify({ - type: 'reconnect', - payload: 'bambu' - })); - } - }; - } else { - bambuDot.style.cursor = 'default'; - bambuDot.onclick = null; - } - } - if (spoolmanDot) { - spoolmanDot.className = 'status-dot ' + (data.spoolman_connected ? 'online' : 'offline'); - // Add click handler only when offline - if (!data.spoolman_connected) { - spoolmanDot.style.cursor = 'pointer'; - spoolmanDot.onclick = function() { - if (socket && socket.readyState === WebSocket.OPEN) { - socket.send(JSON.stringify({ - type: 'reconnect', - payload: 'spoolman' - })); - } - }; - } else { - spoolmanDot.style.cursor = 'default'; - spoolmanDot.onclick = null; - } - } - if (ramStatus) { - ramStatus.textContent = `${data.freeHeap}k`; - } - } - else if (data.type === 'setSpoolmanSettings') { - if (data.payload == 'success') { - showNotification(`Spoolman Settings set successfully`, true); - } else { - showNotification(`Error setting Spoolman Settings`, false); + // Handle different message types + switch(data.type) { + case 'amsData': + displayAmsData(data.payload); + break; + case 'nfcTag': + updateNfcStatusIndicator(data.payload); + break; + case 'nfcData': + updateNfcData(data.payload); + break; + case 'writeNfcTag': + handleWriteNfcTagResponse(data.success); + break; + case 'heartbeat': + handleHeartbeatResponse(data); + break; + case 'setSpoolmanSettings': + handleSpoolmanSettingsResponse(data); + break; + default: + console.warn('Unknown message type:', data.type); } + } catch (error) { + console.error('Error processing WebSocket message:', error); } }; } catch (error) { + console.error('Error initializing WebSocket:', error); isConnected = false; updateConnectionStatus(); - // Nur neue Verbindung versuchen, wenn kein Timer läuft if (!reconnectTimer) { reconnectTimer = setTimeout(() => { + console.log('Attempting to reconnect after error...'); initWebSocket(); }, RECONNECT_INTERVAL); } @@ -389,6 +365,7 @@ function updateSpoolButtons(show) { }); } +// Verbesserte Funktion zum Behandeln von Spoolman Settings function handleSpoolmanSettings(tray_info_idx, setting_id, cali_idx, nozzle_temp_min, nozzle_temp_max) { // Hole das ausgewählte Filament const selectedText = document.getElementById("selected-filament").textContent; @@ -419,6 +396,7 @@ function handleSpoolmanSettings(tray_info_idx, setting_id, cali_idx, nozzle_temp } } +// Verbesserte Funktion zum Behandeln von Spool Out function handleSpoolOut() { // Erstelle Payload const payload = { @@ -443,17 +421,21 @@ function handleSpoolOut() { } } -// Neue Funktion zum Behandeln des Spool-In-Klicks +// Verbesserte Funktion zum Behandeln des Spool-In-Klicks function handleSpoolIn(amsId, trayId) { + console.log("handleSpoolIn called with amsId:", amsId, "trayId:", trayId); + // Prüfe WebSocket Verbindung zuerst if (!socket || socket.readyState !== WebSocket.OPEN) { showNotification("No active WebSocket connection!", false); - console.error("WebSocket not connected"); + console.error("WebSocket not connected, state:", socket ? socket.readyState : "no socket"); return; } // Hole das ausgewählte Filament const selectedText = document.getElementById("selected-filament").textContent; + console.log("Selected filament:", selectedText); + if (selectedText === "Please choose...") { showNotification("Choose Filament first", false); return; @@ -466,53 +448,55 @@ function handleSpoolIn(amsId, trayId) { if (!selectedSpool) { showNotification("Selected Spool not found", false); + console.error("Selected spool not found in spoolsData"); return; } + console.log("Found spool data:", selectedSpool); + // Temperaturwerte extrahieren let minTemp = "175"; let maxTemp = "275"; - if (Array.isArray(selectedSpool.filament.nozzle_temperature) && + if (selectedSpool.filament && + Array.isArray(selectedSpool.filament.nozzle_temperature) && selectedSpool.filament.nozzle_temperature.length >= 2) { minTemp = selectedSpool.filament.nozzle_temperature[0]; maxTemp = selectedSpool.filament.nozzle_temperature[1]; } + // Extrahiere bambu_idx + let bambuIdx = "GFL99"; // Default zu Generic PLA + if (selectedSpool.filament?.extra?.bambu_idx) { + bambuIdx = selectedSpool.filament.extra.bambu_idx.replace(/['"]/g, ''); + } else if (selectedSpool.extra?.bambu_idx) { + bambuIdx = selectedSpool.extra.bambu_idx.replace(/['"]/g, ''); + } + // Erstelle Payload const payload = { type: 'setBambuSpool', payload: { amsId: amsId, trayId: trayId, - color: selectedSpool.filament.color_hex || "FFFFFF", + color: selectedSpool.filament && selectedSpool.filament.color_hex ? selectedSpool.filament.color_hex : "FFFFFF", nozzle_temp_min: parseInt(minTemp), nozzle_temp_max: parseInt(maxTemp), - type: selectedSpool.filament.material, - brand: selectedSpool.filament.vendor.name, - tray_info_idx: selectedSpool.filament.extra.bambu_idx.replace(/['"]+/g, '').trim(), + type: selectedSpool.filament && selectedSpool.filament.material ? selectedSpool.filament.material : "PLA", + brand: selectedSpool.filament && selectedSpool.filament.vendor ? selectedSpool.filament.vendor.name : "", + tray_info_idx: bambuIdx, cali_idx: "-1" // Default-Wert setzen } }; - // Prüfe, ob der Key cali_idx vorhanden ist und setze ihn - if (selectedSpool.filament.extra.bambu_cali_id) { - payload.payload.cali_idx = selectedSpool.filament.extra.bambu_cali_id.replace(/['"]+/g, '').trim(); - } - - // Prüfe, ob der Key bambu_setting_id vorhanden ist - if (selectedSpool.filament.extra.bambu_setting_id) { - payload.payload.bambu_setting_id = selectedSpool.filament.extra.bambu_setting_id.replace(/['"]+/g, '').trim(); - } - - console.log("Spool-In Payload:", payload); + console.log("Sending payload:", payload); try { socket.send(JSON.stringify(payload)); - showNotification(`Spool set in AMS ${amsId} Tray ${trayId}. Pls wait`, true); + showNotification(`Spool settings sent to printer. Please wait...`, true); } catch (error) { - console.error("Fehler beim Senden der WebSocket Nachricht:", error); - showNotification("Error while sending", false); + console.error("Error sending WebSocket message:", error); + showNotification("Error sending spool settings!", false); } } @@ -687,3 +671,75 @@ function showNotification(message, isSuccess) { }, 300); }, 3000); } + +// Neue Handler-Funktionen für bessere Modularität +function handleHeartbeatResponse(data) { + const bambuDot = document.getElementById('bambuDot'); + const spoolmanDot = document.getElementById('spoolmanDot'); + const ramStatus = document.getElementById('ramStatus'); + + if (bambuDot) { + bambuDot.className = 'status-dot ' + (data.bambu_connected ? 'online' : 'offline'); + if (!data.bambu_connected) { + bambuDot.style.cursor = 'pointer'; + bambuDot.onclick = function() { + sendReconnectRequest('bambu'); + }; + } else { + bambuDot.style.cursor = 'default'; + bambuDot.onclick = null; + } + } + + if (spoolmanDot) { + spoolmanDot.className = 'status-dot ' + (data.spoolman_connected ? 'online' : 'offline'); + if (!data.spoolman_connected) { + spoolmanDot.style.cursor = 'pointer'; + spoolmanDot.onclick = function() { + sendReconnectRequest('spoolman'); + }; + } else { + spoolmanDot.style.cursor = 'default'; + spoolmanDot.onclick = null; + } + } + + if (ramStatus) { + ramStatus.textContent = `${data.freeHeap}k`; + } +} + +function handleSpoolmanSettingsResponse(data) { + if (data.payload === 'success') { + showNotification(`Spoolman Settings set successfully`, true); + } else { + showNotification(`Error setting Spoolman Settings`, false); + } +} + +function sendReconnectRequest(target) { + if (socket?.readyState === WebSocket.OPEN) { + socket.send(JSON.stringify({ + type: 'reconnect', + payload: target + })); + } +} + +// Verbesserte Funktion zum Senden von WebSocket-Nachrichten +function sendWebSocketMessage(message) { + if (!socket || socket.readyState !== WebSocket.OPEN) { + console.error('WebSocket is not connected'); + showNotification("Connection error - please try again", false); + return; + } + + try { + const jsonString = JSON.stringify(message); + console.log('Sending WebSocket message:', jsonString); + socket.send(jsonString); + } catch (error) { + console.error('Error sending WebSocket message:', error); + showNotification("Error sending message", false); + } +} diff --git a/src/bambu.cpp b/src/bambu.cpp index 63d4434..0d65a94 100644 --- a/src/bambu.cpp +++ b/src/bambu.cpp @@ -18,7 +18,7 @@ PubSubClient client(sslClient); TaskHandle_t BambuMqttTask; String report_topic = ""; -//String request_topic = ""; +String request_topic = ""; const char* bambu_username = "bblp"; const char* bambu_ip = nullptr; const char* bambu_accesscode = nullptr; @@ -92,7 +92,7 @@ bool loadBambuCredentials() { bambu_serialnr = g_bambu_serialnr.c_str(); report_topic = "device/" + String(bambu_serialnr) + "/report"; - //request_topic = "device/" + String(bambu_serialnr) + "/request"; + request_topic = "device/" + String(bambu_serialnr) + "/request"; return true; } Serial.println("Keine gültigen Bambu-Credentials gefunden."); @@ -197,18 +197,69 @@ FilamentResult findFilamentIdx(String brand, String type) { } bool sendMqttMessage(const String& payload) { - Serial.println("Sending MQTT message"); - Serial.println(payload); - if (client.publish(report_topic.c_str(), payload.c_str())) - { - return true; + // Check MQTT client state first + if (!client.connected()) { + Serial.println("Error: MQTT client not connected when trying to send message"); + Serial.print("MQTT client state: "); + Serial.println(client.state()); + return false; } + + // Check if request_topic is empty + if (request_topic.isEmpty()) { + Serial.println("Error: request_topic is empty!"); + return false; + } + + // Check payload + if (payload.isEmpty()) { + Serial.println("Error: Empty payload!"); + return false; + } + + Serial.println("Attempting to send MQTT message:"); + Serial.println("Topic: " + request_topic); + Serial.println("Payload: " + payload); + Serial.println("Payload length: " + String(payload.length())); - return false; + // Try to publish with QoS 1 and retain flag false + bool published = client.publish(request_topic.c_str(), payload.c_str(), false); + + if (published) { + Serial.println("MQTT message published successfully"); + return true; + } else { + Serial.println("Failed to publish MQTT message"); + Serial.print("MQTT client state after publish attempt: "); + Serial.println(client.state()); + + // Additional error information + switch(client.state()) { + case -4: + Serial.println("Reason: Connection timeout"); + break; + case -3: + Serial.println("Reason: Connection lost"); + break; + case -2: + Serial.println("Reason: Connect failed"); + break; + case -1: + Serial.println("Reason: Disconnected"); + break; + case 0: + Serial.println("Reason: Connected but publish failed"); + break; + default: + Serial.println("Reason: Unknown error"); + break; + } + return false; + } } bool setBambuSpool(String payload) { - Serial.println("Spool settings in"); + Serial.println("Spool settings received from WebSocket"); Serial.println(payload); // Parse the JSON @@ -220,21 +271,28 @@ bool setBambuSpool(String payload) { return false; } - int amsId = doc["amsId"]; - int trayId = doc["trayId"]; + // Check if we have all required fields + if (!doc["amsId"].is() || !doc["trayId"].is()) { + Serial.println("Error: Missing or invalid required fields in payload"); + return false; + } + + int amsId = doc["amsId"].as(); + int trayId = doc["trayId"].as(); String color = doc["color"].as(); color.toUpperCase(); - int minTemp = doc["nozzle_temp_min"]; - int maxTemp = doc["nozzle_temp_max"]; - String type = doc["type"].as(); + int minTemp = doc["nozzle_temp_min"] | 0; // Default to 0 if not present + int maxTemp = doc["nozzle_temp_max"] | 0; // Default to 0 if not present + String type = doc["type"] | ""; // Default to empty string if not present (type == "PLA+") ? type = "PLA" : type; - String brand = doc["brand"].as(); + String brand = doc["brand"] | ""; // Default to empty string if not present String tray_info_idx = (doc["tray_info_idx"].as() != "-1") ? doc["tray_info_idx"].as() : ""; if (tray_info_idx == "") { if (brand != "" && type != "") { FilamentResult result = findFilamentIdx(brand, type); tray_info_idx = result.key; type = result.type; // Aktualisiere den type mit dem gefundenen Basistyp + Serial.println("Found filament idx: " + tray_info_idx + " for type: " + type); } } String setting_id = doc["bambu_setting_id"].as(); @@ -242,6 +300,7 @@ bool setBambuSpool(String payload) { doc.clear(); + // Create MQTT message doc["print"]["sequence_id"] = "0"; doc["print"]["command"] = "ams_filament_setting"; doc["print"]["ams_id"] = amsId < 200 ? amsId : 255; @@ -250,26 +309,25 @@ bool setBambuSpool(String payload) { doc["print"]["nozzle_temp_min"] = minTemp; doc["print"]["nozzle_temp_max"] = maxTemp; doc["print"]["tray_type"] = type; - //doc["print"]["cali_idx"] = (cali_idx != "") ? cali_idx : ""; doc["print"]["tray_info_idx"] = tray_info_idx; doc["print"]["setting_id"] = setting_id; - // Serialize the JSON + // Serialize and send MQTT message String output; serializeJson(doc, output); + Serial.println("Sending to Bambu printer:"); + Serial.println(output); - if (sendMqttMessage(output)) { - Serial.println("Spool successfully set"); - } - else - { - Serial.println("Failed to set spool"); + if (!sendMqttMessage(output)) { + Serial.println("Failed to send filament settings to printer"); return false; } + Serial.println("Filament settings sent successfully"); doc.clear(); yield(); + // Send calibration if available if (cali_idx != "") { yield(); doc["print"]["sequence_id"] = "0"; @@ -278,21 +336,18 @@ bool setBambuSpool(String payload) { doc["print"]["nozzle_diameter"] = "0.4"; doc["print"]["cali_idx"] = cali_idx.toInt(); doc["print"]["tray_id"] = trayId < 200 ? trayId : 254; - //doc["print"]["ams_id"] = amsId < 200 ? amsId : 255; - // Serialize the JSON String output; serializeJson(doc, output); + Serial.println("Sending calibration to printer:"); + Serial.println(output); - if (sendMqttMessage(output)) { - Serial.println("Extrusion calibration successfully set"); - } - else - { - Serial.println("Failed to set extrusion calibration"); + if (!sendMqttMessage(output)) { + Serial.println("Failed to send calibration settings to printer"); return false; } + Serial.println("Calibration settings sent successfully"); doc.clear(); yield(); } @@ -661,8 +716,8 @@ bool setupMqtt() { String clientId = String(bambu_serialnr) + "_" + String(random(0xffff), HEX); // MQTT Connection Options - // client.setKeepAlive(60); - // client.setSocketTimeout(60); // Increase socket timeout + client.setKeepAlive(60); + client.setSocketTimeout(60); // Increase socket timeout Serial.print("Connecting with client ID: "); Serial.println(clientId); -- 2.39.5 From 70c8b7bdc0bb606fecebeda5615035c82bf9ab75 Mon Sep 17 00:00:00 2001 From: Thomas Taugs Date: Sun, 16 Mar 2025 19:40:05 +0100 Subject: [PATCH 7/8] Delete data directory Old and not used... Testing from SPIFFS --- data/bambu_filaments.json | 70 ---------------- data/favicon.ico | Bin 16958 -> 0 bytes data/header.html.gz | Bin 689 -> 0 bytes data/index.html.gz | Bin 1167 -> 0 bytes data/logo.png.gz | Bin 8198 -> 0 bytes data/own_filaments.json | 31 ------- data/rfid.html.gz | Bin 1707 -> 0 bytes data/rfid.js.gz | Bin 5860 -> 0 bytes data/set_spoolman.png.gz | Bin 8932 -> 0 bytes data/spool_in.png.gz | Bin 21835 -> 0 bytes data/spoolman.html | 171 -------------------------------------- data/spoolman.js.gz | Bin 2821 -> 0 bytes data/style.css.gz | Bin 4898 -> 0 bytes data/upgrade.html.gz | Bin 2583 -> 0 bytes data/waage.html.gz | Bin 1658 -> 0 bytes data/wifi.html.gz | Bin 857 -> 0 bytes 16 files changed, 272 deletions(-) delete mode 100644 data/bambu_filaments.json delete mode 100644 data/favicon.ico delete mode 100644 data/header.html.gz delete mode 100644 data/index.html.gz delete mode 100644 data/logo.png.gz delete mode 100644 data/own_filaments.json delete mode 100644 data/rfid.html.gz delete mode 100644 data/rfid.js.gz delete mode 100644 data/set_spoolman.png.gz delete mode 100644 data/spool_in.png.gz delete mode 100644 data/spoolman.html delete mode 100644 data/spoolman.js.gz delete mode 100644 data/style.css.gz delete mode 100644 data/upgrade.html.gz delete mode 100644 data/waage.html.gz delete mode 100644 data/wifi.html.gz diff --git a/data/bambu_filaments.json b/data/bambu_filaments.json deleted file mode 100644 index afe2bc7..0000000 --- a/data/bambu_filaments.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "GFU99": "TPU", - "GFN99": "PA", - "GFN98": "PA-CF", - "GFL99": "PLA", - "GFL96": "PLA Silk", - "GFL98": "PLA-CF", - "GFL95": "PLA High Speed", - "GFG99": "PETG", - "GFG98": "PETG-CF", - "GFG97": "PCTG", - "GFB99": "ABS", - "GFC99": "PC", - "GFB98": "ASA", - "GFS99": "PVA", - "GFS98": "HIPS", - "GFT98": "PPS-CF", - "GFT97": "PPS", - "GFN97": "PPA-CF", - "GFN96": "PPA-GF", - "GFP99": "PE", - "GFP98": "PE-CF", - "GFP97": "PP", - "GFP96": "PP-CF", - "GFP95": "PP-GF", - "GFR99": "EVA", - "GFR98": "PHA", - "GFS97": "BVOH", - "GFA01": "Bambu PLA Matte", - "GFA00": "Bambu PLA Basic", - "GFA09": "Bambu PLA Tough", - "GFA07": "Bambu PLA Marble", - "GFA08": "Bambu PLA Sparkle", - "GFA02": "Bambu PLA Metal", - "GFA05": "Bambu PLA Silk", - "GFS00": "Bambu Support W", - "GFL03": "eSUN PLA+", - "GFL01": "PolyTerra PLA", - "GFL00": "PolyLite PLA", - "GFA50": "Bambu PLA-CF", - "GFS02": "Bambu Support For PLA", - "GFA11": "Bambu PLA Aero", - "GFL04": "Overture PLA", - "GFL05": "Overture Matte PLA", - "GFA12": "Bambu PLA Glow", - "GFA13": "Bambu PLA Dynamic", - "GFA15": "Bambu PLA Galaxy", - "GFS05": "Bambu Support For PLA/PETG", - "GFU01": "Bambu TPU 95A", - "GFU00": "Bambu TPU 95A HF", - "GFG00": "Bambu PETG Basic", - "GFT01": "Bambu PET-CF", - "GFG50": "Bambu PETG-CF", - "GFG60": "PolyLite PETG", - "GFG01": "Bambu PETG Translucent", - "GFB00": "Bambu ABS", - "GFB60": "PolyLite ABS", - "GFB50": "Bambu ABS-GF", - "GFC00": "Bambu PC", - "GFB01": "Bambu ASA", - "GFB61": "PolyLite ASA", - "GFB02": "Bambu ASA-Aero", - "GFS04": "Bambu PVA", - "GFS01": "Bambu Support G", - "GFN03": "Bambu PA-CF", - "GFN04": "Bambu PAHT-CF", - "GFS03": "Bambu Support For PA/PET", - "GFN05": "Bambu PA6-CF", - "GFN08": "Bambu PA6-GF" -} \ No newline at end of file diff --git a/data/favicon.ico b/data/favicon.ico deleted file mode 100644 index 14b75860356963e6670a033b5cf907de68e862b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16958 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 diff --git a/data/index.html.gz b/data/index.html.gz deleted file mode 100644 index c1814488e044aa06cb860629d8e6554c281d454f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1167 zcmV;A1aSKwiwFpmSkz|%|7mVyWq2-VbZu+^tyf!b+cp$_&#ySuiybVImSjVRL^9Ck zG8EX_0Zvi$X*iZ>i3>$)BxTnd`rmg*Nsi>(HlTWlMe-xhcfNC>lDrB-C>iDuhO^|= z{fE1!&%ZrDX)7^1OWY3#ltmga8Mp~T&dz|Iq+%8!D^VL})8OONWB5}rT#{I^G+1%A zu9da{WJ+2l3A*OFEz_K>c*a6MxBxD>s{yrh`+? z514Y#01{dD#oo0sC8Lwo1ik}Dv^TSFyD=xI_;R&N;_YjXNuJJ6Vu6qpZEH5 zS@cA1CKuoV=bcYU+=nEI+gwc+D&KVB%J~X1fyShP#MJ_I@De(|=mVSvIXAVy%?&IC z`*I5?cp*b>S!He@BY&B`g#zmvxYDe;9US5h;#C1gXOvz-6)N)ihJq5m&*EQbI_QZw z%_h;#>aX?7^q!vJ^CTv2D@c^WL7llL_0 zBmVYO?7pGlUhtvq`Tw!4u?pKm+XHDlZ-=wv8P~m@CBwVxY_G(-3ujp4gMt~=L{gt9 zg?fbhtQrlbqI?DFPmQHQgC(`5#8|Clap)Wprd^|J4zBN^)?8ZZVv#?4!0xKeLwMnM zHL^XDvF|3_0D>i^kTXM#isdu{!>d~G{+0V>Er8FbS9TI(< z(C(91uh)@xlCCtY>wU{dfS!oc>6BX(pN5G~uV2TH?at%JpW5YY?Iz10(U*)WhCU-s zG?xx?@DjOh#f5im^eLE5EK0uX1L%78fQD1Bx4E*DA{hg|6@?gOQx0|E%KPmleTAnXkscbdNR3Z6a%;zI!man$H8KAuP hmtfm==+od|z1VNHN!)%#5jFph!9S68^8z*u005R^ME(E( diff --git a/data/logo.png.gz b/data/logo.png.gz deleted file mode 100644 index 9681c15346c83ec203a508a5432f9558346a67d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8198 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 diff --git a/data/own_filaments.json b/data/own_filaments.json deleted file mode 100644 index cd3e43c..0000000 --- a/data/own_filaments.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "TPU": "GFU99", - "PA": "GFN99", - "PA-CF": "GFN98", - "PLA": "GFL99", - "PLA Silk": "GFL96", - "PLA-CF": "GFL98", - "PLA High Speed": "GFL95", - "PETG": "GFG99", - "PETG-CF": "GFG98", - "PCTG": "GFG97", - "ABS": "GFB99", - "ABS+HS": "GFB99", - "PC": "GFC99", - "PC/ABS": "GFC99", - "ASA": "GFB98", - "PVA": "GFS99", - "HIPS": "GFS98", - "PPS-CF": "GFT98", - "PPS": "GFT97", - "PPA-CF": "GFN97", - "PPA-GF": "GFN96", - "PE": "GFP99", - "PE-CF": "GFP98", - "PP": "GFP97", - "PP-CF": "GFP96", - "PP-GF": "GFP95", - "EVA": "GFR99", - "PHA": "GFR98", - "BVOH": "GFS97" -} \ No newline at end of file diff --git a/data/rfid.html.gz b/data/rfid.html.gz deleted file mode 100644 index 4c86b2b9c7b48a4bf94f9059734caab4ad47bd23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1707 zcmV;c22}YUiwFpmSkz|%|8iz&WG-lQZEOI=S>0~iHWa?kQ*gR*f>n0Y?qWz}18vd* z0g|Su(*?VvB}!sTks3+a@rJ&}o~CzulRe1}Nzs;VNp_lU6OdXW4-e1JcYer5KZGI5 z2~JQLPNE+!Z!hkCeg6jKx?q!|$owFNc{UCR56l2iPL2>fQ9(3DagL=TdK`SbdmH{7 zG^aQ&$T*l&vM7br0g46JgahegdOeD+NT?w6|m|>;H0mt(h zmciO}cG5a{93)hg3@^`6%E-ex!i;7-q?#1!48@=?k>@DGKT|*@z2y!jc#A?`PK*ym6Rw)7XB?)KZ zq0PHnIG{??ScS%@J78TWju$3iYg$MZFFNREmDXT8>sOLOoy&b#uCiY}9y-#F4c8v| z;K-5Z<4xbXV&s^%D7}lx9$U0pcx{W9F4q`4yzCKw18_iZVHtGf%uf|;oi4)~KI@{> zR*8Cy)*8Qnwi#i;L<^1CS)T>FSKXu#+hK10{Xc%3a#z_&JeD&INyo*M`^R5 zI)@lScQ|{xPS!)}-mwIZ`xWbgRGp~~gjyzP(gn0{0H+7&Ei?qC58ngPinVOO;CCOw z80{zMbsTgaRf=PiqvS!JI}DM(5S|EmC?rSwRCt<>_k?D-ezJBGH?h*uv2C<@|G%c! zgl7=Z-&<41_B(1CjVjhvHae5gQ)2K2L#~DsuKMO6wALs*o9hGO(linGR3<1{!eN}M zI7c&*{`HkHz0prR**I-YUVqXxzxeoJ+Clt<{LI&H- zI+Zaa-I?Qn_Q444du3PJTdP}pi@Vtc-cYR>k^g!lXqvjZt3s=erp20(jdYX>X%3nu z$+{bcolI`&I?Qxn+XMEGL13a6gz!goKasLRS&wf>x%M?kkc6t1y*m~}X%7H4FO7p> z@}3c_2#Rwd6tUgEqv#44w?oIQvt@0K0?UlTVSuEd`swrXp|7=zC@-PiaTi;0PU6qT zuU22d*|P3kro~kPDw}DNAi?7t^9&YLWde!BpZ+hUC=;>Z$0t1--U8Pe7|1tU(;IYk z*`arr`#Ymx7q~{5w3cz|4q`zInm3PjyY_XsMx)i;;T~}MfC4m%B1~%I9MG3}Qh%B; z24^(>Y>HTxvB%kaqu5vs0bC)-O}?@{>gL$K=6Rg}R|~yq+c3SS+ijNZmDX5Fu?QxA z|M|85Sawi-U2*kC=nXW4JJUVFnk;&2W0Y{TAQG_BsE9e`zgL+li&=M7JiPAN;nG){ zE1s@z`qo9kc<#*EldQB;>hwY5cl|Qq5zgIfB2iloZm%(nEiZG`|k2p@G-E`9!uf zww;C#DL@}coa_Ih{Mf5H^y+5XQFwexz=gWR8eeqWskLohFA19K!8n*|Q^?Gop&7E! z|Hcky_kL=1P35kn-JP(%F&lnzXA^&0-K3EzO}6HNnY+gZ+t~k_`3KeGSy8wd007%x BK&b!# diff --git a/data/rfid.js.gz b/data/rfid.js.gz deleted file mode 100644 index 46476c185acc4673fc11bedc749cedb1c38732be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5860 zcmV?GZG&ib5AL=w2T zxVYcAz-(=?AH?u18eNK%ea~Z`4+9al0(eU3$OcGlqe@xiO}r^g3IgPm<^fv~57$LUb;^xU6` z7`}yzAdsH|o}|yS&#y!>2Y>=v9Pw22!)WPts)L-Le0TifujkO}K`}-wMiPH>jMkPu z{b!5tGWDYn=09G9BmBvd6h_Zca69Z>i@~2iX0C~Mhm8VwaT2B?e#?XM*InvH|5KT7 zBGSAYjIg(_2Eji-@MZk|*Rf#HklieRBH=`^OW}ut9favJic@yUXL)->te_6-)sS$% zO0bSLDnYU>x!zzg_h2B^2xxVd@^q279kUf8Bsr-(0RG7@{ZSAlqTI9ip0AhwX=Oac zB3;B`(PGsyNODgB`sJ5w$XIai8c`PP-riop1^pKqECu60KSbD zX}MW}dyOvAxR$h17&4M_iI0eh2fi2a&=0)@pf?mrDyC_ddA)oCWEalhuvpOz%W|&g9x|_h~A$@fZBcLY%LQ<8?TH| z6h?CqBCDy@a+^6ajTd)f$g)b`B@x4ynvAiKgJ6hw90ikD_@gPTR6+cL^O~kZ6yAJ3 zA0%OSFh&)`73-ZYVp!UR!EA4Vy%s=(u*;UnnP`BR1TQ0J z$BdUsqNQN{mB@qk2$q3)QJPd*Nmd*3*>G_bp*VTbXfZ=Jn~3x{5cu=y^@-;?SsTY9 zj1mgaB?@LdTmwjJRu3!YGs!(okn%=0IF%Q;8rdW|HJU&B4tj?t$tj?2 zJ{tygb28?Yq}PGyj}~!4R>zq~KB|6acYRm%HxS(hf5V2WQq+I?lO-_PTN@bJ{+c3^ zwVlb`lu=9W9yr~Nx+&EHJ&7jH+D=9+WNlFUb!G3U6w4hJ+7n~G2-4dvbk(-jW4^Kq zoF?pbORF{6KA{&ckgJD3(6r3^8_xhqsQNJzZYg+T_P{$P3C2|~A z85qW)Ag;4H9ThLur_>r_#P#uE>!U^J8${=KiOd_L@^ulp%HSEfx;mPuv6WLxFO}P= zJEMPJi1_+U1ke{k8>c_Y;q(&2DJ61fi({n9bm-Fhed{Nvpl8ur;W|^_^F*lIGFTm0 zl$-beJrOZ3%hV5V7UTE7PHcj1PuE>@f!C47-UCM5UE83IL&R*(bMs^x`|E zT)zcnCcJjHYR|3Qo+WS1u^23W%nqkwbUBQ!s7+nS)J9L|2S1$xCC+9iUb|yKZ#2a{ zARAJpSdY>NAQLJdJ5k!4f^m&p>hnCBF9Hy_@4;z^;-fg4!`sj;AY}x_lzL~^LR2}? zT$$3xCPGUm0YOVTJKdU8Pcw!p?IKd{2N`bb1_k`c1k?`MV4bMrfPMZ>AGoj5RV&SO ztixpN2OK|1E!8mpJdbh`j-zbpfc!rSe3QI4QKkEKx3OWdAG7-!7|C|OX zTP|Wx=;~7qeGU#qLnzP`_my(+4B?D|80 zg*_KnxRLtmFHbc(ppBy>-bt9|0Q$*d2qU}O-3OiS&c7+T%MO#K4i79HhD{wF868@A z{ub=;G(?nxz@LCcPnr9lC;!2oMe$4o9S!=m|961zy73ne{`}|8eRuN3^$mpwsvSITnGM&_98JGyyWo>i%@efh5!B^5NIZHyNOhLF?Ori!elNExWC7C9(>io z0PnMH`lAT%vuE_@>{_gO&cmh=|Cn4TL56amCTOZj+gK*bH%jhp>YJq{WlIE6Y`7Vd zv9r9UuN4+0m%e=(6#|?=Z0}ZjRZKO`s;69LFcI`fu4r4=_{Ahk*0e3HY1`PYEHIHStB7jgLWN73u10PzJnKT4CmAPr@j{%%CHE8|wu_3admwn$`v0qsB zlr4Whgnw4dt-J@fL&QE0R-Fr40)0&gxNX4*Eq!V1WXcF_QmW!oZA@d+=`H2{)i!}C zF6t$63-?3v&ueqA`96ajtlYKlgV!5BKmQJEavW!uwe)8FaTFi((bPpes)Z>}MUwin znV`i!2yf6D;fg5LjZWdgcV{Kf1VPI=syq_B=)-?+e2!!)1w$T4>xO#e z0$>3L6wOx`mgq@XVHng+_q?`h3_dK1UI=rZm>xul%NPq0LNy+u(yEap)r@gk!l9HU9 zgsveWU2PVfHmgr*VG?YwJ&$BOI$(U5M8P5zyDW|71J--EJ-^yzff%Rou=5xn)+P3a zd~`X9BVd~W3!@M~4I^+qvQYkG{gmO@YUzsd}=2f3hW)VgI6G3;xsa41|VH zKQi0AfVlg^*n>DCmNffa@y9TL2>nwt2Ee%#SH>I4Qb7NUC&`?L8DqAZC9Fri2JEv6q*aY@DNcV-FUlGF zH#Etm(5Kzzo>cwzwv-J59o7RiHUSMYgODr`_Wip|QS8jG80aBjxz8RxeAv{s7jw^F zBp|GSthL>Y#}hy7Nr&n&N%WH~B=P=*nOMB6Gyx83&jc3(1k_9iwNQ zjHY~?+W7<;y^Nzd<-#absbKexT?(L~C29%yPz3PhY%yd{2nZU_t5%qL`}y+u_cki8W5k!zFCdhgq!&*J|1~M{PBo?7>@I<7x~?aa?uE7=dT= zeOFigL1lI5`|3q?{cPSm_F=E@Ds=;iBMTwO2e8z9(c@ z!nW(u9O%2LoQi96_t-x4&5Ur#-@|X6D*Js+BsitEgk)}x%C6-9{MRAtu^ML*J`$NK z@Ga`I*3YTkuwMmVy>9@W8<#0USZ9A*|dJnAP7snz1efGB2 z<&@4+;ry&VsoMt4bvIFLr7ex>cfK94}jW3JZNFv`5aPq7>L zFSb`D5z9;LG%irpnznMi!bQ$&Gfjsl!vofHV9vTg5!Sp__5yR(7?_V{%YthLItQ8V zh2o|`!B^&Jin#_AZnHGwSA#MSmW#}G>klm{=QwfwCE~NNaWv1Cn zNtKN`^C_0E%gwyCJc+6sUV* zi2!j(l=VFcd*5LCI3Y(+P_n$A^;iH?z=+PGUE9QH{%#agrnI=u?SHwN|7wpMOY%y0AlJFm+m{w=Mg z)Pz=hDgU*a%$nKJ*Edsfg<5e#vzk{oD%y9}nAxJeq;Lj$z--zoRq*k5e15@FFeuBpQX=pESvrkCD(@%j+O*myc>E)Hn2nK4<7EeC&c@HaHPusw6-bU=wVj`YBU4NUf4gH=O@4#L z`KQkg**TxEi5TM!O(Fa_64tY}BR?Jmc^;>9Zm$?}r!-_Xns%KHj2wvMmIG&J@tm5P zS9Hd-_5Swu0}ul^jSHFIC82ryN5ED^IjpP-6q3s7ngaCd3=c40NNX8w`Sci7Rjc#P zGRx*viuLh2Cc31FoXws}D>48#hS&|O6?p){lxr{zne5IfbzrB8n-w8XE9^xs(4puY zpuf+`mn+H_nq8oQ4SV2s&xB8$tM#3MDnJ10XXbi}ofDQ`WjE6Ns&Bs<~upO}W&jrBa)gNo`spwMltYr8LTDVXKp( z1{a0x$WLmX9GUex#9{aMsOlhFRjqM#ag!Ow0JOT14%W%)GFn=x&@#WWQFb#zl`iA@ z1!N=+>HuqE+AQi^J<&Tue;bVW+Kg3}r6MDi$JiQZO=@va18}E$H0DRjma^xWz{b4{ zabrqmMO1B4Q3m1Ck!g4OZ+Wml7r;QG60-YV^F?<@JS@(;)}TkRvCIkbMM6o!63)`Y z%)sQwi_5o1uD=N(KN^3zh;P`?Pbe*GLrXu9YYu|+$xtaRQRQZZo&2!7ewBj3@s6SH zYpe-2RxDlh3Nb@pxXRkK2Cdtg4Be~Ou6O&CXF~6grRKot;JvCgvNPi<*-8oOzSC^~ zZg&#@51N-&WICv3-Y=sNRzOviWpOSjN#OTz9qBCD>B}gN#bx?|S!yFt|Gj0Z&nSoE z-X>w)v1P1p4QJZ7 zvm9h3?&`G4K1r$-pYD)DCbK%QlO0WY=>meAg=%W#d5ep{zTW))uMa%4zQI{#{De8S zn%1RL>p!U0yPG5`-&xZA#(ke=7CqnnP`uTuTp(77oRo4p)i+Y9dV(%`#oVSc0Ah5h z?b7Dj$yO9$yJ|GMWz;ZWAG9jXN6$-(Qono(F$hB1*_{C3Hn)un0qU1i>rJy}It=+{ z%>95aCTOkkjhZKq7&rm?#5Nw?~2{A2^1nUkzu;Y1H|S^pQh7EHacWB>r!&T9Dp diff --git a/data/set_spoolman.png.gz b/data/set_spoolman.png.gz deleted file mode 100644 index d546bd86515b33d27251f8163782a630553d8169..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8932 zcmV(PG7=#i6)MkW$==wAf3}Ip00^zI)$&`DP~B^RM;K-fPYJ z_n!IkQcFV#51Ser007{rD9h_0zJm~ZBqloInCqj4IDy*asAmK-QdbkVfx7Zq*+Q)$ zyne3kfZrcUX+L)>8)pa%XbrJCH=$^1g;R670}Ps#m!6HPm1vmUU9_l-={&0z&}i2&Qgp<>RLcKs3!y{ z#4E(h$M_fU&XBR)K|7fhP{@=}A zUH`?y3#Q-$`|loJdj9SZkPgHP>g{O*QSgDd!I=J__#GE>-AZwlIgk+5QI9Aa3@5Ab&Ca zf&A{Bi}&yJ>bp52#smHvGWr`sI0*`Z{^?4_{~7y7Hva6PI@A`?L4p4TsmRG`c|z?R zT@aX;j*=`;ML|xOUrbn-2h95?4I&%j2wz7#e|aky!V1g>7UJOp^MHl)_`%{}QE@&I zEL{Ew1e71%rC}|8eTin_U;;@n`GLridMQzsC&(1Hrt)ynO%a z;_Co$`){2E{na(lKle=%^l!cY)8L;f^|t_k{!##hlz{%BC5Xm9)Cl5+kRVTl)}+>3 zM*#pxp^k{W{98T%0QO|>7rznL@H#CnFLT7QyR=!6DW zf$uhiIh`fc=&C4f_SpB(tMjr4+V9nZJ2P`Q&zlBKm}vpdtuIB{1(=lTi@(hE@OP(k+8-vQ0S@=cJ&j!1K)h_9}cN3O_9FNmX`LBL_F@k-NVDBz9# zqMgaz=>#PX4T-lVR2>;Gyf$%C!9!Llr6G)w17a~Vc?^fJ*|BDRuJp0Cb49N{IdDUz z+01-qLvnXsGp(3qOG0bM5l2&&tEHur<-+vK z5fnlXGGsD-$6)Yywv@JsyB?z?l(Y z=bkoGTeSO@oO6l4!eRcLdrGTUu>vk7LGOD_h>xtSNQf18jKxJNaYwrQR??wekmDhR zlbXN1{kC-kbQCy!Sw9%RbbrJ`52V~sH-6p6H+ukA_fnN z5k>7vL_4iW&x(LD)9!k@)Cv02`_wrp?JpCPJfgJ{pzyqs>pKRZ{w4zFo{S=h#ztq+ zuTbz6D_(wCc4B)_z^87H7rjOwClz@XBr&^UiNS@M!UGc{z}z-cz)! z5hDr!#z(%k&?k*x1Edp?h?&**e)C>&&aY=lfNsX*WT?wp90kQ(eEZ#G~#9xNe{hO8m9^V#LnW<16qEMNlK=?)$;#9$Q9k}f2> zd!4s9YPIIO7)W)=yDAw1JP9r=go#UBZhiVfFehm8VH96CcU)FzUTjF=zHjFW@+1LA zhdDDn3WdXiJ(W0GDP`lymDaEJyyOv?2M1vFTs>y$WqS06Q7wHJHs5?t^X}M}oi=XB zjK%EgD0A-Mv?~scXJww;UZr_9p-v^?3iI_nBY;j5MFM29`PD%N&~0uChFN z0O(IbI~D5TUvJ{Am-67~hNTe)3%9nRLd1pefH+;qL@3s>PGe>Ri>`FP;>LYXngiJr z>J4Ade?0&wfnuu3VnY_^UD~T9Lgwr%E>+bBNaH|Hh&nanRUEtcR$2Y9?@LaBF#Y^$& zQ_Mi7c!?F^+kS~`_y$$YN8wXl|MgA6S9!p7&0$O&aG^1&YuDcP~_L$!>8_ z%`8*T8AeUSR>g57y?@co**KfU94EyvpW2~FBS=g#eX#MGM64}uHI4o9Wz}EHOYs* zitq|0MU<9}eUn_?_nmDm+aLy~CTY7uj`v=~Zw_h4@>LndUZVu(A}ZuF2VFzKWevTkuOqmLpOK#E7o%)MO+Z3AY&C1>FY- z1gyRUl8@V{-`Q{E$LU;Oa)jlZqiQIG#9+6kF{==wB9-Z3*Baqw`~t}gsn(c$0D65d zQ$%IK>!bx}L~wA|5&DhJXya6#dG23XB;Q{dF^ZY*31J0~moMf@7#QWh$3#*k$)v)@ zRZkj|xSsJiUP{@m&}Qd7>Q4*W~qyHE)CLv^9vR z=f;p(9)iOj`^KQuj5pedJ4%Z^0qMORe{ZJj)Ip@n# zTNl-!I7PB#N4pIm#I$GsC=Ljsmk1Zb>XEPyt0ud*XgKliF!@$NvvPw_xUQL(fqMd{ z#<8-T6*0l(_PE9}QT|08`Qng*u4)0BA9sX6>$V7DS>P}jG1#zfAY$O)EL?f*9AYII z*!~AQKOeCq$@D17BpFO31?`#zmrqy(?7jV}9@{7bv4ZJhwl(ML9!B;>*%rrS7Ha0X zU-WryU56!oA2$zOLgT8{$@2>aW?naiGG_gYdp&{ut6Oo+;x%8nodH zTE$fyOKxzKi?Hcgp2tL!(fXnz!*MusqAf7eR*Mu;dV*F*{B;|{LDniwwW`$0L68NH z{#NkEu#W^b-a4^%<7eSdPoNf2~D1;muIdMz^wH zPg8B*I@;ru2Y0dU=^(VG-p?Toqc+1@`9;nIaW3bGE9>>WiQ~Ccuz?8-5Te$_hsz#| ztUmtW^WtV~AWHw{Gc~nI6Cr^06Yz1OeuE_S0jp&5WcYXK{v`3TMGifoTTT-4hs1z+ zH@!#V0A)%MJ*itXCTew*a*&k5UZsGST7zdqh? zknliR1~weyI() z-!1>1U3}hkHI5un*j2~vmlwU@qG&J>h7_0lKp*8UW+=`m#X;P$_*C+3rtej*_L+tz zC+97Vp+le7(+Y)WWYWpX?1x+mTpPh$@h-vJeHoAz&ZTSX4KXUH*@TEI8OdWt!nPIZ z3BF{FlH^f4nW>N9gklFia5x+ql}tDNlO!JtYqR~AQ{^5`+Y0DW;U;0VHS|}#IkMGj z3whQQDv;}@B55o-6F=oDjjY?e-|2QC+)M}u6!VmRPeEZ7#;0sJZ8IC}sAh@g-M4gP#UsG|mCWbrKA|ggZH6U7!RsS@!hJAD{#Otibdr3a8dHdMJlc(Au>NKHlm8E-$Z#WxRA@q z$$dXQj$S+NUtb5JqocDnr+8!7=ERLjNr? zhK3l?y`h$TF)qS!Iho;oFH4^{qR00)TcvZ4TU48;L*(CS%fFlOm^ z%KXGZN@Zff(Qd1$uOf%|4$g^wc}lvvB$#r*H|HmJ7&ZzRspfZql-&@E$rGu=ex{bpyK~yLTO@VMt^cmlT_jTl%o-MERFGTW_-<)A@d^V z%o7GQOk2E^*cai3gmSoe&kelM{yJ&MI|MS z1Ud=f(G?OEX5!7BVXZSiRoyhKH99?p%b_kv{De(u@GRPp4m{60dGNCDCCMkncBdK6 zgXIRe-~z8F;CxXvujv zTYyv{jDh^gw3c)83KJH7p>Lt?q{Kf@b%^PQm3=oPmS!P@>!B=xDO zqZQqeEtTAuCtt0zkBO^26;jRXtpX|?=Uyj_jg5&(LmOeDvg=5*rRj_WJg?wS&1vErvI@+P_)&d?!=>8@UBj<8?tGQhxpZc?&7M+Yq99tf*woma+V51_7!oDY!H^<)ap+2S0 zh_hl@9UXM=)@m;G`0T>ZJ-m@_>efB`!PHxzVf#VsBU?wn(y zhnFAD2G}5;zR2jcBpm_*0^Dz}Jw$WIUYiyGGB?&2_@kZZ`Q}kd203jab)Tt%hQW-< zn7@AgN>XD@9<;52u03W-5#iZ3Ivt86M9vtFM65y(YCzSSHTn%JDw}MqA;pe}aw}|U@qap=yD2(7Go#*I%&Mts zbCP=NoE_mKtZAs|p;v&fTk|Z;cX#hJ@jg{NvBPL>zgxGL<)oS%& z)5MjPSvUR0$yn3<8G~<&%T5)v(%;TK>mMmbzr$y$${g-v`T%ZLiQ?iRVPezB z>52n&lsb(_P?Q(+X<{gG`Il0Vk*t0moL`kZ^^hEQHer3SH9!=2p1mdrYu5kJ1BDjD zF6=8yQ>Mp0Gaek+7v&HZI-=uf^*t=kbwtTC7Wke4MxZ-xtOwlPW1oM`!pO+->_b3} znlQ3DBkngJyh=23d%VV_N*0yWc?3R8+S8GueT?-JYK6dU1U}%|Ag|=r-2wYySH{b5+{9tqRQe@nw{B=Sbr?$GT1X^k6N#F zyzsmKxx+6hDY*lqTJe}3iV_dQNT;6K$)tc|g{&NcO%6$xZla>lM>kN0d>|J0XBnsO z815W2T!V$Y4@?eGTbC}f7xPBi{JXLpsK%?3wR_dcI#c_HU|XJIZKq#oert$%(9i8U zVdkpz@{TAbKc82)B(7$`Hs%?Ro5iTc%`s{e%777XJ38nMDjF(9b<0T2pC1ZI-u;;J zgGW-hAI$U5^maOx?ipkIU5cl+b2XUgU6Dba%mzfYQKw6=1lH#E_-bk{XB1ae;TLF? z9w-o?&6O}IC4}twS3YYcpL^y@x45)4F+VT*;qEPU`7cl-3AZnG3VzD~l10ObhfJ)f z=+HCq_daeF833($Uq!{EJqZ%o^@{++6A*G}S5B1iE{r;wfPwz1L?BDe!O1CXe1~QY zcfz`Mq(UXLh;$;YjW4Ph_^K(mJd&We$m(4L2I(n{ANF%i&Ycp9nx#X&EH%WsU_w0; zvA#wK`H#y>jb;tZiH|>P%%|N^5dr9Z8W3t}Le222)NK=m!($+GEAWeFNks5L&ioQa zs@U$gZ+4=&8glv440Npq65Y~1Ls4<~YSUT`Ck3gZSD|&-%Q^8obHln{ev&G5?_U(w z))KK!G4uy<(d=R7S%7F(lex4i3!LCeDb|jO!MS`B;Cr8ji1DV^9PKLg3-QIptj#M& z{?fo2Gt7|jCgR&er@^m}mTY5%^m4scGB~M1=#KyN^mLbta3b{Z16jhRpeA`*7-QG7ILy2j z`tPM_tdtd;gEtvd($9--hQ@IosvYb7vS$=s-5L%irH%L2sUQnqM<0jPJmC`@rI+U( z?y;-yhP%ffD?giG?j$v@Hk?baQR3+qm_zdAeZ5nZN^#zsR~vkNrv(e#K~o=9^J*Xe zRsZZ&et=)O`NMn19kbM)MCr(KbxLs7$TigmggmvFx!u~ZyMcdLMy9Oe3>U!3tP6)_j=gaT{3xCF?92IVYv2w^i?RcjBm)g(G#&yZFOnmbO@r9lwYGJ zY<`=rWzw3h^Pc78GW+&vUIyCX!G1QkcH??1O=dB5+j!Aoa>+&@l;`9z$@N3^O;7|{ zSRyj&ip=(b#5-YoOLhoB2!8eCt)3HiRa!@;-~CHN48z2Dbk-5Qw2Lh1#o8_SLqOAx z{V(QGQ62wnv&Ou)o+i3RNkpTv=lxw;Lq|Gp32zhFjCS;W3fXtwc0N6yxspw6n|$$e zC#5=rCGf+Xs(D+<{UM(Ea=VwN2_(572TnZ5!6qS(3hBJ+nO);esZ%IDW9x+=yRdH3 zGRAM6gq$1++$c3-gmrVwXfGVs+iK^YM@!Ho7&xarlxX~Zx4cEuD`HN6rYTYV?6UOi zEJ^w@&Elu;7c@%W%S&Vk5e4DTq3T-+dt$n;q6zsU?#x8g%JovF84G!D2YL!HWjo6roNv)Gh=t^gn4W*+Tw=pjkNI?+S;$n7kU+vGNxC zb{Zz_Q!5cN2X*@B;{Aprk=}#%?W^B0gRW97n3cb$_<9&P4p(OU(VcXwlO1ikbYKZH z`qUX>f=_^X9OT&fkSFkhsr)K&;=*#yL6Rd-l>2VWT3)iHr}x7%_PZ~W6eQyhO=}8y z_p3_q2f-}@hsCUk8n|P7b$WYn(OntaoY;d`!~Erg5oS?QGQ(xxJ)B}^V=dn$SvL;u z^YU9j{>3-e;r1rbx8u%+h1-^=<2w(vziVgh!hTiUkL50|Ds;N_GYRjumUg&aZgsk` zA+)32hA6mc{HcgPH%#tBr1{o%8M=g0OZ>^wgPbh-Rx?l`%+XOai8xx8!^2OI10P0E ywD!Aun diff --git a/data/spool_in.png.gz b/data/spool_in.png.gz deleted file mode 100644 index aebffe0c9e34b96a7be322853e259199554c8670..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21835 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 - - - - - FilaMan - Filament Management Tool - - - - - -

- - - - - - -
-

Spoolman API URL / Bambu Credentials

- -
-
-
Set URL/IP to your Spoolman-Instanz
- -
If you want to enable sending Spool to Spoolman Octoprint Plugin:
-

- Send to Octo-Plugin -

- - - -

-
-
- -
-
-
Bambu Lab Printer Credentials
-
-
- - -
-
- - -
-
- - -
-
-

If activated, FilaMan will automatically update the next filled tray with the last scanned and weighed spool.

-
- - -
-
- - -
- - -

-
-
-
-
- - diff --git a/data/spoolman.js.gz b/data/spoolman.js.gz deleted file mode 100644 index 08a2bb82672aadc9d5c813b0f8594c6acde957ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2821 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 Xceku}hm5x}9zXssW0n9nH7o!CdB}gT diff --git a/data/style.css.gz b/data/style.css.gz deleted file mode 100644 index 27ad44c46e2fb4ba3b141da358585b9dd46c1c4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4898 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 UTvE|)pS}3>4;k-a^;}p00C8HHA^-pY diff --git a/data/upgrade.html.gz b/data/upgrade.html.gz deleted file mode 100644 index 7eefe82005fe966781024222928eab66774f0d10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2583 zcmV+y3h4D8iwFpmSkz|%|8;O@a$#g;E@*UZYyj;V?QYw;^?#m%5zs4pjit2PfG)NS zv`ve4Xw#xe)@>IT1ufAw7n#x}DZANjo@H;b7q~CBb4bb2w_~rx_GA8$Sk&R+`Tn9O z$DDw+7!RwuJ0y3N%U@ihr! zs#M?zx}H(#+^f#KGzt!!h^sWFw`XJ?v#(=9W4;h0uGvbRkr4Q0a!eL9JtI#gTa8Od z3?jZ-5G6w}uQ*vGp0PI?gW(re{0^3#f)IqMV<^#yuSY2A8jOKkJ}Eq7qEPqwo?JN2 z6r=&m@DBi6cK>eL?M?8qN|O&nm84aB1aWo<&&cUXo1AFjh0gR+Q>iCD?Sj})pbo$= zI`n{nBPH>Q0_T_cH~$4)&9a^?be3cw+voVN2P{h$l14znwf#~7o%q0h&609eC{1;y zMi~1j7fkkOItN8FYtwaE!8vG@KxE=k;LMQ8b9gE={-RHJ-|*l<;N`O~_c>eA)yN{X z2;uqCK2EzWF8_KoDd#Tprs3v!(kc77aT>YWP|3(vo9G~|3Is3#0jI7vrDY-()6e$p z8L(~_$az9UqDh);m?X)3P9T62o9jrFNsL`t3Sp9Yb&{noKjYX}#Fif#1etk!ISK0WR|4+VaG; z{on$ZWt6lZ_WAV2psxTP7g4 z$HetFs@^`;ka~$&0mtb4!Iqi#vLhM-ZB|3YU^=t!6a7VWM+S!)lwZGXwG7 zxZ_R~ee^uP(HZn*iZhAzl_--2HX$Kv2?4z!S;$}i_3J<33s<@mp_MflL&;!`wBHJC zWm&K@>?RlGe$3Scy%>}*4N=%-%+sLNMf&7lmS-+TGdHmYyu}Rm`KU*n6)e^6eNQYM zE?&aYz5nhYbzAeZt-lNi(sqVGkr zm41v(cz!~@;r}xL=9|s9ODQY{f`T< z957i>TckW^eDqyn%AxV(P*>d31rKq(9WHlA7*wwPHP4@z1ko)q7Uq1B8RJB77D-4) ztFkqA;%O;aOWfD1)D!Zghvq}vF(0UxN>M3?9XAQBap685NZE07&}a;xx5u zumc_9JbO66zQ*5U_ziPu=~}_=-`dN#QjeCKDI8yJC2RdvTNlxN&PheF4zHIw3~J-lBP(*(B|xVsqV4GSLb_l%vW&s;ADZhm3*rMNCA_Iz=N zd+@tPBI`F0ov7_d`Y`dd@tIGS_hA#ZD6S9UvN~q(Lj0fbST_NPKoHxn-&WRJhJ0FP zHA6mdxYLy>YctgTZ0xp^Qk#por;oY-Yd>6Q0M^BH&J~@-7#?xZPiC3c;Q1A(_Cf0N zI3Bq6b_4GVel+(57RyiW(1SOxC}h2v7FYqmKa>d`73D%7)(Sf8&Y6hnGx7Ui^mQro zq2{08zk8!~`iTKWsu2tU&P!4zz!pDTUO{c=`uSbRNpWzeM9f}cV*dl0JcQ1xsAKS{ zr>CdJo7$97aV#i<+kI$fr8uYHK+zd-$YXna@dKMH0LSTrb1iN}vJtkjb%uMFgJ$11 zECzSa)xWc?nbY>E7dwoi(Q9;B#dp#F1=E{E-dOciuaBJn>-fPs?x>p1?L`E}me=`X zJ*pI79yV(t8o1k-V#=Im2vP`D>>9SVBU?#8we~7DzfgK{`xbDQe=GpZ(<`Z-zWFWXzX8hGh_z@b006}T2Q>fy diff --git a/data/waage.html.gz b/data/waage.html.gz deleted file mode 100644 index 1ec7b06facd796127bf43ea5d4005f3fac7e1a97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1658 zcmV-=28H<_iwFpmSkz|%|94?wXJsyEbZu+^#aL}`+cpsXo?mel2H3$ODQQ<=aBKrh zmZIB|Hki{D`&L>y+gvD8BPqLHk^jCUCE2nqJIPvL0uqbT-SO_ZSE~Oa3}J>Wg)kiU zU;O<3^6t;uE120#43GNm2LzMTL4Y!F4~TMj1a$Q?v<#9N(+2Gz_;B|o{4r?0k}ShP zFz2|)m9_ySN?Mdey5Omu4N{!*1Vg_#0WP`aOoS$30taW&X)VffD{%OR3wFaKgy8Nn z5(BhkQ}nlYN{N14QkGnT%X`o$1_7sS1F*}Sbm19s#JQXXFw;001o4E;9YI9@f*n?4 zmjcZU(bn|-Nt75<6PrZy+?ES>P0%K@ZYO3rkLRcjSF&@wdh4#p&QNwWnp{bPFc?C8 zAN^&N>>js~r;P9<(k~nD+(pV83)NPmoFE!Ns*=Lt68&AEUXD;;VwLW8qLoJHJ9790 zx(zAEEnB&(K@wT~Y%fcn(x#nx2fhcVXuZwuCJ!4=9=0q^n8OaWR@&L>EK`KGf6(n* z`R5*AE~m93z0L`Eg5%1jeq6hxAD6M(AFFg(xhv&!NCY!x5J)y3Gaam5=U;jU4}z4N zT(D&iCIUa70~35ILvArMJxIu2)aNi|c@JJ{%+4D^yda)U!RUm-OQ@-ee7rG1fnP`Q zH9Zb$MI6nxgod8(b?BhpqVaUIvpO^S#`(VDslW+_ga$pPA0lkw{$aR3o9N}HPBAIf zKx=DBaP9%m<8;=B6RWc@7>+E{wjZ;76bnY$5t*wF2goRql*kxaKC15G3zm(G11xN; z3c~g$_j7=($fug6q{4^tW`ndJllfbbRJp=fW(yO#+Q+y=eZbQdsSC3;(C?V7WsPWUnSjtIB z8+K331v!i4fS;;>8^A2L%YIA*dpX~-IRb;%r>9eB00;}@)0w4dg{6;3xD-6O2Vx0) zS#O4SaG3MW%5<0%ntn75hQ{h5am=QjxgWOyaS)vmp$ca`xN>l;5jw1#XL{L#TfveN zR*zAI3z_>IIj?%~J7$WYuJ|WfWp!db!^%eX8V7a*>$XfzX_R+OXvZ<_+5C73Zk>V! zT38qw3S}Y0dJHUQ)s3RioK~l3uY?~#E|$Nf-OdJ~n_1UWb|HO0IEj*m+mARNspKAQ zcYAIvwZH|eNj@!1FOI+avfwgRi%6)%0}#!WvF^z75HHN9tqFNcW~8Lb(T&=);oh;_ z4X-r4bvvuQ-PAfRWQwgL_=dd^C(HEPyPIn_TbDhnvKG_ME;C9t7I@)(Xu6a!xV6JW z1HY9OiBRqg@?0~>QyQhTUt@)HAMI`*wPnJD!M2Ui-ti1+Z0l}^!3n%PJw1I20NE-G zyEv!FJ3e&EDo*)QvD0j!+k|%P{_Z+GGdB`0;VK5*Be0AvTJ6x?8a<&wTrkawc zND|U=FV`cWe?%dC+i3y1o!ys=ca#Z^o%E$b;s1xVChdYA0Lf8%jPPf)|7t>c^jpk0 zMGy0l^Yylrg>auKkDXlCY!59}X)}JyRl05a-m=%6?>fg3O(ve740utAI)9p=YMOgY zM#F-q>crCY%0>P)r}2awMFg(p(^D@z{cc1)c8<750q+>BOS_5G1c7WygQ~! ze&2BDL$hNXYBJkR^VtScB{3+|t}hHUt#CQzlVx`|)?Fd!)m7kR=XI4aM6trVv-QPf ztIQCz?{lX%6TLQ&B}-u1MM_9fboVo1oo=K zgnv*crvZYXhB5LCt{I_9P-_?=9i+?endFNG)VssV?kB7ATNRxU{O8wy0k8#xQ=An5 E00+4%%K!iX diff --git a/data/wifi.html.gz b/data/wifi.html.gz deleted file mode 100644 index 761fca1a718093519a8141530209067d68894f82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 857 zcmV-f1E%~RiwFpmSkz|%|95F-X)b7VZEOIoR!xuFHW0nyFwL!V{s+oGm}tSE`XTaa3Mi7IgwDk|>M?`KtBdPU`+Ehc}CH-q4d)$(u${V|0rQbZdf1yY2VZG3Dd%;u~3rOne zi+?}nl#Q+qEBFqAqqCWpM!ue`d_9Y_!oVF_Yix)$L}r-nxUgP*i0hGGshio6&FU>g z!0i-Mp3N!Av$0n5ovDvgx@viVN}+Rw(0JIP75}C#ZpH)`qL!{#c-+8V(U*HbB^#Yc zPo3L9#qpB8hX(r%{9viOUnq%+WY>VR6_=MXjY(s@q2j`ytN0gQ7PBJ(bFN|GXV^{x z)n}N9YwzaH$X&?&bY>z)l*|S%^M`>KPXAcG-c7uD>Qlx}E!a8}na)?pi#*+3;tA(2 z6y?^V^?8P`A)b-FV_3KyuE4mFjOvgh-%hja9d^6n$`Ra|fw}!Te6GNTzOh)d3!lcx z2{g|*{Ig1$QsF%M!6o7DL#fGL$@BybWp*jo%LGr*+VIUJ>q6{8kPj@)8Gm;zcmJc| znee6U?SHXtu}em!qe7OqqgcLPantlBU%p*8FIs$haF#vJeek<{l)(4aUN(b8&wT

}PM>c}M07ccg$%au3AEZ9G#xL;<3-$+HM6 z^PN4vHgrGu>7|Md9|>7%nx51X<=6GNVb@94bU-z*xFrwMxdpEw)`i@cGdl!FGgyd> jF$JD4UdMb}O7pBgNkyKGw=A<5|2X^usRilgRtNw9Mi{fI -- 2.39.5 From e5e3dcba8cef9bcdc96f944a1b788f01c4b4b9f8 Mon Sep 17 00:00:00 2001 From: tugsi Date: Sun, 23 Mar 2025 17:51:09 +0100 Subject: [PATCH 8/8] gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 89cc49c..19e12dc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ .pio +.vscode .vscode/.browse.c_cpp.db* .vscode/c_cpp_properties.json .vscode/launch.json .vscode/ipch +data -- 2.39.5