Compare commits
	
		
			38 Commits
		
	
	
		
			v1.4.1
			...
			b5f0472af4
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| b5f0472af4 | |||
| 95c1bc823c | |||
| 491ba7f526 | |||
| 56d7d8596c | |||
| 1044e91a0a | |||
| e459b53472 | |||
| 024056cb7d | |||
| e040a736b0 | |||
| 72b6b349c6 | |||
| 190e952ec4 | |||
| 89620a7f00 | |||
| 536950eeb3 | |||
|  | fe4d2d7479 | ||
| 43719aac41 | |||
| 16d0079f7a | |||
| 48b9bf7076 | |||
| b6bd4cb9ad | |||
| e89bb1d547 | |||
| f25789d703 | |||
|  | 65d8cd675f | ||
| 9dfe75ffa2 | |||
| 68cdd8ab40 | |||
| 1069781931 | |||
| eada54eff2 | |||
| 48301ade36 | |||
| 76e0b20393 | |||
| a765b39896 | |||
| d68f6c4a89 | |||
| 1702e2396e | |||
| af23b07df1 | |||
| dd7ba3bf5d | |||
| a818dcd3c0 | |||
| b5279b167a | |||
| a09fd4fda4 | |||
| e4fe08f54c | |||
| 3eac0e5ac4 | |||
| 24d91693d9 | |||
| 94c26590c8 | 
							
								
								
									
										72
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										72
									
								
								CHANGELOG.md
									
									
									
									
									
								
							| @@ -1,5 +1,77 @@ | ||||
