Compare commits
	
		
			62 Commits
		
	
	
		
			v1.4.2
			...
			9ed3c70c01
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 9ed3c70c01 | |||
| e23f3a2151 | |||
| f73306f0b9 | |||
| a450d4bd1a | |||
| d48d994c00 | |||
| 32bb85f897 | |||
| e9d32ee060 | |||
| aba28422bd | |||
| 4a55620d39 | |||
| 7b18266534 | |||
| d81acb2b61 | |||
| 8c7fc159d3 | |||
| 476d3e82e2 | |||
| 3c294a135f | |||
| bb751b6289 | |||
| 7fd01bd1b9 | |||
| fad84e12c8 | |||
| 696efc4d79 | |||
| 29868e7101 | |||
| 823db6157c | |||
| 458cc4eaf2 | |||
| 83d14b32d1 | |||
| 2bf7c9fb7d | |||
|  | ac8adca84d | ||
|  | c701149c64 | ||
| 07a919b6ba | |||
| 8618b90e33 | |||
| 57723b5354 | |||
| d2be752175 | |||
| 97a050ace8 | |||
| 367e692c74 | |||
| 926a21249b | |||
| 2635c19667 | |||
|  | 6cc4efca0a | ||
| 1484a6b0da | |||
| 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 | 
							
								
								
									
										128
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										128
									
								
								CHANGELOG.md
									
									
									
									
									
								
							| @@ -1,5 +1,133 @@ | |||||||