| # Changelog | ||||
|  | ||||
| ## [1.4.7] - 2025-03-27 | ||||
| ### Added | ||||
| - add forced cache refresh after removing and saving Bambu credentials | ||||
| - add functionality to remove Bambu credentials and update API handling | ||||
| - add rfid_bambu.html and update bambu connection handling | ||||
|  | ||||
| ### Changed | ||||
| - update platformio.ini for version v1.4.7 | ||||
| - Merge branch 'testing' | ||||
| - update remove button for Bambu credentials with red background | ||||
| - Merge pull request #28 from tugsi/main | ||||
|  | ||||
| ### Fixed | ||||
| - handle Bambu connection state by introducing bambuDisabled flag | ||||
| - Fix rfid.js-Failure with X1-Series, if you wanna send a Spool to AMS:  - Uncaught TypeError: Cannot read properties of undefined (reading 'replace')     at handleSpoolIn (rfid.js:493:67)     at HTMLButtonElement.onclick ((Index):1:1) handleSpoolIn	@	rfid.js:493 onclick	@	(Index):1 | ||||
|  | ||||
|  | ||||
| ## [1.4.6] - 2025-03-26 | ||||
| ### Changed | ||||
| - update platformio.ini for version v1.4.6 | ||||
|  | ||||
| ### Fixed | ||||
| - handle potential undefined value for tray_info_idx in handleSpoolIn function, by @tugsi | ||||
|  | ||||
|  | ||||
| ## [1.4.5] - 2025-03-25 | ||||
| ### Changed | ||||
| - update platformio.ini for version v1.4.5 | ||||
| - Merge branch 'testing' | ||||
| - remove unused request_topic subscription and reduce MQTT task stack size | ||||
| - Merge pull request #26 from tugsi/main | ||||
| - rename report_topic to topic and update MQTT subscription logic, switched publish topic to request | ||||
|  | ||||
| ### Fixed | ||||
| - increase MQTT buffer size and adjust task stack size | ||||
| - Fix BufferSize for larger JSONs from X-Series | ||||
|  | ||||
|  | ||||
| ## [1.4.4] - 2025-03-23 | ||||
| ### Added | ||||
| - add error handling for missing vendor IDs in filament data | ||||
|  | ||||
| ### Changed | ||||
| - update platformio.ini for version v1.4.4 | ||||
|  | ||||
| ### Fixed | ||||
| - adjust weight threshold for tare check to allow negative values | ||||
|  | ||||
|  | ||||
| ## [1.4.3] - 2025-03-23 | ||||
| ### Changed | ||||
| - update platformio.ini for version v1.4.3 | ||||
|  | ||||
|  | ||||
| ## [1.4.2] - 2025-03-23 | ||||
| ### Added | ||||
| - add WiFi connection check and restart Bambu if not connected | ||||
|  | ||||
| ### Changed | ||||
| - update platformio.ini for version v1.4.2 | ||||
| - increase stack size for BambuMqtt task | ||||
| - update Discord Link | ||||
| - update Discord Link | ||||
| - remove commented-out subscription topic in MQTT setup | ||||
|  | ||||
| ### Fixed | ||||
| - use unique client ID for MQTT connection to avoid conflicts | ||||
| - reload page after firmware update completion | ||||
| - increase WiFi connection timeout from 5 to 10 seconds | ||||
| - ensure valid URL format and remove trailing slash in setupWebserver | ||||
|  | ||||
|  | ||||
| ## [1.4.1] - 2025-03-10 | ||||
| ### Added | ||||
| - added new .step, now with correct individual parts | ||||
|   | ||||
| @@ -9,7 +9,7 @@ Das System integriert sich nahtlos mit der [Spoolman](https://github.com/Donkie/ | ||||
| Weitere Bilder finden Sie im [img Ordner](/img/) | ||||
| oder auf meiner Website: [FilaMan Website](https://www.filaman.app)   | ||||
| Deutsches Erklärvideo: [Youtube](https://youtu.be/uNDe2wh9SS8?si=b-jYx4I1w62zaOHU)   | ||||
| Discord Server: [https://discord.gg/vMAx2gf5](https://discord.gg/vMAx2gf5) | ||||
| Discord Server: [https://discord.gg/my7Gvaxj2v](https://discord.gg/my7Gvaxj2v) | ||||
|  | ||||
| ### Es gibt jetzt auch ein Wiki, dort sind nochmal alle Funktionen beschrieben: [Wiki](https://github.com/ManuelW77/Filaman/wiki) | ||||
|  | ||||
|   | ||||
| @@ -13,7 +13,7 @@ The system integrates seamlessly with [Bambulab](https://bambulab.com/en-us) 3D | ||||
| More Images can be found in the [img Folder](/img/)   | ||||
| or my website: [FilaMan Website](https://www.filaman.app)   | ||||
| german explanatory video: [Youtube](https://youtu.be/uNDe2wh9SS8?si=b-jYx4I1w62zaOHU)   | ||||
| Discord Server: [https://discord.gg/vMAx2gf5](https://discord.gg/vMAx2gf5) | ||||
| Discord Server: [https://discord.gg/my7Gvaxj2v](https://discord.gg/my7Gvaxj2v) | ||||
|  | ||||
| ### Now more detailed informations about the usage: [Wiki](https://github.com/ManuelW77/Filaman/wiki) | ||||
|  | ||||
|   | ||||
| @@ -141,15 +141,6 @@ | ||||
|             </div> | ||||
|         </div> | ||||
|  | ||||
|         <!-- Rechte Spalte --> | ||||
|         <div class="column"> | ||||
|             <div class="feature-box"> | ||||
|                 <h2>Bambu AMS</h2> | ||||
|                 <div id="amsDataContainer"> | ||||
|                     <div class="amsData" id="amsData">Wait for AMS-Data...</div> | ||||
|                 </div> | ||||
|             </div> | ||||
|         </div> | ||||
|     </div> | ||||
| </div> | ||||
|  | ||||
|   | ||||
| @@ -208,7 +208,7 @@ document.addEventListener('spoolmanError', function(event) { | ||||
|     showNotification(`Spoolman Error: ${event.detail.message}`, false); | ||||
| }); | ||||
|  | ||||
| document.addEventListener('filamentSelected', function(event) { | ||||
| document.addEventListener('filamentSelected', function (event) { | ||||
|     updateNfcInfo(); | ||||
|     // Zeige Spool-Buttons wenn ein Filament ausgewählt wurde | ||||
|     const selectedText = document.getElementById("selected-filament").textContent; | ||||
| @@ -490,7 +490,7 @@ function handleSpoolIn(amsId, trayId) { | ||||
|             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(), | ||||
|             tray_info_idx: selectedSpool.filament.extra.bambu_idx?.replace(/['"]+/g, '').trim() || '', | ||||
|             cali_idx: "-1"  // Default-Wert setzen | ||||
|         } | ||||
|     }; | ||||
|   | ||||
							
								
								
									
										160
									
								
								html/rfid_bambu.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										160
									
								
								html/rfid_bambu.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,160 @@ | ||||
| <!-- head --><!DOCTYPE html> | ||||
| <html lang="en"> | ||||
| <head> | ||||
|     <meta charset="UTF-8"> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||||
|     <title>FilaMan - Filament Management Tool</title> | ||||
|     <link rel="icon" type="image/png" href="/favicon.ico"> | ||||
|     <link rel="stylesheet" href="style.css"> | ||||
|     <script> | ||||
|         fetch('/api/version') | ||||
|             .then(response => response.json()) | ||||
|             .then(data => { | ||||
|                 const versionSpan = document.querySelector('.version'); | ||||
|                 if (versionSpan) { | ||||
|                     versionSpan.textContent = 'v' + data.version; | ||||
|                 } | ||||
|             }) | ||||
|             .catch(error => console.error('Error fetching version:', error)); | ||||
|     </script> | ||||
| </head> | ||||
| <body> | ||||
|     <div class="navbar"> | ||||
|         <div style="display: flex; align-items: center; gap: 2rem;"> | ||||
|             <img src="/logo.png" alt="FilaMan Logo" class="logo"> | ||||
|             <div class="logo-text"> | ||||
|                 <h1>FilaMan<span class="version"></span></h1> | ||||
|                 <h4>Filament Management Tool</h4> | ||||
|             </div> | ||||
|         </div> | ||||
|         <nav style="display: flex; gap: 1rem;"> | ||||
|             <a href="/">Start</a> | ||||
|             <a href="/waage">Scale</a> | ||||
|             <a href="/spoolman">Spoolman/Bambu</a> | ||||
|             <a href="/about">About</a> | ||||
|             <a href="/upgrade">Upgrade</a> | ||||
|         </nav> | ||||
|         <div class="status-container"> | ||||
|             <div class="status-item"> | ||||
|                 <span class="status-dot" id="bambuDot"></span>B | ||||
|             </div> | ||||
|             <div class="status-item"> | ||||
|                 <span class="status-dot" id="spoolmanDot"></span>S | ||||
|             </div> | ||||
|             <div class="ram-status" id="ramStatus"></div> | ||||
|         </div> | ||||
|     </div> | ||||
|  | ||||
| <!-- head --> | ||||
|  | ||||
| <div class="connection-status hidden"> | ||||
|     <div class="spinner"></div> | ||||
|     <span>Connection lost. Trying to reconnect...</span> | ||||
| </div> | ||||
| <div class="content"> | ||||
|     <div class="three-column-layout"> | ||||
|         <!-- Linke Spalte --> | ||||
|         <div class="column"> | ||||
|             <div class="feature-box"> | ||||
|                 <div class="statistics-header"> | ||||
|                     <h2>Statistics</h2> | ||||
|                     <button id="refreshSpoolman" class="refresh-button"> | ||||
|                         <span>Refresh Spoolman</span> | ||||
|                     </button> | ||||
|                 </div> | ||||
|                 <div class="statistics-column"> | ||||
|                     <h3>Spools</h3> | ||||
|                         <div class="spool-stat" style="display: flex; justify-content: center; align-items: center;"> | ||||
|                             <span class="stat-label">total:</span> | ||||
|                             <span class="stat-value" id="totalSpools"></span> | ||||
|                             <div style="width: auto;"></div> | ||||
|                             <span class="stat-label">without Tag:</span> | ||||
|                             <span class="stat-value" id="spoolsWithoutTag"></span> | ||||
|                         </div> | ||||
|                 </div> | ||||
|  | ||||
|                 <div class="statistics-grid"> | ||||
|                     <div class="statistics-column"> | ||||
|                         <h3>Overview</h3> | ||||
|                         <ul class="statistics-list"> | ||||
|                             <li> | ||||
|                                 <span class="stat-label">Manufacturer:</span> | ||||
|                                 <span class="stat-value" id="totalVendors"></span> | ||||
|                             </li> | ||||
|                             <li> | ||||
|                                 <span class="stat-label">Weight:</span> | ||||
|                                 <span class="stat-value"><span id="totalWeight"></span></span> | ||||
|                             </li> | ||||
|                             <li> | ||||
|                                 <span class="stat-label">Length:</span> | ||||
|                                 <span class="stat-value"><span id="totalLength"></span></span> | ||||
|                             </li> | ||||
|                         </ul> | ||||
|                     </div> | ||||
|                     <div class="statistics-column"> | ||||
|                         <h3>Materials</h3> | ||||
|                         <ul class="statistics-list" id="materialsList"> | ||||
|                             <!-- Wird dynamisch befüllt --> | ||||
|                         </ul> | ||||
|                     </div> | ||||
|                 </div> | ||||
|             </div> | ||||
|             <div class="feature-box"> | ||||
|                 <div class="nfc-header"> | ||||
|                     <h2>NFC-Tag</h2> | ||||
|                     <span id="nfcStatusIndicator" class="status-circle"></span> | ||||
|                 </div> | ||||
|                 <div class="nfc-status-display"></div> | ||||
|             </div> | ||||
|         </div> | ||||
|  | ||||
|         <!-- Mittlere Spalte --> | ||||
|         <div class="column"> | ||||
|             <div class="feature-box"> | ||||
|                 <h2>Spoolman Spools</h2> | ||||
|                 <label for="vendorSelect">Manufacturer:</label> | ||||
|                 <div style="display: flex; justify-content: space-between; align-items: center;"> | ||||
|                     <select id="vendorSelect" class="styled-select"> | ||||
|                         <option value="">Please choose...</option> | ||||
|                     </select> | ||||
|                     <label style="margin-left: 10px;"> | ||||
|                         <input type="checkbox" id="onlyWithoutSmId" checked onchange="updateFilamentDropdown()"> | ||||
|                         Only Spools without SM ID | ||||
|                     </label> | ||||
|                 </div> | ||||
|             </div> | ||||
|  | ||||
|             <div id="filamentSection" class="feature-box hidden"> | ||||
|                 <label>Spool / Filament:</label> | ||||
|                 <div class="custom-dropdown"> | ||||
|                     <div class="dropdown-button" onclick="toggleFilamentDropdown()"> | ||||
|                         <div class="selected-color" id="selected-color"></div> | ||||
|                         <span id="selected-filament">Please choose...</span> | ||||
|                         <span class="dropdown-arrow">▼</span> | ||||
|                     </div> | ||||
|                     <div class="dropdown-content" id="filament-dropdown-content"> | ||||
|                         <!-- Optionen werden dynamisch hinzugefügt --> | ||||
|                     </div> | ||||
|                 </div> | ||||
|                 <p id="nfcInfo" class="nfc-status"></p> | ||||
|                 <button id="writeNfcButton" class="btn btn-primary hidden" onclick="writeNfcTag()">Write Tag</button> | ||||
|             </div> | ||||
|         </div> | ||||
|  | ||||
|         <!-- Rechte Spalte --> | ||||
|         <div class="column"> | ||||
|             <div class="feature-box"> | ||||
|                 <h2>Bambu AMS</h2> | ||||
|                 <div id="amsDataContainer"> | ||||
|                     <div class="amsData" id="amsData">Wait for AMS-Data...</div> | ||||
|                 </div> | ||||
|             </div> | ||||
|         </div> | ||||
|     </div> | ||||
| </div> | ||||
|  | ||||
| <script src="spoolman.js"></script> | ||||
| <script src="rfid.js"></script> | ||||
|  | ||||
| </body> | ||||
| </html> | ||||
| @@ -57,6 +57,31 @@ | ||||
|             toggleOctoFields(); | ||||
|         }; | ||||
|  | ||||
|         function removeBambuCredentials() { | ||||
|             fetch('/api/bambu?remove=true') | ||||
|                 .then(response => response.json()) | ||||
|                 .then(data => { | ||||
|                     if (data.success) { | ||||
|                         document.getElementById('bambuIp').value = ''; | ||||
|                         document.getElementById('bambuSerial').value = ''; | ||||
|                         document.getElementById('bambuCode').value = ''; | ||||
|                         document.getElementById('autoSend').checked = false; | ||||
|                         document.getElementById('autoSendTime').value = ''; | ||||
|                         document.getElementById('bambuStatusMessage').innerText = 'Bambu Credentials removed!'; | ||||
|                         // Reload with forced cache refresh after short delay | ||||
|                         setTimeout(() => { | ||||
|                             window.location.replace('/'); | ||||
|                             location.reload(true); | ||||
|                         }, 1500); | ||||
|                     } else { | ||||
|                         document.getElementById('bambuStatusMessage').innerText = 'Error while removing Bambu Credentials.'; | ||||
|                     } | ||||
|                 }) | ||||
|                 .catch(error => { | ||||
|                     document.getElementById('bambuStatusMessage').innerText = 'Error while removing: ' + error.message; | ||||
|                 }); | ||||
|         } | ||||
|  | ||||
|         function checkSpoolmanInstance() { | ||||
|             const url = document.getElementById('spoolmanUrl').value; | ||||
|             const spoolmanOctoEnabled = document.getElementById('spoolmanOctoEnabled').checked; | ||||
| @@ -89,6 +114,11 @@ | ||||
|                 .then(data => { | ||||
|                     if (data.healthy) { | ||||
|                         document.getElementById('bambuStatusMessage').innerText = 'Bambu Credentials saved!'; | ||||
|                         // Reload with forced cache refresh after short delay | ||||
|                         setTimeout(() => { | ||||
|                             window.location.replace('/'); | ||||
|                             location.reload(true); | ||||
|                         }, 1500); | ||||
|                     } else { | ||||
|                         document.getElementById('bambuStatusMessage').innerText = 'Error while saving Bambu Credentials.'; | ||||
|                     } | ||||
| @@ -162,6 +192,7 @@ | ||||
|                     </div> | ||||
|  | ||||
|                     <button style="margin: 0;" onclick="saveBambuCredentials()">Save Bambu Credentials</button> | ||||
|                     <button style="margin: 0; background-color: red;" onclick="removeBambuCredentials()">Remove Credentials</button> | ||||
|                     <p id="bambuStatusMessage"></p> | ||||
|                 </div> | ||||
|             </div> | ||||
|   | ||||
| @@ -147,6 +147,13 @@ function updateFilamentDropdown(selectedSmId = null) { | ||||
|  | ||||
|     if (vendorId) { | ||||
|         const filteredFilaments = spoolsData.filter(spool => { | ||||
|             if (!spool?.filament?.vendor?.id) { | ||||
|                 console.log('Problem aufgetreten bei: ', spool?.filament?.vendor); | ||||
|                 console.log('Problematische Spulen:',  | ||||
|                     spoolsData.filter(spool => !spool?.filament?.vendor?.id)); | ||||
|                 return false; | ||||
|             } | ||||
|  | ||||
|             const hasValidNfcId = spool.extra &&  | ||||
|                                  spool.extra.nfc_id &&  | ||||
|                                  spool.extra.nfc_id !== '""' &&  | ||||
| @@ -240,18 +247,6 @@ async function fetchSpoolData() { | ||||
|     } | ||||
| } | ||||
|  | ||||
| /* | ||||
| // Exportiere Funktionen | ||||
| window.getSpoolData = () => spoolsData; | ||||
| window.reloadSpoolData = initSpoolman; | ||||
| window.populateVendorDropdown = populateVendorDropdown; | ||||
| window.updateFilamentDropdown = updateFilamentDropdown; | ||||
| window.toggleFilamentDropdown = () => { | ||||
|     const content = document.getElementById("filament-dropdown-content"); | ||||
|     content.classList.toggle("show"); | ||||
| }; | ||||
| */ | ||||
|  | ||||
| // Event Listener | ||||
| document.addEventListener('DOMContentLoaded', () => { | ||||
|     initSpoolman(); | ||||
|   | ||||
| @@ -129,6 +129,7 @@ | ||||
|                             if (data.status === 'success' || lastReceivedProgress >= 98) { | ||||
|                                 clearTimeout(wsReconnectTimer); | ||||
|                                 setTimeout(() => { | ||||
|                                     window.location.reload(true); | ||||
|                                     window.location.href = '/'; | ||||
|                                 }, 30000); | ||||
|                             } | ||||
| @@ -148,6 +149,7 @@ | ||||
|                         status.style.display = 'block'; | ||||
|                         clearTimeout(wsReconnectTimer); | ||||
|                         setTimeout(() => { | ||||
|                             window.location.reload(true); | ||||
|                             window.location.href = '/'; | ||||
|                         }, 30000); | ||||
|                     } else { | ||||
|   | ||||
| @@ -9,7 +9,7 @@ | ||||
| ; https://docs.platformio.org/page/projectconf.html | ||||
|  | ||||
| [common] | ||||
| version = "1.4.1" | ||||
| version = "1.4.7" | ||||
| to_old_version = "1.4.0" | ||||
|  | ||||
| ## | ||||
|   | ||||
| @@ -17,7 +17,7 @@ PubSubClient client(sslClient); | ||||
|  | ||||
| TaskHandle_t BambuMqttTask; | ||||
|  | ||||
| String report_topic = ""; | ||||
| String topic = ""; | ||||
| //String request_topic = ""; | ||||
| const char* bambu_username = "bblp"; | ||||
| const char* bambu_ip = nullptr; | ||||
| @@ -27,6 +27,7 @@ const char* bambu_serialnr = nullptr; | ||||
| String g_bambu_ip = ""; | ||||
| String g_bambu_accesscode = ""; | ||||
| String g_bambu_serialnr = ""; | ||||
| bool bambuDisabled = false; | ||||
|  | ||||
| bool bambu_connected = false; | ||||
| bool autoSendToBambu = false; | ||||
| @@ -37,6 +38,32 @@ int ams_count = 0; | ||||
| String amsJsonData;  // Speichert das fertige JSON für WebSocket-Clients | ||||
| AMSData ams_data[MAX_AMS];  // Definition des Arrays; | ||||
|  | ||||
| bool removeBambuCredentials() { | ||||
|     if (BambuMqttTask) { | ||||
|         vTaskDelete(BambuMqttTask); | ||||
|     } | ||||
|      | ||||
|     if (!removeJsonValue("/bambu_credentials.json")) { | ||||
|         Serial.println("Fehler beim Löschen der Bambu-Credentials."); | ||||
|         return false; | ||||
|     } | ||||
|     // Löschen der globalen Variablen | ||||
|     g_bambu_ip = ""; | ||||
|     g_bambu_accesscode = ""; | ||||
|     g_bambu_serialnr = ""; | ||||
|     bambu_ip = nullptr; | ||||
|     bambu_accesscode = nullptr; | ||||
|     bambu_serialnr = nullptr; | ||||
|     autoSendToBambu = false; | ||||
|     autoSetToBambuSpoolId = 0; | ||||
|     ams_count = 0; | ||||
|     amsJsonData = ""; | ||||
|  | ||||
|     bambuDisabled = true; | ||||
|  | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| bool saveBambuCredentials(const String& ip, const String& serialnr, const String& accesscode, bool autoSend, const String& autoSendTime) { | ||||
|     if (BambuMqttTask) { | ||||
|         vTaskDelete(BambuMqttTask); | ||||
| @@ -91,7 +118,7 @@ bool loadBambuCredentials() { | ||||
|         bambu_accesscode = g_bambu_accesscode.c_str(); | ||||
|         bambu_serialnr = g_bambu_serialnr.c_str(); | ||||
|  | ||||
|         report_topic = "device/" + String(bambu_serialnr) + "/report"; | ||||
|         topic = "device/" + String(bambu_serialnr); | ||||
|         //request_topic = "device/" + String(bambu_serialnr) + "/request"; | ||||
|         return true; | ||||
|     } | ||||
| @@ -199,7 +226,7 @@ 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()))  | ||||
|     if (client.publish((String(topic) + "/request").c_str(), payload.c_str()))  | ||||
|     { | ||||
|         return true; | ||||
|     } | ||||
| @@ -553,10 +580,11 @@ void reconnect() { | ||||
|         oledShowTopRow(); | ||||
|  | ||||
|         // Attempt to connect | ||||
|         if (client.connect(bambu_serialnr, bambu_username, bambu_accesscode)) { | ||||
|         String clientId = String(bambu_serialnr) + "_" + String(random(0, 100)); | ||||
|         if (client.connect(clientId.c_str(), bambu_username, bambu_accesscode)) { | ||||
|             Serial.println("MQTT re/connected"); | ||||
|  | ||||
|             client.subscribe(report_topic.c_str()); | ||||
|             client.subscribe((String(topic) + "/report").c_str()); | ||||
|             bambu_connected = true; | ||||
|             oledShowTopRow(); | ||||
|         } else { | ||||
| @@ -605,27 +633,25 @@ bool setupMqtt() { | ||||
|     bool success = loadBambuCredentials(); | ||||
|  | ||||
|     if (!success) { | ||||
|         Serial.println("Failed to load Bambu credentials"); | ||||
|         oledShowMessage("Bambu Credentials Missing"); | ||||
|         vTaskDelay(2000 / portTICK_PERIOD_MS); | ||||
|         bambuDisabled = true; | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     if (success && bambu_ip != "" && bambu_accesscode != "" && bambu_serialnr != "")  | ||||
|     { | ||||
|         bambuDisabled = false; | ||||
|         sslClient.setCACert(root_ca); | ||||
|         sslClient.setInsecure(); | ||||
|         client.setServer(bambu_ip, 8883); | ||||
|  | ||||
|         // Verbinden mit dem MQTT-Server | ||||
|         bool connected = true; | ||||
|         if (client.connect(bambu_serialnr, bambu_username, bambu_accesscode))  | ||||
|         String clientId = String(bambu_serialnr) + "_" + String(random(0, 100)); | ||||
|         if (client.connect(clientId.c_str(), bambu_username, bambu_accesscode))  | ||||
|         { | ||||
|             client.setCallback(mqtt_callback); | ||||
|             client.setBufferSize(5120); | ||||
|             // Optional: Topic abonnieren | ||||
|             client.subscribe(report_topic.c_str()); | ||||
|             //client.subscribe(request_topic.c_str()); | ||||
|             client.setBufferSize(15488); | ||||
|             client.subscribe((String(topic) + "/report").c_str()); | ||||
|             Serial.println("MQTT-Client initialisiert"); | ||||
|  | ||||
|             oledShowMessage("Bambu Connected"); | ||||
| @@ -654,10 +680,7 @@ bool setupMqtt() { | ||||
|     }  | ||||
|     else  | ||||
|     { | ||||
|         Serial.println("Fehler: Keine MQTT-Daten vorhanden"); | ||||
|         oledShowMessage("Bambu Credentials Missing"); | ||||
|         oledShowTopRow(); | ||||
|         vTaskDelay(2000 / portTICK_PERIOD_MS); | ||||
|         bambuDisabled = true; | ||||
|         return false; | ||||
|     } | ||||
|     return true; | ||||
|   | ||||
| @@ -30,7 +30,9 @@ extern int ams_count; | ||||
| extern AMSData ams_data[MAX_AMS]; | ||||
| extern bool autoSendToBambu; | ||||
| extern int autoSetToBambuSpoolId; | ||||
| extern bool bambuDisabled; | ||||
|  | ||||
| bool removeBambuCredentials(); | ||||
| bool loadBambuCredentials(); | ||||
| bool saveBambuCredentials(const String& bambu_ip, const String& bambu_serialnr, const String& bambu_accesscode, const bool autoSend, const String& autoSendTime); | ||||
| bool setupMqtt(); | ||||
|   | ||||
| @@ -1,6 +1,20 @@ | ||||
| #include "commonFS.h" | ||||
| #include <LittleFS.h> | ||||
|  | ||||
| bool removeJsonValue(const char* filename) { | ||||
|     File file = LittleFS.open(filename, "r"); | ||||
|     if (!file) { | ||||
|         return true; | ||||
|     } | ||||
|     file.close(); | ||||
|     if (!LittleFS.remove(filename)) { | ||||
|         Serial.print("Fehler beim Löschen der Datei: "); | ||||
|         Serial.println(filename); | ||||
|         return false; | ||||
|     } | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| bool saveJsonValue(const char* filename, const JsonDocument& doc) { | ||||
|     File file = LittleFS.open(filename, "w"); | ||||
|     if (!file) { | ||||
|   | ||||
| @@ -5,6 +5,7 @@ | ||||
| #include <ArduinoJson.h> | ||||
| #include <LittleFS.h> | ||||
|  | ||||
| bool removeJsonValue(const char* filename); | ||||
| bool saveJsonValue(const char* filename, const JsonDocument& doc); | ||||
| bool loadJsonValue(const char* filename, JsonDocument& doc); | ||||
| void initializeFileSystem(); | ||||
|   | ||||
							
								
								
									
										13
									
								
								src/main.cpp
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								src/main.cpp
									
									
									
									
									
								
							| @@ -92,12 +92,19 @@ void loop() { | ||||
|   unsigned long currentMillis = millis(); | ||||
|  | ||||
|   // Überprüfe regelmäßig die WLAN-Verbindung | ||||
|   if (intervalElapsed(currentMillis, lastWifiCheckTime, wifiCheckInterval)) { | ||||
|   if (intervalElapsed(currentMillis, lastWifiCheckTime, wifiCheckInterval))  | ||||
|   { | ||||
|     checkWiFiConnection(); | ||||
|   } | ||||
|  | ||||
|   // Wenn Bambu auto set Spool aktiv | ||||
|   if (autoSendToBambu && autoSetToBambuSpoolId > 0) { | ||||
|   if (autoSendToBambu && autoSetToBambuSpoolId > 0)  | ||||
|   { | ||||
|     if (!bambuDisabled && !bambu_connected)  | ||||
|     { | ||||
|       bambu_restart(); | ||||
|     } | ||||
|  | ||||
|     if (intervalElapsed(currentMillis, lastAutoSetBambuAmsTime, autoSetBambuAmsInterval))  | ||||
|     { | ||||
|       if (hasReadRfidTag == 0) | ||||
| @@ -152,7 +159,7 @@ void loop() { | ||||
|     lastWeightReadTime = currentMillis; | ||||
|  | ||||
|     // Prüfen ob die Waage korrekt genullt ist | ||||
|     if ((weight > 0 && weight < 5) || weight < 0) | ||||
|     if ((weight > 0 && weight < 5) || weight < -1) | ||||
|     { | ||||
|       if(scaleTareCounter < 5) | ||||
|       { | ||||
|   | ||||
| @@ -29,7 +29,7 @@ void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventTyp | ||||
|     if (type == WS_EVT_CONNECT) { | ||||
|         Serial.println("Neuer Client verbunden!"); | ||||
|         // Sende die AMS-Daten an den neuen Client | ||||
|         sendAmsData(client); | ||||
|         if (!bambuDisabled) sendAmsData(client); | ||||
|         sendNfcData(client); | ||||
|         foundNfcTag(client, 0); | ||||
|         sendWriteResult(client, 3); | ||||
| @@ -213,7 +213,10 @@ void setupWebserver(AsyncWebServer &server) { | ||||
|     // Route für RFID | ||||
|     server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ | ||||
|         Serial.println("Anfrage für /rfid erhalten"); | ||||
|         AsyncWebServerResponse *response = request->beginResponse(LittleFS, "/rfid.html.gz", "text/html"); | ||||
|          | ||||
|         String page = (bambuDisabled) ? "/rfid.html.gz" : "/rfid_bambu.html.gz"; | ||||
|         AsyncWebServerResponse *response = request->beginResponse(LittleFS, page, "text/html"); | ||||
|          | ||||
|         response->addHeader("Content-Encoding", "gzip"); | ||||
|         response->addHeader("Cache-Control", CACHE_CONTROL); | ||||
|         request->send(response); | ||||
| @@ -286,6 +289,14 @@ void setupWebserver(AsyncWebServer &server) { | ||||
|         } | ||||
|  | ||||
|         String url = request->getParam("url")->value(); | ||||
|         if (url.indexOf("http://") == -1 && url.indexOf("https://") == -1) { | ||||
|             url = "http://" + url; | ||||
|         } | ||||
|         // Remove trailing slash if exists | ||||
|         if (url.length() > 0 && url.charAt(url.length()-1) == '/') { | ||||
|             url = url.substring(0, url.length()-1); | ||||
|         } | ||||
|          | ||||
|         bool octoEnabled = (request->getParam("octoEnabled")->value() == "true") ? true : false; | ||||
|         String octoUrl = request->getParam("octoUrl")->value(); | ||||
|         String octoToken = (request->getParam("octoToken")->value() != "") ? request->getParam("octoToken")->value() : ""; | ||||
| @@ -300,8 +311,17 @@ void setupWebserver(AsyncWebServer &server) { | ||||
|         request->send(200, "application/json", jsonResponse); | ||||
|     }); | ||||
|  | ||||
|     // Route für das Überprüfen der Spoolman-Instanz | ||||
|     // Route für das Überprüfen der Bambu-Instanz | ||||
|     server.on("/api/bambu", HTTP_GET, [](AsyncWebServerRequest *request){ | ||||
|         if (request->hasParam("remove")) { | ||||
|             if (removeBambuCredentials()) { | ||||
|                 request->send(200, "application/json", "{\"success\": true}"); | ||||
|             } else { | ||||
|                 request->send(500, "application/json", "{\"success\": false, \"error\": \"Fehler beim Löschen der Bambu-Credentials\"}"); | ||||
|             } | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         if (!request->hasParam("bambu_ip") || !request->hasParam("bambu_serialnr") || !request->hasParam("bambu_accesscode")) { | ||||
|             request->send(400, "application/json", "{\"success\": false, \"error\": \"Missing parameter\"}"); | ||||
|             return; | ||||
|   | ||||
| @@ -59,7 +59,7 @@ void initWiFi() { | ||||
|   if(wm_nonblocking) wm.setConfigPortalBlocking(false); | ||||
|   //wm.setConfigPortalTimeout(320); // Portal nach 5min schließen | ||||
|   wm.setWiFiAutoReconnect(true); | ||||
|   wm.setConnectTimeout(5); | ||||
|   wm.setConnectTimeout(10); | ||||
|  | ||||
|   oledShowTopRow(); | ||||
|   oledShowMessage("WiFi Setup"); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user