| # Changelog | # Changelog | ||||||
|  |  | ||||||
|  | ## [1.5.1] - 2025-03-30 | ||||||
|  | ### Changed | ||||||
|  | - update version to 1.5.1 and improve OTA update handling with task management | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ## [1.4.14] - 2025-03-30 | ||||||
|  | ### Added | ||||||
|  | - add auto-tare functionality and update scale handling based on touch sensor connection | ||||||
|  |  | ||||||
|  | ### Changed | ||||||
|  | - update platformio.ini for version v1.4.14 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ## [1.4.13] - 2025-03-30 | ||||||
|  | ### Changed | ||||||
|  | - update platformio.ini for version v1.4.13 | ||||||
|  |  | ||||||
|  | ### Fixed | ||||||
|  | - update touch sensor connection logic to correctly identify connection status | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ## [1.4.12] - 2025-03-30 | ||||||
|  | ### Added | ||||||
|  | - add touch sensor connection check and update logic | ||||||
|  |  | ||||||
|  | ### Changed | ||||||
|  | - update platformio.ini for version v1.4.12 | ||||||
|  | - update README files to clarify PN532 DIP switch settings | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ## [1.4.11] - 2025-03-30 | ||||||
|  | ### Added | ||||||
|  | - Renamed states of NFC state machine and introduced new state machine for spoolman API | ||||||
|  |  | ||||||
|  | ### Changed | ||||||
|  | - update platformio.ini for version v1.4.11 | ||||||
|  | - Merge branch 'main' of github.com:ManuelW77/Filaman | ||||||
|  | - Merge pull request #31 from janecker/nfc_rework | ||||||
|  | - Introducing enum for handling the NFC state to improve code readability | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ## [1.4.10] - 2025-03-30 | ||||||
|  | ### Added | ||||||
|  | - add manual tare functionality for scale | ||||||
|  | - add debounce handling for TTP223 touch sensor | ||||||
|  | - add TTP223 touch sensor support and wiring configuration | ||||||
|  |  | ||||||
|  | ### Changed | ||||||
|  | - update platformio.ini for version v1.4.10 | ||||||
|  |  | ||||||
|  | ### Fixed | ||||||
|  | - update TTP223 pin configuration and adjust touch sensor logic | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ## [1.4.9] - 2025-03-29 | ||||||
|  | ### Changed | ||||||
|  | - update platformio.ini for version v1.4.9 | ||||||
|  |  | ||||||
|  | ### Fixed | ||||||
|  | - enhance HTTP method handling in sendToApi function | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ## [1.4.8] - 2025-03-29 | ||||||
|  | ### Changed | ||||||
|  | - update platformio.ini for version v1.4.8 | ||||||
|  | - Merge pull request #30 from janecker/main | ||||||
|  | - Merge branch 'testing' into main | ||||||
|  |  | ||||||
|  | ### Fixed | ||||||
|  | - improve HTTP client configuration and clear update documents after API calls | ||||||
|  | - Fixes memory leak in HTTPClient by disabling connection reuse | ||||||
|  | - update reload logic after removing and saving Bambu credentials for better cache handling | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ## [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 | ## [1.4.2] - 2025-03-23 | ||||||
| ### Added | ### Added | ||||||
| - add WiFi connection check and restart Bambu if not connected | - add WiFi connection check and restart Bambu if not connected | ||||||
|   | |||||||
							
								
								
									
										31
									
								
								README.de.md
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								README.de.md
									
									
									
									
									
								
							| @@ -55,19 +55,22 @@ Discord Server: [https://discord.gg/my7Gvaxj2v](https://discord.gg/my7Gvaxj2v) | |||||||
| ## Hardware-Anforderungen | ## Hardware-Anforderungen | ||||||
|  |  | ||||||
| ### Komponenten | ### Komponenten | ||||||
| - **ESP32 Entwicklungsboard:** Jede ESP32-Variante. | - **ESP32 Development Board:** Any ESP32 variant. | ||||||
| [Amazon Link](https://amzn.eu/d/aXThslf) | [Amazon Link](https://amzn.to/3FHea6D) | ||||||
| - **HX711 5kg Wägezellen-Verstärker:** Für Gewichtsmessung. | - **HX711 5kg Load Cell Amplifier:** For weight measurement. | ||||||
| [Amazon Link](https://amzn.eu/d/06A0DLb) | [Amazon Link](https://amzn.to/4ja1KTe) | ||||||
| - **OLED 0.96 Zoll I2C weiß/gelb Display:** 128x64 SSD1306. | - **OLED 0.96 Zoll I2C white/yellow Display:** 128x64 SSD1306. | ||||||
| [Amazon Link](https://amzn.eu/d/0AuBp2c) | [Amazon Link](https://amzn.to/445aaa9) | ||||||
| - **PN532 NFC NXP RFID-Modul V3:** Für NFC-Tag-Operationen. | - **PN532 NFC NXP RFID-Modul V3:** For NFC tag operations. | ||||||
| [Amazon Link](https://amzn.eu/d/jfIuQXb) | [Amazon Link](https://amzn.to/4iO6CO4) | ||||||
| - **NFC Tags NTAG213 NTA215:** RFID Tag | - **NFC Tags NTAG213 NTAG215:** RFID Tag | ||||||
| [Amazon Link](https://amzn.eu/d/9Z6mXc1) | [Amazon Link](https://amzn.to/3E071xO) | ||||||
|  | - **TTP223 Touch Sensor (optional):** For reTARE per Button/Touch | ||||||
|  | [Amazon Link](https://amzn.to/4hTChMK) | ||||||
|  |  | ||||||
| ### Pin-Konfiguration |  | ||||||
| | Komponente        | ESP32 Pin | | ### Pin Konfiguration | ||||||
|  | | Component          | ESP32 Pin | | ||||||
| |-------------------|-----------| | |-------------------|-----------| | ||||||
| | HX711 DOUT        | 16        | | | HX711 DOUT        | 16        | | ||||||
| | HX711 SCK         | 17        | | | HX711 SCK         | 17        | | ||||||
| @@ -77,8 +80,10 @@ Discord Server: [https://discord.gg/my7Gvaxj2v](https://discord.gg/my7Gvaxj2v) | |||||||
| | PN532 RESET       | 33        | | | PN532 RESET       | 33        | | ||||||
| | PN532 SDA         | 21        | | | PN532 SDA         | 21        | | ||||||
| | PN532 SCL         | 22        | | | PN532 SCL         | 22        | | ||||||
|  | | TTP223 I/O        | 25        | | ||||||
|  |  | ||||||
| **Achte darauf, dass am PN532 die DIP-Schalter auf I2C gestellt sind** | **!! Achte darauf, dass am PN532 die DIP-Schalter auf I2C gestellt sind**   | ||||||
|  | **Nutze den 3V Pin vom ESP für den Touch Sensor** | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										16
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								README.md
									
									
									
									
									
								
							| @@ -60,15 +60,17 @@ Discord Server: [https://discord.gg/my7Gvaxj2v](https://discord.gg/my7Gvaxj2v) | |||||||
|  |  | ||||||
| ### Components | ### Components | ||||||
| - **ESP32 Development Board:** Any ESP32 variant. | - **ESP32 Development Board:** Any ESP32 variant. | ||||||
| [Amazon Link](https://amzn.eu/d/aXThslf) | [Amazon Link](https://amzn.to/3FHea6D) | ||||||
| - **HX711 5kg Load Cell Amplifier:** For weight measurement. | - **HX711 5kg Load Cell Amplifier:** For weight measurement. | ||||||
| [Amazon Link](https://amzn.eu/d/06A0DLb) | [Amazon Link](https://amzn.to/4ja1KTe) | ||||||
| - **OLED 0.96 Zoll I2C white/yellow Display:** 128x64 SSD1306. | - **OLED 0.96 Zoll I2C white/yellow Display:** 128x64 SSD1306. | ||||||
| [Amazon Link](https://amzn.eu/d/0AuBp2c) | [Amazon Link](https://amzn.to/445aaa9) | ||||||
| - **PN532 NFC NXP RFID-Modul V3:** For NFC tag operations. | - **PN532 NFC NXP RFID-Modul V3:** For NFC tag operations. | ||||||
| [Amazon Link](https://amzn.eu/d/jfIuQXb) | [Amazon Link](https://amzn.to/4iO6CO4) | ||||||
| - **NFC Tags NTAG213 NTAG215:** RFID Tag | - **NFC Tags NTAG213 NTAG215:** RFID Tag | ||||||
| [Amazon Link](https://amzn.eu/d/9Z6mXc1) | [Amazon Link](https://amzn.to/3E071xO) | ||||||
|  | - **TTP223 Touch Sensor (optional):** For reTARE per Button/Touch | ||||||
|  | [Amazon Link](https://amzn.to/4hTChMK) | ||||||
|  |  | ||||||
|  |  | ||||||
| ### Pin Configuration | ### Pin Configuration | ||||||
| @@ -82,8 +84,10 @@ Discord Server: [https://discord.gg/my7Gvaxj2v](https://discord.gg/my7Gvaxj2v) | |||||||
| | PN532 RESET       | 33        | | | PN532 RESET       | 33        | | ||||||
| | PN532 SDA         | 21        | | | PN532 SDA         | 21        | | ||||||
| | PN532 SCL         | 22        | | | PN532 SCL         | 22        | | ||||||
|  | | TTP223 I/O        | 25        | | ||||||
|  |  | ||||||
| **Make sure that the DIP switches on the PN532 are set to I2C** | **!! Make sure that the DIP switches on the PN532 are set to I2C**   | ||||||
|  | **Use the 3V pin from the ESP for the touch sensor** | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -141,15 +141,6 @@ | |||||||
|             </div> |             </div> | ||||||
|         </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> | ||||||
| </div> | </div> | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										14
									
								
								html/rfid.js
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								html/rfid.js
									
									
									
									
									
								
							| @@ -11,7 +11,7 @@ let reconnectTimer = null; | |||||||
| // WebSocket Funktionen | // WebSocket Funktionen | ||||||
| function startHeartbeat() { | function startHeartbeat() { | ||||||
|     if (heartbeatTimer) clearInterval(heartbeatTimer); |     if (heartbeatTimer) clearInterval(heartbeatTimer); | ||||||
|      |  | ||||||
|     heartbeatTimer = setInterval(() => { |     heartbeatTimer = setInterval(() => { | ||||||
|         // Prüfe ob zu lange keine Antwort kam |         // Prüfe ob zu lange keine Antwort kam | ||||||
|         if (Date.now() - lastHeartbeatResponse > HEARTBEAT_TIMEOUT) { |         if (Date.now() - lastHeartbeatResponse > HEARTBEAT_TIMEOUT) { | ||||||
| @@ -29,7 +29,7 @@ function startHeartbeat() { | |||||||
|             updateConnectionStatus(); |             updateConnectionStatus(); | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|          |  | ||||||
|         try { |         try { | ||||||
|             // Sende Heartbeat |             // Sende Heartbeat | ||||||
|             socket.send(JSON.stringify({ type: 'heartbeat' })); |             socket.send(JSON.stringify({ type: 'heartbeat' })); | ||||||
| @@ -83,7 +83,7 @@ function initWebSocket() { | |||||||
|             isConnected = false; |             isConnected = false; | ||||||
|             updateConnectionStatus(); |             updateConnectionStatus(); | ||||||
|             if (heartbeatTimer) clearInterval(heartbeatTimer); |             if (heartbeatTimer) clearInterval(heartbeatTimer); | ||||||
|              |  | ||||||
|             // Bei Fehler Verbindung schließen und neu aufbauen |             // Bei Fehler Verbindung schließen und neu aufbauen | ||||||
|             if (socket) { |             if (socket) { | ||||||
|                 socket.close(); |                 socket.close(); | ||||||
| @@ -109,7 +109,7 @@ function initWebSocket() { | |||||||
|                 const bambuDot = document.getElementById('bambuDot'); |                 const bambuDot = document.getElementById('bambuDot'); | ||||||
|                 const spoolmanDot = document.getElementById('spoolmanDot'); |                 const spoolmanDot = document.getElementById('spoolmanDot'); | ||||||
|                 const ramStatus = document.getElementById('ramStatus'); |                 const ramStatus = document.getElementById('ramStatus'); | ||||||
|                  |  | ||||||
|                 if (bambuDot) { |                 if (bambuDot) { | ||||||
|                     bambuDot.className = 'status-dot ' + (data.bambu_connected ? 'online' : 'offline'); |                     bambuDot.className = 'status-dot ' + (data.bambu_connected ? 'online' : 'offline'); | ||||||
|                     // Add click handler only when offline |                     // Add click handler only when offline | ||||||
| @@ -208,7 +208,7 @@ document.addEventListener('spoolmanError', function(event) { | |||||||
|     showNotification(`Spoolman Error: ${event.detail.message}`, false); |     showNotification(`Spoolman Error: ${event.detail.message}`, false); | ||||||
| }); | }); | ||||||
|  |  | ||||||
| document.addEventListener('filamentSelected', function(event) { | document.addEventListener('filamentSelected', function (event) { | ||||||
|     updateNfcInfo(); |     updateNfcInfo(); | ||||||
|     // Zeige Spool-Buttons wenn ein Filament ausgewählt wurde |     // Zeige Spool-Buttons wenn ein Filament ausgewählt wurde | ||||||
|     const selectedText = document.getElementById("selected-filament").textContent; |     const selectedText = document.getElementById("selected-filament").textContent; | ||||||
| @@ -490,7 +490,7 @@ function handleSpoolIn(amsId, trayId) { | |||||||
|             nozzle_temp_max: parseInt(maxTemp), |             nozzle_temp_max: parseInt(maxTemp), | ||||||
|             type: selectedSpool.filament.material, |             type: selectedSpool.filament.material, | ||||||
|             brand: selectedSpool.filament.vendor.name, |             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 |             cali_idx: "-1"  // Default-Wert setzen | ||||||
|         } |         } | ||||||
|     }; |     }; | ||||||
| @@ -686,4 +686,4 @@ function showNotification(message, isSuccess) { | |||||||
|             notification.remove(); |             notification.remove(); | ||||||
|         }, 300); |         }, 300); | ||||||
|     }, 3000); |     }, 3000); | ||||||
| } | } | ||||||
							
								
								
									
										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(); |             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.reload(true); | ||||||
|  |                             window.location.href = '/'; | ||||||
|  |                         }, 1500); | ||||||
|  |                     } else { | ||||||
|  |                         document.getElementById('bambuStatusMessage').innerText = 'Error while removing Bambu Credentials.'; | ||||||
|  |                     } | ||||||
|  |                 }) | ||||||
|  |                 .catch(error => { | ||||||
|  |                     document.getElementById('bambuStatusMessage').innerText = 'Error while removing: ' + error.message; | ||||||
|  |                 }); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         function checkSpoolmanInstance() { |         function checkSpoolmanInstance() { | ||||||
|             const url = document.getElementById('spoolmanUrl').value; |             const url = document.getElementById('spoolmanUrl').value; | ||||||
|             const spoolmanOctoEnabled = document.getElementById('spoolmanOctoEnabled').checked; |             const spoolmanOctoEnabled = document.getElementById('spoolmanOctoEnabled').checked; | ||||||
| @@ -89,6 +114,11 @@ | |||||||
|                 .then(data => { |                 .then(data => { | ||||||
|                     if (data.healthy) { |                     if (data.healthy) { | ||||||
|                         document.getElementById('bambuStatusMessage').innerText = 'Bambu Credentials saved!'; |                         document.getElementById('bambuStatusMessage').innerText = 'Bambu Credentials saved!'; | ||||||
|  |                         // Reload with forced cache refresh after short delay | ||||||
|  |                         setTimeout(() => { | ||||||
|  |                             window.location.reload(true); | ||||||
|  |                             window.location.href = '/'; | ||||||
|  |                         }, 1500); | ||||||
|                     } else { |                     } else { | ||||||
|                         document.getElementById('bambuStatusMessage').innerText = 'Error while saving Bambu Credentials.'; |                         document.getElementById('bambuStatusMessage').innerText = 'Error while saving Bambu Credentials.'; | ||||||
|                     } |                     } | ||||||
| @@ -162,6 +192,7 @@ | |||||||
|                     </div> |                     </div> | ||||||
|  |  | ||||||
|                     <button style="margin: 0;" onclick="saveBambuCredentials()">Save Bambu Credentials</button> |                     <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> |                     <p id="bambuStatusMessage"></p> | ||||||
|                 </div> |                 </div> | ||||||
|             </div> |             </div> | ||||||
|   | |||||||
| @@ -147,6 +147,13 @@ function updateFilamentDropdown(selectedSmId = null) { | |||||||
|  |  | ||||||
|     if (vendorId) { |     if (vendorId) { | ||||||
|         const filteredFilaments = spoolsData.filter(spool => { |         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 &&  |             const hasValidNfcId = spool.extra &&  | ||||||
|                                  spool.extra.nfc_id &&  |                                  spool.extra.nfc_id &&  | ||||||
|                                  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 | // Event Listener | ||||||
| document.addEventListener('DOMContentLoaded', () => { | document.addEventListener('DOMContentLoaded', () => { | ||||||
|     initSpoolman(); |     initSpoolman(); | ||||||
|   | |||||||
| @@ -55,6 +55,7 @@ | |||||||
|                 <h5 class="card-title">Sacle Calibration</h5> |                 <h5 class="card-title">Sacle Calibration</h5> | ||||||
|                 <button id="calibrateBtn" class="btn btn-primary">Calibrate Scale</button> |                 <button id="calibrateBtn" class="btn btn-primary">Calibrate Scale</button> | ||||||
|                 <button id="tareBtn" class="btn btn-secondary">Tare Scale</button> |                 <button id="tareBtn" class="btn btn-secondary">Tare Scale</button> | ||||||
|  |                    Enable Auto-TARE <input type="checkbox" id="autoTareCheckbox" onchange="setAutoTare(this.checked);" {{autoTare}}> | ||||||
|                 <div id="statusMessage" class="mt-3"></div> |                 <div id="statusMessage" class="mt-3"></div> | ||||||
|             </div> |             </div> | ||||||
|         </div> |         </div> | ||||||
| @@ -140,6 +141,15 @@ | |||||||
|             })); |             })); | ||||||
|         }); |         }); | ||||||
|  |  | ||||||
|  |         // Add auto-tare function | ||||||
|  |         function setAutoTare(enabled) { | ||||||
|  |             ws.send(JSON.stringify({ | ||||||
|  |                 type: 'scale', | ||||||
|  |                 payload: 'setAutoTare', | ||||||
|  |                 enabled: enabled | ||||||
|  |             })); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         // WebSocket-Verbindung beim Laden der Seite initiieren |         // WebSocket-Verbindung beim Laden der Seite initiieren | ||||||
|         connectWebSocket(); |         connectWebSocket(); | ||||||
|     </script> |     </script> | ||||||
|   | |||||||
| @@ -9,8 +9,8 @@ | |||||||
| ; https://docs.platformio.org/page/projectconf.html | ; https://docs.platformio.org/page/projectconf.html | ||||||
|  |  | ||||||
| [common] | [common] | ||||||
| version = "1.4.2" | version = "1.5.1" | ||||||
| to_old_version = "1.4.0" | to_old_version = "1.5.0" | ||||||
|  |  | ||||||
| ## | ## | ||||||
| [env:esp32dev] | [env:esp32dev] | ||||||
|   | |||||||
| @@ -14,7 +14,7 @@ def copy_file(input_file, output_file): | |||||||
|  |  | ||||||
| def should_compress(file): | def should_compress(file): | ||||||
|      # Skip compression for spoolman.html |      # Skip compression for spoolman.html | ||||||
|     if file == 'spoolman.html': |     if file == 'spoolman.html' or file == 'waage.html': | ||||||
|         return False |         return False | ||||||
|     # Komprimiere nur bestimmte Dateitypen |     # Komprimiere nur bestimmte Dateitypen | ||||||
|     return file.endswith(('.js', '.png', '.css', '.html')) |     return file.endswith(('.js', '.png', '.css', '.html')) | ||||||
|   | |||||||
							
								
								
									
										22
									
								
								src/api.cpp
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								src/api.cpp
									
									
									
									
									
								
							| @@ -3,7 +3,8 @@ | |||||||
| #include <ArduinoJson.h> | #include <ArduinoJson.h> | ||||||
| #include "commonFS.h" | #include "commonFS.h" | ||||||
|  |  | ||||||
| bool spoolman_connected = false; | volatile spoolmanApiStateType spoolmanApiState = API_INIT; | ||||||
|  | //bool spoolman_connected = false; | ||||||
| String spoolmanUrl = ""; | String spoolmanUrl = ""; | ||||||
| bool octoEnabled = false; | bool octoEnabled = false; | ||||||
| String octoUrl = ""; | String octoUrl = ""; | ||||||
| @@ -85,6 +86,7 @@ JsonDocument fetchSingleSpoolInfo(int spoolId) { | |||||||
| } | } | ||||||
|  |  | ||||||
| void sendToApi(void *parameter) { | void sendToApi(void *parameter) { | ||||||
|  |     spoolmanApiState = API_TRANSMITTING; | ||||||
|     SendToApiParams* params = (SendToApiParams*)parameter; |     SendToApiParams* params = (SendToApiParams*)parameter; | ||||||
|  |  | ||||||
|     // Extrahiere die Werte |     // Extrahiere die Werte | ||||||
| @@ -94,13 +96,16 @@ void sendToApi(void *parameter) { | |||||||
|     String octoToken = params->octoToken;     |     String octoToken = params->octoToken;     | ||||||
|  |  | ||||||
|     HTTPClient http; |     HTTPClient http; | ||||||
|  |     http.setReuse(false); | ||||||
|  |  | ||||||
|     http.begin(spoolsUrl); |     http.begin(spoolsUrl); | ||||||
|     http.addHeader("Content-Type", "application/json"); |     http.addHeader("Content-Type", "application/json"); | ||||||
|     if (octoEnabled && octoToken != "") http.addHeader("X-Api-Key", octoToken); |     if (octoEnabled && octoToken != "") http.addHeader("X-Api-Key", octoToken); | ||||||
|  |  | ||||||
|     int httpCode = http.PUT(updatePayload); |     int httpCode; | ||||||
|     if (httpType == "PATCH") httpCode = http.PATCH(updatePayload); |     if (httpType == "PATCH") httpCode = http.PATCH(updatePayload); | ||||||
|     if (httpType == "POST") httpCode = http.POST(updatePayload); |     else if (httpType == "POST") httpCode = http.POST(updatePayload); | ||||||
|  |     else httpCode = http.PUT(updatePayload); | ||||||
|  |  | ||||||
|     if (httpCode == HTTP_CODE_OK) { |     if (httpCode == HTTP_CODE_OK) { | ||||||
|         Serial.println("Spoolman erfolgreich aktualisiert"); |         Serial.println("Spoolman erfolgreich aktualisiert"); | ||||||
| @@ -111,10 +116,12 @@ void sendToApi(void *parameter) { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     http.end(); |     http.end(); | ||||||
|  |     vTaskDelay(50 / portTICK_PERIOD_MS); | ||||||
|  |  | ||||||
|     // Speicher freigeben |     // Speicher freigeben | ||||||
|     delete params; |     delete params; | ||||||
|     vTaskDelete(NULL); |     vTaskDelete(NULL); | ||||||
|  |     spoolmanApiState = API_IDLE; | ||||||
| } | } | ||||||
|  |  | ||||||
| bool updateSpoolTagId(String uidString, const char* payload) { | bool updateSpoolTagId(String uidString, const char* payload) { | ||||||
| @@ -165,6 +172,8 @@ bool updateSpoolTagId(String uidString, const char* payload) { | |||||||
|         NULL                      // Task-Handle (nicht benötigt) |         NULL                      // Task-Handle (nicht benötigt) | ||||||
|     ); |     ); | ||||||
|  |  | ||||||
|  |     updateDoc.clear(); | ||||||
|  |  | ||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -201,6 +210,8 @@ uint8_t updateSpoolWeight(String spoolId, uint16_t weight) { | |||||||
|         NULL                      // Task-Handle (nicht benötigt) |         NULL                      // Task-Handle (nicht benötigt) | ||||||
|     ); |     ); | ||||||
|  |  | ||||||
|  |     updateDoc.clear(); | ||||||
|  |  | ||||||
|     return 1; |     return 1; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -238,6 +249,8 @@ bool updateSpoolOcto(int spoolId) { | |||||||
|         NULL                      // Task-Handle (nicht benötigt) |         NULL                      // Task-Handle (nicht benötigt) | ||||||
|     ); |     ); | ||||||
|  |  | ||||||
|  |     updateDoc.clear(); | ||||||
|  |  | ||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -469,7 +482,8 @@ bool checkSpoolmanInstance(const String& url) { | |||||||
|                     return false; |                     return false; | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 spoolman_connected = true; |                 spoolmanApiState = API_IDLE; | ||||||
|  |                 oledShowTopRow(); | ||||||
|                 return strcmp(status, "healthy") == 0; |                 return strcmp(status, "healthy") == 0; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -6,7 +6,13 @@ | |||||||
| #include "website.h" | #include "website.h" | ||||||
| #include "display.h" | #include "display.h" | ||||||
| #include <ArduinoJson.h> | #include <ArduinoJson.h> | ||||||
|  | typedef enum { | ||||||
|  |     API_INIT, | ||||||
|  |     API_IDLE, | ||||||
|  |     API_TRANSMITTING | ||||||
|  | } spoolmanApiStateType; | ||||||
|  |  | ||||||
|  | extern volatile spoolmanApiStateType spoolmanApiState; | ||||||
| extern bool spoolman_connected; | extern bool spoolman_connected; | ||||||
| extern String spoolmanUrl; | extern String spoolmanUrl; | ||||||
| extern bool octoEnabled; | extern bool octoEnabled; | ||||||
|   | |||||||
| @@ -17,7 +17,7 @@ PubSubClient client(sslClient); | |||||||
|  |  | ||||||
| TaskHandle_t BambuMqttTask; | TaskHandle_t BambuMqttTask; | ||||||
|  |  | ||||||
| String report_topic = ""; | String topic = ""; | ||||||
| //String request_topic = ""; | //String request_topic = ""; | ||||||
| const char* bambu_username = "bblp"; | const char* bambu_username = "bblp"; | ||||||
| const char* bambu_ip = nullptr; | const char* bambu_ip = nullptr; | ||||||
| @@ -27,6 +27,7 @@ const char* bambu_serialnr = nullptr; | |||||||
| String g_bambu_ip = ""; | String g_bambu_ip = ""; | ||||||
| String g_bambu_accesscode = ""; | String g_bambu_accesscode = ""; | ||||||
| String g_bambu_serialnr = ""; | String g_bambu_serialnr = ""; | ||||||
|  | bool bambuDisabled = false; | ||||||
|  |  | ||||||
| bool bambu_connected = false; | bool bambu_connected = false; | ||||||
| bool autoSendToBambu = false; | bool autoSendToBambu = false; | ||||||
| @@ -37,6 +38,32 @@ int ams_count = 0; | |||||||
| String amsJsonData;  // Speichert das fertige JSON für WebSocket-Clients | String amsJsonData;  // Speichert das fertige JSON für WebSocket-Clients | ||||||
| AMSData ams_data[MAX_AMS];  // Definition des Arrays; | 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) { | bool saveBambuCredentials(const String& ip, const String& serialnr, const String& accesscode, bool autoSend, const String& autoSendTime) { | ||||||
|     if (BambuMqttTask) { |     if (BambuMqttTask) { | ||||||
|         vTaskDelete(BambuMqttTask); |         vTaskDelete(BambuMqttTask); | ||||||
| @@ -91,7 +118,7 @@ bool loadBambuCredentials() { | |||||||
|         bambu_accesscode = g_bambu_accesscode.c_str(); |         bambu_accesscode = g_bambu_accesscode.c_str(); | ||||||
|         bambu_serialnr = g_bambu_serialnr.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"; |         //request_topic = "device/" + String(bambu_serialnr) + "/request"; | ||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
| @@ -199,7 +226,7 @@ FilamentResult findFilamentIdx(String brand, String type) { | |||||||
| bool sendMqttMessage(const String& payload) { | bool sendMqttMessage(const String& payload) { | ||||||
|     Serial.println("Sending MQTT message"); |     Serial.println("Sending MQTT message"); | ||||||
|     Serial.println(payload); |     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; |         return true; | ||||||
|     } |     } | ||||||
| @@ -557,7 +584,7 @@ void reconnect() { | |||||||
|         if (client.connect(clientId.c_str(), bambu_username, bambu_accesscode)) { |         if (client.connect(clientId.c_str(), bambu_username, bambu_accesscode)) { | ||||||
|             Serial.println("MQTT re/connected"); |             Serial.println("MQTT re/connected"); | ||||||
|  |  | ||||||
|             client.subscribe(report_topic.c_str()); |             client.subscribe((String(topic) + "/report").c_str()); | ||||||
|             bambu_connected = true; |             bambu_connected = true; | ||||||
|             oledShowTopRow(); |             oledShowTopRow(); | ||||||
|         } else { |         } else { | ||||||
| @@ -606,14 +633,13 @@ bool setupMqtt() { | |||||||
|     bool success = loadBambuCredentials(); |     bool success = loadBambuCredentials(); | ||||||
|  |  | ||||||
|     if (!success) { |     if (!success) { | ||||||
|         Serial.println("Failed to load Bambu credentials"); |         bambuDisabled = true; | ||||||
|         oledShowMessage("Bambu Credentials Missing"); |  | ||||||
|         vTaskDelay(2000 / portTICK_PERIOD_MS); |  | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (success && bambu_ip != "" && bambu_accesscode != "" && bambu_serialnr != "")  |     if (success && bambu_ip != "" && bambu_accesscode != "" && bambu_serialnr != "")  | ||||||
|     { |     { | ||||||
|  |         bambuDisabled = false; | ||||||
|         sslClient.setCACert(root_ca); |         sslClient.setCACert(root_ca); | ||||||
|         sslClient.setInsecure(); |         sslClient.setInsecure(); | ||||||
|         client.setServer(bambu_ip, 8883); |         client.setServer(bambu_ip, 8883); | ||||||
| @@ -624,9 +650,8 @@ bool setupMqtt() { | |||||||
|         if (client.connect(clientId.c_str(), bambu_username, bambu_accesscode))  |         if (client.connect(clientId.c_str(), bambu_username, bambu_accesscode))  | ||||||
|         { |         { | ||||||
|             client.setCallback(mqtt_callback); |             client.setCallback(mqtt_callback); | ||||||
|             client.setBufferSize(5120); |             client.setBufferSize(15488); | ||||||
|             client.subscribe(report_topic.c_str()); |             client.subscribe((String(topic) + "/report").c_str()); | ||||||
|             //client.subscribe(request_topic.c_str()); |  | ||||||
|             Serial.println("MQTT-Client initialisiert"); |             Serial.println("MQTT-Client initialisiert"); | ||||||
|  |  | ||||||
|             oledShowMessage("Bambu Connected"); |             oledShowMessage("Bambu Connected"); | ||||||
| @@ -636,7 +661,7 @@ bool setupMqtt() { | |||||||
|             xTaskCreatePinnedToCore( |             xTaskCreatePinnedToCore( | ||||||
|                 mqtt_loop, /* Function to implement the task */ |                 mqtt_loop, /* Function to implement the task */ | ||||||
|                 "BambuMqtt", /* Name of the task */ |                 "BambuMqtt", /* Name of the task */ | ||||||
|                 10240,  /* Stack size in words */ |                 8192,  /* Stack size in words */ | ||||||
|                 NULL,  /* Task input parameter */ |                 NULL,  /* Task input parameter */ | ||||||
|                 mqttTaskPrio,  /* Priority of the task */ |                 mqttTaskPrio,  /* Priority of the task */ | ||||||
|                 &BambuMqttTask,  /* Task handle. */ |                 &BambuMqttTask,  /* Task handle. */ | ||||||
| @@ -655,10 +680,7 @@ bool setupMqtt() { | |||||||
|     }  |     }  | ||||||
|     else  |     else  | ||||||
|     { |     { | ||||||
|         Serial.println("Fehler: Keine MQTT-Daten vorhanden"); |         bambuDisabled = true; | ||||||
|         oledShowMessage("Bambu Credentials Missing"); |  | ||||||
|         oledShowTopRow(); |  | ||||||
|         vTaskDelay(2000 / portTICK_PERIOD_MS); |  | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|     return true; |     return true; | ||||||
|   | |||||||
| @@ -30,7 +30,9 @@ extern int ams_count; | |||||||
| extern AMSData ams_data[MAX_AMS]; | extern AMSData ams_data[MAX_AMS]; | ||||||
| extern bool autoSendToBambu; | extern bool autoSendToBambu; | ||||||
| extern int autoSetToBambuSpoolId; | extern int autoSetToBambuSpoolId; | ||||||
|  | extern bool bambuDisabled; | ||||||
|  |  | ||||||
|  | bool removeBambuCredentials(); | ||||||
| bool loadBambuCredentials(); | bool loadBambuCredentials(); | ||||||
| bool saveBambuCredentials(const String& bambu_ip, const String& bambu_serialnr, const String& bambu_accesscode, const bool autoSend, const String& autoSendTime); | bool saveBambuCredentials(const String& bambu_ip, const String& bambu_serialnr, const String& bambu_accesscode, const bool autoSend, const String& autoSendTime); | ||||||
| bool setupMqtt(); | bool setupMqtt(); | ||||||
|   | |||||||
| @@ -1,6 +1,20 @@ | |||||||
| #include "commonFS.h" | #include "commonFS.h" | ||||||
| #include <LittleFS.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) { | bool saveJsonValue(const char* filename, const JsonDocument& doc) { | ||||||
|     File file = LittleFS.open(filename, "w"); |     File file = LittleFS.open(filename, "w"); | ||||||
|     if (!file) { |     if (!file) { | ||||||
|   | |||||||
| @@ -5,6 +5,7 @@ | |||||||
| #include <ArduinoJson.h> | #include <ArduinoJson.h> | ||||||
| #include <LittleFS.h> | #include <LittleFS.h> | ||||||
|  |  | ||||||
|  | bool removeJsonValue(const char* filename); | ||||||
| bool saveJsonValue(const char* filename, const JsonDocument& doc); | bool saveJsonValue(const char* filename, const JsonDocument& doc); | ||||||
| bool loadJsonValue(const char* filename, JsonDocument& doc); | bool loadJsonValue(const char* filename, JsonDocument& doc); | ||||||
| void initializeFileSystem(); | void initializeFileSystem(); | ||||||
|   | |||||||
| @@ -19,6 +19,12 @@ const uint16_t SCALE_LEVEL_WEIGHT = 500; | |||||||
| uint16_t defaultScaleCalibrationValue = 430; | uint16_t defaultScaleCalibrationValue = 430; | ||||||
| // ***** HX711 | // ***** HX711 | ||||||
|  |  | ||||||
|  | // ***** TTP223 (Touch Sensor) | ||||||
|  | // TTP223 circuit wiring | ||||||
|  | const uint8_t TTP223_PIN = 25; | ||||||
|  | // ***** TTP223 | ||||||
|  |  | ||||||
|  |  | ||||||
| // ***** Display | // ***** Display | ||||||
| // Declaration for an SSD1306 display connected to I2C (SDA, SCL pins) | // Declaration for an SSD1306 display connected to I2C (SDA, SCL pins) | ||||||
| // On an ESP32:   21(SDA),  22(SCL) | // On an ESP32:   21(SDA),  22(SCL) | ||||||
|   | |||||||
| @@ -11,6 +11,8 @@ extern const uint8_t LOADCELL_SCK_PIN; | |||||||
| extern const uint8_t calVal_eepromAdress; | extern const uint8_t calVal_eepromAdress; | ||||||
| extern const uint16_t SCALE_LEVEL_WEIGHT; | extern const uint16_t SCALE_LEVEL_WEIGHT; | ||||||
|  |  | ||||||
|  | extern const uint8_t TTP223_PIN; | ||||||
|  |  | ||||||
| extern const int8_t OLED_RESET; | extern const int8_t OLED_RESET; | ||||||
| extern const uint8_t SCREEN_ADDRESS; | extern const uint8_t SCREEN_ADDRESS; | ||||||
| extern const uint8_t SCREEN_WIDTH; | extern const uint8_t SCREEN_WIDTH; | ||||||
|   | |||||||
| @@ -177,7 +177,7 @@ void oledShowTopRow() { | |||||||
|         display.drawBitmap(50, 0, bitmap_off , 16, 16, WHITE); |         display.drawBitmap(50, 0, bitmap_off , 16, 16, WHITE); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (spoolman_connected == 1) { |     if (spoolmanApiState != API_INIT) { | ||||||
|         display.drawBitmap(80, 0, bitmap_spoolman_on , 16, 16, WHITE); |         display.drawBitmap(80, 0, bitmap_spoolman_on , 16, 16, WHITE); | ||||||
|     } else { |     } else { | ||||||
|         display.drawBitmap(80, 0, bitmap_off , 16, 16, WHITE); |         display.drawBitmap(80, 0, bitmap_off , 16, 16, WHITE); | ||||||
|   | |||||||
							
								
								
									
										55
									
								
								src/main.cpp
									
									
									
									
									
								
							
							
						
						
									
										55
									
								
								src/main.cpp
									
									
									
									
									
								
							| @@ -15,6 +15,7 @@ | |||||||
|  |  | ||||||
| bool mainTaskWasPaused = 0; | bool mainTaskWasPaused = 0; | ||||||
| uint8_t scaleTareCounter = 0; | uint8_t scaleTareCounter = 0; | ||||||
|  | bool touchSensorConnected = false; | ||||||
|  |  | ||||||
| // ##### SETUP ##### | // ##### SETUP ##### | ||||||
| void setup() { | void setup() { | ||||||
| @@ -39,7 +40,6 @@ void setup() { | |||||||
|   setupWebserver(server); |   setupWebserver(server); | ||||||
|  |  | ||||||
|   // Spoolman API |   // Spoolman API | ||||||
|   // api.cpp |  | ||||||
|   initSpoolman(); |   initSpoolman(); | ||||||
|  |  | ||||||
|   // Bambu MQTT |   // Bambu MQTT | ||||||
| @@ -48,7 +48,16 @@ void setup() { | |||||||
|   // NFC Reader |   // NFC Reader | ||||||
|   startNfc(); |   startNfc(); | ||||||
|  |  | ||||||
|   start_scale(); |   // Touch Sensor | ||||||
|  |   pinMode(TTP223_PIN, INPUT_PULLUP); | ||||||
|  |   if (digitalRead(TTP223_PIN) == LOW)  | ||||||
|  |   { | ||||||
|  |     Serial.println("Touch Sensor is connected"); | ||||||
|  |     touchSensorConnected = true; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   // Scale | ||||||
|  |   start_scale(touchSensorConnected); | ||||||
|  |  | ||||||
|   // WDT initialisieren mit 10 Sekunden Timeout |   // WDT initialisieren mit 10 Sekunden Timeout | ||||||
|   bool panic = true; // Wenn true, löst ein WDT-Timeout einen System-Panik aus |   bool panic = true; // Wenn true, löst ein WDT-Timeout einen System-Panik aus | ||||||
| @@ -84,13 +93,25 @@ uint8_t autoAmsCounter = 0; | |||||||
| uint8_t weightSend = 0; | uint8_t weightSend = 0; | ||||||
| int16_t lastWeight = 0; | int16_t lastWeight = 0; | ||||||
|  |  | ||||||
|  | // WIFI check variables | ||||||
| unsigned long lastWifiCheckTime = 0; | unsigned long lastWifiCheckTime = 0; | ||||||
| const unsigned long wifiCheckInterval = 60000; // Überprüfe alle 60 Sekunden (60000 ms) | const unsigned long wifiCheckInterval = 60000; // Überprüfe alle 60 Sekunden (60000 ms) | ||||||
|  |  | ||||||
|  | // Button debounce variables | ||||||
|  | unsigned long lastButtonPress = 0; | ||||||
|  | const unsigned long debounceDelay = 500; // 500 ms debounce delay | ||||||
|  |  | ||||||
| // ##### PROGRAM START ##### | // ##### PROGRAM START ##### | ||||||
| void loop() { | void loop() { | ||||||
|   unsigned long currentMillis = millis(); |   unsigned long currentMillis = millis(); | ||||||
|  |  | ||||||
|  |   // Überprüfe den Status des Touch Sensors | ||||||
|  |   if (touchSensorConnected && digitalRead(TTP223_PIN) == HIGH && currentMillis - lastButtonPress > debounceDelay)  | ||||||
|  |   { | ||||||
|  |     lastButtonPress = currentMillis; | ||||||
|  |     scaleTareRequest = true; | ||||||
|  |   } | ||||||
|  |  | ||||||
|   // Überprüfe regelmäßig die WLAN-Verbindung |   // Überprüfe regelmäßig die WLAN-Verbindung | ||||||
|   if (intervalElapsed(currentMillis, lastWifiCheckTime, wifiCheckInterval))  |   if (intervalElapsed(currentMillis, lastWifiCheckTime, wifiCheckInterval))  | ||||||
|   { |   { | ||||||
| @@ -100,14 +121,14 @@ void loop() { | |||||||
|   // Wenn Bambu auto set Spool aktiv |   // Wenn Bambu auto set Spool aktiv | ||||||
|   if (autoSendToBambu && autoSetToBambuSpoolId > 0)  |   if (autoSendToBambu && autoSetToBambuSpoolId > 0)  | ||||||
|   { |   { | ||||||
|     if (!bambu_connected)  |     if (!bambuDisabled && !bambu_connected)  | ||||||
|     { |     { | ||||||
|       bambu_restart(); |       bambu_restart(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (intervalElapsed(currentMillis, lastAutoSetBambuAmsTime, autoSetBambuAmsInterval))  |     if (intervalElapsed(currentMillis, lastAutoSetBambuAmsTime, autoSetBambuAmsInterval))  | ||||||
|     { |     { | ||||||
|       if (hasReadRfidTag == 0) |       if (nfcReaderState == NFC_IDLE) | ||||||
|       { |       { | ||||||
|         lastAutoSetBambuAmsTime = currentMillis; |         lastAutoSetBambuAmsTime = currentMillis; | ||||||
|         oledShowMessage("Auto Set         " + String(autoSetBambuAmsCounter - autoAmsCounter) + "s"); |         oledShowMessage("Auto Set         " + String(autoSetBambuAmsCounter - autoAmsCounter) + "s"); | ||||||
| @@ -141,7 +162,7 @@ void loop() { | |||||||
|   // Ausgabe der Waage auf Display |   // Ausgabe der Waage auf Display | ||||||
|   if(pauseMainTask == 0) |   if(pauseMainTask == 0) | ||||||
|   { |   { | ||||||
|     if (mainTaskWasPaused || (weight != lastWeight && hasReadRfidTag == 0 && (!autoSendToBambu || autoSetToBambuSpoolId == 0))) |     if (mainTaskWasPaused || (weight != lastWeight && nfcReaderState == NFC_IDLE && (!autoSendToBambu || autoSetToBambuSpoolId == 0))) | ||||||
|     { |     { | ||||||
|       (weight < 2) ? ((weight < -2) ? oledShowMessage("!! -0") : oledShowWeight(0)) : oledShowWeight(weight); |       (weight < 2) ? ((weight < -2) ? oledShowMessage("!! -0") : oledShowWeight(0)) : oledShowWeight(weight); | ||||||
|     } |     } | ||||||
| @@ -154,31 +175,22 @@ void loop() { | |||||||
|  |  | ||||||
|  |  | ||||||
|   // Wenn Timer abgelaufen und nicht gerade ein RFID-Tag geschrieben wird |   // Wenn Timer abgelaufen und nicht gerade ein RFID-Tag geschrieben wird | ||||||
|   if (currentMillis - lastWeightReadTime >= weightReadInterval && hasReadRfidTag < 3) |   if (currentMillis - lastWeightReadTime >= weightReadInterval && nfcReaderState < NFC_WRITING) | ||||||
|   { |   { | ||||||
|     lastWeightReadTime = currentMillis; |     lastWeightReadTime = currentMillis; | ||||||
|  |  | ||||||
|     // Prüfen ob die Waage korrekt genullt ist |     // Prüfen ob die Waage korrekt genullt ist | ||||||
|     if ((weight > 0 && weight < 5) || weight < 0) |     if (autoTare && (weight > 0 && weight < 5) || weight < 0) | ||||||
|     { |     { | ||||||
|       if(scaleTareCounter < 5) |       scale_tare_counter++; | ||||||
|       { |  | ||||||
|         scaleTareCounter++; |  | ||||||
|       } |  | ||||||
|       else |  | ||||||
|       { |  | ||||||
|         scaleTareRequest = true; |  | ||||||
|         scaleTareCounter = 0; |  | ||||||
|       } |  | ||||||
|        |  | ||||||
|     } |     } | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
|       scaleTareCounter = 0; |       scale_tare_counter = 0; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // Prüfen ob das Gewicht gleich bleibt und dann senden |     // Prüfen ob das Gewicht gleich bleibt und dann senden | ||||||
|     if (weight == lastWeight && weight > 5) |     if (abs(weight - lastWeight) <= 2 && weight > 5) | ||||||
|     { |     { | ||||||
|       weigthCouterToApi++; |       weigthCouterToApi++; | ||||||
|     }  |     }  | ||||||
| @@ -190,7 +202,8 @@ void loop() { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   // reset weight counter after writing tag |   // reset weight counter after writing tag | ||||||
|   if (currentMillis - lastWeightReadTime >= weightReadInterval && hasReadRfidTag > 1) |   // TBD: what exactly is the logic behind this? | ||||||
|  |   if (currentMillis - lastWeightReadTime >= weightReadInterval && nfcReaderState != NFC_IDLE && nfcReaderState != NFC_READ_SUCCESS) | ||||||
|   { |   { | ||||||
|     weigthCouterToApi = 0; |     weigthCouterToApi = 0; | ||||||
|   } |   } | ||||||
| @@ -198,7 +211,7 @@ void loop() { | |||||||
|   lastWeight = weight; |   lastWeight = weight; | ||||||
|  |  | ||||||
|   // Wenn ein Tag mit SM id erkannte wurde und der Waage Counter anspricht an SM Senden |   // Wenn ein Tag mit SM id erkannte wurde und der Waage Counter anspricht an SM Senden | ||||||
|   if (spoolId != "" && weigthCouterToApi > 3 && weightSend == 0 && hasReadRfidTag == 1) { |   if (spoolId != "" && weigthCouterToApi > 3 && weightSend == 0 && nfcReaderState == NFC_READ_SUCCESS) { | ||||||
|     oledShowIcon("loading"); |     oledShowIcon("loading"); | ||||||
|     if (updateSpoolWeight(spoolId, weight))  |     if (updateSpoolWeight(spoolId, weight))  | ||||||
|     { |     { | ||||||
|   | |||||||
							
								
								
									
										28
									
								
								src/nfc.cpp
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								src/nfc.cpp
									
									
									
									
									
								
							| @@ -18,7 +18,7 @@ String spoolId = ""; | |||||||
| String nfcJsonData = ""; | String nfcJsonData = ""; | ||||||
| volatile bool pauseBambuMqttTask = false; | volatile bool pauseBambuMqttTask = false; | ||||||
|  |  | ||||||
| volatile uint8_t hasReadRfidTag = 0; | volatile nfcReaderStateType nfcReaderState = NFC_IDLE; | ||||||
| // 0 = nicht gelesen | // 0 = nicht gelesen | ||||||
| // 1 = erfolgreich gelesen | // 1 = erfolgreich gelesen | ||||||
| // 2 = fehler beim Lesen | // 2 = fehler beim Lesen | ||||||
| @@ -242,7 +242,7 @@ void writeJsonToTag(void *parameter) { | |||||||
|   Serial.println("Erstelle NDEF-Message..."); |   Serial.println("Erstelle NDEF-Message..."); | ||||||
|   Serial.println(payload); |   Serial.println(payload); | ||||||
|  |  | ||||||
|   hasReadRfidTag = 3; |   nfcReaderState = NFC_WRITING; | ||||||
|   vTaskSuspend(RfidReaderTask); |   vTaskSuspend(RfidReaderTask); | ||||||
|   vTaskDelay(50 / portTICK_PERIOD_MS); |   vTaskDelay(50 / portTICK_PERIOD_MS); | ||||||
|  |  | ||||||
| @@ -288,7 +288,7 @@ void writeJsonToTag(void *parameter) { | |||||||
|         //oledShowMessage("NFC-Tag written"); |         //oledShowMessage("NFC-Tag written"); | ||||||
|         oledShowIcon("success"); |         oledShowIcon("success"); | ||||||
|         vTaskDelay(1000 / portTICK_PERIOD_MS); |         vTaskDelay(1000 / portTICK_PERIOD_MS); | ||||||
|         hasReadRfidTag = 5; |         nfcReaderState = NFC_WRITE_SUCCESS; | ||||||
|         // aktualisieren der Website wenn sich der Status ändert |         // aktualisieren der Website wenn sich der Status ändert | ||||||
|         sendNfcData(nullptr); |         sendNfcData(nullptr); | ||||||
|         pauseBambuMqttTask = false; |         pauseBambuMqttTask = false; | ||||||
| @@ -310,7 +310,7 @@ void writeJsonToTag(void *parameter) { | |||||||
|         Serial.println("Fehler beim Schreiben der NDEF-Message auf den Tag"); |         Serial.println("Fehler beim Schreiben der NDEF-Message auf den Tag"); | ||||||
|         oledShowIcon("failed"); |         oledShowIcon("failed"); | ||||||
|         vTaskDelay(2000 / portTICK_PERIOD_MS); |         vTaskDelay(2000 / portTICK_PERIOD_MS); | ||||||
|         hasReadRfidTag = 4; |         nfcReaderState = NFC_WRITE_ERROR; | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   else |   else | ||||||
| @@ -318,7 +318,7 @@ void writeJsonToTag(void *parameter) { | |||||||
|     Serial.println("Fehler: Kein Tag zu schreiben gefunden."); |     Serial.println("Fehler: Kein Tag zu schreiben gefunden."); | ||||||
|     oledShowMessage("No NFC-Tag found"); |     oledShowMessage("No NFC-Tag found"); | ||||||
|     vTaskDelay(2000 / portTICK_PERIOD_MS); |     vTaskDelay(2000 / portTICK_PERIOD_MS); | ||||||
|     hasReadRfidTag = 0; |     nfcReaderState = NFC_IDLE; | ||||||
|   } |   } | ||||||
|    |    | ||||||
|   sendWriteResult(nullptr, success); |   sendWriteResult(nullptr, success); | ||||||
| @@ -334,7 +334,7 @@ void startWriteJsonToTag(const char* payload) { | |||||||
|   char* payloadCopy = strdup(payload); |   char* payloadCopy = strdup(payload); | ||||||
|    |    | ||||||
|   // Task nicht mehrfach starten |   // Task nicht mehrfach starten | ||||||
|   if (hasReadRfidTag != 3) { |   if (nfcReaderState != NFC_WRITING) { | ||||||
|     // Erstelle die Task |     // Erstelle die Task | ||||||
|     xTaskCreate( |     xTaskCreate( | ||||||
|         writeJsonToTag,        // Task-Funktion |         writeJsonToTag,        // Task-Funktion | ||||||
| @@ -351,7 +351,7 @@ void scanRfidTask(void * parameter) { | |||||||
|   Serial.println("RFID Task gestartet"); |   Serial.println("RFID Task gestartet"); | ||||||
|   for(;;) { |   for(;;) { | ||||||
|     // Wenn geschrieben wird Schleife aussetzen |     // Wenn geschrieben wird Schleife aussetzen | ||||||
|     if (hasReadRfidTag != 3) |     if (nfcReaderState != NFC_WRITING) | ||||||
|     { |     { | ||||||
|       yield(); |       yield(); | ||||||
|  |  | ||||||
| @@ -363,12 +363,12 @@ void scanRfidTask(void * parameter) { | |||||||
|  |  | ||||||
|       foundNfcTag(nullptr, success); |       foundNfcTag(nullptr, success); | ||||||
|        |        | ||||||
|       if (success && hasReadRfidTag != 1) |       if (success && nfcReaderState != NFC_READ_SUCCESS) | ||||||
|       { |       { | ||||||
|         // Display some basic information about the card |         // Display some basic information about the card | ||||||
|         Serial.println("Found an ISO14443A card"); |         Serial.println("Found an ISO14443A card"); | ||||||
|  |  | ||||||
|         hasReadRfidTag = 6; |         nfcReaderState = NFC_READING; | ||||||
|  |  | ||||||
|         oledShowIcon("transfer"); |         oledShowIcon("transfer"); | ||||||
|         vTaskDelay(500 / portTICK_PERIOD_MS); |         vTaskDelay(500 / portTICK_PERIOD_MS); | ||||||
| @@ -406,11 +406,11 @@ void scanRfidTask(void * parameter) { | |||||||
|             { |             { | ||||||
|               oledShowMessage("NFC-Tag unknown"); |               oledShowMessage("NFC-Tag unknown"); | ||||||
|               vTaskDelay(2000 / portTICK_PERIOD_MS); |               vTaskDelay(2000 / portTICK_PERIOD_MS); | ||||||
|               hasReadRfidTag = 2; |               nfcReaderState = NFC_READ_ERROR; | ||||||
|             } |             } | ||||||
|             else  |             else  | ||||||
|             { |             { | ||||||
|               hasReadRfidTag = 1; |               nfcReaderState = NFC_READ_SUCCESS; | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             free(data); |             free(data); | ||||||
| @@ -418,7 +418,7 @@ void scanRfidTask(void * parameter) { | |||||||
|           else |           else | ||||||
|           { |           { | ||||||
|             oledShowMessage("NFC-Tag read error"); |             oledShowMessage("NFC-Tag read error"); | ||||||
|             hasReadRfidTag = 2; |             nfcReaderState = NFC_READ_ERROR; | ||||||
|           } |           } | ||||||
|         } |         } | ||||||
|         else |         else | ||||||
| @@ -427,9 +427,9 @@ void scanRfidTask(void * parameter) { | |||||||
|         } |         } | ||||||
|       } |       } | ||||||
|  |  | ||||||
|       if (!success && hasReadRfidTag > 0) |       if (!success && nfcReaderState != NFC_IDLE) | ||||||
|       { |       { | ||||||
|         hasReadRfidTag = 0; |         nfcReaderState = NFC_IDLE; | ||||||
|         //uidString = ""; |         //uidString = ""; | ||||||
|         nfcJsonData = ""; |         nfcJsonData = ""; | ||||||
|         Serial.println("Tag entfernt"); |         Serial.println("Tag entfernt"); | ||||||
|   | |||||||
							
								
								
									
										14
									
								
								src/nfc.h
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								src/nfc.h
									
									
									
									
									
								
							| @@ -3,6 +3,16 @@ | |||||||
|  |  | ||||||
| #include <Arduino.h> | #include <Arduino.h> | ||||||
|  |  | ||||||
|  | typedef enum{ | ||||||
|  |     NFC_IDLE, | ||||||
|  |     NFC_READING, | ||||||
|  |     NFC_READ_SUCCESS, | ||||||
|  |     NFC_READ_ERROR, | ||||||
|  |     NFC_WRITING, | ||||||
|  |     NFC_WRITE_SUCCESS, | ||||||
|  |     NFC_WRITE_ERROR | ||||||
|  | } nfcReaderStateType; | ||||||
|  |  | ||||||
| void startNfc(); | void startNfc(); | ||||||
| void scanRfidTask(void * parameter); | void scanRfidTask(void * parameter); | ||||||
| void startWriteJsonToTag(const char* payload); | void startWriteJsonToTag(const char* payload); | ||||||
| @@ -10,7 +20,9 @@ void startWriteJsonToTag(const char* payload); | |||||||
| extern TaskHandle_t RfidReaderTask; | extern TaskHandle_t RfidReaderTask; | ||||||
| extern String nfcJsonData; | extern String nfcJsonData; | ||||||
| extern String spoolId; | extern String spoolId; | ||||||
| extern volatile uint8_t hasReadRfidTag; | extern volatile nfcReaderStateType nfcReaderState; | ||||||
| extern volatile bool pauseBambuMqttTask; | extern volatile bool pauseBambuMqttTask; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
							
								
								
									
										33
									
								
								src/ota.cpp
									
									
									
									
									
								
							
							
						
						
									
										33
									
								
								src/ota.cpp
									
									
									
									
									
								
							| @@ -1,6 +1,10 @@ | |||||||
| #include <Arduino.h> | #include <Arduino.h> | ||||||
| #include <website.h> | #include <website.h> | ||||||
| #include <commonFS.h> | #include <commonFS.h> | ||||||
|  | #include "scale.h" | ||||||
|  | #include "bambu.h" | ||||||
|  | #include "nfc.h" | ||||||
|  |  | ||||||
|  |  | ||||||
| // Globale Variablen für Config Backups hinzufügen | // Globale Variablen für Config Backups hinzufügen | ||||||
| String bambuCredentialsBackup; | String bambuCredentialsBackup; | ||||||
| @@ -151,6 +155,25 @@ void handleUpdate(AsyncWebServer &server) { | |||||||
|  |  | ||||||
|     updateHandler->onUpload([](AsyncWebServerRequest *request, String filename, |     updateHandler->onUpload([](AsyncWebServerRequest *request, String filename, | ||||||
|                              size_t index, uint8_t *data, size_t len, bool final) { |                              size_t index, uint8_t *data, size_t len, bool final) { | ||||||
|  |  | ||||||
|  |         // Disable all Tasks | ||||||
|  |         if (BambuMqttTask != NULL)  | ||||||
|  |         { | ||||||
|  |             Serial.println("Delete BambuMqttTask"); | ||||||
|  |             vTaskDelete(BambuMqttTask); | ||||||
|  |             BambuMqttTask = NULL; | ||||||
|  |         } | ||||||
|  |         if (ScaleTask) { | ||||||
|  |             Serial.println("Delete ScaleTask"); | ||||||
|  |             vTaskDelete(ScaleTask); | ||||||
|  |             ScaleTask = NULL; | ||||||
|  |         } | ||||||
|  |         if (RfidReaderTask) { | ||||||
|  |             Serial.println("Delete RfidReaderTask"); | ||||||
|  |             vTaskDelete(RfidReaderTask); | ||||||
|  |             RfidReaderTask = NULL; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if (!index) { |         if (!index) { | ||||||
|             updateTotalSize = request->contentLength(); |             updateTotalSize = request->contentLength(); | ||||||
|             updateWritten = 0; |             updateWritten = 0; | ||||||
| @@ -159,9 +182,9 @@ void handleUpdate(AsyncWebServer &server) { | |||||||
|             if (isSpiffsUpdate) { |             if (isSpiffsUpdate) { | ||||||
|                 // Backup vor dem Update |                 // Backup vor dem Update | ||||||
|                 sendUpdateProgress(0, "backup", "Backing up configurations..."); |                 sendUpdateProgress(0, "backup", "Backing up configurations..."); | ||||||
|                 delay(200); |                 vTaskDelay(200 / portTICK_PERIOD_MS); | ||||||
|                 backupJsonConfigs(); |                 backupJsonConfigs(); | ||||||
|                 delay(200); |                 vTaskDelay(200 / portTICK_PERIOD_MS); | ||||||
|                  |                  | ||||||
|                 const esp_partition_t *partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_SPIFFS, NULL); |                 const esp_partition_t *partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_SPIFFS, NULL); | ||||||
|                 if (!partition || !Update.begin(partition->size, U_SPIFFS)) { |                 if (!partition || !Update.begin(partition->size, U_SPIFFS)) { | ||||||
| @@ -169,14 +192,14 @@ void handleUpdate(AsyncWebServer &server) { | |||||||
|                     return; |                     return; | ||||||
|                 } |                 } | ||||||
|                 sendUpdateProgress(5, "starting", "Starting SPIFFS update..."); |                 sendUpdateProgress(5, "starting", "Starting SPIFFS update..."); | ||||||
|                 delay(200); |                 vTaskDelay(200 / portTICK_PERIOD_MS); | ||||||
|             } else { |             } else { | ||||||
|                 if (!Update.begin(updateTotalSize)) { |                 if (!Update.begin(updateTotalSize)) { | ||||||
|                     request->send(400, "application/json", "{\"success\":false,\"message\":\"Update initialization failed\"}"); |                     request->send(400, "application/json", "{\"success\":false,\"message\":\"Update initialization failed\"}"); | ||||||
|                     return; |                     return; | ||||||
|                 } |                 } | ||||||
|                 sendUpdateProgress(0, "starting", "Starting firmware update..."); |                 sendUpdateProgress(0, "starting", "Starting firmware update..."); | ||||||
|                 delay(200); |                 vTaskDelay(200 / portTICK_PERIOD_MS); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -202,7 +225,7 @@ void handleUpdate(AsyncWebServer &server) { | |||||||
|             if (currentProgress != lastProgress && (currentProgress % 10 == 0 || final)) { |             if (currentProgress != lastProgress && (currentProgress % 10 == 0 || final)) { | ||||||
|                 sendUpdateProgress(currentProgress, "uploading"); |                 sendUpdateProgress(currentProgress, "uploading"); | ||||||
|                 oledShowMessage("Update: " + String(currentProgress) + "%"); |                 oledShowMessage("Update: " + String(currentProgress) + "%"); | ||||||
|                 delay(50); |                 vTaskDelay(50 / portTICK_PERIOD_MS); | ||||||
|                 lastProgress = currentProgress; |                 lastProgress = currentProgress; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -14,6 +14,7 @@ TaskHandle_t ScaleTask; | |||||||
| int16_t weight = 0; | int16_t weight = 0; | ||||||
|  |  | ||||||
| uint8_t weigthCouterToApi = 0; | uint8_t weigthCouterToApi = 0; | ||||||
|  | uint8_t scale_tare_counter = 0; | ||||||
| bool scaleTareRequest = false; | bool scaleTareRequest = false; | ||||||
| uint8_t pauseMainTask = 0; | uint8_t pauseMainTask = 0; | ||||||
| uint8_t scaleCalibrated = 1; | uint8_t scaleCalibrated = 1; | ||||||
| @@ -21,8 +22,23 @@ uint8_t scaleCalibrated = 1; | |||||||
| Preferences preferences; | Preferences preferences; | ||||||
| const char* NVS_NAMESPACE = "scale"; | const char* NVS_NAMESPACE = "scale"; | ||||||
| const char* NVS_KEY_CALIBRATION = "cal_value"; | const char* NVS_KEY_CALIBRATION = "cal_value"; | ||||||
|  | const char* NVS_KEY_AUTOTARE = "auto_tare"; | ||||||
|  | bool autoTare = true; | ||||||
|  |  | ||||||
| // ##### Funktionen für Waage ##### | // ##### Funktionen für Waage ##### | ||||||
|  | uint8_t setAutoTare(bool autoTareValue) { | ||||||
|  |   Serial.print("Set AutoTare to "); | ||||||
|  |   Serial.println(autoTareValue); | ||||||
|  |   autoTare = autoTareValue; | ||||||
|  |  | ||||||
|  |   // Speichern mit NVS | ||||||
|  |   preferences.begin(NVS_NAMESPACE, false); // false = readwrite | ||||||
|  |   preferences.putBool(NVS_KEY_AUTOTARE, autoTare); | ||||||
|  |   preferences.end(); | ||||||
|  |  | ||||||
|  |   return 1; | ||||||
|  | } | ||||||
|  |  | ||||||
| uint8_t tareScale() { | uint8_t tareScale() { | ||||||
|   Serial.println("Tare scale"); |   Serial.println("Tare scale"); | ||||||
|   scale.tare(); |   scale.tare(); | ||||||
| @@ -38,11 +54,23 @@ void scale_loop(void * parameter) { | |||||||
|   for(;;) { |   for(;;) { | ||||||
|     if (scale.is_ready())  |     if (scale.is_ready())  | ||||||
|     { |     { | ||||||
|       // Waage nochmal Taren, wenn zu lange Abweichung |       // Waage automatisch Taren, wenn zu lange Abweichung | ||||||
|  |       if (autoTare && scale_tare_counter >= 5)  | ||||||
|  |       { | ||||||
|  |         Serial.println("Auto Tare scale"); | ||||||
|  |         scale.tare(); | ||||||
|  |         scale_tare_counter = 0; | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       // Waage manuell Taren | ||||||
|       if (scaleTareRequest == true)  |       if (scaleTareRequest == true)  | ||||||
|       { |       { | ||||||
|         Serial.println("Re-Tare scale"); |         Serial.println("Re-Tare scale"); | ||||||
|  |         oledShowMessage("TARE Scale"); | ||||||
|  |         vTaskDelay(pdMS_TO_TICKS(1000)); | ||||||
|         scale.tare(); |         scale.tare(); | ||||||
|  |         vTaskDelay(pdMS_TO_TICKS(1000)); | ||||||
|  |         oledShowWeight(0); | ||||||
|         scaleTareRequest = false; |         scaleTareRequest = false; | ||||||
|       } |       } | ||||||
|  |  | ||||||
| @@ -53,13 +81,20 @@ void scale_loop(void * parameter) { | |||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| void start_scale() { | void start_scale(bool touchSensorConnected) { | ||||||
|   Serial.println("Prüfe Calibration Value"); |   Serial.println("Prüfe Calibration Value"); | ||||||
|   float calibrationValue; |   float calibrationValue; | ||||||
|  |  | ||||||
|   // NVS lesen |   // NVS lesen | ||||||
|   preferences.begin(NVS_NAMESPACE, true); // true = readonly |   preferences.begin(NVS_NAMESPACE, true); // true = readonly | ||||||
|   calibrationValue = preferences.getFloat(NVS_KEY_CALIBRATION, defaultScaleCalibrationValue); |   calibrationValue = preferences.getFloat(NVS_KEY_CALIBRATION, defaultScaleCalibrationValue); | ||||||
|  |    | ||||||
|  |   // auto Tare | ||||||
|  |   // Wenn Touch Sensor verbunden, dann autoTare auf false setzen | ||||||
|  |   // Danach prüfen was in NVS gespeichert ist | ||||||
|  |   autoTare = (touchSensorConnected) ? false : true; | ||||||
|  |   autoTare = preferences.getBool(NVS_KEY_AUTOTARE, autoTare); | ||||||
|  |  | ||||||
|   preferences.end(); |   preferences.end(); | ||||||
|  |  | ||||||
|   Serial.print("Read Scale Calibration Value "); |   Serial.print("Read Scale Calibration Value "); | ||||||
|   | |||||||
| @@ -4,17 +4,19 @@ | |||||||
| #include <Arduino.h> | #include <Arduino.h> | ||||||
| #include "HX711.h" | #include "HX711.h" | ||||||
|  |  | ||||||
|  | uint8_t setAutoTare(bool autoTareValue); | ||||||
| uint8_t start_scale(); | uint8_t start_scale(bool touchSensorConnected); | ||||||
| uint8_t calibrate_scale(); | uint8_t calibrate_scale(); | ||||||
| uint8_t tareScale(); | uint8_t tareScale(); | ||||||
|  |  | ||||||
| extern HX711 scale; | extern HX711 scale; | ||||||
| extern int16_t weight; | extern int16_t weight; | ||||||
| extern uint8_t weigthCouterToApi; | extern uint8_t weigthCouterToApi; | ||||||
|  | extern uint8_t scale_tare_counter; | ||||||
| extern uint8_t scaleTareRequest; | extern uint8_t scaleTareRequest; | ||||||
| extern uint8_t pauseMainTask; | extern uint8_t pauseMainTask; | ||||||
| extern uint8_t scaleCalibrated; | extern uint8_t scaleCalibrated; | ||||||
|  | extern bool autoTare; | ||||||
|  |  | ||||||
| extern TaskHandle_t ScaleTask; | extern TaskHandle_t ScaleTask; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -22,14 +22,14 @@ AsyncWebServer server(webserverPort); | |||||||
| AsyncWebSocket ws("/ws"); | AsyncWebSocket ws("/ws"); | ||||||
|  |  | ||||||
| uint8_t lastSuccess = 0; | uint8_t lastSuccess = 0; | ||||||
| uint8_t lastHasReadRfidTag = 0; | nfcReaderStateType lastnfcReaderState = NFC_IDLE; | ||||||
|  |  | ||||||
|  |  | ||||||
| void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len) { | void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len) { | ||||||
|     if (type == WS_EVT_CONNECT) { |     if (type == WS_EVT_CONNECT) { | ||||||
|         Serial.println("Neuer Client verbunden!"); |         Serial.println("Neuer Client verbunden!"); | ||||||
|         // Sende die AMS-Daten an den neuen Client |         // Sende die AMS-Daten an den neuen Client | ||||||
|         sendAmsData(client); |         if (!bambuDisabled) sendAmsData(client); | ||||||
|         sendNfcData(client); |         sendNfcData(client); | ||||||
|         foundNfcTag(client, 0); |         foundNfcTag(client, 0); | ||||||
|         sendWriteResult(client, 3); |         sendWriteResult(client, 3); | ||||||
| @@ -44,13 +44,15 @@ void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventTyp | |||||||
|         JsonDocument doc; |         JsonDocument doc; | ||||||
|         deserializeJson(doc, message); |         deserializeJson(doc, message); | ||||||
|  |  | ||||||
|  |         bool spoolmanConnected = (spoolmanApiState != API_INIT); | ||||||
|  |  | ||||||
|         if (doc["type"] == "heartbeat") { |         if (doc["type"] == "heartbeat") { | ||||||
|             // Sende Heartbeat-Antwort |             // Sende Heartbeat-Antwort | ||||||
|             ws.text(client->id(), "{" |             ws.text(client->id(), "{" | ||||||
|                 "\"type\":\"heartbeat\"," |                 "\"type\":\"heartbeat\"," | ||||||
|                 "\"freeHeap\":" + String(ESP.getFreeHeap()/1024) + "," |                 "\"freeHeap\":" + String(ESP.getFreeHeap()/1024) + "," | ||||||
|                 "\"bambu_connected\":" + String(bambu_connected) + "," |                 "\"bambu_connected\":" + String(bambu_connected) + "," | ||||||
|                 "\"spoolman_connected\":" + String(spoolman_connected) + "" |                 "\"spoolman_connected\":" + String(spoolmanConnected) + "" | ||||||
|                 "}"); |                 "}"); | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -73,6 +75,10 @@ void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventTyp | |||||||
|                 success = calibrate_scale(); |                 success = calibrate_scale(); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|  |             if (doc["payload"] == "setAutoTare") { | ||||||
|  |                 success = setAutoTare(doc["enabled"].as<bool>()); | ||||||
|  |             } | ||||||
|  |  | ||||||
|             if (success) { |             if (success) { | ||||||
|                 ws.textAll("{\"type\":\"scale\",\"payload\":\"success\"}"); |                 ws.textAll("{\"type\":\"scale\",\"payload\":\"success\"}"); | ||||||
|             } else { |             } else { | ||||||
| @@ -139,34 +145,31 @@ void foundNfcTag(AsyncWebSocketClient *client, uint8_t success) { | |||||||
| } | } | ||||||
|  |  | ||||||
| void sendNfcData(AsyncWebSocketClient *client) { | void sendNfcData(AsyncWebSocketClient *client) { | ||||||
|     if (lastHasReadRfidTag == hasReadRfidTag) return; |     if (lastnfcReaderState == nfcReaderState) return; | ||||||
|     if (hasReadRfidTag == 0) { |     // TBD: Why is there no status for reading the tag? | ||||||
|         ws.textAll("{\"type\":\"nfcData\", \"payload\":{}}"); |     switch(nfcReaderState){ | ||||||
|  |         case NFC_IDLE: | ||||||
|  |             ws.textAll("{\"type\":\"nfcData\", \"payload\":{}}"); | ||||||
|  |             break; | ||||||
|  |         case NFC_READ_SUCCESS: | ||||||
|  |             ws.textAll("{\"type\":\"nfcData\", \"payload\":" + nfcJsonData + "}"); | ||||||
|  |             break; | ||||||
|  |         case NFC_READ_ERROR: | ||||||
|  |             ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"error\":\"Empty Tag or Data not readable\"}}"); | ||||||
|  |             break; | ||||||
|  |         case NFC_WRITING: | ||||||
|  |             ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"info\":\"Schreibe Tag...\"}}"); | ||||||
|  |             break; | ||||||
|  |         case NFC_WRITE_SUCCESS: | ||||||
|  |             ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"info\":\"Tag erfolgreich geschrieben\"}}"); | ||||||
|  |             break; | ||||||
|  |         case NFC_WRITE_ERROR: | ||||||
|  |             ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"error\":\"Error writing to Tag\"}}"); | ||||||
|  |             break; | ||||||
|  |         case DEFAULT: | ||||||
|  |             ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"error\":\"Something went wrong\"}}"); | ||||||
|     } |     } | ||||||
|     else if (hasReadRfidTag == 1) { |     lastnfcReaderState = nfcReaderState; | ||||||
|         ws.textAll("{\"type\":\"nfcData\", \"payload\":" + nfcJsonData + "}"); |  | ||||||
|     } |  | ||||||
|     else if (hasReadRfidTag == 2) |  | ||||||
|     { |  | ||||||
|         ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"error\":\"Empty Tag or Data not readable\"}}"); |  | ||||||
|     } |  | ||||||
|     else if (hasReadRfidTag == 3) |  | ||||||
|     { |  | ||||||
|         ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"info\":\"Schreibe Tag...\"}}"); |  | ||||||
|     } |  | ||||||
|     else if (hasReadRfidTag == 4) |  | ||||||
|     { |  | ||||||
|         ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"error\":\"Error writing to Tag\"}}"); |  | ||||||
|     } |  | ||||||
|     else if (hasReadRfidTag == 5) |  | ||||||
|     { |  | ||||||
|         ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"info\":\"Tag erfolgreich geschrieben\"}}"); |  | ||||||
|     } |  | ||||||
|     else  |  | ||||||
|     { |  | ||||||
|         ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"error\":\"Something went wrong\"}}"); |  | ||||||
|     } |  | ||||||
|     lastHasReadRfidTag = hasReadRfidTag; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void sendAmsData(AsyncWebSocketClient *client) { | void sendAmsData(AsyncWebSocketClient *client) { | ||||||
| @@ -204,16 +207,23 @@ void setupWebserver(AsyncWebServer &server) { | |||||||
|     // Route für Waage |     // Route für Waage | ||||||
|     server.on("/waage", HTTP_GET, [](AsyncWebServerRequest *request){ |     server.on("/waage", HTTP_GET, [](AsyncWebServerRequest *request){ | ||||||
|         Serial.println("Anfrage für /waage erhalten"); |         Serial.println("Anfrage für /waage erhalten"); | ||||||
|         AsyncWebServerResponse *response = request->beginResponse(LittleFS, "/waage.html.gz", "text/html"); |         //AsyncWebServerResponse *response = request->beginResponse(LittleFS, "/waage.html.gz", "text/html"); | ||||||
|         response->addHeader("Content-Encoding", "gzip"); |         //response->addHeader("Content-Encoding", "gzip"); | ||||||
|         response->addHeader("Cache-Control", CACHE_CONTROL); |         //response->addHeader("Cache-Control", CACHE_CONTROL); | ||||||
|         request->send(response); |  | ||||||
|  |         String html = loadHtmlWithHeader("/waage.html"); | ||||||
|  |         html.replace("{{autoTare}}", (autoTare) ? "checked" : ""); | ||||||
|  |  | ||||||
|  |         request->send(200, "text/html", html); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     // Route für RFID |     // Route für RFID | ||||||
|     server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ |     server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ | ||||||
|         Serial.println("Anfrage für /rfid erhalten"); |         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("Content-Encoding", "gzip"); | ||||||
|         response->addHeader("Cache-Control", CACHE_CONTROL); |         response->addHeader("Cache-Control", CACHE_CONTROL); | ||||||
|         request->send(response); |         request->send(response); | ||||||
| @@ -310,6 +320,15 @@ void setupWebserver(AsyncWebServer &server) { | |||||||
|  |  | ||||||
|     // Route für das Überprüfen der Bambu-Instanz |     // Route für das Überprüfen der Bambu-Instanz | ||||||
|     server.on("/api/bambu", HTTP_GET, [](AsyncWebServerRequest *request){ |     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")) { |         if (!request->hasParam("bambu_ip") || !request->hasParam("bambu_serialnr") || !request->hasParam("bambu_accesscode")) { | ||||||
|             request->send(400, "application/json", "{\"success\": false, \"error\": \"Missing parameter\"}"); |             request->send(400, "application/json", "{\"success\": false, \"error\": \"Missing parameter\"}"); | ||||||
|             return; |             return; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user