Compare commits

..

778 Commits
v1.0.5 ... main

Author SHA1 Message Date
01f1e123ac fix: increase stack size for sendToApi task to improve stability 2025-04-15 16:38:16 +02:00
012f91851e fix: adjust tare weight tolerance to ignore deviations of 2g 2025-03-31 10:59:54 +02:00
9ed3c70c01 fix: improve weight stability check before sending to API 2025-03-31 10:08:26 +02:00
e23f3a2151 docs: update changelog and header for version v1.5.1
All checks were successful
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m52s
2025-03-30 16:38:38 +02:00
f73306f0b9 chore: update version to 1.5.1 and improve OTA update handling with task management 2025-03-30 16:38:23 +02:00
a450d4bd1a docs: update changelog and header for version v1.4.14
All checks were successful
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m42s
2025-03-30 16:01:45 +02:00
d48d994c00 docs: update platformio.ini for version v1.4.14 2025-03-30 16:01:45 +02:00
32bb85f897 feat: add auto-tare functionality and update scale handling based on touch sensor connection 2025-03-30 16:01:17 +02:00
e9d32ee060 docs: update changelog and header for version v1.4.13
All checks were successful
Release Workflow / detect-provider (push) Successful in 5s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m44s
2025-03-30 12:59:57 +02:00
aba28422bd docs: update platformio.ini for version v1.4.13 2025-03-30 12:59:57 +02:00
4a55620d39 fix: update touch sensor connection logic to correctly identify connection status 2025-03-30 12:59:51 +02:00
7b18266534 docs: update changelog and header for version v1.4.12
Some checks failed
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m16s
2025-03-30 12:55:33 +02:00
d81acb2b61 docs: update platformio.ini for version v1.4.12 2025-03-30 12:55:33 +02:00
8c7fc159d3 fix: add touch sensor connection check and update logic 2025-03-30 12:55:26 +02:00
476d3e82e2 docs: update README files to clarify PN532 DIP switch settings 2025-03-30 12:35:50 +02:00
3c294a135f docs: update changelog and header for version v1.4.11
All checks were successful
Release Workflow / detect-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m56s
2025-03-30 12:21:57 +02:00
bb751b6289 docs: update platformio.ini for version v1.4.11 2025-03-30 12:21:57 +02:00
7fd01bd1b9 Merge branch 'main' of github.com:ManuelW77/Filaman 2025-03-30 12:21:04 +02:00
fad84e12c8 docs: update changelog and header for version v1.4.10
All checks were successful
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 3m6s
2025-03-30 12:19:25 +02:00
696efc4d79 docs: update platformio.ini for version v1.4.10 2025-03-30 12:19:25 +02:00
29868e7101 fix: update TTP223 pin configuration and adjust touch sensor logic 2025-03-30 12:19:07 +02:00
823db6157c fix: add manual tare functionality for scale 2025-03-29 14:44:33 +01:00
458cc4eaf2
Merge pull request #31 from janecker/nfc_rework
Introducing enum for handling the NFC state to improve code readability
2025-03-29 14:25:20 +01:00
83d14b32d1 fix: add debounce handling for TTP223 touch sensor 2025-03-29 14:23:55 +01:00
2bf7c9fb7d feat: add TTP223 touch sensor support and wiring configuration 2025-03-29 14:18:58 +01:00
Jan Philipp Ecker
ac8adca84d Renamed states of NFC state machine and introduced new state machine for spoolman API 2025-03-29 13:21:47 +01:00
Jan Philipp Ecker
c701149c64 Introducing enum for handling the NFC state to improve code readability 2025-03-29 11:45:38 +01:00
07a919b6ba docs: update changelog and header for version v1.4.9
All checks were successful
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m48s
2025-03-29 10:11:25 +01:00
8618b90e33 docs: update platformio.ini for version v1.4.9 2025-03-29 10:11:25 +01:00
57723b5354 fix: enhance HTTP method handling in sendToApi function 2025-03-29 10:03:17 +01:00
d2be752175 docs: update changelog and header for version v1.4.8
All checks were successful
Release Workflow / detect-provider (push) Successful in 4s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m46s
2025-03-29 07:58:12 +01:00
97a050ace8 docs: update platformio.ini for version v1.4.8 2025-03-29 07:58:12 +01:00
367e692c74
Merge pull request #30 from janecker/main
Fix memory leak issue in HTTPClient
2025-03-29 07:55:45 +01:00
926a21249b
Merge branch 'testing' into main 2025-03-29 07:55:33 +01:00
2635c19667 fix: improve HTTP client configuration and clear update documents after API calls 2025-03-29 07:52:49 +01:00
Jan Philipp Ecker
6cc4efca0a Fixes memory leak in HTTPClient by disabling connection reuse 2025-03-28 22:40:50 +01:00
1484a6b0da fix: update reload logic after removing and saving Bambu credentials for better cache handling 2025-03-27 19:13:57 +01:00
b5f0472af4 docs: update changelog and header for version v1.4.7
All checks were successful
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 3m10s
2025-03-27 18:54:33 +01:00
95c1bc823c docs: update platformio.ini for version v1.4.7 2025-03-27 18:54:33 +01:00
491ba7f526 Merge branch 'testing' 2025-03-27 18:54:15 +01:00
56d7d8596c style: update remove button for Bambu credentials with red background 2025-03-27 18:07:33 +01:00
1044e91a0a feat: add forced cache refresh after removing and saving Bambu credentials 2025-03-27 18:03:40 +01:00
e459b53472 feat: add functionality to remove Bambu credentials and update API handling 2025-03-27 18:01:15 +01:00
024056cb7d fix: handle Bambu connection state by introducing bambuDisabled flag 2025-03-27 11:18:04 +01:00
e040a736b0 feat: add rfid_bambu.html and update bambu connection handling 2025-03-27 10:35:10 +01:00
72b6b349c6
Merge pull request #28 from tugsi/main
Fix rfid.js-Failure with X1-Series, if you wanna send a Spool to AMS
2025-03-26 11:54:41 +01:00
190e952ec4 docs: update changelog and header for version v1.4.6
All checks were successful
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m57s
2025-03-26 11:52:46 +01:00
89620a7f00 docs: update platformio.ini for version v1.4.6 2025-03-26 11:52:46 +01:00
536950eeb3 fix: handle potential undefined value for tray_info_idx in handleSpoolIn function, by @tugsi 2025-03-26 11:51:58 +01:00
tugsi
fe4d2d7479 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
2025-03-25 17:40:55 +01:00
43719aac41 docs: update changelog and header for version v1.4.5
All checks were successful
Release Workflow / detect-provider (push) Successful in 4s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 3m21s
2025-03-25 12:11:56 +01:00
16d0079f7a docs: update platformio.ini for version v1.4.5 2025-03-25 12:11:56 +01:00
48b9bf7076 Merge branch 'testing' 2025-03-25 12:08:08 +01:00
b6bd4cb9ad refactor: remove unused request_topic subscription and reduce MQTT task stack size 2025-03-25 12:05:34 +01:00
e89bb1d547 fix: increase MQTT buffer size and adjust task stack size 2025-03-25 12:02:54 +01:00
f25789d703
Merge pull request #26 from tugsi/main
Fix BufferSize for larger JSONs from X-Series
2025-03-25 12:01:57 +01:00
tugsi
65d8cd675f Fix BufferSize for larger JSONs from X-Series 2025-03-24 12:17:28 +01:00
9dfe75ffa2 refactor: rename report_topic to topic and update MQTT subscription logic, switched publish topic to request 2025-03-23 18:01:53 +01:00
68cdd8ab40 docs: update changelog and header for version v1.4.4
All checks were successful
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 3m10s
2025-03-23 16:50:29 +01:00
1069781931 docs: update platformio.ini for version v1.4.4 2025-03-23 16:50:29 +01:00
eada54eff2 fix: add error handling for missing vendor IDs in filament data 2025-03-23 16:28:13 +01:00
48301ade36 fix: adjust weight threshold for tare check to allow negative values 2025-03-23 15:03:37 +01:00
76e0b20393 docs: update changelog and header for version v1.4.3
All checks were successful
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m48s
2025-03-23 11:38:57 +01:00
a765b39896 docs: update platformio.ini for version v1.4.3 2025-03-23 11:38:57 +01:00
d68f6c4a89 docs: update changelog and header for version v1.4.2
All checks were successful
Release Workflow / detect-provider (push) Successful in 1m4s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 3m14s
2025-03-23 11:25:52 +01:00
1702e2396e docs: update platformio.ini for version v1.4.2 2025-03-23 11:25:52 +01:00
af23b07df1 fix: use unique client ID for MQTT connection to avoid conflicts 2025-03-23 11:24:46 +01:00
dd7ba3bf5d fix: reload page after firmware update completion 2025-03-23 11:15:38 +01:00
a818dcd3c0 fix: increase WiFi connection timeout from 5 to 10 seconds 2025-03-23 11:05:10 +01:00
b5279b167a fix: ensure valid URL format and remove trailing slash in setupWebserver 2025-03-23 11:03:57 +01:00
a09fd4fda4 fix: add WiFi connection check and restart Bambu if not connected 2025-03-23 11:03:51 +01:00
e4fe08f54c increase stack size for BambuMqtt task 2025-03-23 10:41:28 +01:00
3eac0e5ac4 update Discord Link 2025-03-15 16:02:18 +01:00
24d91693d9 update Discord Link 2025-03-15 15:57:46 +01:00
94c26590c8 remove commented-out subscription topic in MQTT setup 2025-03-10 17:41:14 +01:00
4559bae066 docs: update changelog and header for version v1.4.1
All checks were successful
Release Workflow / detect-provider (push) Successful in 1m22s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m48s
2025-03-10 17:34:09 +01:00
cdb2d16cf9 docs: update platformio.ini for version v1.4.1 2025-03-10 17:34:09 +01:00
cd71949c82 refactor length calculation to convert total length to meters before formatting 2025-03-10 17:33:47 +01:00
6cd280389d
Merge pull request #16 from spitzbirne32/main
Usermod for M3 heat inserts and AliExpress parts
2025-03-06 15:19:28 +01:00
spitzbirne32
daf27820b1
improved housing to show display better 2025-03-06 12:16:10 +01:00
spitzbirne32
dd7fbe1119
added new .step, now with correct individual parts 2025-03-06 12:14:39 +01:00
spitzbirne32
dc2ddb47eb
removed CAD, as they were all duplicates 2025-03-06 12:13:25 +01:00
spitzbirne32
6bb8f565e6
typo in AliE link 2025-03-04 01:59:47 +01:00
spitzbirne32
ec60ca88f1
added changelog 2025-03-04 01:57:50 +01:00
spitzbirne32
17664acf9e
Delete usermod/spitzbirne32/STL/README.md 2025-03-04 01:48:02 +01:00
spitzbirne32
18f7454a76
Add files via upload 2025-03-04 01:43:50 +01:00
spitzbirne32
e7b5917888
added .stp files of modifications 2025-03-04 01:43:20 +01:00
spitzbirne32
5c57968ba9
Update README.md 2025-03-04 01:40:33 +01:00
spitzbirne32
795c926c1f
added merged picture 2025-03-04 01:33:01 +01:00
spitzbirne32
8735a9740c
moved pictures of parts into dedicated folders 2025-03-04 01:26:41 +01:00
spitzbirne32
02d0adc6bf
added pictures of components bought from AliE 2025-03-04 01:21:18 +01:00
spitzbirne32
24067666ed
Update README.md 2025-03-04 01:17:12 +01:00
spitzbirne32
9264333eda
Add files via upload 2025-03-04 01:06:07 +01:00
spitzbirne32
66216d57ae
Update README.md 2025-03-04 01:05:35 +01:00
spitzbirne32
5100a669b0
Update README.md 2025-03-04 00:54:43 +01:00
spitzbirne32
4ad89b68a7
added pictures for heat insert location 2025-03-04 00:50:42 +01:00
spitzbirne32
758acaff9f
Delete usermod/spitzbirne32/STL/ScaleTop_Heatinsert_Location_usermod_spitzbirne32_.png 2025-03-04 00:50:22 +01:00
spitzbirne32
fed96b9c58
Delete usermod/spitzbirne32/STL/Housing_Heatinsert_Location_usermod_spitzbirne32_.png 2025-03-04 00:50:14 +01:00
spitzbirne32
2d072ee09a
added pictures showing heat insert location 2025-03-04 00:49:31 +01:00
spitzbirne32
b55b6e3fd5
created folders 2025-03-04 00:26:37 +01:00
spitzbirne32
238b928236
Update README.md 2025-03-04 00:16:01 +01:00
spitzbirne32
24ce0ca6df
Update README.md 2025-03-04 00:15:10 +01:00
spitzbirne32
3cf934b920
Create README.md 2025-03-04 00:11:54 +01:00
spitzbirne32
f68ea3edb0
Update README.md 2025-03-04 00:09:49 +01:00
spitzbirne32
16321c9461
Update README.md 2025-03-04 00:05:21 +01:00
spitzbirne32
f9530f6d9a
Create README.md 2025-03-03 22:08:45 +01:00
83f2f0834d
Merge pull request #15 from ManuelW77/main
set to main state
2025-03-03 17:10:35 +01:00
6632aa8f95
Merge pull request #14 from janecker/scale-calibration-rework
Reworks the scale calibration handling
2025-03-03 17:08:06 +01:00
8a558c3121 refactor: remove unnecessary delay in MQTT setup and add delay before restart 2025-03-03 16:58:24 +01:00
Jan Philipp Ecker
d434fde92e Reworks the scale calibration handling
Fixes some issues in the scale handling. Prevents a wdg reset after
after scale calibration. Also makes sure that after calibration all
tasks are started again that have been suspsended before.
2025-03-03 16:50:46 +01:00
5afb60df32 fix: correct typo in console log for total length 2025-03-02 20:21:27 +01:00
3394e6eb01 feat: add new 3D print file for Filaman scale 2025-03-02 08:06:59 +01:00
3818c2c059 refactor: remove redundant scale calibration checks and enhance task management 2025-03-01 18:50:20 +01:00
0afc543b5f refactor: enhance AMS data handling and streamline spool auto-setting logic 2025-03-01 18:44:35 +01:00
adee46e3fc refactor: adjust stack size and improve scale calibration logic 2025-03-01 18:44:29 +01:00
1db74867e6 refactor: update labels and input types for better clarity and functionality 2025-03-01 18:44:17 +01:00
0f24a63d32 added Discord Server 2025-03-01 15:33:39 +01:00
3640809502 update documentation for clarity and accuracy 2025-03-01 13:04:28 +01:00
289d5357be docs: update changelog and header for version v1.4.0
All checks were successful
Release Workflow / detect-provider (push) Successful in 5s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m45s
2025-03-01 12:46:18 +01:00
315530d1ea update NFC tag references to include NTAG213 and clarify storage capacity 2025-03-01 12:45:55 +01:00
f36773a4c4 bump version to 1.4.0 2025-03-01 12:37:50 +01:00
b35163936f add support for Spoolman Octoprint Plugin in README files 2025-03-01 12:33:26 +01:00
7a2c9d6d17 add OctoPrint integration with configurable fields and update functionality 2025-03-01 12:18:33 +01:00
eb2a8dc128 add version comparison function and check for outdated versions before updates 2025-03-01 12:18:21 +01:00
bec2c91331 remove unused version and protocol fields from JSON output; add error message for insufficient memory 2025-03-01 10:42:06 +01:00
c6e727de06 remove unused version and protocol fields from NFC data packet 2025-03-01 10:41:51 +01:00
3253e7d407 sort vendors alphabetically in the dropdown list 2025-03-01 10:41:44 +01:00
bce2ad2ed8
Merge pull request #10 from janecker/nfc-improvements
Improves NFC Tag handling
2025-03-01 10:03:46 +01:00
Jan Philipp Ecker
0eff29ef4a Improves NFC Tag handling
Fixes memory underflow when reading tags. Reads tags with their actual data size and uses actual size instead of constnat value for tag size when writing a tag.
2025-02-28 22:35:34 +01:00
492bf6cdb8 docs: update changelog and header for version v1.3.99
All checks were successful
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m39s
2025-02-28 18:35:16 +01:00
b0317f4001 docs: update platformio.ini for version v1.3.99 2025-02-28 18:35:16 +01:00
58ff6458b0 refactor: update workflows to build firmware with LittleFS instead of SPIFFS 2025-02-28 18:35:05 +01:00
d9c40f5124 docs: update changelog and header for version v1.3.98
Some checks failed
Release Workflow / detect-provider (push) Successful in 4s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m51s
2025-02-28 18:12:56 +01:00
68bc31e29a docs: update platformio.ini for version v1.3.98 2025-02-28 18:12:56 +01:00
9b23ac5fd2 refactor: migrate from SPIFFS to LittleFS for file handling 2025-02-28 18:12:42 +01:00
d31bff14c3 chore: remove unused VSCode settings file 2025-02-28 09:29:34 +01:00
150f92484a refactor: remove commented-out spoolman and filaman data from api.cpp 2025-02-28 09:26:09 +01:00
fa74832fb9 docs: update changelog and header for version v1.3.97
All checks were successful
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m47s
2025-02-28 08:53:08 +01:00
2eab3db77d docs: update platformio.ini for version v1.3.97 2025-02-28 08:53:07 +01:00
0a1bf22f7e feat: füge Bestätigungsmeldung für Spool-Einstellung hinzu 2025-02-27 22:07:47 +01:00
d58244c1f8 fix: Speichernutzung optimiert 2025-02-27 21:56:31 +01:00
db626ea516 fix: behebe doppelte http.end() Aufrufe in checkSpoolmanExtraFields 2025-02-27 21:54:47 +01:00
fd8f7685a1 fix: optimiere Verzögerungen und Stackgrößen in NFC-Task-Funktionen 2025-02-27 21:54:32 +01:00
944b156528 feat: verbessere WLAN-Konfiguration und füge mDNS-Unterstützung hinzu 2025-02-27 21:53:48 +01:00
76100593cc refactor: entferne ungenutzte Bibliotheken und Debug-Ausgaben aus main.cpp 2025-02-27 15:50:04 +01:00
732d590344 feat: aktualisiere OLED-Anzeige mit Versionsnummer und verbessere Textausrichtung 2025-02-27 14:35:53 +01:00
46cd953b80 feat: füge regelmäßige WLAN-Verbindungsüberprüfung hinzu 2025-02-27 09:38:54 +01:00
c645035bbe feat: aktualisiere Schaltplan-Bild 2025-02-26 18:29:37 +01:00
9e76620cd3 style: entferne text-shadow von deaktivierten Schaltflächen 2025-02-26 18:07:22 +01:00
faddda6201 feat: zeige Versionsnummer im OLED-Display an 2025-02-26 18:01:35 +01:00
de9c1706c0 docs: füge Link zum Wiki für detaillierte Informationen über die Nutzung hinzu 2025-02-25 20:19:04 +01:00
9f7ee13e78 docs: update changelog and header for version v1.3.96
All checks were successful
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 3m1s
2025-02-25 16:29:37 +01:00
cf3f6f6741 docs: update platformio.ini for version v1.3.96 2025-02-25 16:29:37 +01:00
b87d43c64e feat: füge Unterstützung für Spoolman-Einstellungen hinzu und aktualisiere die Benutzeroberfläche 2025-02-25 16:24:22 +01:00
3d0411e3c1 feat: entferne die sendAmsData-Funktion aus der API-Schnittstelle 2025-02-25 14:52:47 +01:00
9c61b708aa fix: aktualisiere Bedingungen für die AMS-Datenaktualisierung und entferne unnötige Aufrufe 2025-02-25 14:52:27 +01:00
90f800d042 fix: aktualisiere Bedingung für den Fortschritt der OTA-Update-Nachricht 2025-02-25 12:19:24 +01:00
a7b1721e1d feat: erweitere Bambu-Credentials um AutoSend-Zeit und aktualisiere die Benutzeroberfläche 2025-02-25 12:17:20 +01:00
e4825d2905 feat: erweitere Bambu-Credentials mit AutoSend-Wartezeit und aktualisiere die Benutzeroberfläche 2025-02-25 11:32:57 +01:00
c1733848d3 feat: add espRestart function and replace delay with vTaskDelay for OTA update process 2025-02-25 11:02:54 +01:00
484c95523d feat: implement OTA update functionality with backup and restore for configurations 2025-02-25 10:57:49 +01:00
8499613215 fix: update auto set logic to check RFID tag before setting Bambu spool 2025-02-25 10:57:36 +01:00
08f37186b4 feat: add own_filaments.json and integrate custom filament loading in bambu.cpp 2025-02-25 09:02:11 +01:00
2948a35fa8 docs: update changelog and header for version v1.3.95
All checks were successful
Release Workflow / detect-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m45s
2025-02-24 19:56:19 +01:00
730724fe58 docs: update webpages for version v1.3.95 2025-02-24 19:56:18 +01:00
714b7065e7 fix: bind autoSendToBambu variable to checkbox in spoolman.html 2025-02-24 19:56:01 +01:00
2d8aec515d docs: update changelog and header for version v1.3.94
All checks were successful
Release Workflow / detect-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m41s
2025-02-24 19:47:24 +01:00
b245a206ce docs: update webpages for version v1.3.94 2025-02-24 19:47:24 +01:00
f1489e75cc fix: correct payload type check in NFC write event handling 2025-02-24 19:46:58 +01:00
d9ae829503 docs: update changelog and header for version v1.3.93
All checks were successful
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 3m1s
2025-02-24 19:15:03 +01:00
2247b8ed6c docs: update webpages for version v1.3.93 2025-02-24 19:15:03 +01:00
d70b187bf9 feat: implement auto send feature for Bambu spool management and update related configurations 2025-02-24 19:14:51 +01:00
1ade007473 fix: remove debug output from splitTextIntoLines and update weight display logic in scanRfidTask 2025-02-24 19:14:45 +01:00
0af14e2f7d docs: add debug mode instructions for Spoolman in README 2025-02-24 19:14:28 +01:00
de67cdbff3 fix: enhance weight display logic for negative values 2025-02-24 12:28:18 +01:00
98fce15ccc refactor: simplify filament names in JSON configuration 2025-02-24 12:21:27 +01:00
ab417ba64b refactor: update findFilamentIdx to return structured result and improve type searching logic 2025-02-24 12:11:27 +01:00
320057bc49 docs: add wiring diagrams to README for PN532 I2C setup 2025-02-24 10:10:15 +01:00
9007a65fc2 docs: update README to reflect PN532 I2C configuration and remove SPI pin details 2025-02-24 09:36:28 +01:00
2214f5f5de fix: remove unnecessary CPU frequency configuration from setup function 2025-02-24 09:20:44 +01:00
5c5846c52c docs: update changelog and header for version v1.3.92
All checks were successful
Release Workflow / detect-provider (push) Successful in 4s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m49s
2025-02-24 07:47:58 +01:00
517fa37a3d docs: update webpages for version v1.3.92 2025-02-24 07:47:58 +01:00
aaa7a6ee9c fix: configure CPU frequency settings in setup function only for testing 2025-02-24 07:47:50 +01:00
a0b8639488 fix: update comment to clarify NVS reading process 2025-02-23 21:29:38 +01:00
a16c05287e fix: adjust weight display logic to handle cases for weight less than 2 2025-02-23 21:23:46 +01:00
ecb35a97bd fix: update weight display logic to handle negative and specific weight cases 2025-02-23 21:22:50 +01:00
ba968611ec refactor: remove commented-out code in setBambuSpool function 2025-02-23 21:17:55 +01:00
6bd11ddce3 docs: update installation instructions and formatting in README files 2025-02-23 20:35:46 +01:00
3eb313e61a docs: update changelog and header for version v1.3.91
All checks were successful
Release Workflow / detect-provider (push) Successful in 5s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m51s
2025-02-23 20:29:45 +01:00
aad35dc296 docs: update webpages for version v1.3.91 2025-02-23 20:29:45 +01:00
85ac636b1e feat: update GitHub Actions workflow for FTP firmware upload with improved credential checks 2025-02-23 20:29:40 +01:00
6f1804c3fe docs: update changelog and header for version v1.3.90
All checks were successful
Release Workflow / detect-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m52s
2025-02-23 20:28:25 +01:00
89716920dc docs: update webpages for version v1.3.90 2025-02-23 20:28:25 +01:00
78b5078651 feat: update index.html for improved content structure and additional links 2025-02-23 20:27:38 +01:00
6098c3b052 feat: improve UI for Spoolman and Bambu Lab printer credentials, enhancing layout and styling 2025-02-23 20:23:09 +01:00
e7537f94d4 docs: update README files with HSPI default PINs and add ESP32 pin diagram 2025-02-23 20:12:35 +01:00
37717392d0 feat: implement scale calibration checks and update start_scale function to return calibration status 2025-02-23 16:44:43 +01:00
c6da28ad6f feat: add FTP upload functionality to GitHub release workflow and update installation instructions in README 2025-02-23 16:13:42 +01:00
d6e38a4e73 fix: remove debug secrets check from Gitea release workflow 2025-02-23 16:01:42 +01:00
4e0d9353c8 docs: update changelog and header for version v1.3.89
All checks were successful
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m59s
2025-02-23 15:57:14 +01:00
7059826659 docs: update webpages for version v1.3.89 2025-02-23 15:57:13 +01:00
41faa8bb1c fix: update Gitea release workflow to use vars for FTP credentials 2025-02-23 15:57:09 +01:00
b38e3fa5ef docs: update changelog and header for version v1.3.88
Some checks failed
Release Workflow / detect-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m48s
2025-02-23 15:49:37 +01:00
5280d7e341 docs: update webpages for version v1.3.88 2025-02-23 15:49:37 +01:00
2f95c66d39 fix: update Gitea release workflow to use secrets for FTP credentials 2025-02-23 15:49:33 +01:00
df1b87465c docs: update changelog and header for version v1.3.87
Some checks failed
Release Workflow / detect-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m43s
2025-02-23 15:39:09 +01:00
84f1420999 docs: update webpages for version v1.3.87 2025-02-23 15:39:09 +01:00
b14dd5475d fix: enhance FTP upload workflow with credential checks and version output 2025-02-23 15:38:59 +01:00
975845421b docs: update changelog and header for version v1.3.86
Some checks failed
Release Workflow / detect-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m55s
2025-02-23 15:29:14 +01:00
044ddbe0eb docs: update webpages for version v1.3.86 2025-02-23 15:29:14 +01:00
c385544d67 fix: streamline FTP credentials usage in Gitea release workflow 2025-02-23 15:29:10 +01:00
c6cfd85687 docs: update changelog and header for version v1.3.85
Some checks failed
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m41s
2025-02-23 15:20:13 +01:00
84632322e2 docs: update webpages for version v1.3.85 2025-02-23 15:20:13 +01:00
86e55a8696 fix: add FTP_USER variable for Gitea release workflow 2025-02-23 15:20:09 +01:00
d2b40daaca docs: update changelog and header for version v1.3.84
Some checks failed
Release Workflow / detect-provider (push) Successful in 5s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m47s
2025-02-23 15:13:49 +01:00
9d58cbc31c docs: update webpages for version v1.3.84 2025-02-23 15:13:48 +01:00
d09aeaf47c fix: add FTP_HOST variable for firmware upload in Gitea release workflow 2025-02-23 15:13:45 +01:00
9fb82fe51e docs: update changelog and header for version v1.3.83
Some checks failed
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m57s
2025-02-23 15:07:40 +01:00
5e0e2c5f6b docs: update webpages for version v1.3.83 2025-02-23 15:07:40 +01:00
a8460503ff fix: correct variable interpolation for FTP credentials in Gitea release workflow 2025-02-23 15:07:35 +01:00
6700a1761f docs: update changelog and header for version v1.3.82
Some checks failed
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m51s
2025-02-23 14:59:03 +01:00
7207f36e06 docs: update webpages for version v1.3.82 2025-02-23 14:59:03 +01:00
e79bee3381 feat: update Gitea release workflow to use variable interpolation for FTP credentials 2025-02-23 14:58:57 +01:00
c3918f075b docs: update changelog and header for version v1.3.81
Some checks failed
Release Workflow / detect-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m41s
2025-02-23 14:53:03 +01:00
0c384219c5 docs: update webpages for version v1.3.81 2025-02-23 14:53:03 +01:00
42b9daf4be feat: update Gitea release workflow to use environment variables for FTP credentials and version 2025-02-23 14:53:00 +01:00
13a771682f docs: update changelog and header for version v1.3.80
Some checks failed
Release Workflow / detect-provider (push) Successful in 4s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m39s
2025-02-23 14:43:41 +01:00
f79f87bf09 docs: update webpages for version v1.3.80 2025-02-23 14:43:41 +01:00
9fe3f6c0ff feat: add FTP_USER and FTP_PASSWORD secrets for firmware upload in Gitea release workflow 2025-02-23 14:43:36 +01:00
55e89948bb docs: update changelog and header for version v1.3.79
Some checks failed
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m47s
2025-02-23 14:36:19 +01:00
6c5e8c4d07 docs: update webpages for version v1.3.79 2025-02-23 14:36:19 +01:00
4f79700d74 feat: add FTP_USER input for firmware upload in Gitea release workflow 2025-02-23 14:36:14 +01:00
1b4fecf409 docs: update changelog and header for version v1.3.78
Some checks failed
Release Workflow / detect-provider (push) Successful in 4s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 3m7s
2025-02-23 12:35:14 +01:00
89a6101d97 docs: update webpages for version v1.3.78 2025-02-23 12:35:14 +01:00
ee45a74fee fix: change FTP protocol from FTPS to FTP for file upload in workflow 2025-02-23 12:35:09 +01:00
db365aba3c docs: update changelog and header for version v1.3.77
Some checks failed
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m49s
2025-02-23 12:05:24 +01:00
63cdfaee6c docs: update webpages for version v1.3.77 2025-02-23 12:05:24 +01:00
eb2e360c35 fix: replace ncftp with lftp for secure firmware upload 2025-02-23 12:05:19 +01:00
7d578640e2 docs: update changelog and header for version v1.3.76
Some checks failed
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m44s
2025-02-23 12:00:38 +01:00
b006533a91 docs: update webpages for version v1.3.76 2025-02-23 12:00:37 +01:00
9fa7526623 fix: replace FTP action with curl for secure firmware upload and install ncftp 2025-02-23 12:00:33 +01:00
dfbb2fbd9b docs: update changelog and header for version v1.3.75
Some checks failed
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m40s
2025-02-23 11:55:20 +01:00
0302158449 docs: update webpages for version v1.3.75 2025-02-23 11:55:20 +01:00
68c385f9d7 fix: update FTP user and enhance SSL options in gitea-release workflow 2025-02-23 11:55:11 +01:00
9a8bd58cb3 docs: update changelog and header for version v1.3.74
Some checks failed
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Has been cancelled
2025-02-23 11:39:55 +01:00
0d8b8918c1 docs: update webpages for version v1.3.74 2025-02-23 11:39:54 +01:00
a892b854b5 fix: update password syntax in gitea-release workflow 2025-02-23 11:39:51 +01:00
0f02f6c848 docs: update changelog and header for version v1.3.73
Some checks failed
Release Workflow / detect-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 3m18s
2025-02-23 11:34:36 +01:00
96c054827e docs: update webpages for version v1.3.73 2025-02-23 11:34:36 +01:00
f93eedf775 chore: update version to 1.3.72 in platformio.ini 2025-02-23 11:34:32 +01:00
68a10dfeb2 docs: update changelog and header for version v1.3.72
Some checks failed
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m46s
2025-02-23 11:17:17 +01:00
632b7a089e docs: update webpages for version v1.3.72 2025-02-23 11:17:17 +01:00
c0e3650bf4 fix: update FTP options for Gitea release workflow 2025-02-23 11:17:13 +01:00
8e3dfc93f7 docs: update changelog and header for version v1.3.71
Some checks failed
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m37s
2025-02-23 11:09:57 +01:00
5016285dce docs: update webpages for version v1.3.71 2025-02-23 11:09:57 +01:00
9b1a232fde feat: add FTP upload step for firmware in Gitea release workflow 2025-02-23 11:09:49 +01:00
37e79b7a49 docs: update changelog and header for version v1.3.70
All checks were successful
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m41s
2025-02-23 09:58:18 +01:00
6bd23f31c1 docs: update webpages for version v1.3.70 2025-02-23 09:58:17 +01:00
3099e9ded9 docs: update changelog and header for version v1.3.69
All checks were successful
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m37s
2025-02-23 09:54:00 +01:00
4952ad3150 docs: update webpages for version v1.3.69 2025-02-23 09:54:00 +01:00
2055da9962 fix: update release note generation to use the second latest tag 2025-02-23 09:53:55 +01:00
459a31cad3 docs: update changelog and header for version v1.3.68
All checks were successful
Release Workflow / detect-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 3m3s
2025-02-23 09:48:22 +01:00
4b1930209b docs: update webpages for version v1.3.68 2025-02-23 09:48:21 +01:00
7dde07b5ab fix: update release note generation to include commit hash and author 2025-02-23 09:48:15 +01:00
33a5406248 fix: remove commented test line from platformio.ini 2025-02-23 09:47:18 +01:00
b016a31ff0 docs: update changelog and header for version v1.3.67
All checks were successful
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m37s
2025-02-23 09:18:57 +01:00
19bc4927e4 docs: update webpages for version v1.3.67 2025-02-23 09:18:57 +01:00
cd55cb86ba ci: update release note generation to use the latest tag 2025-02-23 09:18:52 +01:00
8ab16b351b docs: update changelog and header for version v1.3.66
All checks were successful
Release Workflow / detect-provider (push) Successful in 6s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m52s
2025-02-23 09:02:44 +01:00
400a37d3ac docs: update webpages for version v1.3.66 2025-02-23 09:02:44 +01:00
eb4f809435 ci: remove redundant git fetch for tags in release note generation 2025-02-23 09:02:40 +01:00
1148947b8e docs: update changelog and header for version v1.3.65
All checks were successful
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 3m18s
2025-02-22 20:49:15 +01:00
3b01336999 docs: update webpages for version v1.3.65 2025-02-22 20:49:15 +01:00
44614b58dc ci: improve release note generation by fetching tags and sorting unique commits 2025-02-22 20:49:10 +01:00
ed8d618272 docs: update changelog and header for version v1.3.64
All checks were successful
Release Workflow / detect-provider (push) Successful in 4s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 3m6s
2025-02-22 20:37:49 +01:00
cd2ac54e98 docs: update webpages for version v1.3.64 2025-02-22 20:37:49 +01:00
92f675b24c style: remove unnecessary closing tags from header.html 2025-02-22 20:37:46 +01:00
c342877558 docs: update changelog and header for version v1.3.63
All checks were successful
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m40s
2025-02-22 20:33:55 +01:00
f5743cbd7b docs: update webpages for version v1.3.63 2025-02-22 20:33:55 +01:00
8a62597705 style: update release note generation for initial release handling 2025-02-22 20:33:51 +01:00
374721d1e5 style: update update-form background and add glass border effect 2025-02-22 20:30:30 +01:00
ea6f708c6e docs: update changelog and header for version v1.3.62
Some checks failed
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m37s
2025-02-22 20:25:08 +01:00
78169dfdb1 docs: update webpages for version v1.3.62 2025-02-22 20:25:08 +01:00
074bfb658d style: update background colors and improve layout for update sections 2025-02-22 20:25:00 +01:00
989076e794 docs: update changelog and header for version v1.3.61
Some checks failed
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m47s
2025-02-22 20:14:35 +01:00
aa0d056d10 docs: update webpages for version v1.3.61 2025-02-22 20:14:35 +01:00
cd619b8f2a feat: update release notes generation to use previous tag for changes 2025-02-22 20:13:15 +01:00
6d8358cbb9 docs: update changelog and header for version v1.3.60
All checks were successful
Release Workflow / detect-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m48s
2025-02-22 20:06:25 +01:00
1f3a67634f docs: update webpages for version v1.3.60 2025-02-22 20:06:25 +01:00
09969b644e feat: remove automatic git push from changelog update script 2025-02-22 20:06:20 +01:00
deb7abd102 feat: implement release notes generation with categorized changes since last tag 2025-02-22 20:00:42 +01:00
1b059c35f1 docs: update changelog for version 1.3.59
All checks were successful
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m37s
2025-02-22 19:57:13 +01:00
e098d71f6f docs: update webpages for version v1.3.59 2025-02-22 19:57:13 +01:00
4b25b72b2e feat: implement enhanced update progress handling and WebSocket notifications 2025-02-22 19:50:12 +01:00
5c59016f94 feat: improve update progress reporting and enhance WebSocket notifications 2025-02-22 18:49:45 +01:00
d2da501b94 feat: enhance update progress handling and add WebSocket closure notification 2025-02-22 18:19:21 +01:00
4135073623 feat: implement WebSocket for update progress and enhance update response handling 2025-02-22 18:12:27 +01:00
fe7b57fe0e docs: update changelog for version 1.3.58
All checks were successful
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m25s
2025-02-22 17:59:59 +01:00
c1ae6b7295 docs: update webpages for version v1.3.58 2025-02-22 17:59:59 +01:00
9eee89fac7 feat: implement backup and restore functionality for Bambu credentials and Spoolman URL 2025-02-22 17:58:20 +01:00
8c5e7e26ac docs: update upgrade page message and improve progress display logic 2025-02-22 17:53:51 +01:00
7b52066378 docs: update changelog for version 1.3.57
All checks were successful
Release Workflow / detect-provider (push) Successful in 5s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m59s
2025-02-22 17:36:09 +01:00
d5afa38ded docs: update webpages for version v1.3.57 2025-02-22 17:36:09 +01:00
cf50baba2d docs: update header title to 'Filament Management Tool' in multiple HTML files 2025-02-22 17:36:02 +01:00
aa9e7da94b docs: update changelog for version 1.3.56
All checks were successful
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m41s
2025-02-22 17:31:33 +01:00
71cd3ba4fc docs: update webpages for version v1.3.56 2025-02-22 17:31:33 +01:00
73e240e879 docs: update header title and improve SPIFFS update error handling 2025-02-22 17:31:28 +01:00
0d34e1d718 docs: clarify comments in Gitea and GitHub release workflows 2025-02-22 17:18:11 +01:00
84cc8beb9b docs: update changelog for version 1.3.55
All checks were successful
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m38s
2025-02-22 17:00:00 +01:00
fd70e3179d docs: update webpages for version v1.3.55 2025-02-22 16:59:59 +01:00
c553640ad8 docs: update component descriptions in README files 2025-02-22 16:59:56 +01:00
807eca3c43 docs: update changelog for version 1.3.54
Some checks failed
Release Workflow / detect-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m12s
2025-02-22 16:47:52 +01:00
b52730bf67 docs: update webpages for version v1.3.54 2025-02-22 16:47:52 +01:00
9a59b91e88 workflow: update SPIFFS binary creation to exclude header 2025-02-22 16:47:27 +01:00
a5af4013d8 docs: update changelog for version 1.3.53
All checks were successful
Release Workflow / detect-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m34s
2025-02-22 16:22:30 +01:00
e54ce58ec4 version: update to version 1.3.53 2025-02-22 16:22:27 +01:00
142eafd232 docs: update changelog for version 1.3.51 2025-02-22 16:22:04 +01:00
63ab9e0993 docs: update changelog for version 1.3.51 2025-02-22 16:21:54 +01:00
aaa5506d40 workflow: update SPIFFS binary magic byte and revert version to 1.3.51 2025-02-22 16:21:51 +01:00
8037adc045 docs: update changelog for version 1.3.52
All checks were successful
Release Workflow / detect-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m20s
2025-02-22 16:09:46 +01:00
6e7c728cd8 docs: update webpages for version v1.3.52 2025-02-22 16:09:46 +01:00
3fe8271344 workflow: update SPIFFS binary creation to use correct chip revision (0xEB for Rev 3) 2025-02-22 16:09:41 +01:00
f2bc6eab92 docs: update changelog for version 1.3.51
All checks were successful
Release Workflow / detect-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m35s
2025-02-22 15:50:55 +01:00
37df492339 docs: update webpages for version v1.3.51 2025-02-22 15:50:54 +01:00
c4b425403f config: update platformio.ini to specify correct chip revision and remove unused dependencies 2025-02-22 15:50:49 +01:00
73244689dd docs: update changelog for version 1.3.50
All checks were successful
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m31s
2025-02-22 15:16:53 +01:00
27296104d2 docs: update webpages for version v1.3.50 2025-02-22 15:16:53 +01:00
5f99773897 docs: update changelog for version 1.3.49
All checks were successful
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m43s
2025-02-22 14:54:23 +01:00
7416285fb9 docs: update webpages for version v1.3.49 2025-02-22 14:54:23 +01:00
85928e358d workflow: update SPIFFS binary header to use correct chip revision 2025-02-22 14:54:19 +01:00
092b4fd8ec docs: update changelog for version 1.3.48
All checks were successful
Release Workflow / detect-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m52s
2025-02-22 14:31:23 +01:00
399645a2b3 docs: update webpages for version v1.3.48 2025-02-22 14:31:23 +01:00
164bb241b7 workflow: update SPIFFS binary header for firmware release 2025-02-22 14:29:33 +01:00
e564c6eeae docs: update changelog for version 1.3.47
All checks were successful
Release Workflow / detect-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m37s
2025-02-22 14:04:37 +01:00
4288dd0cd4 docs: update webpages for version v1.3.47 2025-02-22 14:04:37 +01:00
37d43b2d7d workflow: optimize firmware and SPIFFS update process, improve progress handling and logging 2025-02-22 14:04:34 +01:00
adb354ddcd docs: update changelog for version 1.3.46
All checks were successful
Release Workflow / detect-provider (push) Successful in 4s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m39s
2025-02-22 13:55:42 +01:00
15d5e5edce docs: update webpages for version v1.3.46 2025-02-22 13:55:42 +01:00
c6edf30245 docs: update changelog for version 1.3.45
All checks were successful
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m44s
2025-02-22 12:21:35 +01:00
65ac207f36 docs: update webpages for version v1.3.45 2025-02-22 12:21:35 +01:00
698abbd669 workflow: update SPIFFS binary creation to include minimal header and adjust update validation logic 2025-02-22 12:21:33 +01:00
04a7c2cce3 docs: update changelog for version 1.3.44
All checks were successful
Release Workflow / detect-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m48s
2025-02-22 12:11:30 +01:00
78f54b72fd docs: update webpages for version v1.3.44 2025-02-22 12:11:30 +01:00
f4eee9af91 docs: update header title to 'Hollo Lollo Trollo' 2025-02-22 12:11:26 +01:00
cad14b3bc2 docs: update header title to 'Filament Management Tool' and improve update response messages 2025-02-22 12:10:57 +01:00
312f75fc5f docs: update changelog for version 1.3.43
All checks were successful
Release Workflow / detect-provider (push) Successful in 7s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m28s
2025-02-22 12:03:29 +01:00
b8714e93e2 docs: update webpages for version v1.3.43 2025-02-22 12:03:28 +01:00
cd9da0fe4f docs: update header title to 'Hollo Lollo Trollo' 2025-02-22 12:03:25 +01:00
2b620ef5ed docs: update changelog for version 1.3.42
All checks were successful
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m27s
2025-02-22 11:52:21 +01:00
3f63a01b8b docs: update webpages for version v1.3.42 2025-02-22 11:52:21 +01:00
22bb16b6a4 fix: correct path for SPIFFS binary creation in Gitea release workflow 2025-02-22 11:52:19 +01:00
53ceee7816 docs: update changelog for version 1.3.41
Some checks failed
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m32s
2025-02-22 11:48:12 +01:00
d48b002806 docs: update webpages for version v1.3.41 2025-02-22 11:48:12 +01:00
dd905b6c6e fix: remove redundant buffer size setting in NFC initialization 2025-02-22 11:47:35 +01:00
77b9eda110 fix: update SPIFFS binary creation and enhance NFC buffer size 2025-02-22 11:46:17 +01:00
32a6e9dcd3 docs: update changelog for version 1.3.40
All checks were successful
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m30s
2025-02-22 11:31:19 +01:00
6cd5539e60 docs: update webpages for version v1.3.40 2025-02-22 11:31:19 +01:00
903b697912 fix: update SPIFFS binary header and enhance WebSocket error handling 2025-02-22 11:31:15 +01:00
72c2fb70c2 docs: update changelog for version 1.3.39
All checks were successful
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m44s
2025-02-22 11:26:27 +01:00
f2f3f0ab9f docs: update webpages for version v1.3.39 2025-02-22 11:26:27 +01:00
c07692c218 workflow: update SPIFFS binary creation to set chip version to max supported 2025-02-22 11:26:24 +01:00
a184903b66 docs: update changelog for version 1.3.38
All checks were successful
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m58s
2025-02-22 11:21:08 +01:00
af1640383d docs: update webpages for version v1.3.38 2025-02-22 11:21:08 +01:00
c00e54b145 workflow: update SPIFFS binary creation with minimal ESP32 image header 2025-02-22 11:20:41 +01:00
f6c92c686b docs: update changelog for version 1.3.37
All checks were successful
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m46s
2025-02-22 11:13:40 +01:00
b8db01529b docs: update webpages for version v1.3.37 2025-02-22 11:13:40 +01:00
55db6d76ab workflow: update ESP32-WROOM image header for SPIFFS binary creation 2025-02-22 11:13:07 +01:00
a18749a1ff docs: update changelog for version 1.3.36
All checks were successful
Release Workflow / detect-provider (push) Successful in 4s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m40s
2025-02-22 10:54:13 +01:00
1811fd9159 docs: update webpages for version v1.3.36 2025-02-22 10:54:13 +01:00
b550760427 partition: update SPIFFS binary header and offsets in workflow files 2025-02-22 10:53:50 +01:00
c5033acadc docs: update changelog for version 1.3.35
All checks were successful
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m50s
2025-02-22 10:48:53 +01:00
7de4189c83 docs: update webpages for version v1.3.35 2025-02-22 10:48:53 +01:00
f43f2a15b2 partition: update SPIFFS binary header and offsets in workflow files 2025-02-22 10:48:44 +01:00
858192c6cb docs: update changelog for version 1.3.34
All checks were successful
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m46s
2025-02-22 10:40:03 +01:00
e2bd39922d docs: update webpages for version v1.3.34 2025-02-22 10:40:03 +01:00
c86cc7173e partition: update SPIFFS binary creation and offsets in workflow files 2025-02-22 10:38:34 +01:00
16362e66a3 docs: update changelog for version 1.3.33
All checks were successful
Release Workflow / detect-provider (push) Successful in 5s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m46s
2025-02-22 10:09:03 +01:00
48d9ba8f71 docs: update webpages for version v1.3.33 2025-02-22 10:09:03 +01:00
e2bea5a0c3 partition: update spiffs offset and app sizes in partition files 2025-02-22 10:08:47 +01:00
3e11f65188 partition: update spiffs offset in partition files 2025-02-22 10:06:43 +01:00
df59c42c8a partition: update app sizes and offsets in partitions.csv 2025-02-22 10:04:11 +01:00
abe1d7c930 docs: update changelog for version 1.3.32
All checks were successful
Release Workflow / detect-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m31s
2025-02-22 09:52:44 +01:00
ca614c3cc4 docs: update webpages for version v1.3.32 2025-02-22 09:52:44 +01:00
5153374093 workflow: update magic byte for SPIFFS binary creation 2025-02-22 09:52:39 +01:00
66db4d7a85 docs: update changelog for version 1.3.31
All checks were successful
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m58s
2025-02-22 09:47:27 +01:00
90e71922b1 docs: update webpages for version v1.3.31 2025-02-22 09:47:27 +01:00
e8e5c0bd3d workflow: remove unnecessary data and SPIFFS change checks from release workflows 2025-02-22 09:47:15 +01:00
7e53e1ccb0 docs: update changelog for version 1.3.30
Some checks failed
Release Workflow / detect-provider (push) Successful in 4s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m46s
2025-02-22 09:38:14 +01:00
e49e812b13 docs: update webpages for version v1.3.30 2025-02-22 09:38:14 +01:00
b1e0fcfadf workflow: update Gitea and GitHub release workflows to create SPIFFS binary with magic byte 2025-02-22 09:37:59 +01:00
31ef3ac8df docs: update changelog for version 1.3.29
All checks were successful
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m45s
2025-02-21 23:44:36 +01:00
8cf3f87c89 docs: update webpages for version v1.3.29 2025-02-21 23:44:35 +01:00
c446188311 workflow: update Gitea release workflow to create release before file uploads 2025-02-21 23:44:30 +01:00
8e2a8d597d docs: update changelog for version 1.3.28
Some checks failed
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 3m25s
2025-02-21 23:37:15 +01:00
7d3b1c34f6 docs: update webpages for version v1.3.28 2025-02-21 23:37:15 +01:00
b95c61118b workflow: update Gitea release workflow to use file uploads with curl 2025-02-21 23:37:12 +01:00
0dfb158959 docs: update changelog for version 1.3.27
Some checks failed
Release Workflow / detect-provider (push) Successful in 7s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m29s
2025-02-21 23:23:19 +01:00
75c774bb24 docs: update webpages for version v1.3.27 2025-02-21 23:23:19 +01:00
cf80adb43c workflow: add GITEA_TOKEN secret for Gitea API access in release workflows 2025-02-21 23:23:16 +01:00
36d50cbe7f docs: update changelog for version 1.3.26
Some checks failed
Release Workflow / detect-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m51s
2025-02-21 23:14:34 +01:00
9148d207c7 docs: update webpages for version v1.3.26 2025-02-21 23:14:34 +01:00
5f6fef9448 workflow: improve Gitea release workflow with enhanced error handling and debug outputs 2025-02-21 23:14:30 +01:00
946202de0e docs: update changelog for version 1.3.25
Some checks failed
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m33s
2025-02-21 23:07:41 +01:00
41a3717347 docs: update webpages for version v1.3.25 2025-02-21 23:07:41 +01:00
255c820439 workflow: update Gitea release workflow to include RUNNER_NAME and improve error handling 2025-02-21 23:07:38 +01:00
aef3ba77ba docs: update changelog for version 1.3.24
Some checks failed
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m33s
2025-02-21 22:59:00 +01:00
2592c3a497 docs: update webpages for version v1.3.24 2025-02-21 22:59:00 +01:00
a48c5dfef0 workflow: rename update files to upgrade in GitHub release workflow 2025-02-21 22:58:54 +01:00
00554d0b09 workflow: aktualisiere bestehende Einträge im Changelog für vorhandene Versionen 2025-02-21 22:58:38 +01:00
05a91cd8d8 workflow: improve Gitea release process with dynamic URL determination and debug outputs 2025-02-21 22:58:24 +01:00
7cf113eaff docs: update changelog for version 1.3.23
Some checks failed
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m57s
2025-02-21 22:48:04 +01:00
44d27adab2 docs: update webpages for version v1.3.23 2025-02-21 22:48:04 +01:00
e0a2dff5fe workflow: enhance Gitea release process with debug outputs and API connection checks 2025-02-21 22:47:30 +01:00
519a089684 docs: update changelog for version 1.3.22
Some checks failed
Release Workflow / detect-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m27s
2025-02-21 22:39:28 +01:00
ef053bb2b6 docs: update webpages for version v1.3.22 2025-02-21 22:39:28 +01:00
0a91c7b269 workflow: improve Gitea release process with additional environment variables and error handling 2025-02-21 22:39:24 +01:00
875d9d2b70 docs: update changelog for version 1.3.21
Some checks failed
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m53s
2025-02-21 22:34:28 +01:00
52840b9b0b docs: update webpages for version v1.3.21 2025-02-21 22:34:28 +01:00
da1fc7678f workflow: enhance Gitea release process with API integration and token management 2025-02-21 22:34:18 +01:00
982bb5aa21 docs: update changelog for version 1.3.20
Some checks failed
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m44s
2025-02-21 22:22:10 +01:00
007737db13 docs: update webpages for version v1.3.20 2025-02-21 22:22:10 +01:00
17e5949201 workflow: enable git tagging and pushing for Gitea releases 2025-02-21 22:22:06 +01:00
6a57186091 docs: update changelog for version 1.3.19
All checks were successful
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m42s
2025-02-21 22:17:32 +01:00
babd3f47a0 docs: update webpages for version v1.3.19 2025-02-21 22:17:32 +01:00
5372fe10fe workflow: enable git push for version tagging in Gitea release 2025-02-21 22:17:22 +01:00
e0c9d90892 docs: update changelog for version 1.3.18
All checks were successful
Release Workflow / detect-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m49s
2025-02-21 22:11:13 +01:00
e5f5d1961b docs: update webpages for version v1.3.18 2025-02-21 22:11:13 +01:00
31a960fb9e docs: add note about filaman_full.bin installation in changelog 2025-02-21 22:11:07 +01:00
3c2e75b77a docs: update changelog for version 1.3.18 and enhance update script for existing entries 2025-02-21 22:10:32 +01:00
367143c456 docs: update changelog for version 1.3.17
All checks were successful
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m39s
2025-02-21 21:54:28 +01:00
fbde4b764f docs: update webpages for version v1.3.17 2025-02-21 21:54:28 +01:00
e57f4216d4 ci: comment out git tag and push commands in gitea-release workflow 2025-02-21 21:54:24 +01:00
b8beb992d6 config: update platformio.ini for version 1.3.16
Some checks failed
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m32s
2025-02-21 21:49:48 +01:00
4234b2254e docs: update changelog for version 1.3.16 2025-02-21 21:44:40 +01:00
b8faf79163 docs: update webpages for version v1.3.16 2025-02-21 21:44:40 +01:00
d35afaff46 ci: update filenames for firmware and website binaries in release workflows 2025-02-21 21:44:33 +01:00
a8a00372b5 docs: update changelog for version 1.3.15 2025-02-21 21:34:36 +01:00
72f4eab588 docs: update webpages for version v1.3.15 2025-02-21 21:34:36 +01:00
afa4eddc00 ci: fix missing 'fi' in GitHub release workflow script 2025-02-21 21:34:32 +01:00
b0888e7e63 docs: update changelog for version 1.3.14
Some checks failed
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m32s
2025-02-21 21:25:29 +01:00
238a84a8a2 docs: update webpages for version v1.3.14 2025-02-21 21:25:29 +01:00
59cc00ca13 ci: update GitHub release workflow to improve file upload handling 2025-02-21 21:25:16 +01:00
ab083f5f57 docs: update changelog for version 1.3.13
Some checks failed
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m39s
2025-02-21 21:17:06 +01:00
c111573206 docs: update webpages for version v1.3.13 2025-02-21 21:17:06 +01:00
52b2494e52 ci: update GitHub release workflow to use RELEASE_TOKEN for improved security 2025-02-21 21:17:02 +01:00
069ec2d7a1 docs: update changelog for version 1.3.12
Some checks failed
Release Workflow / detect-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m45s
2025-02-21 21:13:40 +01:00
94e35ae86e docs: update webpages for version v1.3.12 2025-02-21 21:13:40 +01:00
d71e3d8184 ci: enhance GitHub release workflow with token handling and file upload improvements 2025-02-21 21:13:36 +01:00
bb166aa29f docs: update changelog for version 1.3.11
Some checks failed
Release Workflow / detect-provider (push) Successful in 4s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m55s
2025-02-21 21:07:19 +01:00
0d718023f8 docs: update webpages for version v1.3.11 2025-02-21 21:07:19 +01:00
b16781043f ci: refactor Gitea release workflow by simplifying input handling and removing unnecessary checks 2025-02-21 21:07:15 +01:00
dff184ff25 docs: update changelog for version 1.3.10
All checks were successful
Release Workflow / route (push) Successful in 7s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m40s
2025-02-21 21:03:56 +01:00
0ce281221d docs: update webpages for version v1.3.10 2025-02-21 21:03:56 +01:00
bc26c160e8 ci: simplify GitHub release workflow by removing provider verification step 2025-02-21 21:03:52 +01:00
c25f41db75 docs: update changelog for version 1.3.9
All checks were successful
Release Workflow / route (push) Successful in 16s
Release Workflow / verify-provider (push) Successful in 4s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m51s
2025-02-21 21:00:21 +01:00
e107c17f50 docs: update webpages for version v1.3.9 2025-02-21 21:00:21 +01:00
85b9d03ebd ci: comment out permissions for GitHub release workflow 2025-02-21 20:59:37 +01:00
17b188626a docs: update changelog for version 1.3.8
All checks were successful
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m35s
2025-02-21 20:56:07 +01:00
a534c5f872 docs: update webpages for version v1.3.8 2025-02-21 20:56:07 +01:00
93f7582790 feat: add Gitea and GitHub release workflows 2025-02-21 20:56:02 +01:00
46acc63756 docs: update changelog for version 1.3.7
Some checks failed
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Has been cancelled
2025-02-21 20:54:16 +01:00
67a9e1bdce docs: update webpages for version v1.3.7 2025-02-21 20:54:16 +01:00
2b75b64b4a feat: add GitHub and Gitea release workflows 2025-02-21 20:54:11 +01:00
8d003295e7 docs: update changelog for version 1.3.6
Some checks failed
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m46s
2025-02-21 20:45:33 +01:00
f89500946a docs: update webpages for version v1.3.6 2025-02-21 20:45:33 +01:00
14e745ff06 fix: update GitHub token reference and correct file path in release workflow 2025-02-21 20:45:25 +01:00
d058397fa2 docs: update changelog for version 1.3.5
Some checks failed
Release Workflow / route (push) Successful in 6s
Release Workflow / verify-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m24s
2025-02-21 20:22:03 +01:00
622f5403a7 docs: update webpages for version v1.3.5 2025-02-21 20:22:03 +01:00
92b78a86dd feat: enhance release workflow to support Gitea alongside GitHub 2025-02-21 20:21:57 +01:00
ec399390e8 docs: update changelog for version 1.3.4
Some checks failed
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m22s
2025-02-21 20:04:05 +01:00
909c4e9b5e docs: update webpages for version v1.3.4 2025-02-21 20:04:05 +01:00
f4b20bfffd Merge branch 'old' 2025-02-21 20:03:45 +01:00
78464215a9 feat: add Gitea and GitHub release workflows 2025-02-21 20:03:21 +01:00
4365f0463a docs: update changelog for version 1.3.3
Some checks failed
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m42s
2025-02-21 19:48:48 +01:00
727bc0e760 docs: update webpages for version v1.3.3 2025-02-21 19:48:48 +01:00
04604013eb fix: correct directory path in GitHub workflows for SPIFFS binary 2025-02-21 19:48:45 +01:00
cf5fc5f6f1 docs: update changelog for version 1.3.2
Some checks failed
Release Workflow / route (push) Successful in 6s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m35s
2025-02-21 19:33:26 +01:00
945a4ccce6 docs: update webpages for version v1.3.2 2025-02-21 19:33:26 +01:00
7cf9e2d145 fix: add missing conditional exit in release workflow 2025-02-21 19:33:24 +01:00
9db4e338ea docs: update changelog for version 1.3.1
Some checks failed
Release Workflow / route (push) Successful in 6s
Release Workflow / verify-provider (push) Failing after 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Has been skipped
2025-02-21 19:10:52 +01:00
dea6ca2c66 docs: update webpages for version v1.3.1 2025-02-21 19:10:52 +01:00
e224e72e41 feat: enhance GitHub and Gitea release workflows with Python setup and binary preparation 2025-02-21 19:10:48 +01:00
306c517da7 docs: update changelog for version 1.3.0
All checks were successful
Release Workflow / route (push) Successful in 6s
Release Workflow / verify-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m40s
2025-02-21 18:58:35 +01:00
0337bbabe0 bump version to 1.3.0 in platformio.ini 2025-02-21 18:58:32 +01:00
bde14e50e0 docs: update changelog for version 1.2.102
All checks were successful
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 3m1s
2025-02-21 18:28:20 +01:00
9c656a9bd0 docs: update webpages for version v1.2.102 2025-02-21 18:28:20 +01:00
eae552017d fix: adjust bootloader offset in binary merge for Gitea and GitHub workflows 2025-02-21 18:28:16 +01:00
a77918da41 docs: update changelog for version 1.2.101
Some checks failed
Release Workflow / route (push) Successful in 6s
Release Workflow / verify-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m38s
2025-02-21 18:07:47 +01:00
262dad38a6 docs: update webpages for version v1.2.101 2025-02-21 18:07:46 +01:00
cfc9f103cf refactor: always create SPIFFS binary in release workflows 2025-02-21 18:07:43 +01:00
0117302672 refactor: migrate calibration value storage from EEPROM to NVS 2025-02-21 18:04:05 +01:00
1de283b62f docs: update changelog for version 1.2.100
All checks were successful
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m41s
2025-02-21 17:49:32 +01:00
f1eb78eb38 docs: update webpages for version v1.2.100 2025-02-21 17:49:32 +01:00
8a65b86475 refactor: remove OTA handling and JSON backup/restore functions 2025-02-21 17:47:25 +01:00
a3aef819c8 docs: update changelog for version 1.2.99
Some checks failed
Release Workflow / route (push) Successful in 8s
Release Workflow / verify-provider (push) Successful in 4s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Has been cancelled
2025-02-21 17:42:40 +01:00
a62b5ec933 docs: update webpages for version v1.2.99 2025-02-21 17:42:40 +01:00
1a8cf7a58f docs: add SPIFFS change detection and binary copying to release workflows 2025-02-21 17:42:04 +01:00
b0b3d41c84 docs: add backup and restore functions for JSON configurations during OTA updates 2025-02-21 17:38:20 +01:00
38b68aecfc docs: update JSON field type checks from JsonObject to String for improved validation 2025-02-21 17:11:48 +01:00
4992f5f433 docs: update JSON handling in API and Bambu modules for improved object management 2025-02-21 16:53:45 +01:00
5cbbe1d231 docs: update platformio.ini dependencies and improve version handling in website.cpp 2025-02-21 16:35:19 +01:00
9b29460d64 docs: update Cache-Control header to reflect a 1-week duration 2025-02-21 15:15:01 +01:00
dd14d475b7 docs: remove version definition from website.cpp 2025-02-21 15:14:36 +01:00
9e6cd3b451 docs: optimize WiFi and WebSocket settings; enhance TCP/IP stack configuration 2025-02-21 15:07:16 +01:00
c1be6ca582 docs: update upgrade page title and heading; adjust cache control duration 2025-02-21 14:35:12 +01:00
265ff0c787 docs: update changelog for version 1.2.98
All checks were successful
Release Workflow / route (push) Successful in 6s
Release Workflow / verify-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m28s
2025-02-21 13:52:27 +01:00
67eca82ac5 docs: update webpages for version v1.2.98 2025-02-21 13:52:27 +01:00
568db90db0 docs: update changelog for version 1.2.97
All checks were successful
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m37s
2025-02-21 12:34:25 +01:00
2dfd53d64a docs: update webpages for version v1.2.97 2025-02-21 12:34:25 +01:00
262a2fcbd4 refactor: streamline Gitea and GitHub release workflows to check for data changes and update binary handling 2025-02-21 12:34:20 +01:00
3770de15d3 docs: update changelog for version 1.2.96
Some checks failed
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m45s
2025-02-21 12:09:40 +01:00
75a74ec9bd docs: update webpages for version v1.2.96 2025-02-21 12:09:40 +01:00
979adcbb14 feat: add SPIFFS build step to Gitea and GitHub release workflows 2025-02-21 12:09:36 +01:00
2dd563a178 Merge branch 'temp-branch'
Some checks failed
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 3m3s
2025-02-21 12:03:12 +01:00
767c217c25 docs: update changelog for version 1.2.95 2025-02-21 11:58:00 +01:00
c07689e15a docs: update webpages for version v1.2.95 2025-02-21 11:58:00 +01:00
d6ca69fd19 chore: bump version to 1.2.94 in platformio.ini 2025-02-21 11:57:57 +01:00
60553255b8 feat: enhance update process with separate forms for firmware and webpage uploads, including validation and improved UI 2025-02-21 11:57:19 +01:00
8199b283c0 feat: add API endpoint for version retrieval and update HTML to display dynamic version 2025-02-21 11:53:59 +01:00
d774ce0d09 docs: update changelog for version 1.2.94
All checks were successful
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m56s
2025-02-21 10:46:05 +01:00
4a44eda5c4 docs: update webpages for version v1.2.94 2025-02-21 10:46:05 +01:00
c43ca20d8d refactor: remove unused flash size parameters in release workflows 2025-02-21 10:46:00 +01:00
21ba35cd19 docs: update changelog for version 1.2.93
All checks were successful
Release Workflow / route (push) Successful in 6s
Release Workflow / verify-provider (push) Successful in 4s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m47s
2025-02-21 10:35:58 +01:00
62273320e9 docs: update webpages for version v1.2.93 2025-02-21 10:35:58 +01:00
b8e4af4e4d refactor: update SPIFFS initialization and partition sizes; enhance WiFi setup 2025-02-21 10:35:52 +01:00
513d74fdb0 docs: update changelog for version 1.2.92
All checks were successful
Release Workflow / route (push) Successful in 8s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m43s
2025-02-21 09:25:00 +01:00
df884e7668 docs: update webpages for version v1.2.92 2025-02-21 09:25:00 +01:00
8182b5f684 feat: enhance OTA upload handling with chunk validation and timeout checks 2025-02-21 09:24:54 +01:00
4477537cec docs: update changelog for version 1.2.91
All checks were successful
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m57s
2025-02-20 20:40:20 +01:00
44ba7df34f docs: update webpages for version v1.2.91 2025-02-20 20:40:20 +01:00
54744a06dd fix: add file existence checks before uploading binaries in release workflows 2025-02-20 20:40:14 +01:00
cefa81030b docs: update changelog for version 1.2.90
Some checks failed
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m48s
2025-02-20 20:33:25 +01:00
62052927d2 docs: update webpages for version v1.2.90 2025-02-20 20:33:25 +01:00
933a84f8ce refactor: update Gitea and GitHub release workflows to include SPIFFS directory creation and firmware copying 2025-02-20 20:33:19 +01:00
db3c19ff2e docs: update changelog for version 1.2.89
Some checks failed
Release Workflow / route (push) Successful in 6s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m46s
2025-02-20 20:20:09 +01:00
ae9eb4cc6b docs: update webpages for version v1.2.89 2025-02-20 20:20:09 +01:00
89d40832c5 refactor: enhance OTA update process with SPIFFS support and improved error handling 2025-02-20 20:19:24 +01:00
c161216c04 docs: update changelog for version 1.2.88
All checks were successful
Release Workflow / route (push) Successful in 6s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m42s
2025-02-20 20:05:38 +01:00
6a016b6ac4 docs: update webpages for version v1.2.88 2025-02-20 20:05:38 +01:00
44dd485e17 fix: improve OTA update handling and logging for better error reporting 2025-02-20 20:04:58 +01:00
d41f0f3e67 docs: update changelog for version 1.2.87
All checks were successful
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m30s
2025-02-20 19:52:44 +01:00
484058515e docs: update webpages for version v1.2.87 2025-02-20 19:52:44 +01:00
f552b492cf fix: update firmware build process and remove unused OTA environment 2025-02-20 19:52:34 +01:00
c3040b3c29 docs: update changelog for version 1.2.86
All checks were successful
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m36s
2025-02-20 19:09:35 +01:00
d7ba67085d docs: update webpages for version v1.2.86 2025-02-20 19:09:35 +01:00
48efb9e21a fix: update SPIFFS offset and size in release workflows and partitions.csv 2025-02-20 19:09:28 +01:00
e983ba6e44 docs: update changelog for version 1.2.85
All checks were successful
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m48s
2025-02-20 18:37:57 +01:00
37171d6eca docs: update webpages for version v1.2.85 2025-02-20 18:37:57 +01:00
ebb08a7a66 ci: streamline release workflows by removing unnecessary binary uploads and adding SPIFFS formatting 2025-02-20 18:37:51 +01:00
b5330af351 docs: update changelog for version 1.2.84
All checks were successful
Release Workflow / route (push) Successful in 10s
Release Workflow / verify-provider (push) Successful in 4s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m41s
2025-02-20 18:04:06 +01:00
4919d34484 docs: update webpages for version v1.2.84 2025-02-20 18:04:06 +01:00
2da641d604 ci: update installation steps for xxd to include package list update 2025-02-20 18:04:00 +01:00
ce413965c7 docs: update changelog for version 1.2.83
Some checks failed
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 25s
2025-02-20 18:01:22 +01:00
3fafed930e docs: update webpages for version v1.2.83 2025-02-20 18:01:22 +01:00
e1c604ee8d refactor: replace hexdump with xxd for magic byte verification in release workflows 2025-02-20 18:01:16 +01:00
11bbfb7db6 docs: update changelog for version 1.2.82
Some checks failed
Release Workflow / route (push) Successful in 6s
Release Workflow / verify-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m27s
2025-02-20 17:53:00 +01:00
71d8f7ec5a docs: update webpages for version v1.2.82 2025-02-20 17:53:00 +01:00
f4518e4a36 refactor: enhance Gitea and GitHub release workflows to include magic byte handling and improve binary verification 2025-02-20 17:52:18 +01:00
62d9596d08 docs: update changelog for version 1.2.81
All checks were successful
Release Workflow / route (push) Successful in 8s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m42s
2025-02-20 17:11:28 +01:00
e27e95d291 docs: update webpages for version v1.2.81 2025-02-20 17:11:28 +01:00
b7651ad50d refactor: update Gitea and GitHub release workflows to use esp32dev_ota for building and uploading firmware and SPIFFS binaries 2025-02-20 17:11:22 +01:00
f1937e2977 docs: update changelog for version 1.2.80
All checks were successful
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 3m37s
2025-02-20 17:05:53 +01:00
ad5ddf713c docs: update webpages for version v1.2.80 2025-02-20 17:05:52 +01:00
ccb494f843 bump version to 1.2.79 in platformio.ini 2025-02-20 17:05:47 +01:00
17307d8f03 refactor: update Gitea and GitHub release workflows to include new firmware and SPIFFS binaries; fix version display in HTML files to v1.2.78 2025-02-20 17:04:56 +01:00
e5240a9572 docs: update changelog for version 1.2.79
All checks were successful
Release Workflow / route (push) Successful in 12s
Release Workflow / verify-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m45s
2025-02-20 16:25:02 +01:00
06ebf105cf docs: update webpages for version v1.2.79 2025-02-20 16:25:02 +01:00
118e099fc5 refactor: simplify Gitea release workflow by using esptool for binary creation 2025-02-20 16:24:57 +01:00
8edd50f786 docs: update changelog for version 1.2.78
Some checks failed
Release Workflow / route (push) Successful in 8s
Release Workflow / verify-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m44s
2025-02-20 16:15:59 +01:00
b85325a747 docs: update webpages for version v1.2.78 2025-02-20 16:15:59 +01:00
e1e0352beb refactor: streamline Gitea release workflow and update version to 1.2.77 2025-02-20 16:15:48 +01:00
8a93cccfce refactor: update Gitea and GitHub release workflows to improve binary preparation and verification
fix: correct version number in HTML files and platformio.ini to v1.2.76
enhance: streamline OTA update handling by removing unnecessary magic byte checks
2025-02-20 16:14:49 +01:00
c374069f36 docs: update changelog for version 1.2.77
All checks were successful
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m33s
2025-02-20 15:53:26 +01:00
59cd7c177d refactor: optimize Gitea release workflow by simplifying build steps and improving file handling 2025-02-20 15:53:22 +01:00
45088b5838 docs: update webpages for version v1.2.77 2025-02-20 15:53:07 +01:00
1b9c79b559 docs: update changelog for version 1.2.76
Some checks failed
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m48s
2025-02-20 15:42:44 +01:00
37e1e861d3 docs: update webpages for version v1.2.76 2025-02-20 15:42:44 +01:00
cce39319d9 refactor: streamline Gitea release workflow and remove obsolete OTA data initialization script 2025-02-20 15:41:14 +01:00
6391054c23 feat: enhance OTA update process with improved file verification and new OTA data initialization 2025-02-20 15:07:13 +01:00
52cf46d7f8 docs: update changelog for version 1.2.75
All checks were successful
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m57s
2025-02-20 14:57:17 +01:00
84b05e48ce docs: update webpages for version v1.2.75 2025-02-20 14:57:16 +01:00
5c41d864c1 refactor: simplify OTA update handling by removing unnecessary variables and improving error reporting 2025-02-20 14:56:31 +01:00
5dc3563da6 docs: update changelog for version 1.2.74
All checks were successful
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 3m17s
2025-02-20 14:46:12 +01:00
9e1b2943d6 docs: update webpages for version v1.2.74 2025-02-20 14:46:12 +01:00
7b89b04621 refactor: enhance OTA update process with improved handling of full image updates and SPIFFS data 2025-02-20 14:45:34 +01:00
e140f8e003 docs: update changelog for version 1.2.73
All checks were successful
Release Workflow / route (push) Successful in 6s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 3m14s
2025-02-20 14:31:44 +01:00
3d0bdde476 docs: update webpages for version v1.2.73 2025-02-20 14:31:44 +01:00
3ac7d6b4f7 refactor: improve OTA update process with enhanced size checks and progress logging 2025-02-20 14:31:10 +01:00
5f52775984 refactor: enhance OTA update process with improved size checks and debugging output 2025-02-20 14:28:11 +01:00
463eaf4b6f docs: update changelog for version 1.2.72
All checks were successful
Release Workflow / route (push) Successful in 13s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 3m16s
2025-02-20 14:17:34 +01:00
4bf6b11d3a docs: update webpages for version v1.2.72 2025-02-20 14:17:34 +01:00
b0c4af7c4e refactor: simplify OTA update process by removing unnecessary buffer and adjusting offsets 2025-02-20 14:16:49 +01:00
249e896ea4 docs: update changelog for version 1.2.71
Some checks failed
Release Workflow / route (push) Successful in 6s
Release Workflow / verify-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Has been cancelled
2025-02-20 14:09:21 +01:00
c74f587fff docs: update webpages for version v1.2.71 2025-02-20 14:09:21 +01:00
7a7ee72585 fix: update version number to v1.2.65 in HTML files and platformio.ini; add script to create full binary 2025-02-20 14:08:17 +01:00
3dd5fbc585 docs: update changelog for version 1.2.70
All checks were successful
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 3m23s
2025-02-20 12:01:08 +01:00
ed9c1487ed docs: update webpages for version v1.2.70 2025-02-20 12:01:08 +01:00
d8756421a1 fix: add logging to stopAllTasks for better debugging 2025-02-20 12:00:45 +01:00
d92c78f9d0 docs: update changelog for version 1.2.69
All checks were successful
Release Workflow / route (push) Successful in 11s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 3m21s
2025-02-20 11:54:38 +01:00
2d19ea745f docs: update webpages for version v1.2.69 2025-02-20 11:54:37 +01:00
13779cc9d7 docs: update changelog for version 1.2.68
Some checks failed
Release Workflow / route (push) Successful in 6s
Release Workflow / verify-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Has been cancelled
2025-02-20 11:53:15 +01:00
b6d5a8a00b docs: update webpages for version v1.2.68 2025-02-20 11:53:15 +01:00
f6319e79f0 fix: update stopAllTasks to suspend RfidReaderTask instead of NfcTask 2025-02-20 11:53:04 +01:00
6f24630a7d feat: add task handles for BambuMqttTask and ScaleTask; rename stopTasks to stopAllTasks 2025-02-20 11:52:36 +01:00
4475d21218 docs: update changelog for version 1.2.67
All checks were successful
Release Workflow / route (push) Successful in 6s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 3m6s
2025-02-20 11:42:41 +01:00
01a926a38d feat: improve OTA upload handling and add SPIFFS update support 2025-02-20 11:42:36 +01:00
6b966c02b3 docs: update webpages for version v1.2.67 2025-02-20 11:42:25 +01:00
1450e1ad2e docs: update changelog for version 1.2.66
All checks were successful
Release Workflow / route (push) Successful in 8s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 3m5s
2025-02-20 11:27:18 +01:00
3102a6c217 docs: update webpages for version v1.2.66 2025-02-20 11:27:18 +01:00
d5b2b2746d feat: enhance OTA upload to support SPIFFS updates 2025-02-20 11:27:11 +01:00
7e776d4816 docs: update changelog for version 1.2.65
All checks were successful
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 5s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 3m8s
2025-02-20 11:16:54 +01:00
e84b2973c5 docs: update webpages for version v1.2.65 2025-02-20 11:16:53 +01:00
5793dc1a1f docs: update changelog for version 1.2.64
Some checks failed
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Has been cancelled
2025-02-20 11:13:56 +01:00
1732491c48 docs: update webpages for version v1.2.64 2025-02-20 11:13:56 +01:00
0500bb6951 fix: improve error handling in OTA upload process 2025-02-20 11:13:49 +01:00
ef9ef7257a docs: update changelog for version 1.2.63
All checks were successful
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 3m10s
2025-02-20 10:59:17 +01:00
e86fd229dc docs: update webpages for version v1.2.63 2025-02-20 10:59:17 +01:00
b940a166da feat: update version to 1.2.63 2025-02-20 10:59:10 +01:00
c857e16de2 feat: enhance OTA upload handling with magic byte checks for image types
Some checks failed
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 3m4s
2025-02-20 10:53:23 +01:00
8b2a537b72 docs: update changelog for version 1.2.62
All checks were successful
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 3m6s
2025-02-20 10:29:08 +01:00
88ec151c4c docs: update webpages for version 1.2.62 2025-02-20 10:29:08 +01:00
0a203f02eb feat: update version to 1.2.62 2025-02-20 10:29:04 +01:00
04b59f4809 docs: update changelog for version 1.2.61
All checks were successful
Release Workflow / route (push) Successful in 8s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 3m9s
2025-02-20 10:06:15 +01:00
b31861af67 docs: update webpages for version 1.2.61 2025-02-20 10:06:15 +01:00
ce3b423dc1 feat: update version to 1.2.61 and enhance OTA update error handling 2025-02-20 10:06:06 +01:00
05f275142f docs: update changelog for version 1.2.60
All checks were successful
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 4s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 3m11s
2025-02-20 01:28:56 +01:00
72af54bd20 docs: update webpages for version 1.2.60 2025-02-20 01:28:56 +01:00
a1e30a3b7f feat: update version to 1.2.60 in platformio configuration 2025-02-20 01:28:45 +01:00
8f8322e629 docs: update changelog for version 1.2.59
All checks were successful
Release Workflow / route (push) Successful in 6s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 3m10s
2025-02-20 01:08:56 +01:00
1e386c49af docs: update webpages for version 1.2.59 2025-02-20 01:08:56 +01:00
3070d75d07 feat: update version to 1.2.59 and enhance OTA upload handling 2025-02-20 01:08:48 +01:00
34ee9badea docs: update changelog for version 1.2.58
All checks were successful
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 3m16s
2025-02-20 00:50:53 +01:00
6594af9540 feat: update version to 1.2.58 in HTML files and platformio configuration 2025-02-20 00:50:48 +01:00
c21bd2d4ec docs: update changelog for version 1.2.57
All checks were successful
Release Workflow / route (push) Successful in 8s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 3m15s
2025-02-20 00:33:35 +01:00
e5f895b560 feat: update version to 1.2.57 in platformio configuration 2025-02-20 00:33:31 +01:00
bb0f50ce1d fix: update spiffs offset and sizes in firmware and partitions configuration 2025-02-20 00:33:16 +01:00
499a08aa75 docs: update changelog for version 1.2.56
Some checks failed
Release Workflow / route (push) Successful in 8s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m50s
2025-02-19 22:06:56 +01:00
745d960f62 feat: update version to 1.2.56 and adjust firmware and partition settings 2025-02-19 22:06:47 +01:00
531d0fe9a2 refactor: remove redundant comment from Gitea release workflow 2025-02-19 21:45:26 +01:00
2af23e8084 docs: update changelog for version 1.2.55
All checks were successful
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 3m8s
2025-02-19 21:25:23 +01:00
cd204fdaa8 feat: update version to 1.2.55 and adjust Gitea release workflow to remove 'v' prefix from version 2025-02-19 21:24:38 +01:00
d04ad42b5b docs: update changelog for version 1.2.54
Some checks failed
Release Workflow / route (push) Successful in 10s
Release Workflow / verify-provider (push) Successful in 6s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 3m38s
2025-02-19 21:03:22 +01:00
8d80a8fb5a feat: update version to 1.2.54 and add check for missing changelog in Gitea release workflow 2025-02-19 21:03:17 +01:00
77032bf9ae docs: update changelog for version 1.2.53
Some checks failed
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m56s
2025-02-19 20:54:26 +01:00
3967366ae6 feat: update version to 1.2.53 and enhance Gitea release workflow to handle missing changelog 2025-02-19 20:54:20 +01:00
cd391378c2 docs: update changelog for version 1.2.52
All checks were successful
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m59s
2025-02-19 20:36:45 +01:00
3fc3a689cb feat: update version to 1.2.52 and improve Gitea release workflow output handling 2025-02-19 20:35:33 +01:00
bd5b32a3b0 docs: update changelog for version 1.2.51
All checks were successful
Release Workflow / route (push) Successful in 9s
Release Workflow / verify-provider (push) Successful in 4s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 3m14s
2025-02-19 20:14:54 +01:00
a5c999234c feat: update version to 1.2.51 and add debug output in Gitea release workflow 2025-02-19 20:14:43 +01:00
f64d3e51ce docs: update changelog for version 1.2.50
All checks were successful
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 3m30s
2025-02-19 20:06:08 +01:00
a650b7d860 feat: update version to 1.2.50 and remove obsolete build workflow 2025-02-19 20:05:56 +01:00
14e98072aa docs: update changelog for version 1.2.49
All checks were successful
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 3m0s
2025-02-19 18:24:09 +01:00
0bc4c0565f feat: update version to 1.2.49 and modify changelog reading in Gitea release workflow 2025-02-19 18:24:05 +01:00
4aa8e844ac docs: update changelog for version 1.2.48
All checks were successful
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 3m16s
2025-02-19 18:03:35 +01:00
d7135fddc8 feat: update version to 1.2.48 and modify changelog reading in release workflows 2025-02-19 18:03:31 +01:00
6e3e978839 docs: update changelog for version 1.2.47
All checks were successful
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 3m9s
2025-02-19 17:54:06 +01:00
33b0e79c18 feat: update version to 1.2.47 and modify changelog reading in GitHub release workflow 2025-02-19 17:53:54 +01:00
787d878e83 docs: update changelog for version 1.2.46
All checks were successful
Release Workflow / route (push) Successful in 8s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 3m5s
2025-02-19 15:09:00 +01:00
1e24179b82 feat: update Gitea release workflow to include changelog and increment version to 1.2.46 2025-02-19 15:08:56 +01:00
67027840f4 docs: update changelog for version 1.2.45
All checks were successful
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 3m14s
2025-02-19 14:11:47 +01:00
2755e9c863 feat: update Gitea release workflow to use dynamic upload URL and increment version to 1.2.45 2025-02-19 14:11:44 +01:00
7ae26fb0a9 docs: update changelog for version 1.2.44
Some checks failed
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 3m9s
2025-02-19 12:57:19 +01:00
98bcf98f1e feat: update Gitea release workflow to include additional outputs and increment version to 1.2.44 2025-02-19 12:57:15 +01:00
bc8ac32fee docs: update changelog for version 1.2.43
Some checks failed
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 3m7s
2025-02-19 12:50:18 +01:00
ba74eca21d feat: update Gitea release workflow by removing unnecessary outputs and increment version to 1.2.43 2025-02-19 12:50:16 +01:00
d4e1cf1322 docs: update changelog for version 1.2.42
Some checks failed
Release Workflow / route (push) Successful in 6s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m48s
2025-02-19 12:44:09 +01:00
5170784e44 feat: update Gitea release workflow to include additional outputs and increment version to 1.2.42 2025-02-19 12:44:07 +01:00
ac323167d0 docs: update changelog for version 1.2.41
Some checks failed
Release Workflow / route (push) Successful in 8s
Release Workflow / verify-provider (push) Successful in 4s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 3m4s
2025-02-19 12:20:02 +01:00
003de5bc00 feat: update Gitea release workflow debug output and increment version to 1.2.41 2025-02-19 12:20:00 +01:00
83595cfadf docs: update changelog for version 1.2.40
Some checks failed
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 3m4s
2025-02-19 12:09:15 +01:00
cfe21d63d7 feat: add inputs for Gitea release workflow and increment version to 1.2.40 2025-02-19 12:09:12 +01:00
63e72076ed docs: update changelog for version 1.2.39
Some checks failed
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 3m12s
2025-02-19 12:02:04 +01:00
2a011ee244 feat: update Gitea release workflow to use Python virtual environment and increment version to 1.2.39 2025-02-19 12:02:01 +01:00
84dd2bd40b docs: update changelog for version 1.2.38
Some checks failed
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 18s
2025-02-19 11:58:29 +01:00
1449cacc0e feat: update Gitea release workflow and increment version to 1.2.38 2025-02-19 11:58:26 +01:00
f1c2b2eb87 docs: update changelog for version 1.2.37
Some checks failed
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 10s
2025-02-19 11:46:19 +01:00
0f1a3b1d5b feat: update Gitea release workflow and increment version to 1.2.37 2025-02-19 11:46:17 +01:00
6190cf04db docs: update changelog for version 1.2.36
Some checks failed
Release Workflow / route (push) Successful in 12s
Release Workflow / verify-provider (push) Successful in 4s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 45s
2025-02-19 11:38:39 +01:00
680aed0e10 feat: update Gitea release workflow and increment version to 1.2.36 2025-02-19 11:38:37 +01:00
fadb122d28 docs: update changelog for version 1.2.35
Some checks failed
Release Workflow / route (push) Successful in 20s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 18s
2025-02-19 11:18:07 +01:00
4347f89c16 feat: update Gitea release workflow and version to 1.2.35 2025-02-19 11:18:05 +01:00
9856757e49 docs: update changelog for version 1.2.34
All checks were successful
Release Workflow / route (push) Successful in 12s
Release Workflow / verify-provider (push) Successful in 4s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Has been skipped
2025-02-19 11:01:57 +01:00
afb7b5f42b feat: update version to 1.2.34 and enhance Gitea and GitHub release workflows 2025-02-19 11:01:54 +01:00
ba8506247b docs: update changelog for version 1.2.33
All checks were successful
Release Workflow / route (push) Successful in 12s
Release Workflow / verify-provider (push) Successful in 8s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Has been skipped
2025-02-19 11:00:03 +01:00
61f3f90d6d feat: update version to 1.2.33 and refactor release workflows for Gitea and GitHub 2025-02-19 11:00:01 +01:00
a143527dd0 docs: update changelog for version 1.2.32
Some checks failed
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m24s
2025-02-19 10:58:53 +01:00
f2c9818e61 feat: update version to 1.2.32 and adjust workflow dependencies for GitHub and Gitea releases 2025-02-19 10:58:51 +01:00
9e23af29ff docs: update changelog for version 1.2.31
All checks were successful
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Has been skipped
2025-02-19 10:58:06 +01:00
095885442a feat: update version to 1.2.31 2025-02-19 10:58:04 +01:00
359c9b5a6d docs: update changelog for version 1.2.30
All checks were successful
Release Workflow / route (push) Successful in 6s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Has been skipped
2025-02-19 10:50:09 +01:00
b16a7a4c17 feat: update version to 1.2.30 and enhance release workflows for Gitea and GitHub with improved artifact handling and changelog integration 2025-02-19 10:50:06 +01:00
b4ea175757 docs: update changelog for version 1.2.29
All checks were successful
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m26s
2025-02-19 10:37:44 +01:00
ca4671a7dd feat: update version to 1.2.29 and enhance Gitea release workflow with improved error handling and debugging 2025-02-19 10:37:41 +01:00
7a4b1a934f docs: update changelog for version 1.2.28
All checks were successful
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m42s
2025-02-19 10:24:47 +01:00
77d90bbe83 feat: add build and release workflows for Gitea and GitHub, increment version to 1.2.28 2025-02-19 10:24:43 +01:00
c99d802184 docs: update changelog for version 1.2.27
Some checks failed
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m49s
2025-02-19 10:12:55 +01:00
ca15d2abe4 feat: enhance CI workflows with provider detection and update version to 1.2.27 2025-02-19 10:12:52 +01:00
bddb48ba9a docs: update changelog for version 1.2.26
Some checks failed
Release Workflow / route (push) Successful in 15s
Release Workflow / gitea-release (push) Has been cancelled
Release Workflow / github-release (push) Has been cancelled
2025-02-19 10:07:45 +01:00
f4b67e52b8 feat: update release workflows for Gitea and GitHub, increment version to 1.2.26 2025-02-19 10:07:41 +01:00
00f6a4b0ae docs: update changelog for version 1.2.25
Some checks failed
Github Release / build (push) Failing after 3m8s
Create Release / build (push) Has been cancelled
2025-02-19 09:43:47 +01:00
ab3937a69d feat: update GitHub release workflows and increment version to 1.2.25 2025-02-19 09:43:44 +01:00
0c4bae48d4 docs: update changelog for version 1.2.24 2025-02-19 09:40:33 +01:00
b4b17cb999 feat: update GitHub release workflow and increment version to 1.2.24 2025-02-19 09:40:30 +01:00
5ff3864d9d docs: update changelog for version 1.2.23
Some checks failed
Release / prepare (push) Has been cancelled
2025-02-19 09:39:43 +01:00
9b8736d35f feat: update Gitea release workflow and increment version to 1.2.23 2025-02-19 09:39:41 +01:00
cf0ba20637 docs: update changelog for version 1.2.22
Some checks failed
Release / prepare (push) Has been cancelled
2025-02-19 09:27:21 +01:00
e06c0b9a76 feat: update Gitea runner configuration and increment version to 1.2.22 2025-02-19 09:27:18 +01:00
4cb370ddff docs: update changelog for version 1.2.21
Some checks failed
Release / prepare (push) Has been cancelled
2025-02-19 01:30:59 +01:00
0b9c1711da feat: update Gitea release condition and increment version to 1.2.21 2025-02-19 01:30:46 +01:00
e2449030c5 docs: update changelog for version 1.2.20
Some checks failed
Release / prepare (push) Has been cancelled
2025-02-19 01:21:23 +01:00
5a91e87afa feat: update release workflows for GitHub and Gitea, increment version to 1.2.20 2025-02-19 01:21:14 +01:00
5e66c3bd45 docs: update changelog for version 1.2.19
Some checks failed
Release / prepare (push) Has been cancelled
Release / github (push) Has been cancelled
Release / gitea (push) Has been cancelled
2025-02-19 01:19:46 +01:00
61c82f796f feat: add Gitea and GitHub release workflows for version 1.2.19 2025-02-19 01:19:42 +01:00
7661e0eb20 docs: update changelog for version 1.2.18
Some checks failed
Release / release (push) Has been cancelled
2025-02-19 01:18:00 +01:00
c06e6de89a feat: remove Gitea and GitHub release workflows and increment version to 1.2.18 2025-02-19 01:17:56 +01:00
262bed84df docs: update changelog for version 1.2.17
Some checks failed
Release / prepare (push) Has been cancelled
Release / github (push) Has been cancelled
Release / gitea (push) Has been cancelled
2025-02-19 01:03:56 +01:00
c710e5d7f8 feat: update Gitea release workflow for version 1.2.17 and improve job structure 2025-02-19 01:03:53 +01:00
5d39f04786 docs: update changelog for version 1.2.16
Some checks failed
Release / github-release (push) Has been cancelled
Release / gitea-release (push) Has been cancelled
Release / get-version-and-changelog (push) Has been cancelled
2025-02-19 00:49:39 +01:00
d955e26b82 feat: update Gitea release workflow and increment version to 1.2.16 2025-02-19 00:49:35 +01:00
c20e7de5c3 docs: update changelog for version 1.2.15
Some checks failed
Release / get-version-and-changelog (push) Successful in 7s
Release / github-release (push) Has been skipped
Release / gitea-release (push) Failing after 2s
2025-02-19 00:46:38 +01:00
55c3b3688a feat: update version to 1.2.15 and clean up Gitea release workflow 2025-02-19 00:46:34 +01:00
fea5932125 docs: update changelog for version 1.2.14
Some checks failed
Release / get-version-and-changelog (push) Successful in 8s
Release / github-release (push) Has been skipped
Release / gitea-release (push) Failing after 3s
2025-02-19 00:43:18 +01:00
04f557939d feat: update version to 1.2.14 and refactor release workflows for improved GitHub and Gitea support 2025-02-19 00:43:15 +01:00
58549a53e4 docs: update changelog for version 1.2.13 2025-02-19 00:32:43 +01:00
64a46e3e7d feat: update version to 1.2.13 and enhance release workflow with Python setup and Gitea support 2025-02-19 00:32:40 +01:00
c2bd0982ab docs: update changelog for version 1.2.12
Some checks failed
Release / prepare (push) Successful in 8s
Release / release (push) Failing after 0s
2025-02-19 00:26:45 +01:00
e0b8da079e feat: update version to 1.2.12 and refactor release workflows for improved provider detection and execution 2025-02-19 00:26:40 +01:00
8c88827a2d docs: update changelog for version 1.2.11
Some checks failed
Release / prepare (push) Successful in 8s
Release / github-release (push) Has been skipped
Release / gitea-release (push) Failing after 3s
2025-02-18 23:50:00 +01:00
6128bc2827 feat: update version to 1.2.11 and enhance GitHub and Gitea release workflows with input validation and improved error handling 2025-02-18 23:49:57 +01:00
6d21a8ec52 docs: update changelog for version 1.2.10 2025-02-18 23:31:16 +01:00
2ee4eca7dd feat: enhance Gitea release workflow with API connection verification and URL validation; update version to 1.2.10 2025-02-18 23:31:00 +01:00
9eb64e06f0 docs: update changelog for version 1.2.9
Some checks failed
Release / release (push) Failing after 2m37s
2025-02-18 23:20:06 +01:00
693ef4e26c feat: update version to 1.2.9 in platformio.ini 2025-02-18 23:20:03 +01:00
11c099eba2 feat: refactor GitHub and Gitea release workflows for improved version handling and firmware uploads 2025-02-18 23:14:52 +01:00
c7c122a505 docs: update changelog for version 1.2.8
Some checks failed
GitHub Release / build (push) Has been cancelled
Release / detect (push) Successful in 7s
Release / gitea-release (push) Failing after 2m22s
Release / github-release (push) Has been skipped
2025-02-18 22:32:11 +01:00
d1bb4b7c83 feat: update version to 1.2.8 in platformio.ini; refactor Gitea and GitHub release workflows 2025-02-18 22:32:07 +01:00
dc5118587c feat: update version to 1.2.7 in platformio.ini; adjust Gitea release workflow 2025-02-18 22:28:31 +01:00
b13f2c4eee docs: update changelog for version 1.2.6
Some checks failed
Gitea Release / build (push) Failing after 0s
GitHub Release / build (push) Failing after 2m41s
Release / detect-and-run (push) Failing after 17s
2025-02-18 22:23:50 +01:00
6d16c35e62 feat: update version to 1.2.6 in platformio.ini 2025-02-18 22:23:45 +01:00
c94ebf5e33 docs: update changelog for version 1.2.5 2025-02-18 22:18:51 +01:00
9203706a20 feat: update version to 1.2.5; enhance Gitea release workflow and streamline release process 2025-02-18 22:18:49 +01:00
c252f48a49 docs: update changelog for version 1.2.4
Some checks failed
GitHub Release / build (push) Has been cancelled
Release / detect-and-run (push) Failing after 0s
Gitea Release / build (push) Failing after 2m48s
2025-02-18 21:56:09 +01:00
228dcacb1e feat: update version to 1.2.4 in HTML files and platformio.ini 2025-02-18 21:56:05 +01:00
9de4ed9ee9 feat: add GitHub and Gitea release workflows; streamline firmware release process 2025-02-18 21:53:23 +01:00
4d8a6fb943 docs: update changelog for version 1.2.3
Some checks failed
Create Release / build (push) Failing after 5m9s
2025-02-18 14:40:02 +01:00
2cab24403e feat: update version to 1.2.3; modify HTML files to reflect new version; enhance firmware update process and UI improvements 2025-02-18 14:18:14 +01:00
8b246e180b docs: update changelog for version 1.2.2
Some checks failed
Create Release / build (push) Has been cancelled
2025-02-18 12:29:07 +01:00
b5c014db86 feat: update version to 1.2.2; change OTA upgrade link in HTML files; enhance OTA upload handling with progress updates and JSON responses 2025-02-18 12:28:47 +01:00
3c783c9844 feat: implement OTA update functionality with web interface; update partition settings and build configuration 2025-02-18 11:42:52 +01:00
175d614d1f feat: remove unused OTA server setup and related includes; update platformio.ini dependencies 2025-02-18 10:05:08 +01:00
678a286af1 feat: adjust weight counter threshold and optimize delay in RFID scanning; include scale header in NFC module 2025-02-17 15:04:21 +01:00
f877f43d90 feat: update version to v1.2.1 and change upgrade link to OTA in HTML files; modify updateSpoolTagId function to return boolean 2025-02-17 14:44:38 +01:00
3cd0798186 docs: update changelog for version 1.2.0
Some checks failed
Create Release / build (push) Has been cancelled
2025-02-17 12:41:44 +01:00
2a67d8f67c feat: implement OTA functionality and update build scripts; change upgrade link to OTA in HTML 2025-02-17 12:41:25 +01:00
240795a2d0 feat: update version to v1.2.0 and modify build scripts in platformio.ini; remove unused includes in scale.cpp and website.cpp 2025-02-17 11:49:39 +01:00
4e384d777e feat: update version to v1.2.0 and add upgrade link in HTML files 2025-02-17 10:46:56 +01:00
03cbf82275 feat: add esp_wifi.h and set maximum transmit power in WiFi initialization 2025-02-16 21:46:06 +01:00
0c1a222636 fix: update version number in header to v1.1.0 2025-02-16 21:45:57 +01:00
8716b4ad73 docs: update changelog for version 1.1.0 2025-02-16 16:26:58 +01:00
6fcfefec8f chore: clean up changelog and update script execution in platformio.ini 2025-02-16 16:26:54 +01:00
b696a79f4b docs: update changelog for version 1.1.0 2025-02-16 16:14:26 +01:00
61ed765d87 fix: correct version number in nav bar 2025-02-16 16:12:07 +01:00
2703689e4e feat: update version to 1.1.0 and modify gzip compression handling for /spoolman route
Some checks failed
Create Release / build (push) Has been cancelled
2025-02-16 13:00:42 +01:00
b24c50722f chore: increment version to 1.0.9 in platformio.ini
Some checks failed
Create Release / build (push) Has been cancelled
2025-02-16 12:54:55 +01:00
3ec23a9f79 feat: implement gzip compression for /spoolman route response 2025-02-16 12:54:24 +01:00
75fe6b55ad chore: increment version to 1.0.8 in platformio.ini
Some checks failed
Create Release / build (push) Has been cancelled
2025-02-16 12:30:19 +01:00
fa2f980312 fix: update partition settings and version in platformio.ini, and enhance release workflow 2025-02-16 12:29:12 +01:00
7964f1cd77 chore: increment version to 1.0.7 in platformio.ini
Some checks failed
Create Release / build (push) Has been cancelled
2025-02-16 12:15:29 +01:00
dd611df9f5 feat: update ESP Async WebServer dependency to use GitHub URL instead of versioned package 2025-02-16 12:14:50 +01:00
0ccc67f4b2 feat: update release workflow trigger and increment version to 1.0.6
Some checks failed
Create Release / build (push) Has been cancelled
2025-02-16 12:11:30 +01:00
a027dfb54e chore: remove unnecessary blank line in release workflow configuration 2025-02-16 12:07:14 +01:00
07741f2a52 feat: enhance release workflow by adding permissions for issues and pull requests, and updating GitHub CLI installation method 2025-02-16 12:05:50 +01:00
3e9b89f69b feat: streamline GitHub Actions release workflow by consolidating permissions and enhancing GitHub CLI installation step 2025-02-16 12:01:41 +01:00
bf67a635f6 feat: add GitHub CLI installation step to release workflow 2025-02-16 11:59:34 +01:00
84cccd5014 feat: update release workflow to include version in asset naming for firmware binaries 2025-02-16 11:58:04 +01:00
e983b0fcfd feat: update release workflow to use new asset naming and streamline release creation process 2025-02-16 11:53:49 +01:00
e01bb9b1f9 feat: enhance GitHub Actions workflow by adding permissions for discussions and packages 2025-02-16 11:50:51 +01:00
17b6051da0 feat: update GitHub Actions workflow for firmware release and add partition configuration 2025-02-16 11:47:20 +01:00
72 changed files with 53017 additions and 957 deletions

208
.github/workflows/gitea-release.yml vendored Normal file
View File

@ -0,0 +1,208 @@
name: Gitea Release
on:
workflow_call:
secrets:
GITEA_TOKEN:
description: 'Token für Gitea API-Zugriff'
required: true
outputs:
version:
description: 'The version that was released'
value: ${{ jobs.create-release.outputs.version }}
jobs:
create-release:
runs-on: ubuntu-latest
outputs:
version: ${{ steps.get_version.outputs.VERSION }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.x'
- name: Install PlatformIO
run: |
python -m pip install --upgrade pip
pip install --upgrade platformio esptool
- name: Install xxd
run: |
sudo apt-get update
sudo apt-get install xxd
- name: Build Firmware
run: |
VERSION=$(grep '^version = ' platformio.ini | cut -d'"' -f2)
# Build firmware and LittleFS
echo "Building firmware and LittleFS..."
pio run -e esp32dev
pio run -t buildfs
# Copy firmware binary
cp .pio/build/esp32dev/firmware.bin .pio/build/esp32dev/upgrade_filaman_firmware_v${VERSION}.bin
# Create LittleFS binary - direct copy without header
cp .pio/build/esp32dev/littlefs.bin .pio/build/esp32dev/upgrade_filaman_website_v${VERSION}.bin
# Create full binary
(cd .pio/build/esp32dev &&
esptool.py --chip esp32 merge_bin \
--fill-flash-size 4MB \
--flash_mode dio \
--flash_freq 40m \
--flash_size 4MB \
-o filaman_full_${VERSION}.bin \
0x1000 bootloader.bin \
0x8000 partitions.bin \
0x10000 firmware.bin \
0x3D0000 littlefs.bin)
# Verify file sizes
echo "File sizes:"
(cd .pio/build/esp32dev && ls -lh *.bin)
- name: Get version from platformio.ini
id: get_version
run: |
VERSION=$(grep '^version = ' platformio.ini | cut -d'"' -f2)
echo "VERSION=$VERSION" >> $GITHUB_OUTPUT
- name: Generate Release Notes
id: release_notes
run: |
# Get the latest tag
LATEST_TAG=$(git for-each-ref --sort=-creatordate --format '%(refname:short)' refs/tags | sed -n '2p')
if [ -n "$LATEST_TAG" ]; then
echo "CHANGES<<EOF" >> $GITHUB_OUTPUT
echo "Changes since ${LATEST_TAG}:" >> $GITHUB_OUTPUT
echo "" >> $GITHUB_OUTPUT
# Get all commits since last release with commit hash and author
echo "### Added" >> $GITHUB_OUTPUT
git log ${LATEST_TAG}..HEAD --pretty=format:"%h - %s (%an)" | grep -iE '^[a-f0-9]+ - (feat|add|new)' | sed 's/^[a-f0-9]* - feat: /- /' >> $GITHUB_OUTPUT || true
echo "" >> $GITHUB_OUTPUT
echo "### Fixed" >> $GITHUB_OUTPUT
git log ${LATEST_TAG}..HEAD --pretty=format:"%h - %s (%an)" | grep -iE '^[a-f0-9]+ - fix' | sed 's/^[a-f0-9]* - fix: /- /' >> $GITHUB_OUTPUT || true
echo "" >> $GITHUB_OUTPUT
echo "### Changed" >> $GITHUB_OUTPUT
git log ${LATEST_TAG}..HEAD --pretty=format:"%h - %s (%an)" | grep -ivE '^[a-f0-9]+ - (feat|fix|add|new)' | sed 's/^[a-f0-9]* - /- /' >> $GITHUB_OUTPUT || true
echo "EOF" >> $GITHUB_OUTPUT
else
# First release
echo "CHANGES<<EOF" >> $GITHUB_OUTPUT
echo "Initial Release" >> $GITHUB_OUTPUT
echo "" >> $GITHUB_OUTPUT
# Add all commits for initial release
echo "### Added" >> $GITHUB_OUTPUT
git log --pretty=format:"%h - %s (%an)" | grep -iE '^[a-f0-9]+ - (feat|add|new)' | sed 's/^[a-f0-9]* - feat: /- /' >> $GITHUB_OUTPUT || true
echo "" >> $GITHUB_OUTPUT
echo "### Fixed" >> $GITHUB_OUTPUT
git log --pretty=format:"%h - %s (%an)" | grep -iE '^[a-f0-9]+ - fix' | sed 's/^[a-f0-9]* - fix: /- /' >> $GITHUB_OUTPUT || true
echo "" >> $GITHUB_OUTPUT
echo "### Changed" >> $GITHUB_OUTPUT
git log --pretty=format:"%h - %s (%an)" | grep -ivE '^[a-f0-9]+ - (feat|fix|add|new)' | sed 's/^[a-f0-9]* - /- /' >> $GITHUB_OUTPUT || true
echo "EOF" >> $GITHUB_OUTPUT
fi
- name: Determine Gitea URL
id: gitea_url
run: |
echo "Debug Environment:"
echo "GITHUB_SERVER_URL=${GITHUB_SERVER_URL:-not set}"
echo "GITEA_SERVER_URL=${GITEA_SERVER_URL:-not set}"
echo "GITHUB_REPOSITORY=${GITHUB_REPOSITORY:-not set}"
echo "GITEA_REPOSITORY=${GITEA_REPOSITORY:-not set}"
echo "RUNNER_NAME=${RUNNER_NAME:-not set}"
# Set API URL based on environment
if [ -n "${GITEA_ACTIONS}" ] || [ -n "${GITEA_REPOSITORY}" ] || [[ "${RUNNER_NAME}" == *"gitea"* ]]; then
GITEA_API_URL="${GITHUB_SERVER_URL}"
GITEA_REPO=$(echo "${GITHUB_REPOSITORY}" | cut -d'/' -f2)
GITEA_OWNER=$(echo "${GITHUB_REPOSITORY}" | cut -d'/' -f1)
else
echo "Error: This workflow is only for Gitea"
exit 1
fi
echo "GITEA_API_URL=${GITEA_API_URL}" >> $GITHUB_OUTPUT
echo "GITEA_REPO=${GITEA_REPO}" >> $GITHUB_OUTPUT
echo "GITEA_OWNER=${GITEA_OWNER}" >> $GITHUB_OUTPUT
- name: Create Gitea Release
env:
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
GITEA_API_URL: ${{ steps.gitea_url.outputs.GITEA_API_URL }}
GITEA_REPO: ${{ steps.gitea_url.outputs.GITEA_REPO }}
GITEA_OWNER: ${{ steps.gitea_url.outputs.GITEA_OWNER }}
run: |
# Debug Token (nur Länge ausgeben für Sicherheit)
echo "Debug: Token length: ${#GITEA_TOKEN}"
if [ -z "$GITEA_TOKEN" ]; then
echo "Error: GITEA_TOKEN is empty"
exit 1
fi
VERSION=${{ steps.get_version.outputs.VERSION }}
cd .pio/build/esp32dev
# Debug-Ausgaben
echo "Debug: API URL: ${GITEA_API_URL}"
echo "Debug: Repository: ${GITEA_OWNER}/${GITEA_REPO}"
# Erstelle zuerst den Release ohne Dateien
echo "Debug: Creating release..."
RELEASE_DATA="{\"tag_name\":\"v${VERSION}\",\"name\":\"v${VERSION}\",\"body\":\"${{ steps.release_notes.outputs.CHANGES }}\"}"
RELEASE_RESPONSE=$(curl -s -w "\n%{http_code}" \
-X POST \
-H "Authorization: token ${GITEA_TOKEN}" \
-H "Content-Type: application/json" \
-d "${RELEASE_DATA}" \
"${GITEA_API_URL}/api/v1/repos/${GITEA_OWNER}/${GITEA_REPO}/releases")
RELEASE_STATUS=$(echo "$RELEASE_RESPONSE" | tail -n1)
RELEASE_BODY=$(echo "$RELEASE_RESPONSE" | head -n -1)
if [ "$RELEASE_STATUS" != "201" ]; then
echo "Error: Failed to create release"
echo "Response: $RELEASE_BODY"
exit 1
fi
# Extrahiere die Release-ID aus der Antwort
RELEASE_ID=$(echo "$RELEASE_BODY" | grep -o '"id":[0-9]*' | cut -d':' -f2)
# Lade die Dateien einzeln hoch
for file in upgrade_filaman_firmware_v${VERSION}.bin upgrade_filaman_website_v${VERSION}.bin filaman_full_${VERSION}.bin; do
if [ -f "$file" ]; then
echo "Debug: Uploading $file..."
UPLOAD_RESPONSE=$(curl -s -w "\n%{http_code}" \
-X POST \
-H "Authorization: token ${GITEA_TOKEN}" \
-H "Content-Type: application/octet-stream" \
--data-binary @"$file" \
"${GITEA_API_URL}/api/v1/repos/${GITEA_OWNER}/${GITEA_REPO}/releases/${RELEASE_ID}/assets?name=${file}")
UPLOAD_STATUS=$(echo "$UPLOAD_RESPONSE" | tail -n1)
if [ "$UPLOAD_STATUS" != "201" ]; then
echo "Warning: Failed to upload $file"
echo "Response: $(echo "$UPLOAD_RESPONSE" | head -n -1)"
else
echo "Successfully uploaded $file"
fi
fi
done

185
.github/workflows/github-release.yml vendored Normal file
View File

@ -0,0 +1,185 @@
name: GitHub Release
on:
workflow_call:
secrets:
RELEASE_TOKEN:
description: 'GitHub token for release creation'
required: true
permissions:
contents: write
jobs:
create-release:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.x'
- name: Install PlatformIO
run: |
python -m pip install --upgrade pip
pip install --upgrade platformio esptool
- name: Install xxd
run: |
sudo apt-get update
sudo apt-get install xxd
- name: Build Firmware
run: |
VERSION=$(grep '^version = ' platformio.ini | cut -d'"' -f2)
# Always build firmware and LittleFS
echo "Building firmware and LittleFS..."
pio run -e esp32dev
pio run -t buildfs
# Copy firmware binary
cp .pio/build/esp32dev/firmware.bin .pio/build/esp32dev/upgrade_filaman_firmware_v${VERSION}.bin
# Create LittleFS binary - direct copy without header
cp .pio/build/esp32dev/littlefs.bin .pio/build/esp32dev/upgrade_filaman_website_v${VERSION}.bin
# Create full binary (always)
(cd .pio/build/esp32dev &&
esptool.py --chip esp32 merge_bin \
--fill-flash-size 4MB \
--flash_mode dio \
--flash_freq 40m \
--flash_size 4MB \
-o filaman_full_${VERSION}.bin \
0x1000 bootloader.bin \
0x8000 partitions.bin \
0x10000 firmware.bin \
0x3D0000 littlefs.bin)
# Verify file sizes
echo "File sizes:"
(cd .pio/build/esp32dev && ls -lh *.bin)
- name: Get version from platformio.ini
id: get_version
run: |
VERSION=$(grep '^version = ' platformio.ini | cut -d'"' -f2)
echo "VERSION=$VERSION" >> $GITHUB_OUTPUT
- name: Generate Release Notes
id: release_notes
run: |
# Get the latest tag
LATEST_TAG=$(git for-each-ref --sort=-creatordate --format '%(refname:short)' refs/tags | sed -n '2p')
if [ -n "$LATEST_TAG" ]; then
echo "CHANGES<<EOF" >> $GITHUB_OUTPUT
echo "Changes since ${LATEST_TAG}:" >> $GITHUB_OUTPUT
echo "" >> $GITHUB_OUTPUT
# Get all commits since last release with commit hash and author
echo "### Added" >> $GITHUB_OUTPUT
git log ${LATEST_TAG}..HEAD --pretty=format:"%h - %s (%an)" | grep -iE '^[a-f0-9]+ - (feat|add|new)' | sed 's/^[a-f0-9]* - feat: /- /' >> $GITHUB_OUTPUT || true
echo "" >> $GITHUB_OUTPUT
echo "### Fixed" >> $GITHUB_OUTPUT
git log ${LATEST_TAG}..HEAD --pretty=format:"%h - %s (%an)" | grep -iE '^[a-f0-9]+ - fix' | sed 's/^[a-f0-9]* - fix: /- /' >> $GITHUB_OUTPUT || true
echo "" >> $GITHUB_OUTPUT
echo "### Changed" >> $GITHUB_OUTPUT
git log ${LATEST_TAG}..HEAD --pretty=format:"%h - %s (%an)" | grep -ivE '^[a-f0-9]+ - (feat|fix|add|new)' | sed 's/^[a-f0-9]* - /- /' >> $GITHUB_OUTPUT || true
echo "EOF" >> $GITHUB_OUTPUT
else
# First release
echo "CHANGES<<EOF" >> $GITHUB_OUTPUT
echo "Initial Release" >> $GITHUB_OUTPUT
echo "" >> $GITHUB_OUTPUT
# Add all commits for initial release
echo "### Added" >> $GITHUB_OUTPUT
git log --pretty=format:"%h - %s (%an)" | grep -iE '^[a-f0-9]+ - (feat|add|new)' | sed 's/^[a-f0-9]* - feat: /- /' >> $GITHUB_OUTPUT || true
echo "" >> $GITHUB_OUTPUT
echo "### Fixed" >> $GITHUB_OUTPUT
git log --pretty=format:"%h - %s (%an)" | grep -iE '^[a-f0-9]+ - fix' | sed 's/^[a-f0-9]* - fix: /- /' >> $GITHUB_OUTPUT || true
echo "" >> $GITHUB_OUTPUT
echo "### Changed" >> $GITHUB_OUTPUT
git log --pretty=format:"%h - %s (%an)" | grep -ivE '^[a-f0-9]+ - (feat|fix|add|new)' | sed 's/^[a-f0-9]* - /- /' >> $GITHUB_OUTPUT || true
echo "EOF" >> $GITHUB_OUTPUT
fi
- name: Create GitHub Release
env:
GH_TOKEN: ${{ secrets.RELEASE_TOKEN }}
run: |
VERSION=${{ steps.get_version.outputs.VERSION }}
cd .pio/build/esp32dev
# Create release with available files
FILES_TO_UPLOAD=""
# Always add firmware
if [ -f "upgrade_filaman_firmware_v${VERSION}.bin" ]; then
FILES_TO_UPLOAD="$FILES_TO_UPLOAD upgrade_filaman_firmware_v${VERSION}.bin"
fi
# Add LittleFS and full binary only if they exist
if [ -f "upgrade_filaman_website_v${VERSION}.bin" ]; then
FILES_TO_UPLOAD="$FILES_TO_UPLOAD upgrade_filaman_website_v${VERSION}.bin"
fi
if [ -f "filaman_full_${VERSION}.bin" ]; then
FILES_TO_UPLOAD="$FILES_TO_UPLOAD filaman_full_${VERSION}.bin"
fi
# Create release with available files
if [ -n "$FILES_TO_UPLOAD" ]; then
gh release create "v${VERSION}" \
--title "Release ${VERSION}" \
--notes "${{ steps.release_notes.outputs.CHANGES }}" \
$FILES_TO_UPLOAD
else
echo "Error: No files found to upload"
exit 1
fi
- name: Install lftp
run: sudo apt-get install -y lftp
- name: Upload Firmware via FTP
if: success()
env:
FTP_PASSWORD: ${{ vars.FTP_PASSWORD }}
FTP_USER: ${{ vars.FTP_USER }}
FTP_HOST: ${{ vars.FTP_HOST }}
VERSION: ${{ steps.get_version.outputs.VERSION }}
run: |
echo "Environment variables:"
env | grep -E '^FTP_' | while read -r line; do
var_name=$(echo "$line" | cut -d= -f1)
var_value=$(echo "$line" | cut -d= -f2-)
echo "$var_name is $(if [ -n "$var_value" ]; then echo "set"; else echo "empty"; fi)"
done
cd .pio/build/esp32dev
if [ -n "$FTP_USER" ] && [ -n "$FTP_PASSWORD" ] && [ -n "$FTP_HOST" ]; then
echo "All FTP credentials are present, attempting upload..."
lftp -c "set ssl:verify-certificate no; \
set ftp:ssl-protect-data true; \
set ftp:ssl-force true; \
set ssl:check-hostname false; \
set ftp:ssl-auth TLS; \
open -u $FTP_USER,$FTP_PASSWORD $FTP_HOST; \
put -O / filaman_full_${VERSION}.bin -o filaman_full.bin"
else
echo "Error: Some FTP credentials are missing"
exit 1
fi

View File

@ -1,33 +1,41 @@
name: Create Release
name: Release Workflow
on:
push:
tags:
- 'v*'
permissions:
contents: write
jobs:
build:
detect-provider:
runs-on: ubuntu-latest
outputs:
provider: ${{ steps.provider.outputs.provider }}
steps:
- uses: actions/checkout@v2
- name: Get version from tag
id: get_version
run: echo ::set-output name=VERSION::${GITHUB_REF/refs\/tags\/v/}
- name: Read CHANGELOG.md
id: changelog
run: |
CHANGELOG=$(awk "/## \[${{ steps.get_version.outputs.VERSION }}\]/{p=1;print;next} /## \[/{p=0} p" CHANGELOG.md)
echo "::set-output name=CHANGES::$CHANGELOG"
- name: Create Release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ github.ref }}
release_name: Release ${{ steps.get_version.outputs.VERSION }}
body: ${{ steps.changelog.outputs.CHANGES }}
draft: false
prerelease: false
- name: Determine CI Provider
id: provider
shell: bash
run: |
if [ -n "${GITEA_ACTIONS}" ] || [ -n "${GITEA_REPOSITORY}" ] || [[ "${RUNNER_NAME}" == *"gitea"* ]]; then
echo "provider=gitea" >> "$GITHUB_OUTPUT"
else
echo "provider=github" >> "$GITHUB_OUTPUT"
fi
github-release:
needs: detect-provider
permissions:
contents: write
if: needs.detect-provider.outputs.provider == 'github'
uses: ./.github/workflows/github-release.yml
secrets:
RELEASE_TOKEN: ${{ secrets.GITHUB_TOKEN }}
gitea-release:
needs: detect-provider
if: needs.detect-provider.outputs.provider == 'gitea'
uses: ./.github/workflows/gitea-release.yml
secrets:
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}

54
.vscode/settings.json vendored
View File

@ -1,54 +0,0 @@
{
"files.associations": {
"algorithm": "cpp",
"vector": "cpp",
"cmath": "cpp",
"array": "cpp",
"atomic": "cpp",
"*.tcc": "cpp",
"bitset": "cpp",
"cctype": "cpp",
"clocale": "cpp",
"cstdarg": "cpp",
"cstddef": "cpp",
"cstdint": "cpp",
"cstdio": "cpp",
"cstdlib": "cpp",
"cstring": "cpp",
"ctime": "cpp",
"cwchar": "cpp",
"cwctype": "cpp",
"deque": "cpp",
"unordered_map": "cpp",
"unordered_set": "cpp",
"exception": "cpp",
"functional": "cpp",
"iterator": "cpp",
"map": "cpp",
"memory": "cpp",
"memory_resource": "cpp",
"numeric": "cpp",
"optional": "cpp",
"random": "cpp",
"regex": "cpp",
"string": "cpp",
"string_view": "cpp",
"system_error": "cpp",
"tuple": "cpp",
"type_traits": "cpp",
"utility": "cpp",
"fstream": "cpp",
"initializer_list": "cpp",
"iomanip": "cpp",
"iosfwd": "cpp",
"istream": "cpp",
"limits": "cpp",
"new": "cpp",
"ostream": "cpp",
"sstream": "cpp",
"stdexcept": "cpp",
"streambuf": "cpp",
"cinttypes": "cpp",
"typeinfo": "cpp"
}
}

File diff suppressed because it is too large Load Diff

View File

@ -6,9 +6,12 @@ Das System integriert sich nahtlos mit der [Spoolman](https://github.com/Donkie/
![Scale](./img/scale_trans.png)
Weitere Bilder finden Sie im [img Ordner](/img/)
Weitere Bilder finden Sie im [img Ordner](/img/)
oder auf meiner Website: [FilaMan Website](https://www.filaman.app)
Deutsches Erklärvideo: [Youtube](https://youtu.be/uNDe2wh9SS8?si=b-jYx4I1w62zaOHU)
Deutsches Erklärvideo: [Youtube](https://youtu.be/uNDe2wh9SS8?si=b-jYx4I1w62zaOHU)
Discord Server: [https://discord.gg/my7Gvaxj2v](https://discord.gg/my7Gvaxj2v)
### Es gibt jetzt auch ein Wiki, dort sind nochmal alle Funktionen beschrieben: [Wiki](https://github.com/ManuelW77/Filaman/wiki)
### ESP32 Hardware-Funktionen
- **Gewichtsmessung:** Verwendung einer Wägezelle mit HX711-Verstärker für präzise Gewichtsverfolgung.
@ -16,7 +19,7 @@ Deutsches Erklärvideo: [Youtube](https://youtu.be/uNDe2wh9SS8?si=b-jYx4I1w62zaO
- **OLED-Display:** Zeigt aktuelles Gewicht, Verbindungsstatus (WiFi, Bambu Lab, Spoolman).
- **WLAN-Konnektivität:** WiFiManager für einfache Netzwerkkonfiguration.
- **MQTT-Integration:** Verbindet sich mit Bambu Lab Drucker für AMS-Steuerung.
- **NFC-Tag NTAG215:** Verwendung von NTAG215 wegen ausreichendem Speicherplatz auf dem Tag
- **NFC-Tag NTAG213 NTAG215:** Verwendung von NTAG213, besser NTAG215 wegen ausreichendem Speicherplatz auf dem Tag
### Weboberflächen-Funktionen
- **Echtzeit-Updates:** WebSocket-Verbindung für Live-Daten-Updates.
@ -33,6 +36,7 @@ Deutsches Erklärvideo: [Youtube](https://youtu.be/uNDe2wh9SS8?si=b-jYx4I1w62zaO
- Filtern und Auswählen von Filamenten.
- Automatische Aktualisierung der Spulengewichte.
- Verfolgung von NFC-Tag-Zuweisungen.
- Unterstützt das Spoolman Octoprint Plugin
### Wenn Sie meine Arbeit unterstützen möchten, freue ich mich über einen Kaffee
<a href="https://www.buymeacoffee.com/manuelw" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" style="height: 30px !important;width: 108px !important;" ></a>
@ -51,19 +55,22 @@ Deutsches Erklärvideo: [Youtube](https://youtu.be/uNDe2wh9SS8?si=b-jYx4I1w62zaO
## Hardware-Anforderungen
### Komponenten
- **ESP32 Entwicklungsboard:** Jede ESP32-Variante.
[Amazon Link](https://amzn.eu/d/aXThslf)
- **HX711 Wägezellen-Verstärker:** Für Gewichtsmessung.
[Amazon Link](https://amzn.eu/d/1wZ4v0x)
- **OLED Display:** 128x64 SSD1306.
[Amazon Link](https://amzn.eu/d/dozAYDU)
- **PN532 NFC Modul:** Für NFC-Tag-Operationen.
[Amazon Link](https://amzn.eu/d/8205DDh)
- **NFC-Tag:** NTAG215
[Amazon Link](https://amzn.eu/d/fywy4c4)
- **ESP32 Development Board:** Any ESP32 variant.
[Amazon Link](https://amzn.to/3FHea6D)
- **HX711 5kg Load Cell Amplifier:** For weight measurement.
[Amazon Link](https://amzn.to/4ja1KTe)
- **OLED 0.96 Zoll I2C white/yellow Display:** 128x64 SSD1306.
[Amazon Link](https://amzn.to/445aaa9)
- **PN532 NFC NXP RFID-Modul V3:** For NFC tag operations.
[Amazon Link](https://amzn.to/4iO6CO4)
- **NFC Tags NTAG213 NTAG215:** RFID Tag
[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 SCK | 17 |
@ -71,10 +78,17 @@ Deutsches Erklärvideo: [Youtube](https://youtu.be/uNDe2wh9SS8?si=b-jYx4I1w62zaO
| OLED SCL | 22 |
| PN532 IRQ | 32 |
| PN532 RESET | 33 |
| PN532 SCK | 14 |
| PN532 MOSI | 13 |
| PN532 MISO | 12 |
| PN532 CS/SS | 15 |
| PN532 SDA | 21 |
| PN532 SCL | 22 |
| TTP223 I/O | 25 |
**!! Achte darauf, dass am PN532 die DIP-Schalter auf I2C gestellt sind**
**Nutze den 3V Pin vom ESP für den Touch Sensor**
![Wiring](./img/Schaltplan.png)
![myWiring](./img/IMG_2589.jpeg)
![myWiring](./img/IMG_2590.jpeg)
## Software-Abhängigkeiten
@ -101,7 +115,31 @@ Deutsches Erklärvideo: [Youtube](https://youtu.be/uNDe2wh9SS8?si=b-jYx4I1w62zaO
- PN532 NFC Modul
- Verbindungskabel
### Schritt-für-Schritt Installation
## Wichtiger Hinweis
Du musst Spoolman auf DEBUG Modus setzten, da man bisher in Spoolman keine CORS Domains setzen kann!
```
# Enable debug mode
# If enabled, the client will accept requests from any host
# This can be useful when developing, but is also a security risk
# Default: FALSE
#SPOOLMAN_DEBUG_MODE=TRUE
```
## Schritt-für-Schritt Installation
### Einfache Installation
1. **Gehe auf [FilaMan Installer](https://www.filaman.app/installer.html)**
2. **Stecke dein ESP an den Rechner und klicke Connect**
3. **Wähle dein Device Port und klicke Intall**
4. **Ersteinrichtung:**
- Mit dem "FilaMan" WLAN-Zugangspunkt verbinden.
- WLAN-Einstellungen über das Konfigurationsportal vornehmen.
- Weboberfläche unter `http://filaman.local` oder der IP-Adresse aufrufen.
### Compile by yourself
1. **Repository klonen:**
```bash
git clone https://github.com/ManuelW77/Filaman.git

View File

@ -6,12 +6,16 @@ FilaMan is a filament management system for 3D printing. It uses ESP32 hardware
Users can manage filament spools, monitor the status of the Automatic Material System (AMS) and make settings via a web interface.
The system integrates seamlessly with [Bambulab](https://bambulab.com/en-us) 3D printers and [Spoolman](https://github.com/Donkie/Spoolman) filament management as well as the [Openspool](https://github.com/spuder/OpenSpool) NFC-TAG format.
![Scale](./img/scale_trans.png)
More Images can be found in the [img Folder](/img/)
or my website:[FilaMan Website](https://www.filaman.app)
german explanatory video: [Youtube](https://youtu.be/uNDe2wh9SS8?si=b-jYx4I1w62zaOHU)
or my website: [FilaMan Website](https://www.filaman.app)
german explanatory video: [Youtube](https://youtu.be/uNDe2wh9SS8?si=b-jYx4I1w62zaOHU)
Discord Server: [https://discord.gg/my7Gvaxj2v](https://discord.gg/my7Gvaxj2v)
### Now more detailed informations about the usage: [Wiki](https://github.com/ManuelW77/Filaman/wiki)
### ESP32 Hardware Features
- **Weight Measurement:** Using a load cell with HX711 amplifier for precise weight tracking.
@ -19,7 +23,7 @@ german explanatory video: [Youtube](https://youtu.be/uNDe2wh9SS8?si=b-jYx4I1w62z
- **OLED Display:** Shows current weight, connection status (WiFi, Bambu Lab, Spoolman).
- **WiFi Connectivity:** WiFiManager for easy network configuration.
- **MQTT Integration:** Connects to Bambu Lab printer for AMS control.
- **NFC-Tag NTAG215:** Use NTAG215 because of enaught space on the Tag
- **NFC-Tag NTAG213 NTAG215:** Use NTAG213, better NTAG215 because of enaught space on the Tag
### Web Interface Features
- **Real-time Updates:** WebSocket connection for live data updates.
@ -36,6 +40,7 @@ german explanatory video: [Youtube](https://youtu.be/uNDe2wh9SS8?si=b-jYx4I1w62z
- Filter and select filaments.
- Update spool weights automatically.
- Track NFC tag assignments.
- Supports Spoolman Octoprint Plugin
### If you want to support my work, i would be happy to get a coffe
<a href="https://www.buymeacoffee.com/manuelw" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" style="height: 30px !important;width: 108px !important;" ></a>
@ -55,15 +60,17 @@ german explanatory video: [Youtube](https://youtu.be/uNDe2wh9SS8?si=b-jYx4I1w62z
### Components
- **ESP32 Development Board:** Any ESP32 variant.
[Amazon Link](https://amzn.eu/d/aXThslf)
- **HX711 Load Cell Amplifier:** For weight measurement.
[Amazon Link](https://amzn.eu/d/1wZ4v0x)
- **OLED Display:** 128x64 SSD1306.
[Amazon Link](https://amzn.eu/d/dozAYDU)
- **PN532 NFC Module:** For NFC tag operations.
[Amazon Link](https://amzn.eu/d/8205DDh)
- **NFC-Tag:** NTAG215
[Amazon Link](https://amzn.eu/d/fywy4c4)
[Amazon Link](https://amzn.to/3FHea6D)
- **HX711 5kg Load Cell Amplifier:** For weight measurement.
[Amazon Link](https://amzn.to/4ja1KTe)
- **OLED 0.96 Zoll I2C white/yellow Display:** 128x64 SSD1306.
[Amazon Link](https://amzn.to/445aaa9)
- **PN532 NFC NXP RFID-Modul V3:** For NFC tag operations.
[Amazon Link](https://amzn.to/4iO6CO4)
- **NFC Tags NTAG213 NTAG215:** RFID Tag
[Amazon Link](https://amzn.to/3E071xO)
- **TTP223 Touch Sensor (optional):** For reTARE per Button/Touch
[Amazon Link](https://amzn.to/4hTChMK)
### Pin Configuration
@ -75,10 +82,17 @@ german explanatory video: [Youtube](https://youtu.be/uNDe2wh9SS8?si=b-jYx4I1w62z
| OLED SCL | 22 |
| PN532 IRQ | 32 |
| PN532 RESET | 33 |
| PN532 SCK | 14 |
| PN532 MOSI | 13 |
| PN532 MISO | 12 |
| PN532 CS/SS | 15 |
| PN532 SDA | 21 |
| PN532 SCL | 22 |
| TTP223 I/O | 25 |
**!! Make sure that the DIP switches on the PN532 are set to I2C**
**Use the 3V pin from the ESP for the touch sensor**
![Wiring](./img/Schaltplan.png)
![myWiring](./img/IMG_2589.jpeg)
![myWiring](./img/IMG_2590.jpeg)
## Software Dependencies
@ -91,9 +105,9 @@ german explanatory video: [Youtube](https://youtu.be/uNDe2wh9SS8?si=b-jYx4I1w62z
- `Adafruit_SSD1306`: OLED display control
- `HX711`: Load cell communication
## Installation
### Installation
### Prerequisites
## Prerequisites
- **Software:**
- [PlatformIO](https://platformio.org/) in VS Code
- [Spoolman](https://github.com/Donkie/Spoolman) instance
@ -105,7 +119,32 @@ german explanatory video: [Youtube](https://youtu.be/uNDe2wh9SS8?si=b-jYx4I1w62z
- PN532 NFC Module
- Connecting wires
### Step-by-Step Installation
## Important Note
You have to activate Spoolman in debug mode, because you are not able to set CORS Domains in Spoolman yet.
```
# Enable debug mode
# If enabled, the client will accept requests from any host
# This can be useful when developing, but is also a security risk
# Default: FALSE
#SPOOLMAN_DEBUG_MODE=TRUE
```
## Step-by-Step Installation
### Easy Installation
1. **Go to [FilaMan Installer](https://www.filaman.app/installer.html)**
2. **Plug you device in and push Connect button**
3. **Select your Device Port and push Intall**
4. **Initial Setup:**
- Connect to the "FilaMan" WiFi access point.
- Configure WiFi settings through the captive portal.
- Access the web interface at `http://filaman.local` or the IP address.
### Compile by yourself
1. **Clone the Repository:**
```bash
git clone https://github.com/ManuelW77/Filaman.git
@ -124,7 +163,6 @@ german explanatory video: [Youtube](https://youtu.be/uNDe2wh9SS8?si=b-jYx4I1w62z
- Configure WiFi settings through the captive portal.
- Access the web interface at `http://filaman.local` or the IP address.
## Documentation
### Relevant Links

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -1,7 +1,31 @@
{
"GFU99": "Generic TPU",
"GFN99": "Generic PA",
"GFN98": "Generic PA-CF",
"GFU99": "TPU",
"GFN99": "PA",
"GFN98": "PA-CF",
"GFL99": "PLA",
"GFL96": "PLA Silk",
"GFL98": "PLA-CF",
"GFL95": "PLA High Speed",
"GFG99": "PETG",
"GFG98": "PETG-CF",
"GFG97": "PCTG",
"GFB99": "ABS",
"GFC99": "PC",
"GFB98": "ASA",
"GFS99": "PVA",
"GFS98": "HIPS",
"GFT98": "PPS-CF",
"GFT97": "PPS",
"GFN97": "PPA-CF",
"GFN96": "PPA-GF",
"GFP99": "PE",
"GFP98": "PE-CF",
"GFP97": "PP",
"GFP96": "PP-CF",
"GFP95": "PP-GF",
"GFR99": "EVA",
"GFR98": "PHA",
"GFS97": "BVOH",
"GFA01": "Bambu PLA Matte",
"GFA00": "Bambu PLA Basic",
"GFA09": "Bambu PLA Tough",
@ -13,15 +37,11 @@
"GFL03": "eSUN PLA+",
"GFL01": "PolyTerra PLA",
"GFL00": "PolyLite PLA",
"GFL99": "Generic PLA",
"GFL96": "Generic PLA Silk",
"GFL98": "Generic PLA-CF",
"GFA50": "Bambu PLA-CF",
"GFS02": "Bambu Support For PLA",
"GFA11": "Bambu PLA Aero",
"GFL04": "Overture PLA",
"GFL05": "Overture Matte PLA",
"GFL95": "Generic PLA High Speed",
"GFA12": "Bambu PLA Glow",
"GFA13": "Bambu PLA Dynamic",
"GFA15": "Bambu PLA Galaxy",
@ -30,41 +50,21 @@
"GFU00": "Bambu TPU 95A HF",
"GFG00": "Bambu PETG Basic",
"GFT01": "Bambu PET-CF",
"GFG99": "Generic PETG",
"GFG98": "Generic PETG-CF",
"GFG50": "Bambu PETG-CF",
"GFG60": "PolyLite PETG",
"GFG01": "Bambu PETG Translucent",
"GFG97": "Generic PCTG",
"GFB00": "Bambu ABS",
"GFB99": "Generic ABS",
"GFB60": "PolyLite ABS",
"GFB50": "Bambu ABS-GF",
"GFC00": "Bambu PC",
"GFC99": "Generic PC",
"GFB98": "Generic ASA",
"GFB01": "Bambu ASA",
"GFB61": "PolyLite ASA",
"GFB02": "Bambu ASA-Aero",
"GFS99": "Generic PVA",
"GFS04": "Bambu PVA",
"GFS01": "Bambu Support G",
"GFN03": "Bambu PA-CF",
"GFN04": "Bambu PAHT-CF",
"GFS03": "Bambu Support For PA/PET",
"GFN05": "Bambu PA6-CF",
"GFN08": "Bambu PA6-GF",
"GFS98": "Generic HIPS",
"GFT98": "Generic PPS-CF",
"GFT97": "Generic PPS",
"GFN97": "Generic PPA-CF",
"GFN96": "Generic PPA-GF",
"GFP99": "Generic PE",
"GFP98": "Generic PE-CF",
"GFP97": "Generic PP",
"GFP96": "Generic PP-CF",
"GFP95": "Generic PP-GF",
"GFR99": "Generic EVA",
"GFR98": "Generic PHA",
"GFS97": "Generic BVOH"
"GFN08": "Bambu PA6-GF"
}

View File

@ -6,13 +6,24 @@
<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">v1.0.2</span></h1>
<h1>FilaMan<span class="version"></span></h1>
<h4>Filament Management Tool</h4>
</div>
</div>
@ -21,6 +32,7 @@
<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">

View File

@ -1,4 +1,4 @@
<!DOCTYPE html>
<!-- head --><!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
@ -6,13 +6,24 @@
<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">v1.0.2</span></h1>
<h1>FilaMan<span class="version"></span></h1>
<h4>Filament Management Tool</h4>
</div>
</div>
@ -21,6 +32,7 @@
<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">
@ -33,9 +45,9 @@
</div>
</div>
<!-- head -->
<div class="container">
<div class="content">
<h1>FilaMan</h1>
<p>Filament Management Tool</p>
<p>Your smart solution for <strong>Filament Management</strong> in 3D printing.</p>
@ -43,10 +55,11 @@
<h2>About FilaMan</h2>
<p>
FilaMan is a tool designed to simplify filament spool management. It allows you to identify and weigh filament spools,
automatically sync data with the self-hosted <a href="https://github.com/Donkie/Spoolman" target="_blank">Spoolman</a> platform,
and ensure compatibility with <a href="https://github.com/spuder/OpenSpool" target="_blank">OpenSpool</a> for Bambu printers.
automatically sync data with the self-hosted <a href="https://github.com/Donkie/Spoolman" target="_blank">Spoolman</a> platform.
</p>
<p>Get more information at <a href="https://www.filaman.app" target="_blank">https://www.filaman.app</a> and <a href="https://github.com/ManuelW77/Filaman" target="_blank">https://github.com/ManuelW77/Filaman</a>.</p>
<div class="features">
<div class="feature">
<h3>Spool Identification</h3>
@ -61,12 +74,6 @@
<p>Works with OpenSpool to recognize and activate spools on Bambu printers.</p>
</div>
</div>
<h2>Future Plans</h2>
<p>
We are working on expanding compatibility to support smaller NFC tags like NTag213
and developing custom software to enhance the OpenSpool experience.
</p>
</div>
</body>
</html>

31
html/own_filaments.json Normal file
View File

@ -0,0 +1,31 @@
{
"TPU": "GFU99",
"PA": "GFN99",
"PA-CF": "GFN98",
"PLA": "GFL99",
"PLA Silk": "GFL96",
"PLA-CF": "GFL98",
"PLA High Speed": "GFL95",
"PETG": "GFG99",
"PETG-CF": "GFG98",
"PCTG": "GFG97",
"ABS": "GFB99",
"ABS+HS": "GFB99",
"PC": "GFC99",
"PC/ABS": "GFC99",
"ASA": "GFB98",
"PVA": "GFS99",
"HIPS": "GFS98",
"PPS-CF": "GFT98",
"PPS": "GFT97",
"PPA-CF": "GFN97",
"PPA-GF": "GFN96",
"PE": "GFP99",
"PE-CF": "GFP98",
"PP": "GFP97",
"PP-CF": "GFP96",
"PP-GF": "GFP95",
"EVA": "GFR99",
"PHA": "GFR98",
"BVOH": "GFS97"
}

View File

@ -1,4 +1,4 @@
<!DOCTYPE html>
<!-- head --><!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
@ -6,13 +6,24 @@
<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">v1.0.2</span></h1>
<h1>FilaMan<span class="version"></span></h1>
<h4>Filament Management Tool</h4>
</div>
</div>
@ -21,6 +32,7 @@
<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">
@ -33,6 +45,7 @@
</div>
</div>
<!-- head -->
<div class="connection-status hidden">
<div class="spinner"></div>
@ -128,15 +141,6 @@
</div>
</div>
<!-- Rechte Spalte -->
<div class="column">
<div class="feature-box">
<h2>Bambu AMS</h2>
<div id="amsDataContainer">
<div class="amsData" id="amsData">Wait for AMS-Data...</div>
</div>
</div>
</div>
</div>
</div>

View File

@ -11,7 +11,7 @@ let reconnectTimer = null;
// WebSocket Funktionen
function startHeartbeat() {
if (heartbeatTimer) clearInterval(heartbeatTimer);
heartbeatTimer = setInterval(() => {
// Prüfe ob zu lange keine Antwort kam
if (Date.now() - lastHeartbeatResponse > HEARTBEAT_TIMEOUT) {
@ -29,7 +29,7 @@ function startHeartbeat() {
updateConnectionStatus();
return;
}
try {
// Sende Heartbeat
socket.send(JSON.stringify({ type: 'heartbeat' }));
@ -83,7 +83,7 @@ function initWebSocket() {
isConnected = false;
updateConnectionStatus();
if (heartbeatTimer) clearInterval(heartbeatTimer);
// Bei Fehler Verbindung schließen und neu aufbauen
if (socket) {
socket.close();
@ -109,7 +109,7 @@ function initWebSocket() {
const bambuDot = document.getElementById('bambuDot');
const spoolmanDot = document.getElementById('spoolmanDot');
const ramStatus = document.getElementById('ramStatus');
if (bambuDot) {
bambuDot.className = 'status-dot ' + (data.bambu_connected ? 'online' : 'offline');
// Add click handler only when offline
@ -150,6 +150,13 @@ function initWebSocket() {
ramStatus.textContent = `${data.freeHeap}k`;
}
}
else if (data.type === 'setSpoolmanSettings') {
if (data.payload == 'success') {
showNotification(`Spoolman Settings set successfully`, true);
} else {
showNotification(`Error setting Spoolman Settings`, false);
}
}
};
} catch (error) {
isConnected = false;
@ -201,7 +208,7 @@ document.addEventListener('spoolmanError', function(event) {
showNotification(`Spoolman Error: ${event.detail.message}`, false);
});
document.addEventListener('filamentSelected', function(event) {
document.addEventListener('filamentSelected', function (event) {
updateNfcInfo();
// Zeige Spool-Buttons wenn ein Filament ausgewählt wurde
const selectedText = document.getElementById("selected-filament").textContent;
@ -285,6 +292,14 @@ function displayAmsData(amsData) {
<img src="spool_in.png" alt="Spool In" style="width: 48px; height: 48px; transform: rotate(180deg) scaleX(-1);">
</button>`;
const spoolmanButtonHtml = `
<button class="spool-button" onclick="handleSpoolmanSettings('${tray.tray_info_idx}', '${tray.setting_id}', '${tray.cali_idx}', '${tray.nozzle_temp_min}', '${tray.nozzle_temp_max}')"
style="position: absolute; bottom: 0px; right: 0px;
background: none; border: none; padding: 0;
cursor: pointer; display: none;">
<img src="set_spoolman.png" alt="Spool In" style="width: 38px; height: 38px;">
</button>`;
if (!hasAnyContent) {
return `
<div class="tray">
@ -348,6 +363,7 @@ function displayAmsData(amsData) {
${trayDetails}
${tempHTML}
${(ams.ams_id === 255 && tray.tray_type !== '') ? outButtonHtml : ''}
${(tray.setting_id != "" && tray.setting_id != "null") ? spoolmanButtonHtml : ''}
</div>
</div>`;
@ -373,6 +389,36 @@ function updateSpoolButtons(show) {
});
}
function handleSpoolmanSettings(tray_info_idx, setting_id, cali_idx, nozzle_temp_min, nozzle_temp_max) {
// Hole das ausgewählte Filament
const selectedText = document.getElementById("selected-filament").textContent;
// Finde die ausgewählte Spule in den Daten
const selectedSpool = spoolsData.find(spool =>
`${spool.id} | ${spool.filament.name} (${spool.filament.material})` === selectedText
);
const payload = {
type: 'setSpoolmanSettings',
payload: {
filament_id: selectedSpool.filament.id,
tray_info_idx: tray_info_idx,
setting_id: setting_id,
cali_idx: cali_idx,
temp_min: nozzle_temp_min,
temp_max: nozzle_temp_max
}
};
try {
socket.send(JSON.stringify(payload));
showNotification(`Setting send to Spoolman`, true);
} catch (error) {
console.error("Error while sending settings to Spoolman:", error);
showNotification("Error while sending!", false);
}
}
function handleSpoolOut() {
// Erstelle Payload
const payload = {
@ -444,7 +490,7 @@ function handleSpoolIn(amsId, trayId) {
nozzle_temp_max: parseInt(maxTemp),
type: selectedSpool.filament.material,
brand: selectedSpool.filament.vendor.name,
tray_info_idx: selectedSpool.filament.extra.bambu_idx.replace(/['"]+/g, '').trim(),
tray_info_idx: selectedSpool.filament.extra.bambu_idx?.replace(/['"]+/g, '').trim() || '',
cali_idx: "-1" // Default-Wert setzen
}
};
@ -594,8 +640,6 @@ function writeNfcTag() {
// Erstelle das NFC-Datenpaket mit korrekten Datentypen
const nfcData = {
version: "2.0",
protocol: "openspool",
color_hex: selectedSpool.filament.color_hex || "FFFFFF",
type: selectedSpool.filament.material,
min_temp: minTemp,
@ -642,4 +686,4 @@ function showNotification(message, isSuccess) {
notification.remove();
}, 300);
}, 3000);
}
}

160
html/rfid_bambu.html Normal file
View 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>

BIN
html/set_spoolman.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

@ -1,4 +1,4 @@
<!DOCTYPE html>
<!-- head --><!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
@ -6,13 +6,24 @@
<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">v1.0.2</span></h1>
<h1>FilaMan<span class="version"></span></h1>
<h4>Filament Management Tool</h4>
</div>
</div>
@ -21,6 +32,7 @@
<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">
@ -33,17 +45,50 @@
</div>
</div>
<!-- head -->
<script>
window.onload = function() {
if (spoolmanUrl && spoolmanUrl.trim() !== "") {
document.getElementById('spoolmanUrl').value = spoolmanUrl;
}
// Initialize OctoPrint fields visibility
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() {
const url = document.getElementById('spoolmanUrl').value;
fetch(`/api/checkSpoolman?url=${encodeURIComponent(url)}`)
const spoolmanOctoEnabled = document.getElementById('spoolmanOctoEnabled').checked;
const spoolmanOctoUrl = document.getElementById('spoolmanOctoUrl').value;
const spoolmanOctoToken = document.getElementById('spoolmanOctoToken').value;
fetch(`/api/checkSpoolman?url=${encodeURIComponent(url)}&octoEnabled=${spoolmanOctoEnabled}&octoUrl=${spoolmanOctoUrl}&octoToken=${spoolmanOctoToken}`)
.then(response => response.json())
.then(data => {
if (data.healthy) {
@ -61,12 +106,19 @@
const ip = document.getElementById('bambuIp').value;
const serial = document.getElementById('bambuSerial').value;
const code = document.getElementById('bambuCode').value;
const autoSend = document.getElementById('autoSend').checked;
const autoSendTime = document.getElementById('autoSendTime').value;
fetch(`/api/bambu?bambu_ip=${encodeURIComponent(ip)}&bambu_serialnr=${encodeURIComponent(serial)}&bambu_accesscode=${encodeURIComponent(code)}`)
fetch(`/api/bambu?bambu_ip=${encodeURIComponent(ip)}&bambu_serialnr=${encodeURIComponent(serial)}&bambu_accesscode=${encodeURIComponent(code)}&autoSend=${autoSend}&autoSendTime=${autoSendTime}`)
.then(response => response.json())
.then(data => {
if (data.healthy) {
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 {
document.getElementById('bambuStatusMessage').innerText = 'Error while saving Bambu Credentials.';
}
@ -75,6 +127,15 @@
document.getElementById('bambuStatusMessage').innerText = 'Error while saving: ' + error.message;
});
}
/**
* Controls visibility of OctoPrint configuration fields based on checkbox state
* Called on page load and when checkbox changes
*/
function toggleOctoFields() {
const octoEnabled = document.getElementById('spoolmanOctoEnabled').checked;
document.getElementById('octoFields').style.display = octoEnabled ? 'block' : 'none';
}
</script>
<script>
var spoolmanUrl = "{{spoolmanUrl}}";
@ -82,27 +143,59 @@
<div class="content">
<h1>Spoolman API URL / Bambu Credentials</h1>
<label for="spoolmanUrl">Set URL/IP to your Spoolman-Instanz:</label>
<input type="text" id="spoolmanUrl" placeholder="http://ip-or-url-of-your-spoolman-instanz:port">
<button onclick="checkSpoolmanInstance()">Save Spoolman URL</button>
<p id="statusMessage"></p>
<h2>Bambu Lab Printer Credentials</h2>
<div class="bambu-settings">
<div class="input-group">
<label for="bambuIp">Bambu Drucker IP-Adresse:</label>
<input type="text" id="bambuIp" placeholder="192.168.1.xxx" value="{{bambuIp}}">
<div class="card">
<div class="card-body">
<h5 class="card-title">Set URL/IP to your Spoolman-Instanz</h5>
<input type="text" id="spoolmanUrl" placeholder="http://ip-or-url-of-your-spoolman-instanz:port">
<h5 class="card-title">If you want to enable sending Spool to Spoolman Octoprint Plugin:</h5>
<p>
<input type="checkbox" id="spoolmanOctoEnabled" {{spoolmanOctoEnabled}} onchange="toggleOctoFields()"> Send to Octo-Plugin
</p>
<div id="octoFields" style="display: none;">
<p>
<input type="text" id="spoolmanOctoUrl" placeholder="http://ip-or-url-of-your-octoprint-instanz:port" value="{{spoolmanOctoUrl}}">
<input type="text" id="spoolmanOctoToken" placeholder="Your Octoprint Token" value="{{spoolmanOctoToken}}">
</p>
</div>
<button onclick="checkSpoolmanInstance()">Save Spoolman URL</button>
<p id="statusMessage"></p>
</div>
<div class="input-group">
<label for="bambuSerial">Drucker Seriennummer:</label>
<input type="text" id="bambuSerial" placeholder="BBLXXXXXXXX" value="{{bambuSerial}}">
</div>
<div class="card">
<div class="card-body">
<h5 class="card-title">Bambu Lab Printer Credentials</h5>
<div class="bambu-settings">
<div class="input-group">
<label for="bambuIp">Bambu Drucker IP-Adresse:</label>
<input type="text" id="bambuIp" placeholder="192.168.1.xxx" value="{{bambuIp}}">
</div>
<div class="input-group">
<label for="bambuSerial">Drucker Seriennummer:</label>
<input type="text" id="bambuSerial" placeholder="BBLXXXXXXXX" value="{{bambuSerial}}">
</div>
<div class="input-group">
<label for="bambuCode">Access Code:</label>
<input type="text" id="bambuCode" placeholder="Access Code vom Drucker" value="{{bambuCode}}">
</div>
<hr>
<p>If activated, FilaMan will automatically update the next filled tray with the last scanned and weighed spool.</p>
<div class="input-group" style="display: flex; margin-bottom: 0;">
<label for="autoSend" style="width: 250px; margin-right: 5px;">Auto Send to Bambu:</label>
<label for="autoSendTime" style="width: 250px; margin-right: 5px;">Wait for Spool in Sec:</label>
</div>
<div class="input-group" style="display: flex;">
<input type="checkbox" id="autoSend" {{autoSendToBambu}} style="width: 190px; margin-right: 10px;">
<input type="number" min="60" id="autoSendTime" placeholder="Time to wait" value="{{autoSendTime}}" style="width: 100px;">
</div>
<button style="margin: 0;" onclick="saveBambuCredentials()">Save Bambu Credentials</button>
<button style="margin: 0; background-color: red;" onclick="removeBambuCredentials()">Remove Credentials</button>
<p id="bambuStatusMessage"></p>
</div>
</div>
<div class="input-group">
<label for="bambuCode">Access Code:</label>
<input type="text" id="bambuCode" placeholder="Access Code vom Drucker" value="{{bambuCode}}">
</div>
<button onclick="saveBambuCredentials()">Save Bambu Credentials</button>
<p id="bambuStatusMessage"></p>
</div>
</div>
</body>

View File

@ -86,10 +86,10 @@ function populateVendorDropdown(data, selectedSmId = null) {
});
// Nach der Schleife: Formatierung der Gesamtlänge
console.log("Total Lenght: ", totalLength);
const formattedLength = totalLength > 1000
? (totalLength / 1000).toFixed(2) + " km"
: totalLength.toFixed(2) + " m";
const lengthInM = totalLength / 1000; // erst in m umrechnen
const formattedLength = lengthInM > 1000
? (lengthInM / 1000).toFixed(2) + " km"
: lengthInM.toFixed(2) + " m";
// Formatierung des Gesamtgewichts (von g zu kg zu t)
const weightInKg = totalWeight / 1000; // erst in kg umrechnen
@ -97,13 +97,15 @@ function populateVendorDropdown(data, selectedSmId = null) {
? (weightInKg / 1000).toFixed(2) + " t"
: weightInKg.toFixed(2) + " kg";
// Dropdown mit gefilterten Herstellern befüllen
Object.entries(filteredVendors).forEach(([id, name]) => {
const option = document.createElement("option");
option.value = id;
option.textContent = name;
vendorSelect.appendChild(option);
});
// Dropdown mit gefilterten Herstellern befüllen - alphabetisch sortiert
Object.entries(filteredVendors)
.sort(([, nameA], [, nameB]) => nameA.localeCompare(nameB)) // Sort vendors alphabetically by name
.forEach(([id, name]) => {
const option = document.createElement("option");
option.value = id;
option.textContent = name;
vendorSelect.appendChild(option);
});
document.getElementById("totalSpools").textContent = totalSpools;
document.getElementById("spoolsWithoutTag").textContent = spoolsWithoutTag;
@ -145,6 +147,13 @@ function updateFilamentDropdown(selectedSmId = null) {
if (vendorId) {
const filteredFilaments = spoolsData.filter(spool => {
if (!spool?.filament?.vendor?.id) {
console.log('Problem aufgetreten bei: ', spool?.filament?.vendor);
console.log('Problematische Spulen:',
spoolsData.filter(spool => !spool?.filament?.vendor?.id));
return false;
}
const hasValidNfcId = spool.extra &&
spool.extra.nfc_id &&
spool.extra.nfc_id !== '""' &&
@ -238,18 +247,6 @@ async function fetchSpoolData() {
}
}
/*
// Exportiere Funktionen
window.getSpoolData = () => spoolsData;
window.reloadSpoolData = initSpoolman;
window.populateVendorDropdown = populateVendorDropdown;
window.updateFilamentDropdown = updateFilamentDropdown;
window.toggleFilamentDropdown = () => {
const content = document.getElementById("filament-dropdown-content");
content.classList.toggle("show");
};
*/
// Event Listener
document.addEventListener('DOMContentLoaded', () => {
initSpoolman();

View File

@ -188,14 +188,18 @@ label {
font-weight: bold;
}
input[type="text"], input[type="submit"] {
input[type="text"], input[type="submit"], input[type="number"] {
padding: 10px;
border: 1px solid #ccc;
border-radius: 5px;
font-size: 16px;
}
input[type="text"]:focus {
input[type="number"] {
width: 108px !important;
}
input[type="text"]:focus, input[type="number"]:focus {
border-color: #007bff;
outline: none;
}
@ -279,9 +283,10 @@ a:hover {
/* Karten-Stil für optische Trennung */
.card {
background: #f9f9f9;
background: var(--primary-color);
width: 500px;
padding: 15px;
margin: 20px 0;
margin: 20px auto;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
@ -760,17 +765,19 @@ a:hover {
right: 20px;
padding: 15px 25px;
border-radius: 4px;
color: white;
color: black;
z-index: 1000;
animation: slideIn 0.3s ease-out;
}
.notification.success {
background-color: #28a745;
color: black !important;
}
.notification.error {
background-color: #dc3545;
color: white !important;
}
.notification.fade-out {
@ -959,7 +966,6 @@ input[type="submit"]:disabled,
/* Bambu Settings Erweiterung */
.bambu-settings {
background: white;
padding: 20px;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
@ -1013,4 +1019,141 @@ input[type="submit"]:disabled,
color: #000;
vertical-align: middle;
margin-left: 0.5rem;
text-shadow: none !important;
}
.progress-container {
width: 100%;
margin: 20px 0;
display: none;
background: #f0f0f0;
border-radius: 4px;
overflow: hidden;
}
.progress-bar {
width: 0%;
height: 24px;
background-color: #4CAF50;
text-align: center;
line-height: 24px;
color: white;
transition: width 0.3s ease-in-out;
font-weight: bold;
}
.status {
margin: 10px 0;
padding: 15px;
border-radius: 4px;
display: none;
}
.error {
background-color: #ffebee;
color: #c62828;
border: 1px solid #ef9a9a;
}
.success {
background-color: #e8f5e9;
color: #2e7d32;
border: 1px solid #a5d6a7;
}
.update-form {
background: var(--primary-color);
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.05);
border: var(--glass-border);
padding: 20px;
border-radius: 8px;
margin: 0 auto;
width: 400px;
text-align: center;
}
.update-form input[type="file"] {
margin-bottom: 15px;
width: 80%;
padding: 8px;
border: 1px solid #ddd;
border-radius: 4px;
background-color: #4CAF50;
}
.update-form input[type="submit"] {
background-color: #4CAF50;
color: white;
padding: 10px 20px;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 16px;
transition: background-color 0.3s;
}
.update-form input[type="submit"]:hover {
background-color: #45a049;
}
.update-form input[type="submit"]:disabled {
background-color: #cccccc;
cursor: not-allowed;
}
.warning {
background-color: var(--primary-color);
border: 1px solid #ffe0b2;
margin: 20px auto;
border-radius: 4px;
max-width: 600px;
text-align: center;
color: #e65100;
padding: 15px;
}
.update-options {
display: flex;
gap: 2rem;
margin: 2rem 0;
}
.update-section {
flex: 1;
background: var(--background-green);
padding: 1.5rem;
border-radius: 8px;
}
.update-section h2 {
margin-top: 0;
color: #333;
}
.update-section p {
color: #666;
margin-bottom: 1rem;
}
.progress-container {
margin: 20px 0;
background: #f0f0f0;
border-radius: 4px;
overflow: hidden;
}
.progress-bar {
width: 0;
height: 20px;
background: #4CAF50;
transition: width 0.3s ease-in-out;
text-align: center;
line-height: 20px;
color: white;
}
.status {
margin-top: 20px;
padding: 10px;
border-radius: 4px;
display: none;
}
.status.success {
background: #e8f5e9;
color: #2e7d32;
}
.status.error {
background: #ffebee;
color: #c62828;
}
.warning {
background: #fff3e0;
color: #e65100;
padding: 15px;
border-radius: 4px;
margin-bottom: 20px;
}

255
html/upgrade.html Normal file
View File

@ -0,0 +1,255 @@
<!-- 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="content">
<h1>Firmware Upgrade</h1>
<div class="warning">
<strong>Warning:</strong> Do not power off the device during update.
</div>
<div class="update-options">
<div class="update-section">
<h2>Firmware Update</h2>
<p>Upload a new firmware file (filaman_*.bin)</p>
<div class="update-form">
<form id="firmwareForm" enctype='multipart/form-data' data-type="firmware">
<input type='file' name='update' accept='.bin' required>
<input type='submit' value='Start Firmware Update'>
</form>
</div>
</div>
<div class="update-section">
<h2>Webpage Update</h2>
<p>Upload a new webpage file (webpage_*.bin)</p>
<div class="update-form">
<form id="webpageForm" enctype='multipart/form-data' data-type="webpage">
<input type='file' name='update' accept='.bin' required>
<input type='submit' value='Start Webpage Update'>
</form>
</div>
</div>
</div>
<div class="progress-container" style="display: none;">
<div class="progress-bar">0%</div>
</div>
<div class="status"></div>
</div>
<script>
// Hide status indicators during update
const statusContainer = document.querySelector('.status-container');
if (statusContainer) {
statusContainer.style.display = 'none';
}
const progress = document.querySelector('.progress-bar');
const progressContainer = document.querySelector('.progress-container');
const status = document.querySelector('.status');
let updateInProgress = false;
let lastReceivedProgress = 0;
// WebSocket Handling
let ws = null;
let wsReconnectTimer = null;
function connectWebSocket() {
ws = new WebSocket('ws://' + window.location.host + '/ws');
ws.onmessage = function(event) {
try {
const data = JSON.parse(event.data);
if (data.type === "updateProgress" && updateInProgress) {
// Zeige Fortschrittsbalken
progressContainer.style.display = 'block';
// Aktualisiere den Fortschritt nur wenn er größer ist
const newProgress = parseInt(data.progress);
if (!isNaN(newProgress) && newProgress >= lastReceivedProgress) {
progress.style.width = newProgress + '%';
progress.textContent = newProgress + '%';
lastReceivedProgress = newProgress;
}
// Zeige Status-Nachricht
if (data.message || data.status) {
status.textContent = data.message || getStatusMessage(data.status);
status.className = 'status success';
status.style.display = 'block';
// Starte Reload wenn Update erfolgreich
if (data.status === 'success' || lastReceivedProgress >= 98) {
clearTimeout(wsReconnectTimer);
setTimeout(() => {
window.location.reload(true);
window.location.href = '/';
}, 30000);
}
}
}
} catch (e) {
console.error('WebSocket message error:', e);
}
};
ws.onclose = function() {
if (updateInProgress) {
// Wenn der Fortschritt hoch genug ist, gehen wir von einem erfolgreichen Update aus
if (lastReceivedProgress >= 85) {
status.textContent = "Update appears successful! Device is restarting... Page will reload in 30 seconds.";
status.className = 'status success';
status.style.display = 'block';
clearTimeout(wsReconnectTimer);
setTimeout(() => {
window.location.reload(true);
window.location.href = '/';
}, 30000);
} else {
// Versuche Reconnect bei niedrigem Fortschritt
wsReconnectTimer = setTimeout(connectWebSocket, 1000);
}
}
};
ws.onerror = function(err) {
console.error('WebSocket error:', err);
if (updateInProgress && lastReceivedProgress >= 85) {
status.textContent = "Update appears successful! Device is restarting... Page will reload in 30 seconds.";
status.className = 'status success';
status.style.display = 'block';
setTimeout(() => {
window.location.href = '/';
}, 30000);
}
};
}
// Initial WebSocket connection
connectWebSocket();
function getStatusMessage(status) {
switch(status) {
case 'starting': return 'Starting update...';
case 'uploading': return 'Uploading...';
case 'finalizing': return 'Finalizing update...';
case 'restoring': return 'Restoring configurations...';
case 'preparing': return 'Preparing for restart...';
case 'success': return 'Update successful! Device is restarting... Page will reload in 30 seconds.';
default: return 'Updating...';
}
}
function handleUpdate(e) {
e.preventDefault();
const form = e.target;
const file = form.update.files[0];
const updateType = form.dataset.type;
if (!file) {
alert('Please select a file.');
return;
}
// Validate file name pattern
if (updateType === 'firmware' && !file.name.startsWith('upgrade_filaman_firmware_')) {
alert('Please select a valid firmware file (upgrade_filaman_firmware_*.bin)');
return;
}
if (updateType === 'webpage' && !file.name.startsWith('upgrade_filaman_website_')) {
alert('Please select a valid webpage file (upgrade_filaman_website_*.bin)');
return;
}
// Reset UI
updateInProgress = true;
progressContainer.style.display = 'block';
status.style.display = 'none';
status.className = 'status';
progress.style.width = '0%';
progress.textContent = '0%';
// Disable submit buttons
document.querySelectorAll('form input[type=submit]').forEach(btn => btn.disabled = true);
// Send update
const xhr = new XMLHttpRequest();
xhr.open('POST', '/update', true);
xhr.onload = function() {
if (xhr.status !== 200 && !progress.textContent.startsWith('100')) {
status.textContent = "Update failed: " + (xhr.responseText || "Unknown error");
status.className = 'status error';
status.style.display = 'block';
updateInProgress = false;
document.querySelectorAll('form input[type=submit]').forEach(btn => btn.disabled = false);
}
};
xhr.onerror = function() {
if (!progress.textContent.startsWith('100')) {
status.textContent = "Network error during update";
status.className = 'status error';
status.style.display = 'block';
updateInProgress = false;
document.querySelectorAll('form input[type=submit]').forEach(btn => btn.disabled = false);
}
};
const formData = new FormData();
formData.append('update', file);
xhr.send(formData);
}
document.getElementById('firmwareForm').addEventListener('submit', handleUpdate);
document.getElementById('webpageForm').addEventListener('submit', handleUpdate);
</script>
</body>
</html>

View File

@ -1,4 +1,4 @@
<!DOCTYPE html>
<!-- head --><!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
@ -6,13 +6,24 @@
<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">v1.0.2</span></h1>
<h1>FilaMan<span class="version"></span></h1>
<h4>Filament Management Tool</h4>
</div>
</div>
@ -21,6 +32,7 @@
<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">
@ -33,6 +45,7 @@
</div>
</div>
<!-- head -->
<div class="content">
<h1>Scale Configuration Page</h1>
@ -42,6 +55,7 @@
<h5 class="card-title">Sacle Calibration</h5>
<button id="calibrateBtn" class="btn btn-primary">Calibrate Scale</button>
<button id="tareBtn" class="btn btn-secondary">Tare Scale</button>
&nbsp;&nbsp;&nbsp;Enable Auto-TARE <input type="checkbox" id="autoTareCheckbox" onchange="setAutoTare(this.checked);" {{autoTare}}>
<div id="statusMessage" class="mt-3"></div>
</div>
</div>
@ -127,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
connectWebSocket();
</script>

View File

@ -1,4 +1,4 @@
<!DOCTYPE html>
<!-- head --><!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
@ -6,13 +6,24 @@
<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">v1.0.2</span></h1>
<h1>FilaMan<span class="version"></span></h1>
<h4>Filament Management Tool</h4>
</div>
</div>
@ -21,6 +32,7 @@
<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">
@ -33,6 +45,7 @@
</div>
</div>
<!-- head -->
<div class="content">
<h1>WiFi Configuration Page</h1>

BIN
img/7-enable.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

BIN
img/ESP32-SPI-Pins.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

BIN
img/IMG_2589.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

BIN
img/IMG_2590.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

BIN
img/Schaltplan.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 283 KiB

6
partitions.csv Normal file
View File

@ -0,0 +1,6 @@
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x5000,
otadata, data, ota, 0xe000, 0x2000,
app0, app, ota_0, 0x10000, 0x1E0000,
app1, app, ota_1, 0x1F0000, 0x1E0000,
spiffs, data, spiffs, 0x3D0000, 0x30000,
1 # Name Type SubType Offset Size Flags
2 nvs data nvs 0x9000 0x5000
3 otadata data ota 0xe000 0x2000
4 app0 app ota_0 0x10000 0x1E0000
5 app1 app ota_1 0x1F0000 0x1E0000
6 spiffs data spiffs 0x3D0000 0x30000

View File

@ -9,8 +9,10 @@
; https://docs.platformio.org/page/projectconf.html
[common]
version = "1.0.5"
version = "1.5.1"
to_old_version = "1.5.0"
##
[env:esp32dev]
platform = espressif32
board = esp32dev
@ -19,8 +21,11 @@ monitor_speed = 115200
lib_deps =
tzapu/WiFiManager @ ^2.0.17
me-no-dev/ESP Async WebServer @ ^1.2.4
me-no-dev/AsyncTCP @ ^1.1.1
https://github.com/me-no-dev/ESPAsyncWebServer.git#master
#me-no-dev/AsyncTCP @ ^1.1.1
https://github.com/esphome/AsyncTCP.git
#mathieucarbou/ESPAsyncWebServer @ ^3.6.0
#esp32async/AsyncTCP @ ^3.3.5
bogde/HX711 @ ^0.7.5
adafruit/Adafruit SSD1306 @ ^2.5.13
adafruit/Adafruit GFX Library @ ^1.11.11
@ -30,22 +35,41 @@ lib_deps =
digitaldragon/SSLClient @ ^1.3.2
; Enable SPIFFS upload
board_build.filesystem = spiffs
board_build.spiffs.partition = 2M
board_build.spiffs.upload_size = 2M
#board_build.filesystem = spiffs
board_build.filesystem = littlefs
; Update partition settings
board_build.partitions = partitions.csv
board_upload.flash_size = 4MB
board_build.flash_mode = dio
board_upload.flash_freq = "40m"
build_flags =
-Os
-ffunction-sections
-fdata-sections
-DNDEBUG
#-DNDEBUG
-mtext-section-literals
'-D VERSION="${common.version}"'
-DVERSION=\"${common.version}\"
-DTOOLDVERSION=\"${common.to_old_version}\"
-DASYNCWEBSERVER_REGEX
#-DCORE_DEBUG_LEVEL=3
-DCONFIG_ARDUHAL_LOG_COLORS=1
#-DOTA_DEBUG=1
-DCONFIG_OPTIMIZATION_LEVEL_DEBUG=1
-DBOOT_APP_PARTITION_OTA_0=1
-DCONFIG_LWIP_TCP_MSL=60000
-DCONFIG_LWIP_TCP_RCV_BUF_DEFAULT=4096
-DCONFIG_LWIP_MAX_ACTIVE_TCP=16
extra_scripts =
pre:scripts/combine_html.py
pre:scripts/pre_build.py
pre:scripts/pre_spiffs.py
pre:scripts/gzip_files.py
pre:scripts/extra_script.py
pre:scripts/update_changelog.py
scripts/extra_script.py
${env:buildfs.extra_scripts}
[env:buildfs]
extra_scripts =
pre:scripts/combine_html.py ; Combine header with HTML files
scripts/gzip_files.py ; Compress files for SPIFFS
[platformio]
default_envs = esp32dev

View File

@ -1,7 +1,10 @@
Import("env")
import os
import re
def combine_html_files(source, target, env):
print("COMBINE HTML FILES")
html_dir = "./html"
header_file = os.path.join(html_dir, "header.html")
@ -18,14 +21,14 @@ def combine_html_files(source, target, env):
with open(file_path, 'r') as f:
content = f.read()
# Replace placeholder with header content
if '{{header}}' in content:
new_content = content.replace('{{header}}', header_content)
# Write back combined content
with open(file_path, 'w') as f:
f.write(new_content)
print(f"Combined header with {filename}")
# Replace content between head comments with header content
pattern = r'(<!-- head -->).*?(<!-- head -->)'
new_content = re.sub(pattern, r'\1' + header_content + r'\2', content, flags=re.DOTALL)
# Write back combined content
with open(file_path, 'w') as f:
f.write(new_content)
print(f"Combined header with {filename}")
# Register the script to run before building SPIFFS
env.AddPreAction("buildfs", combine_html_files)

View File

@ -13,6 +13,9 @@ def copy_file(input_file, output_file):
shutil.copy2(input_file, output_file)
def should_compress(file):
# Skip compression for spoolman.html
if file == 'spoolman.html' or file == 'waage.html':
return False
# Komprimiere nur bestimmte Dateitypen
return file.endswith(('.js', '.png', '.css', '.html'))

View File

@ -22,4 +22,4 @@ def replace_version(source, target, env):
with open(header_file, 'w') as file:
file.write(content)
env.AddPreAction("buildfs", replace_version)
env.AddPreAction("buildfs", replace_version)

View File

@ -1,7 +1,39 @@
Import("env")
board_config = env.BoardConfig()
# Calculate SPIFFS size based on partition table
SPIFFS_START = 0x310000 # From partitions.csv
SPIFFS_SIZE = 0xE0000 # From partitions.csv
SPIFFS_PAGE = 256
SPIFFS_BLOCK = 4096
env.Replace(
MKSPIFFSTOOL="mkspiffs",
SPIFFSBLOCKSZ=SPIFFS_BLOCK,
SPIFFSBLOCKSIZE=SPIFFS_BLOCK,
SPIFFSSTART=SPIFFS_START,
SPIFFSEND=SPIFFS_START + SPIFFS_SIZE,
SPIFFSPAGESZ=SPIFFS_PAGE,
SPIFFSSIZE=SPIFFS_SIZE
)
# Wiederverwendung der replace_version Funktion
exec(open("./scripts/pre_build.py").read())
# Bind to SPIFFS build
env.AddPreAction("buildfs", replace_version)
env.AddPreAction("buildfs", replace_version)
import os
import shutil
from SCons.Script import DefaultEnvironment
env = DefaultEnvironment()
# Format SPIFFS partition before uploading new files
spiffs_dir = os.path.join(env.subst("$BUILD_DIR"), "spiffs")
if os.path.exists(spiffs_dir):
shutil.rmtree(spiffs_dir)
os.makedirs(spiffs_dir)
print("SPIFFS partition formatted.")

View File

@ -64,33 +64,10 @@ def get_changes_from_git():
return changes
def push_changes(version):
"""Push changes to upstream"""
try:
# Stage the CHANGELOG.md
subprocess.run(['git', 'add', 'CHANGELOG.md'], check=True)
# Commit the changelog
commit_msg = f"docs: update changelog for version {version}"
subprocess.run(['git', 'commit', '-m', commit_msg], check=True)
# Push to origin (local)
subprocess.run(['git', 'push', 'origin'], check=True)
print("Successfully pushed to origin")
# Ask for upstream push
response = input("Do you want to push to GitHub (upstream)? (y/n): ").lower()
if response == 'y':
subprocess.run(['git', 'push', 'upstream'], check=True)
print("Successfully pushed to upstream")
except subprocess.CalledProcessError as e:
print(f"Error during git operations: {e}")
return False
return True
def update_changelog():
print("Starting changelog update...")
version = get_version()
print(f"Current version: {version}")
today = datetime.now().strftime('%Y-%m-%d')
script_dir = os.path.dirname(os.path.abspath(__file__))
@ -115,7 +92,7 @@ def update_changelog():
if not os.path.exists(changelog_path):
with open(changelog_path, 'w') as f:
f.write(f"# Changelog\n\n{changelog_entry}")
push_changes(version)
print(f"Created new changelog file with version {version}")
else:
with open(changelog_path, 'r') as f:
content = f.read()
@ -124,9 +101,30 @@ def update_changelog():
updated_content = content.replace("# Changelog\n", f"# Changelog\n\n{changelog_entry}")
with open(changelog_path, 'w') as f:
f.write(updated_content)
push_changes(version)
print(f"Added new version {version} to changelog")
else:
print(f"Version {version} already exists in changelog")
# Version existiert bereits, aktualisiere die bestehenden Einträge
version_pattern = f"## \\[{version}\\] - \\d{{4}}-\\d{{2}}-\\d{{2}}"
next_version_pattern = "## \\[.*?\\] - \\d{4}-\\d{2}-\\d{2}"
# Finde den Start der aktuellen Version
version_match = re.search(version_pattern, content)
if version_match:
version_start = version_match.start()
# Suche nach der nächsten Version
next_version_match = re.search(next_version_pattern, content[version_start + 1:])
if next_version_match:
# Ersetze den Inhalt zwischen aktueller und nächster Version
next_version_pos = version_start + 1 + next_version_match.start()
updated_content = content[:version_start] + changelog_entry + content[next_version_pos:]
else:
# Wenn keine nächste Version existiert, ersetze bis zum Ende
updated_content = content[:version_start] + changelog_entry + "\n"
with open(changelog_path, 'w') as f:
f.write(updated_content)
print(f"Updated entries for version {version}")
if __name__ == "__main__":
update_changelog()

View File

@ -3,43 +3,23 @@
#include <ArduinoJson.h>
#include "commonFS.h"
bool spoolman_connected = false;
volatile spoolmanApiStateType spoolmanApiState = API_INIT;
//bool spoolman_connected = false;
String spoolmanUrl = "";
bool octoEnabled = false;
String octoUrl = "";
String octoToken = "";
struct SendToApiParams {
String httpType;
String spoolsUrl;
String updatePayload;
String octoToken;
};
/*
// Spoolman Data
{
"version":"1.0",
"protocol":"openspool",
"color_hex":"AF7933",
"type":"ABS",
"min_temp":175,
"max_temp":275,
"brand":"Overture"
}
// FilaMan Data
{
"version":"1.0",
"protocol":"openspool",
"color_hex":"AF7933",
"type":"ABS",
"min_temp":175,
"max_temp":275,
"brand":"Overture",
"sm_id":
}
*/
JsonDocument fetchSpoolsForWebsite() {
JsonDocument fetchSingleSpoolInfo(int spoolId) {
HTTPClient http;
String spoolsUrl = spoolmanUrl + apiUrl + "/spool";
String spoolsUrl = spoolmanUrl + apiUrl + "/spool/" + spoolId;
Serial.print("Rufe Spool-Daten von: ");
Serial.println(spoolsUrl);
@ -56,84 +36,45 @@ JsonDocument fetchSpoolsForWebsite() {
Serial.print("Fehler beim Parsen der JSON-Antwort: ");
Serial.println(error.c_str());
} else {
JsonArray spools = doc.as<JsonArray>();
JsonArray filteredSpools = filteredDoc.to<JsonArray>();
String filamentType = doc["filament"]["material"].as<String>();
String filamentBrand = doc["filament"]["vendor"]["name"].as<String>();
for (JsonObject spool : spools) {
JsonObject filteredSpool = filteredSpools.createNestedObject();
filteredSpool["extra"]["nfc_id"] = spool["extra"]["nfc_id"];
int nozzle_temp_min = 0;
int nozzle_temp_max = 0;
if (doc["filament"]["extra"]["nozzle_temperature"].is<String>()) {
String tempString = doc["filament"]["extra"]["nozzle_temperature"].as<String>();
tempString.replace("[", "");
tempString.replace("]", "");
int commaIndex = tempString.indexOf(',');
if (commaIndex != -1) {
nozzle_temp_min = tempString.substring(0, commaIndex).toInt();
nozzle_temp_max = tempString.substring(commaIndex + 1).toInt();
}
}
JsonObject filament = filteredSpool.createNestedObject("filament");
filament["sm_id"] = spool["id"];
filament["id"] = spool["filament"]["id"];
filament["name"] = spool["filament"]["name"];
filament["material"] = spool["filament"]["material"];
filament["color_hex"] = spool["filament"]["color_hex"];
filament["nozzle_temperature"] = spool["filament"]["extra"]["nozzle_temperature"]; // [190,230]
filament["price_meter"] = spool["filament"]["extra"]["price_meter"];
filament["price_gramm"] = spool["filament"]["extra"]["price_gramm"];
String filamentColor = doc["filament"]["color_hex"].as<String>();
filamentColor.toUpperCase();
JsonObject vendor = filament.createNestedObject("vendor");
vendor["id"] = spool["filament"]["vendor"]["id"];
vendor["name"] = spool["filament"]["vendor"]["name"];
}
}
} else {
Serial.print("Fehler beim Abrufen der Spool-Daten. HTTP-Code: ");
Serial.println(httpCode);
}
String tray_info_idx = doc["filament"]["extra"]["bambu_idx"].as<String>();
tray_info_idx.replace("\"", "");
String cali_idx = doc["filament"]["extra"]["bambu_cali_id"].as<String>(); // "\"153\""
cali_idx.replace("\"", "");
String bambu_setting_id = doc["filament"]["extra"]["bambu_setting_id"].as<String>(); // "\"PFUSf40e9953b40d3d\""
bambu_setting_id.replace("\"", "");
http.end();
return filteredDoc;
}
doc.clear();
JsonDocument fetchAllSpoolsInfo() {
HTTPClient http;
String spoolsUrl = spoolmanUrl + apiUrl + "/spool";
Serial.print("Rufe Spool-Daten von: ");
Serial.println(spoolsUrl);
http.begin(spoolsUrl);
int httpCode = http.GET();
JsonDocument filteredDoc;
if (httpCode == HTTP_CODE_OK) {
String payload = http.getString();
JsonDocument doc;
DeserializationError error = deserializeJson(doc, payload);
if (error) {
Serial.print("Fehler beim Parsen der JSON-Antwort: ");
Serial.println(error.c_str());
} else {
JsonArray spools = doc.as<JsonArray>();
JsonArray filteredSpools = filteredDoc.to<JsonArray>();
for (JsonObject spool : spools) {
JsonObject filteredSpool = filteredSpools.createNestedObject();
filteredSpool["price"] = spool["price"];
filteredSpool["remaining_weight"] = spool["remaining_weight"];
filteredSpool["used_weight"] = spool["used_weight"];
filteredSpool["extra"]["nfc_id"] = spool["extra"]["nfc_id"];
JsonObject filament = filteredSpool.createNestedObject("filament");
filament["id"] = spool["filament"]["id"];
filament["name"] = spool["filament"]["name"];
filament["material"] = spool["filament"]["material"];
filament["density"] = spool["filament"]["density"];
filament["diameter"] = spool["filament"]["diameter"];
filament["spool_weight"] = spool["filament"]["spool_weight"];
filament["color_hex"] = spool["filament"]["color_hex"];
JsonObject vendor = filament.createNestedObject("vendor");
vendor["id"] = spool["filament"]["vendor"]["id"];
vendor["name"] = spool["filament"]["vendor"]["name"];
JsonObject extra = filament.createNestedObject("extra");
extra["nozzle_temperature"] = spool["filament"]["extra"]["nozzle_temperature"];
extra["price_gramm"] = spool["filament"]["extra"]["price_gramm"];
extra["price_meter"] = spool["filament"]["extra"]["price_meter"];
}
filteredDoc["color"] = filamentColor;
filteredDoc["type"] = filamentType;
filteredDoc["nozzle_temp_min"] = nozzle_temp_min;
filteredDoc["nozzle_temp_max"] = nozzle_temp_max;
filteredDoc["brand"] = filamentBrand;
filteredDoc["tray_info_idx"] = tray_info_idx;
filteredDoc["cali_idx"] = cali_idx;
filteredDoc["bambu_setting_id"] = bambu_setting_id;
}
} else {
Serial.print("Fehler beim Abrufen der Spool-Daten. HTTP-Code: ");
@ -145,50 +86,58 @@ JsonDocument fetchAllSpoolsInfo() {
}
void sendToApi(void *parameter) {
spoolmanApiState = API_TRANSMITTING;
SendToApiParams* params = (SendToApiParams*)parameter;
// Extrahiere die Werte
String httpType = params->httpType;
String spoolsUrl = params->spoolsUrl;
String updatePayload = params->updatePayload;
String octoToken = params->octoToken;
HTTPClient http;
http.setReuse(false);
http.begin(spoolsUrl);
http.addHeader("Content-Type", "application/json");
if (octoEnabled && octoToken != "") http.addHeader("X-Api-Key", octoToken);
int httpCode = http.PUT(updatePayload);
int httpCode;
if (httpType == "PATCH") httpCode = http.PATCH(updatePayload);
else if (httpType == "POST") httpCode = http.POST(updatePayload);
else httpCode = http.PUT(updatePayload);
if (httpCode == HTTP_CODE_OK) {
Serial.println("Gewicht der Spule erfolgreich aktualisiert");
Serial.println("Spoolman erfolgreich aktualisiert");
} else {
Serial.println("Fehler beim Aktualisieren des Gewichts der Spule");
Serial.println("Fehler beim Senden an Spoolman!");
oledShowMessage("Spoolman update failed");
vTaskDelay(2000 / portTICK_PERIOD_MS);
}
http.end();
vTaskDelay(50 / portTICK_PERIOD_MS);
// Speicher freigeben
delete params;
vTaskDelete(NULL);
spoolmanApiState = API_IDLE;
}
uint8_t updateSpoolTagId(String uidString, const char* payload) {
bool updateSpoolTagId(String uidString, const char* payload) {
JsonDocument doc;
DeserializationError error = deserializeJson(doc, payload);
if (error) {
Serial.print("Fehler beim JSON-Parsing: ");
Serial.println(error.c_str());
return 0;
return false;
}
// Überprüfe, ob die erforderlichen Felder vorhanden sind
if (!doc.containsKey("sm_id") || doc["sm_id"] == "") {
if (!doc["sm_id"].is<String>() || doc["sm_id"].as<String>() == "") {
Serial.println("Keine Spoolman-ID gefunden.");
return 0;
return false;
}
String spoolsUrl = spoolmanUrl + apiUrl + "/spool/" + doc["sm_id"].as<String>();
@ -207,7 +156,7 @@ uint8_t updateSpoolTagId(String uidString, const char* payload) {
SendToApiParams* params = new SendToApiParams();
if (params == nullptr) {
Serial.println("Fehler: Kann Speicher für Task-Parameter nicht allokieren.");
return 0;
return false;
}
params->httpType = "PATCH";
params->spoolsUrl = spoolsUrl;
@ -217,13 +166,15 @@ uint8_t updateSpoolTagId(String uidString, const char* payload) {
BaseType_t result = xTaskCreate(
sendToApi, // Task-Funktion
"SendToApiTask", // Task-Name
4096, // Stackgröße in Bytes
6144, // Stackgröße in Bytes
(void*)params, // Parameter
0, // Priorität
NULL // Task-Handle (nicht benötigt)
);
return 1;
updateDoc.clear();
return true;
}
uint8_t updateSpoolWeight(String spoolId, uint16_t weight) {
@ -253,15 +204,102 @@ uint8_t updateSpoolWeight(String spoolId, uint16_t weight) {
BaseType_t result = xTaskCreate(
sendToApi, // Task-Funktion
"SendToApiTask", // Task-Name
4096, // Stackgröße in Bytes
6144, // Stackgröße in Bytes
(void*)params, // Parameter
0, // Priorität
NULL // Task-Handle (nicht benötigt)
);
updateDoc.clear();
return 1;
}
bool updateSpoolOcto(int spoolId) {
String spoolsUrl = octoUrl + "/plugin/Spoolman/selectSpool";
Serial.print("Update Spule in Octoprint mit URL: ");
Serial.println(spoolsUrl);
JsonDocument updateDoc;
updateDoc["spool_id"] = spoolId;
updateDoc["tool"] = "tool0";
String updatePayload;
serializeJson(updateDoc, updatePayload);
Serial.print("Update Payload: ");
Serial.println(updatePayload);
SendToApiParams* params = new SendToApiParams();
if (params == nullptr) {
Serial.println("Fehler: Kann Speicher für Task-Parameter nicht allokieren.");
return false;
}
params->httpType = "POST";
params->spoolsUrl = spoolsUrl;
params->updatePayload = updatePayload;
params->octoToken = octoToken;
// Erstelle die Task
BaseType_t result = xTaskCreate(
sendToApi, // Task-Funktion
"SendToApiTask", // Task-Name
6144, // Stackgröße in Bytes
(void*)params, // Parameter
0, // Priorität
NULL // Task-Handle (nicht benötigt)
);
updateDoc.clear();
return true;
}
bool updateSpoolBambuData(String payload) {
JsonDocument doc;
DeserializationError error = deserializeJson(doc, payload);
if (error) {
Serial.print("Fehler beim JSON-Parsing: ");
Serial.println(error.c_str());
return false;
}
String spoolsUrl = spoolmanUrl + apiUrl + "/filament/" + doc["filament_id"].as<String>();
Serial.print("Update Spule mit URL: ");
Serial.println(spoolsUrl);
JsonDocument updateDoc;
updateDoc["extra"]["bambu_setting_id"] = "\"" + doc["setting_id"].as<String>() + "\"";
updateDoc["extra"]["bambu_cali_id"] = "\"" + doc["cali_idx"].as<String>() + "\"";
updateDoc["extra"]["bambu_idx"] = "\"" + doc["tray_info_idx"].as<String>() + "\"";
updateDoc["extra"]["nozzle_temperature"] = "[" + doc["temp_min"].as<String>() + "," + doc["temp_max"].as<String>() + "]";
String updatePayload;
serializeJson(updateDoc, updatePayload);
Serial.print("Update Payload: ");
Serial.println(updatePayload);
SendToApiParams* params = new SendToApiParams();
if (params == nullptr) {
Serial.println("Fehler: Kann Speicher für Task-Parameter nicht allokieren.");
return false;
}
params->httpType = "PATCH";
params->spoolsUrl = spoolsUrl;
params->updatePayload = updatePayload;
// Erstelle die Task
BaseType_t result = xTaskCreate(
sendToApi, // Task-Funktion
"SendToApiTask", // Task-Name
6144, // Stackgröße in Bytes
(void*)params, // Parameter
0, // Priorität
NULL // Task-Handle (nicht benötigt)
);
return true;
}
// #### Spoolman init
bool checkSpoolmanExtraFields() {
HTTPClient http;
@ -368,7 +406,7 @@ bool checkSpoolmanExtraFields() {
for (uint8_t s = 0; s < extraLength; s++) {
bool found = false;
for (JsonObject field : doc.as<JsonArray>()) {
if (field.containsKey("key") && field["key"] == extraFields[s]) {
if (field["key"].is<String>() && field["key"] == extraFields[s]) {
Serial.println("Feld gefunden: " + extraFields[s]);
found = true;
break;
@ -403,12 +441,13 @@ bool checkSpoolmanExtraFields() {
}
}
}
http.end();
}
Serial.println("-------- ENDE Prüfe Felder --------");
Serial.println();
http.end();
return true;
}
@ -430,7 +469,7 @@ bool checkSpoolmanInstance(const String& url) {
String payload = http.getString();
JsonDocument doc;
DeserializationError error = deserializeJson(doc, payload);
if (!error && doc.containsKey("status")) {
if (!error && doc["status"].is<String>()) {
const char* status = doc["status"];
http.end();
@ -443,7 +482,8 @@ bool checkSpoolmanInstance(const String& url) {
return false;
}
spoolman_connected = true;
spoolmanApiState = API_IDLE;
oledShowTopRow();
return strcmp(status, "healthy") == 0;
}
}
@ -452,24 +492,38 @@ bool checkSpoolmanInstance(const String& url) {
return false;
}
bool saveSpoolmanUrl(const String& url) {
bool saveSpoolmanUrl(const String& url, bool octoOn, const String& octoWh, const String& octoTk) {
if (!checkSpoolmanInstance(url)) return false;
JsonDocument doc;
doc["url"] = url;
Serial.print("Speichere URL in Datei: ");
Serial.println(url);
doc["octoEnabled"] = octoOn;
doc["octoUrl"] = octoWh;
doc["octoToken"] = octoTk;
Serial.print("Speichere Spoolman Data in Datei: ");
Serial.println(doc.as<String>());
if (!saveJsonValue("/spoolman_url.json", doc)) {
Serial.println("Fehler beim Speichern der Spoolman-URL.");
return false;
}
spoolmanUrl = url;
octoEnabled = octoOn;
octoUrl = octoWh;
octoToken = octoTk;
return true;
}
String loadSpoolmanUrl() {
JsonDocument doc;
if (loadJsonValue("/spoolman_url.json", doc) && doc.containsKey("url")) {
if (loadJsonValue("/spoolman_url.json", doc) && doc["url"].is<String>()) {
octoEnabled = (doc["octoEnabled"].is<bool>()) ? doc["octoEnabled"].as<bool>() : false;
if (octoEnabled && doc["octoToken"].is<String>() && doc["octoUrl"].is<String>())
{
octoUrl = doc["octoUrl"].as<String>();
octoToken = doc["octoToken"].as<String>();
}
return doc["url"].as<String>();
}
Serial.println("Keine gültige Spoolman-URL gefunden.");

View File

@ -6,19 +6,28 @@
#include "website.h"
#include "display.h"
#include <ArduinoJson.h>
typedef enum {
API_INIT,
API_IDLE,
API_TRANSMITTING
} spoolmanApiStateType;
extern volatile spoolmanApiStateType spoolmanApiState;
extern bool spoolman_connected;
extern String spoolmanUrl;
extern bool octoEnabled;
extern String octoUrl;
extern String octoToken;
bool checkSpoolmanInstance(const String& url);
bool saveSpoolmanUrl(const String& url);
bool saveSpoolmanUrl(const String& url, bool octoOn, const String& octoWh, const String& octoTk);
String loadSpoolmanUrl(); // Neue Funktion zum Laden der URL
bool checkSpoolmanExtraFields(); // Neue Funktion zum Überprüfen der Extrafelder
JsonDocument fetchSpoolsForWebsite(); // API-Funktion für die Webseite
JsonDocument fetchAllSpoolsInfo();
void sendAmsData(AsyncWebSocketClient *client); // Neue Funktion zum Senden von AMS-Daten
uint8_t updateSpoolTagId(String uidString, const char* payload); // Neue Funktion zum Aktualisieren eines Spools
JsonDocument fetchSingleSpoolInfo(int spoolId); // API-Funktion für die Webseite
bool updateSpoolTagId(String uidString, const char* payload); // Neue Funktion zum Aktualisieren eines Spools
uint8_t updateSpoolWeight(String spoolId, uint16_t weight); // Neue Funktion zum Aktualisieren des Gewichts
bool initSpoolman(); // Neue Funktion zum Initialisieren von Spoolman
bool updateSpoolBambuData(String payload); // Neue Funktion zum Aktualisieren der Bambu-Daten
bool updateSpoolOcto(int spoolId); // Neue Funktion zum Aktualisieren der Octo-Daten
#endif

View File

@ -17,20 +17,54 @@ PubSubClient client(sslClient);
TaskHandle_t BambuMqttTask;
String report_topic = "";
String topic = "";
//String request_topic = "";
const char* bambu_username = "bblp";
const char* bambu_ip = nullptr;
const char* bambu_accesscode = nullptr;
const char* bambu_serialnr = nullptr;
String g_bambu_ip = "";
String g_bambu_accesscode = "";
String g_bambu_serialnr = "";
bool bambuDisabled = false;
bool bambu_connected = false;
bool autoSendToBambu = false;
int autoSetToBambuSpoolId = 0;
// Globale Variablen für AMS-Daten
int ams_count = 0;
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 saveBambuCredentials(const String& ip, const String& serialnr, const String& accesscode) {
bool removeBambuCredentials() {
if (BambuMqttTask) {
vTaskDelete(BambuMqttTask);
}
if (!removeJsonValue("/bambu_credentials.json")) {
Serial.println("Fehler beim Löschen der Bambu-Credentials.");
return false;
}
// Löschen der globalen Variablen
g_bambu_ip = "";
g_bambu_accesscode = "";
g_bambu_serialnr = "";
bambu_ip = nullptr;
bambu_accesscode = nullptr;
bambu_serialnr = nullptr;
autoSendToBambu = false;
autoSetToBambuSpoolId = 0;
ams_count = 0;
amsJsonData = "";
bambuDisabled = true;
return true;
}
bool saveBambuCredentials(const String& ip, const String& serialnr, const String& accesscode, bool autoSend, const String& autoSendTime) {
if (BambuMqttTask) {
vTaskDelete(BambuMqttTask);
}
@ -39,6 +73,8 @@ bool saveBambuCredentials(const String& ip, const String& serialnr, const String
doc["bambu_ip"] = ip;
doc["bambu_accesscode"] = accesscode;
doc["bambu_serialnr"] = serialnr;
doc["autoSendToBambu"] = autoSend;
doc["autoSendTime"] = (autoSendTime != "") ? autoSendTime.toInt() : autoSetBambuAmsCounter;
if (!saveJsonValue("/bambu_credentials.json", doc)) {
Serial.println("Fehler beim Speichern der Bambu-Credentials.");
@ -49,6 +85,8 @@ bool saveBambuCredentials(const String& ip, const String& serialnr, const String
bambu_ip = ip.c_str();
bambu_accesscode = accesscode.c_str();
bambu_serialnr = serialnr.c_str();
autoSendToBambu = autoSend;
autoSetBambuAmsCounter = autoSendTime.toInt();
vTaskDelay(100 / portTICK_PERIOD_MS);
if (!setupMqtt()) return false;
@ -58,22 +96,29 @@ bool saveBambuCredentials(const String& ip, const String& serialnr, const String
bool loadBambuCredentials() {
JsonDocument doc;
if (loadJsonValue("/bambu_credentials.json", doc) && doc.containsKey("bambu_ip")) {
if (loadJsonValue("/bambu_credentials.json", doc) && doc["bambu_ip"].is<String>()) {
// Temporäre Strings für die Werte
String ip = doc["bambu_ip"].as<String>();
String code = doc["bambu_accesscode"].as<String>();
String serial = doc["bambu_serialnr"].as<String>();
g_bambu_ip = ip;
g_bambu_accesscode = code;
g_bambu_serialnr = serial;
if (doc["autoSendToBambu"].is<bool>()) autoSendToBambu = doc["autoSendToBambu"].as<bool>();
if (doc["autoSendTime"].is<int>()) autoSetBambuAmsCounter = doc["autoSendTime"].as<int>();
ip.trim();
code.trim();
serial.trim();
// Dynamische Speicherallokation für die globalen Pointer
bambu_ip = strdup(ip.c_str());
bambu_accesscode = strdup(code.c_str());
bambu_serialnr = strdup(serial.c_str());
bambu_ip = g_bambu_ip.c_str();
bambu_accesscode = g_bambu_accesscode.c_str();
bambu_serialnr = g_bambu_serialnr.c_str();
report_topic = "device/" + String(bambu_serialnr) + "/report";
topic = "device/" + String(bambu_serialnr);
//request_topic = "device/" + String(bambu_serialnr) + "/request";
return true;
}
@ -81,19 +126,49 @@ bool loadBambuCredentials() {
return false;
}
String findFilamentIdx(String brand, String type) {
struct FilamentResult {
String key;
String type;
};
FilamentResult findFilamentIdx(String brand, String type) {
// JSON-Dokument für die Filament-Daten erstellen
JsonDocument doc;
// Laden der own_filaments.json
String ownFilament = "";
if (!loadJsonValue("/own_filaments.json", doc))
{
Serial.println("Fehler beim Laden der eigenen Filament-Daten");
}
else
{
// Durchsuche direkt nach dem Type als Schlüssel
if (doc[type].is<String>()) {
ownFilament = doc[type].as<String>();
}
doc.clear();
}
doc.clear();
// Laden der bambu_filaments.json
if (!loadJsonValue("/bambu_filaments.json", doc)) {
if (!loadJsonValue("/bambu_filaments.json", doc))
{
Serial.println("Fehler beim Laden der Filament-Daten");
return "GFL99"; // Fallback auf Generic PLA
return {"GFL99", "PLA"}; // Fallback auf Generic PLA
}
// Wenn eigener Typ
if (ownFilament != "")
{
if (doc[ownFilament].is<String>())
{
return {ownFilament, doc[ownFilament].as<String>()};
}
}
// 1. Erst versuchen wir die exakte Brand + Type Kombination zu finden
String searchKey;
// 1. Suche nach Brand + Type Kombination
if (brand == "Bambu" || brand == "Bambulab") {
searchKey = "Bambu " + type;
} else if (brand == "PolyLite") {
@ -109,26 +184,49 @@ String findFilamentIdx(String brand, String type) {
// Durchsuche alle Einträge nach der Brand + Type Kombination
for (JsonPair kv : doc.as<JsonObject>()) {
if (kv.value().as<String>() == searchKey) {
return kv.key().c_str();
return {kv.key().c_str(), kv.value().as<String>()};
}
}
// 2. Wenn nicht gefunden, suche nach Generic + Type
searchKey = "Generic " + type;
// 2. Wenn nicht gefunden, zerlege den type String in Wörter und suche nach jedem Wort
// Sammle alle vorhandenen Filamenttypen aus der JSON
std::vector<String> knownTypes;
for (JsonPair kv : doc.as<JsonObject>()) {
if (kv.value().as<String>() == searchKey) {
return kv.key().c_str();
String value = kv.value().as<String>();
// Extrahiere den Typ ohne Markennamen
if (value.indexOf(" ") != -1) {
value = value.substring(value.indexOf(" ") + 1);
}
if (!value.isEmpty()) {
knownTypes.push_back(value);
}
}
// Zerlege den Input-Type in Wörter
String typeStr = type;
typeStr.trim();
// Durchsuche für jedes bekannte Filament, ob es im Input vorkommt
for (const String& knownType : knownTypes) {
if (typeStr.indexOf(knownType) != -1) {
// Suche nach diesem Typ in der Original-JSON
for (JsonPair kv : doc.as<JsonObject>()) {
String value = kv.value().as<String>();
if (value.indexOf(knownType) != -1) {
return {kv.key().c_str(), knownType};
}
}
}
}
// 3. Wenn immer noch nichts gefunden, gebe GFL99 zurück (Generic PLA)
return "GFL99";
return {"GFL99", "PLA"};
}
bool sendMqttMessage(String payload) {
bool sendMqttMessage(const String& payload) {
Serial.println("Sending MQTT message");
Serial.println(payload);
if (client.publish(report_topic.c_str(), payload.c_str()))
if (client.publish((String(topic) + "/request").c_str(), payload.c_str()))
{
return true;
}
@ -156,15 +254,22 @@ bool setBambuSpool(String payload) {
int minTemp = doc["nozzle_temp_min"];
int maxTemp = doc["nozzle_temp_max"];
String type = doc["type"].as<String>();
(type == "PLA+") ? type = "PLA" : type;
String brand = doc["brand"].as<String>();
String tray_info_idx = (doc["tray_info_idx"].as<String>() != "-1") ? doc["tray_info_idx"].as<String>() : "";
if (tray_info_idx == "") tray_info_idx = (brand != "" && type != "") ? findFilamentIdx(brand, type) : "";
if (tray_info_idx == "") {
if (brand != "" && type != "") {
FilamentResult result = findFilamentIdx(brand, type);
tray_info_idx = result.key;
type = result.type; // Aktualisiere den type mit dem gefundenen Basistyp
}
}
String setting_id = doc["bambu_setting_id"].as<String>();
String cali_idx = doc["cali_idx"].as<String>();
doc.clear();
doc["print"]["sequence_id"] = 0;
doc["print"]["sequence_id"] = "0";
doc["print"]["command"] = "ams_filament_setting";
doc["print"]["ams_id"] = amsId < 200 ? amsId : 255;
doc["print"]["tray_id"] = trayId < 200 ? trayId : 254;
@ -172,10 +277,10 @@ bool setBambuSpool(String payload) {
doc["print"]["nozzle_temp_min"] = minTemp;
doc["print"]["nozzle_temp_max"] = maxTemp;
doc["print"]["tray_type"] = type;
doc["print"]["cali_idx"] = (cali_idx != "") ? cali_idx : "";
//doc["print"]["cali_idx"] = (cali_idx != "") ? cali_idx : "";
doc["print"]["tray_info_idx"] = tray_info_idx;
doc["print"]["setting_id"] = setting_id;
// Serialize the JSON
String output;
serializeJson(doc, output);
@ -194,13 +299,13 @@ bool setBambuSpool(String payload) {
if (cali_idx != "") {
yield();
doc["print"]["sequence_id"] = 0;
doc["print"]["sequence_id"] = "0";
doc["print"]["command"] = "extrusion_cali_sel";
doc["print"]["filament_id"] = tray_info_idx;
doc["print"]["nozzle_diameter"] = "0.4";
doc["print"]["cali_idx"] = cali_idx.toInt();
doc["print"]["tray_id"] = trayId < 200 ? trayId : 254;
doc["print"]["ams_id"] = amsId < 200 ? amsId : 255;
//doc["print"]["ams_id"] = amsId < 200 ? amsId : 255;
// Serialize the JSON
String output;
@ -218,44 +323,120 @@ bool setBambuSpool(String payload) {
doc.clear();
yield();
}
/*
if (setting_id != "") {
yield();
doc["print"]["sequence_id"] = 0;
doc["print"]["command"] = "ams_filament_setting";
doc["print"]["nozzle_temp_min"] = minTemp;
doc["print"]["nozzle_temp_max"] = maxTemp;
doc["print"]["setting_id"] = setting_id;
doc["print"]["tray_color"] = color.length() == 8 ? color : color+"FF";
doc["print"]["ams_id"] = amsId < 200 ? amsId : 255;
doc["print"]["tray_id"] = trayId < 200 ? trayId : 254;
doc["print"]["tray_info_idx"] = tray_info_idx;
doc["print"]["tray_type"] = type;
// Serialize the JSON
String output;
serializeJson(doc, output);
return true;
}
if (sendMqttMessage(output)) {
Serial.println("Filament Setting successfully set");
void autoSetSpool(int spoolId, uint8_t trayId) {
// wenn neue spule erkannt und autoSetToBambu > 0
JsonDocument spoolInfo = fetchSingleSpoolInfo(spoolId);
if (!spoolInfo.isNull())
{
// AMS und TRAY id ergänzen
spoolInfo["amsId"] = 0;
spoolInfo["trayId"] = trayId;
Serial.println("Auto set spool");
Serial.println(spoolInfo.as<String>());
setBambuSpool(spoolInfo.as<String>());
oledShowMessage("Spool set");
}
// id wieder zurücksetzen damit abgeschlossen
autoSetToBambuSpoolId = 0;
}
void updateAmsWsData(JsonDocument& doc, JsonArray& amsArray, int& ams_count, JsonObject& vtTray) {
// Fortfahren mit der bestehenden Verarbeitung, da Änderungen gefunden wurden
ams_count = amsArray.size();
for (int i = 0; i < ams_count && i < 16; i++) {
JsonObject amsObj = amsArray[i];
JsonArray trayArray = amsObj["tray"].as<JsonArray>();
ams_data[i].ams_id = i; // Setze die AMS-ID
for (int j = 0; j < trayArray.size() && j < 4; j++) { // Annahme: Maximal 4 Trays pro AMS
JsonObject trayObj = trayArray[j];
ams_data[i].trays[j].id = trayObj["id"].as<uint8_t>();
ams_data[i].trays[j].tray_info_idx = trayObj["tray_info_idx"].as<String>();
ams_data[i].trays[j].tray_type = trayObj["tray_type"].as<String>();
ams_data[i].trays[j].tray_sub_brands = trayObj["tray_sub_brands"].as<String>();
ams_data[i].trays[j].tray_color = trayObj["tray_color"].as<String>();
ams_data[i].trays[j].nozzle_temp_min = trayObj["nozzle_temp_min"].as<int>();
ams_data[i].trays[j].nozzle_temp_max = trayObj["nozzle_temp_max"].as<int>();
if (trayObj["tray_type"].as<String>() == "") ams_data[i].trays[j].setting_id = "";
ams_data[i].trays[j].cali_idx = trayObj["cali_idx"].as<String>();
}
}
// Setze ams_count auf die Anzahl der normalen AMS
ams_count = amsArray.size();
// Wenn externe Spule vorhanden, füge sie hinzu
if (doc["print"]["vt_tray"].is<JsonObject>()) {
//JsonObject vtTray = doc["print"]["vt_tray"];
int extIdx = ams_count; // Index für externe Spule
ams_data[extIdx].ams_id = 255; // Spezielle ID für externe Spule
ams_data[extIdx].trays[0].id = 254; // Spezielle ID für externes Tray
ams_data[extIdx].trays[0].tray_info_idx = vtTray["tray_info_idx"].as<String>();
ams_data[extIdx].trays[0].tray_type = vtTray["tray_type"].as<String>();
ams_data[extIdx].trays[0].tray_sub_brands = vtTray["tray_sub_brands"].as<String>();
ams_data[extIdx].trays[0].tray_color = vtTray["tray_color"].as<String>();
ams_data[extIdx].trays[0].nozzle_temp_min = vtTray["nozzle_temp_min"].as<int>();
ams_data[extIdx].trays[0].nozzle_temp_max = vtTray["nozzle_temp_max"].as<int>();
if (doc["print"]["vt_tray"]["tray_type"].as<String>() != "")
{
//ams_data[extIdx].trays[0].setting_id = vtTray["setting_id"].as<String>();
ams_data[extIdx].trays[0].cali_idx = vtTray["cali_idx"].as<String>();
}
else
{
Serial.println("Failed to set Filament setting");
return false;
ams_data[extIdx].trays[0].setting_id = "";
ams_data[extIdx].trays[0].cali_idx = "";
}
doc.clear();
yield();
ams_count++; // Erhöhe ams_count für die externe Spule
}
*/
return true;
// Erstelle JSON für WebSocket-Clients
JsonDocument wsDoc;
JsonArray wsArray = wsDoc.to<JsonArray>();
for (int i = 0; i < ams_count; i++) {
JsonObject amsObj = wsArray.add<JsonObject>();
amsObj["ams_id"] = ams_data[i].ams_id;
JsonArray trays = amsObj["tray"].to<JsonArray>();
int maxTrays = (ams_data[i].ams_id == 255) ? 1 : 4;
for (int j = 0; j < maxTrays; j++) {
JsonObject trayObj = trays.add<JsonObject>();
trayObj["id"] = ams_data[i].trays[j].id;
trayObj["tray_info_idx"] = ams_data[i].trays[j].tray_info_idx;
trayObj["tray_type"] = ams_data[i].trays[j].tray_type;
trayObj["tray_sub_brands"] = ams_data[i].trays[j].tray_sub_brands;
trayObj["tray_color"] = ams_data[i].trays[j].tray_color;
trayObj["nozzle_temp_min"] = ams_data[i].trays[j].nozzle_temp_min;
trayObj["nozzle_temp_max"] = ams_data[i].trays[j].nozzle_temp_max;
trayObj["setting_id"] = ams_data[i].trays[j].setting_id;
trayObj["cali_idx"] = ams_data[i].trays[j].cali_idx;
}
}
serializeJson(wsArray, amsJsonData);
wsDoc.clear();
Serial.println("AMS data updated");
sendAmsData(nullptr);
}
// init
void mqtt_callback(char* topic, byte* payload, unsigned int length) {
String message;
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
@ -263,21 +444,25 @@ void mqtt_callback(char* topic, byte* payload, unsigned int length) {
// JSON-Dokument parsen
JsonDocument doc;
DeserializationError error = deserializeJson(doc, message);
if (error) {
message = "";
if (error)
{
Serial.print("Fehler beim Parsen des JSON: ");
Serial.println(error.c_str());
return;
}
// Prüfen, ob "print->upgrade_state" und "print.ams.ams" existieren
if (doc["print"].containsKey("upgrade_state")) {
if (doc["print"]["upgrade_state"].is<JsonObject>() || (doc["print"]["command"].is<String>() && doc["print"]["command"] == "push_status"))
{
// Prüfen ob AMS-Daten vorhanden sind
if (!doc["print"].containsKey("ams") || !doc["print"]["ams"].containsKey("ams")) {
if (!doc["print"]["ams"].is<JsonObject>() || !doc["print"]["ams"]["ams"].is<JsonArray>())
{
return;
}
JsonArray amsArray = doc["print"]["ams"]["ams"].as<JsonArray>();
// Prüfe ob sich die AMS-Daten geändert haben
bool hasChanges = false;
@ -304,154 +489,81 @@ void mqtt_callback(char* topic, byte* payload, unsigned int length) {
// Vergleiche die Trays
for (int j = 0; j < trayArray.size() && j < 4 && !hasChanges; j++) {
JsonObject trayObj = trayArray[j];
if (trayObj["tray_type"].as<String>() == "") ams_data[storedIndex].trays[j].setting_id = "";
if (trayObj["setting_id"].isNull()) trayObj["setting_id"] = "";
if (trayObj["tray_info_idx"].as<String>() != ams_data[storedIndex].trays[j].tray_info_idx ||
trayObj["tray_type"].as<String>() != ams_data[storedIndex].trays[j].tray_type ||
trayObj["tray_color"].as<String>() != ams_data[storedIndex].trays[j].tray_color ||
(trayObj["setting_id"].as<String>() != "" && trayObj["setting_id"].as<String>() != ams_data[storedIndex].trays[j].setting_id) ||
trayObj["cali_idx"].as<String>() != ams_data[storedIndex].trays[j].cali_idx) {
hasChanges = true;
if (autoSendToBambu && autoSetToBambuSpoolId > 0 && hasChanges)
{
autoSetSpool(autoSetToBambuSpoolId, ams_data[storedIndex].trays[j].id);
}
break;
}
}
}
// Prüfe die externe Spule
if (!hasChanges && doc["print"].containsKey("vt_tray")) {
JsonObject vtTray = doc["print"]["vt_tray"];
bool foundExternal = false;
JsonObject vtTray = doc["print"]["vt_tray"];
if (doc["print"]["vt_tray"].is<JsonObject>()) {
for (int i = 0; i < ams_count; i++) {
if (ams_data[i].ams_id == 255) {
foundExternal = true;
if (vtTray["tray_type"].as<String>() == "") ams_data[i].trays[0].setting_id = "";
if (vtTray["setting_id"].isNull()) vtTray["setting_id"] = "";
if (vtTray["tray_info_idx"].as<String>() != ams_data[i].trays[0].tray_info_idx ||
vtTray["tray_type"].as<String>() != ams_data[i].trays[0].tray_type ||
vtTray["tray_color"].as<String>() != ams_data[i].trays[0].tray_color ||
vtTray["cali_idx"].as<String>() != ams_data[i].trays[0].cali_idx) {
(vtTray["setting_id"].as<String>() != "" && vtTray["setting_id"].as<String>() != ams_data[i].trays[0].setting_id) ||
(vtTray["tray_type"].as<String>() != "" && vtTray["cali_idx"].as<String>() != ams_data[i].trays[0].cali_idx)) {
hasChanges = true;
if (autoSendToBambu && autoSetToBambuSpoolId > 0 && hasChanges)
{
autoSetSpool(autoSetToBambuSpoolId, 254);
}
}
break;
}
}
if (!foundExternal) hasChanges = true;
}
if (!hasChanges) return;
// Fortfahren mit der bestehenden Verarbeitung, da Änderungen gefunden wurden
ams_count = amsArray.size();
for (int i = 0; i < ams_count && i < 16; i++) {
JsonObject amsObj = amsArray[i];
JsonArray trayArray = amsObj["tray"].as<JsonArray>();
ams_data[i].ams_id = i; // Setze die AMS-ID
for (int j = 0; j < trayArray.size() && j < 4; j++) { // Annahme: Maximal 4 Trays pro AMS
JsonObject trayObj = trayArray[j];
ams_data[i].trays[j].id = trayObj["id"].as<uint8_t>();
ams_data[i].trays[j].tray_info_idx = trayObj["tray_info_idx"].as<String>();
ams_data[i].trays[j].tray_type = trayObj["tray_type"].as<String>();
ams_data[i].trays[j].tray_sub_brands = trayObj["tray_sub_brands"].as<String>();
ams_data[i].trays[j].tray_color = trayObj["tray_color"].as<String>();
ams_data[i].trays[j].nozzle_temp_min = trayObj["nozzle_temp_min"].as<int>();
ams_data[i].trays[j].nozzle_temp_max = trayObj["nozzle_temp_max"].as<int>();
ams_data[i].trays[j].setting_id = trayObj["setting_id"].as<String>();
ams_data[i].trays[j].cali_idx = trayObj["cali_idx"].as<String>();
}
}
// Setze ams_count auf die Anzahl der normalen AMS
ams_count = amsArray.size();
// Wenn externe Spule vorhanden, füge sie hinzu
if (doc["print"].containsKey("vt_tray")) {
JsonObject vtTray = doc["print"]["vt_tray"];
int extIdx = ams_count; // Index für externe Spule
ams_data[extIdx].ams_id = 255; // Spezielle ID für externe Spule
ams_data[extIdx].trays[0].id = 254; // Spezielle ID für externes Tray
ams_data[extIdx].trays[0].tray_info_idx = vtTray["tray_info_idx"].as<String>();
ams_data[extIdx].trays[0].tray_type = vtTray["tray_type"].as<String>();
ams_data[extIdx].trays[0].tray_sub_brands = vtTray["tray_sub_brands"].as<String>();
ams_data[extIdx].trays[0].tray_color = vtTray["tray_color"].as<String>();
ams_data[extIdx].trays[0].nozzle_temp_min = vtTray["nozzle_temp_min"].as<int>();
ams_data[extIdx].trays[0].nozzle_temp_max = vtTray["nozzle_temp_max"].as<int>();
ams_data[extIdx].trays[0].setting_id = vtTray["setting_id"].as<String>();
ams_data[extIdx].trays[0].cali_idx = vtTray["cali_idx"].as<String>();
ams_count++; // Erhöhe ams_count für die externe Spule
}
// Sende die aktualisierten AMS-Daten
//sendAmsData(nullptr);
// Erstelle JSON für WebSocket-Clients
JsonDocument wsDoc;
JsonArray wsArray = wsDoc.to<JsonArray>();
for (int i = 0; i < ams_count; i++) {
JsonObject amsObj = wsArray.createNestedObject();
amsObj["ams_id"] = ams_data[i].ams_id;
JsonArray trays = amsObj.createNestedArray("tray");
int maxTrays = (ams_data[i].ams_id == 255) ? 1 : 4;
for (int j = 0; j < maxTrays; j++) {
JsonObject trayObj = trays.createNestedObject();
trayObj["id"] = ams_data[i].trays[j].id;
trayObj["tray_info_idx"] = ams_data[i].trays[j].tray_info_idx;
trayObj["tray_type"] = ams_data[i].trays[j].tray_type;
trayObj["tray_sub_brands"] = ams_data[i].trays[j].tray_sub_brands;
trayObj["tray_color"] = ams_data[i].trays[j].tray_color;
trayObj["nozzle_temp_min"] = ams_data[i].trays[j].nozzle_temp_min;
trayObj["nozzle_temp_max"] = ams_data[i].trays[j].nozzle_temp_max;
trayObj["setting_id"] = ams_data[i].trays[j].setting_id;
trayObj["cali_idx"] = ams_data[i].trays[j].cali_idx;
}
}
serializeJson(wsArray, amsJsonData);
sendAmsData(nullptr);
updateAmsWsData(doc, amsArray, ams_count, vtTray);
}
// Neue Bedingung für ams_filament_setting
else if (doc["print"]["command"] == "ams_filament_setting") {
if (doc["print"]["command"] == "ams_filament_setting") {
int amsId = doc["print"]["ams_id"].as<int>();
int trayId = doc["print"]["tray_id"].as<int>();
String settingId = doc["print"]["setting_id"].as<String>();
String settingId = (doc["print"]["setting_id"].is<String>()) ? doc["print"]["setting_id"].as<String>() : "";
// Finde das entsprechende AMS und Tray
for (int i = 0; i < ams_count; i++) {
if (ams_data[i].ams_id == amsId) {
// Update setting_id im entsprechenden Tray
ams_data[i].trays[trayId].setting_id = settingId;
// Erstelle neues JSON für WebSocket-Clients
JsonDocument wsDoc;
JsonArray wsArray = wsDoc.to<JsonArray>();
for (int j = 0; j < ams_count; j++) {
JsonObject amsObj = wsArray.createNestedObject();
amsObj["ams_id"] = ams_data[j].ams_id;
JsonArray trays = amsObj.createNestedArray("tray");
int maxTrays = (ams_data[j].ams_id == 255) ? 1 : 4;
for (int k = 0; k < maxTrays; k++) {
JsonObject trayObj = trays.createNestedObject();
trayObj["id"] = ams_data[j].trays[k].id;
trayObj["tray_info_idx"] = ams_data[j].trays[k].tray_info_idx;
trayObj["tray_type"] = ams_data[j].trays[k].tray_type;
trayObj["tray_sub_brands"] = ams_data[j].trays[k].tray_sub_brands;
trayObj["tray_color"] = ams_data[j].trays[k].tray_color;
trayObj["nozzle_temp_min"] = ams_data[j].trays[k].nozzle_temp_min;
trayObj["nozzle_temp_max"] = ams_data[j].trays[k].nozzle_temp_max;
trayObj["setting_id"] = ams_data[j].trays[k].setting_id;
trayObj["cali_idx"] = ams_data[j].trays[k].cali_idx;
if (trayId == 254)
{
// Suche AMS mit ID 255 (externe Spule)
for (int j = 0; j < ams_count; j++) {
if (ams_data[j].ams_id == 255) {
ams_data[j].trays[0].setting_id = settingId;
break;
}
}
}
// Aktualisiere das globale amsJsonData
amsJsonData = "";
serializeJson(wsArray, amsJsonData);
else
{
ams_data[i].trays[trayId].setting_id = settingId;
}
// Sende an WebSocket Clients
Serial.println("Filament setting updated");
sendAmsData(nullptr);
break;
}
@ -461,16 +573,18 @@ void mqtt_callback(char* topic, byte* payload, unsigned int length) {
void reconnect() {
// Loop until we're reconnected
uint8_t retries = 0;
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
Serial.println("Attempting MQTT re/connection...");
bambu_connected = false;
oledShowTopRow();
// Attempt to connect
if (client.connect(bambu_serialnr, bambu_username, bambu_accesscode)) {
Serial.println("... re-connected");
// ... and resubscribe
client.subscribe(report_topic.c_str());
String clientId = String(bambu_serialnr) + "_" + String(random(0, 100));
if (client.connect(clientId.c_str(), bambu_username, bambu_accesscode)) {
Serial.println("MQTT re/connected");
client.subscribe((String(topic) + "/report").c_str());
bambu_connected = true;
oledShowTopRow();
} else {
@ -479,14 +593,23 @@ void reconnect() {
Serial.println(" try again in 5 seconds");
bambu_connected = false;
oledShowTopRow();
// Wait 5 seconds before retrying
yield();
vTaskDelay(5000 / portTICK_PERIOD_MS);
if (retries > 5) {
Serial.println("Disable Bambu MQTT Task after 5 retries");
//vTaskSuspend(BambuMqttTask);
vTaskDelete(BambuMqttTask);
break;
}
retries++;
}
}
}
void mqtt_loop(void * parameter) {
Serial.println("Bambu MQTT Task gestartet");
for(;;) {
if (pauseBambuMqttTask) {
vTaskDelay(10000);
@ -500,6 +623,7 @@ void mqtt_loop(void * parameter) {
}
client.loop();
yield();
esp_task_wdt_reset();
vTaskDelay(100);
}
}
@ -507,30 +631,27 @@ void mqtt_loop(void * parameter) {
bool setupMqtt() {
// Wenn Bambu Daten vorhanden
bool success = loadBambuCredentials();
vTaskDelay(100 / portTICK_PERIOD_MS);
if (!success) {
Serial.println("Failed to load Bambu credentials");
oledShowMessage("Bambu Credentials Missing");
vTaskDelay(2000 / portTICK_PERIOD_MS);
bambuDisabled = true;
return false;
}
if (success && bambu_ip != "" && bambu_accesscode != "" && bambu_serialnr != "")
{
bambuDisabled = false;
sslClient.setCACert(root_ca);
sslClient.setInsecure();
client.setServer(bambu_ip, 8883);
// Verbinden mit dem MQTT-Server
bool connected = true;
if (client.connect(bambu_serialnr, bambu_username, bambu_accesscode))
String clientId = String(bambu_serialnr) + "_" + String(random(0, 100));
if (client.connect(clientId.c_str(), bambu_username, bambu_accesscode))
{
client.setCallback(mqtt_callback);
client.setBufferSize(5120);
// Optional: Topic abonnieren
client.subscribe(report_topic.c_str());
//client.subscribe(request_topic.c_str());
client.setBufferSize(15488);
client.subscribe((String(topic) + "/report").c_str());
Serial.println("MQTT-Client initialisiert");
oledShowMessage("Bambu Connected");
@ -540,7 +661,7 @@ bool setupMqtt() {
xTaskCreatePinnedToCore(
mqtt_loop, /* Function to implement the task */
"BambuMqtt", /* Name of the task */
10000, /* Stack size in words */
8192, /* Stack size in words */
NULL, /* Task input parameter */
mqttTaskPrio, /* Priority of the task */
&BambuMqttTask, /* Task handle. */
@ -559,10 +680,7 @@ bool setupMqtt() {
}
else
{
Serial.println("Fehler: Keine MQTT-Daten vorhanden");
oledShowMessage("Bambu Credentials Missing");
oledShowTopRow();
vTaskDelay(2000 / portTICK_PERIOD_MS);
bambuDisabled = true;
return false;
}
return true;
@ -571,6 +689,7 @@ bool setupMqtt() {
void bambu_restart() {
if (BambuMqttTask) {
vTaskDelete(BambuMqttTask);
delay(10);
}
setupMqtt();
}

View File

@ -28,12 +28,17 @@ extern bool bambu_connected;
extern int ams_count;
extern AMSData ams_data[MAX_AMS];
extern bool autoSendToBambu;
extern int autoSetToBambuSpoolId;
extern bool bambuDisabled;
bool removeBambuCredentials();
bool loadBambuCredentials();
bool saveBambuCredentials(const String& bambu_ip, const String& bambu_serialnr, const String& bambu_accesscode);
bool saveBambuCredentials(const String& bambu_ip, const String& bambu_serialnr, const String& bambu_accesscode, const bool autoSend, const String& autoSendTime);
bool setupMqtt();
void mqtt_loop(void * parameter);
bool setBambuSpool(String payload);
void bambu_restart();
extern TaskHandle_t BambuMqttTask;
#endif

View File

@ -1,7 +1,22 @@
#include "commonFS.h"
#include <LittleFS.h>
bool removeJsonValue(const char* filename) {
File file = LittleFS.open(filename, "r");
if (!file) {
return true;
}
file.close();
if (!LittleFS.remove(filename)) {
Serial.print("Fehler beim Löschen der Datei: ");
Serial.println(filename);
return false;
}
return true;
}
bool saveJsonValue(const char* filename, const JsonDocument& doc) {
File file = SPIFFS.open(filename, "w");
File file = LittleFS.open(filename, "w");
if (!file) {
Serial.print("Fehler beim Öffnen der Datei zum Schreiben: ");
Serial.println(filename);
@ -19,7 +34,7 @@ bool saveJsonValue(const char* filename, const JsonDocument& doc) {
}
bool loadJsonValue(const char* filename, JsonDocument& doc) {
File file = SPIFFS.open(filename, "r");
File file = LittleFS.open(filename, "r");
if (!file) {
Serial.print("Fehler beim Öffnen der Datei zum Lesen: ");
Serial.println(filename);
@ -35,23 +50,12 @@ bool loadJsonValue(const char* filename, JsonDocument& doc) {
return true;
}
bool initializeSPIFFS() {
// Erster Versuch
if (SPIFFS.begin(true)) {
Serial.println("SPIFFS mounted successfully.");
return true;
void initializeFileSystem() {
if (!LittleFS.begin(true)) {
Serial.println("LittleFS Mount Failed");
return;
}
// Formatierung versuchen
Serial.println("Failed to mount SPIFFS. Formatting...");
SPIFFS.format();
// Zweiter Versuch nach Formatierung
if (SPIFFS.begin(true)) {
Serial.println("SPIFFS formatted and mounted successfully.");
return true;
}
Serial.println("SPIFFS initialization failed completely.");
return false;
Serial.printf("LittleFS Total: %u bytes\n", LittleFS.totalBytes());
Serial.printf("LittleFS Used: %u bytes\n", LittleFS.usedBytes());
Serial.printf("LittleFS Free: %u bytes\n", LittleFS.totalBytes() - LittleFS.usedBytes());
}

View File

@ -2,11 +2,12 @@
#define COMMONFS_H
#include <Arduino.h>
#include <SPIFFS.h>
#include <ArduinoJson.h>
#include <LittleFS.h>
bool removeJsonValue(const char* filename);
bool saveJsonValue(const char* filename, const JsonDocument& doc);
bool loadJsonValue(const char* filename, JsonDocument& doc);
bool initializeSPIFFS();
void initializeFileSystem();
#endif

View File

@ -19,6 +19,12 @@ const uint16_t SCALE_LEVEL_WEIGHT = 500;
uint16_t defaultScaleCalibrationValue = 430;
// ***** HX711
// ***** TTP223 (Touch Sensor)
// TTP223 circuit wiring
const uint8_t TTP223_PIN = 25;
// ***** TTP223
// ***** Display
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
// On an ESP32: 21(SDA), 22(SCL)
@ -40,6 +46,10 @@ const uint8_t webserverPort = 80;
const char* apiUrl = "/api/v1";
// ***** API
// ***** Bambu Auto Set Spool
uint8_t autoSetBambuAmsCounter = 60;
// ***** Bambu Auto Set Spool
// ***** Task Prios
uint8_t rfidTaskCore = 1;
uint8_t rfidTaskPrio = 1;

View File

@ -11,6 +11,8 @@ extern const uint8_t LOADCELL_SCK_PIN;
extern const uint8_t calVal_eepromAdress;
extern const uint16_t SCALE_LEVEL_WEIGHT;
extern const uint8_t TTP223_PIN;
extern const int8_t OLED_RESET;
extern const uint8_t SCREEN_ADDRESS;
extern const uint8_t SCREEN_WIDTH;
@ -23,6 +25,8 @@ extern const uint8_t OLED_DATA_END;
extern const char* apiUrl;
extern const uint8_t webserverPort;
extern uint8_t autoSetBambuAmsCounter;
extern const unsigned char wifi_on[];
extern const unsigned char wifi_off[];
extern const unsigned char cloud_on[];

View File

@ -20,9 +20,9 @@ void setupDisplay() {
// the library initializes this with an Adafruit splash screen.
display.setTextColor(WHITE);
display.display();
delay(1000); // Pause for 2 seconds
oledShowTopRow();
delay(2000);
oledShowMessage("FilaMan v" + String(VERSION));
vTaskDelay(2000 / portTICK_PERIOD_MS);
}
void oledclearline() {
@ -117,7 +117,6 @@ std::vector<String> splitTextIntoLines(String text, uint8_t textSize) {
lines.push_back(currentLine);
}
Serial.println(lines.size());
return lines;
}
@ -140,8 +139,9 @@ void oledShowMultilineMessage(String message, uint8_t size) {
int totalHeight = lines.size() * lineHeight;
int startY = OLED_DATA_START + ((OLED_DATA_END - OLED_DATA_START - totalHeight) / 2);
uint8_t lineDistance = (lines.size() == 2) ? 5 : 0;
for (size_t i = 0; i < lines.size(); i++) {
display.setCursor(oled_center_h(lines[i]), startY + (i * lineHeight));
display.setCursor(oled_center_h(lines[i]), startY + (i * lineHeight) + (i == 1 ? lineDistance : 0));
display.print(lines[i]);
}
@ -177,7 +177,7 @@ void oledShowTopRow() {
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);
} else {
display.drawBitmap(80, 0, bitmap_off , 16, 16, WHITE);

View File

@ -1,10 +1,8 @@
#include <Arduino.h>
#include <WiFi.h>
#include <DNSServer.h>
#include <WiFiManager.h>
#include <ESPmDNS.h>
#include <Wire.h>
#include <WiFi.h>
#include "wlan.h"
#include "config.h"
#include "website.h"
#include "api.h"
@ -15,18 +13,22 @@
#include "esp_task_wdt.h"
#include "commonFS.h"
// ***** WIFI initialisieren
WiFiManager wm;
bool wm_nonblocking = false;
void initWiFi();
// ################### Functions
bool mainTaskWasPaused = 0;
uint8_t scaleTareCounter = 0;
bool touchSensorConnected = false;
// ##### SETUP #####
void setup() {
Serial.begin(115200);
uint64_t chipid;
chipid = ESP.getEfuseMac(); //The chip ID is essentially its MAC address(length: 6 bytes).
Serial.printf("ESP32 Chip ID = %04X", (uint16_t)(chipid >> 32)); //print High 2 bytes
Serial.printf("%08X\n", (uint32_t)chipid); //print Low 4bytes.
// Initialize SPIFFS
initializeSPIFFS();
initializeFileSystem();
// Start Display
setupDisplay();
@ -35,89 +37,151 @@ void setup() {
initWiFi();
// Webserver
Serial.println("Starte Webserver");
setupWebserver(server);
// Spoolman API
// api.cpp
initSpoolman();
// Bambu MQTT
// bambu.cpp
setupMqtt();
// mDNS
Serial.println("Starte MDNS");
if (!MDNS.begin("filaman")) { // Set the hostname to "esp32.local"
Serial.println("Error setting up MDNS responder!");
while(1) {
delay(1000);
}
}
Serial.println("mDNS responder started");
// NFC Reader
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
bool panic = true; // Wenn true, löst ein WDT-Timeout einen System-Panik aus
esp_task_wdt_init(10, panic);
esp_task_wdt_init(10, panic);
// Aktuellen Task (loopTask) zum Watchdog hinzufügen
esp_task_wdt_add(NULL);
// Optional: Andere Tasks zum Watchdog hinzufügen, falls nötig
// esp_task_wdt_add(task_handle);
}
/**
* Safe interval check that handles millis() overflow
* @param currentTime Current millis() value
* @param lastTime Last recorded time
* @param interval Desired interval in milliseconds
* @return True if interval has elapsed
*/
bool intervalElapsed(unsigned long currentTime, unsigned long &lastTime, unsigned long interval) {
if (currentTime - lastTime >= interval || currentTime < lastTime) {
lastTime = currentTime;
return true;
}
return false;
}
unsigned long lastWeightReadTime = 0;
const unsigned long weightReadInterval = 1000; // 1 second
unsigned long lastAmsSendTime = 0;
const unsigned long amsSendInterval = 60000; // 1 minute
unsigned long lastAutoSetBambuAmsTime = 0;
const unsigned long autoSetBambuAmsInterval = 1000; // 1 second
uint8_t autoAmsCounter = 0;
uint8_t weightSend = 0;
int16_t lastWeight = 0;
uint8_t wifiErrorCounter = 0;
// WIFI check variables
unsigned long lastWifiCheckTime = 0;
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 #####
void loop() {
// Überprüfe den WLAN-Status
if (WiFi.status() != WL_CONNECTED) {
wifiErrorCounter++;
wifiOn = false;
} else {
wifiErrorCounter = 0;
wifiOn = true;
}
if (wifiErrorCounter > 20) ESP.restart();
unsigned long currentMillis = millis();
// Falls WifiManager im nicht blockenden Modus ist
//if(wm_nonblocking) wm.process();
// Send AMS Data min every Minute
if (currentMillis - lastAmsSendTime >= amsSendInterval) {
lastAmsSendTime = currentMillis;
sendAmsData(nullptr);
// Ü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
if (intervalElapsed(currentMillis, lastWifiCheckTime, wifiCheckInterval))
{
checkWiFiConnection();
}
// Wenn Bambu auto set Spool aktiv
if (autoSendToBambu && autoSetToBambuSpoolId > 0)
{
if (!bambuDisabled && !bambu_connected)
{
bambu_restart();
}
if (intervalElapsed(currentMillis, lastAutoSetBambuAmsTime, autoSetBambuAmsInterval))
{
if (nfcReaderState == NFC_IDLE)
{
lastAutoSetBambuAmsTime = currentMillis;
oledShowMessage("Auto Set " + String(autoSetBambuAmsCounter - autoAmsCounter) + "s");
autoAmsCounter++;
if (autoAmsCounter >= autoSetBambuAmsCounter)
{
autoSetToBambuSpoolId = 0;
autoAmsCounter = 0;
oledShowWeight(weight);
}
}
else
{
autoAmsCounter = 0;
}
}
}
// Wenn Waage nicht Kalibriert
if (scaleCalibrated == 3)
{
oledShowMessage("Scale not calibrated!");
vTaskDelay(5000 / portTICK_PERIOD_MS);
yield();
esp_task_wdt_reset();
return;
}
// Ausgabe der Waage auf Display
if (pauseMainTask == 0 && weight != lastWeight && hasReadRfidTag == 0)
if(pauseMainTask == 0)
{
(weight < 0) ? oledShowMessage("!! -1") : oledShowWeight(weight);
if (mainTaskWasPaused || (weight != lastWeight && nfcReaderState == NFC_IDLE && (!autoSendToBambu || autoSetToBambuSpoolId == 0)))
{
(weight < 2) ? ((weight < -2) ? oledShowMessage("!! -0") : oledShowWeight(0)) : oledShowWeight(weight);
}
mainTaskWasPaused = false;
}
else
{
mainTaskWasPaused = true;
}
// 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;
// Prüfen ob die Waage korrekt genullt ist
if ((weight > 0 && weight < 5) || weight < 0)
// Abweichung von 2g ignorieren
if (autoTare && (weight > 2 && weight < 7) || weight < -2)
{
scale_tare_counter++;
}
@ -127,7 +191,7 @@ void loop() {
}
// Prüfen ob das Gewicht gleich bleibt und dann senden
if (weight == lastWeight && weight > 5)
if (abs(weight - lastWeight) <= 2 && weight > 5)
{
weigthCouterToApi++;
}
@ -137,8 +201,10 @@ void loop() {
weightSend = 0;
}
}
// 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;
}
@ -146,13 +212,19 @@ void loop() {
lastWeight = weight;
// Wenn ein Tag mit SM id erkannte wurde und der Waage Counter anspricht an SM Senden
if (spoolId != "" && weigthCouterToApi > 5 && weightSend == 0 && hasReadRfidTag == 1) {
if (spoolId != "" && weigthCouterToApi > 3 && weightSend == 0 && nfcReaderState == NFC_READ_SUCCESS) {
oledShowIcon("loading");
if (updateSpoolWeight(spoolId, weight))
{
oledShowIcon("success");
vTaskDelay(2000 / portTICK_PERIOD_MS);
weightSend = 1;
autoSetToBambuSpoolId = spoolId.toInt();
if (octoEnabled)
{
updateSpoolOcto(autoSetToBambuSpoolId);
}
}
else
{
@ -160,42 +232,6 @@ void loop() {
vTaskDelay(2000 / portTICK_PERIOD_MS);
}
}
yield();
esp_task_wdt_reset();
}
// ##### Funktionen für Konfiguration #####
void initWiFi() {
WiFi.mode(WIFI_STA); // explicitly set mode, esp defaults to STA+AP
if(wm_nonblocking) wm.setConfigPortalBlocking(false);
wm.setConfigPortalTimeout(320); // Portal nach 5min schließen
oledShowTopRow();
oledShowMessage("WiFi Setup");
bool res;
// res = wm.autoConnect(); // auto generated AP name from chipid
res = wm.autoConnect("FilaMan"); // anonymous ap
// res = wm.autoConnect("spoolman","password"); // password protected ap
if(!res) {
Serial.println("Failed to connect or hit timeout");
// ESP.restart();
oledShowTopRow();
oledShowMessage("WiFi not connected Check Portal");
}
else {
wifiOn = true;
//if you get here you have connected to the WiFi
Serial.println("connected...yeey :)");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
oledShowTopRow();
display.display();
}
}
// ##### Funktionen für Konfiguration Ende #####

View File

@ -6,6 +6,7 @@
#include "website.h"
#include "api.h"
#include "esp_task_wdt.h"
#include "scale.h"
//Adafruit_PN532 nfc(PN532_SCK, PN532_MISO, PN532_MOSI, PN532_SS);
Adafruit_PN532 nfc(PN532_IRQ, PN532_RESET);
@ -17,7 +18,7 @@ String spoolId = "";
String nfcJsonData = "";
volatile bool pauseBambuMqttTask = false;
volatile uint8_t hasReadRfidTag = 0;
volatile nfcReaderStateType nfcReaderState = NFC_IDLE;
// 0 = nicht gelesen
// 1 = erfolgreich gelesen
// 2 = fehler beim Lesen
@ -43,8 +44,6 @@ void payloadToJson(uint8_t *data) {
DeserializationError error = deserializeJson(doc, jsonString);
if (!error) {
const char* version = doc["version"];
const char* protocol = doc["protocol"];
const char* color_hex = doc["color_hex"];
const char* type = doc["type"];
int min_temp = doc["min_temp"];
@ -54,8 +53,6 @@ void payloadToJson(uint8_t *data) {
Serial.println();
Serial.println("-----------------");
Serial.println("JSON-Parsed Data:");
Serial.println(version);
Serial.println(protocol);
Serial.println(color_hex);
Serial.println(type);
Serial.println(min_temp);
@ -92,16 +89,16 @@ bool formatNdefTag() {
return success;
}
uint8_t ntag2xx_WriteNDEF(const char *payload) {
/*
if (!formatNdefTag()) {
Serial.println("Fehler beim Formatieren des NDEF-Tags.");
hasReadRfidTag = 2;
return 0;
}
*/
uint16_t readTagSize()
{
uint8_t buffer[4];
memset(buffer, 0, 4);
nfc.ntag2xx_ReadPage(3, buffer);
return buffer[2]*8;
}
uint8_t tagSize = 240; // 144 bytes is maximum for NTAG213
uint8_t ntag2xx_WriteNDEF(const char *payload) {
uint16_t tagSize = readTagSize();
Serial.print("Tag Size: ");Serial.println(tagSize);
uint8_t pageBuffer[4] = {0, 0, 0, 0};
@ -137,49 +134,21 @@ uint8_t ntag2xx_WriteNDEF(const char *payload) {
return 0;
}
//Serial.println();
//Serial.print("Header Size: ");Serial.println(sizeof(pageHeader));
// Kombiniere Header und Payload
int totalSize = sizeof(pageHeader) + len;
uint8_t* combinedData = (uint8_t*) malloc(totalSize);
if (combinedData == NULL)
{
Serial.println("Fehler: Nicht genug Speicher vorhanden.");
oledShowMessage("Tag too small");
vTaskDelay(2000 / portTICK_PERIOD_MS);
return 0;
}
// Überprüfe die Kombination von Header und Payload
/*
Serial.print("Header: ");
for (int i = 0; i < sizeof(pageHeader); i++) {
Serial.print(pageHeader[i], HEX);
Serial.print(" ");
}
Serial.println();
Serial.print("Payload: ");
for (int i = 0; i < len; i++) {
Serial.print(payload[i], HEX);
Serial.print(" ");
}
Serial.println();
*/
// Kombiniere Header und Payload
memcpy(combinedData, pageHeader, sizeof(pageHeader));
memcpy(&combinedData[sizeof(pageHeader)], payload, len);
// Überprüfe die Kombination von Header und Payload
/*
Serial.print("Kombinierte Daten: ");
for (int i = 0; i < totalSize; i++) {
Serial.print(combinedData[i], HEX);
Serial.print(" ");
}
Serial.println();
*/
// Schreibe die Seiten
uint8_t a = 0;
uint8_t i = 0;
@ -188,21 +157,9 @@ uint8_t ntag2xx_WriteNDEF(const char *payload) {
int bytesToWrite = (totalSize < 4) ? totalSize : 4;
memcpy(pageBuffer, combinedData + a, bytesToWrite);
// Überprüfe die Schreibung der Seiten
/*
Serial.print("Seite ");
Serial.print(i);
Serial.print(": ");
for (int j = 0; j < bytesToWrite; j++) {
Serial.print(pageBuffer[j], HEX);
Serial.print(" ");
}
Serial.println();
*/
uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 }; // Buffer to store the returned UID
uint8_t uidLength;
nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength, 500);
//Serial.print("Schreibe Seite: ");Serial.println(i);
//uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 }; // Buffer to store the returned UID
//uint8_t uidLength;
//nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength, 100);
if (!(nfc.ntag2xx_WritePage(4+i, pageBuffer)))
{
@ -210,8 +167,6 @@ uint8_t ntag2xx_WriteNDEF(const char *payload) {
free(combinedData);
return 0;
}
//Serial.print("Seite geschrieben: ");Serial.println(i);
yield();
//esp_task_wdt_reset();
@ -285,12 +240,18 @@ void writeJsonToTag(void *parameter) {
// Gib die erstellte NDEF-Message aus
Serial.println("Erstelle NDEF-Message...");
hasReadRfidTag = 3;
Serial.println(payload);
nfcReaderState = NFC_WRITING;
vTaskSuspend(RfidReaderTask);
vTaskDelay(50 / portTICK_PERIOD_MS);
//pauseBambuMqttTask = true;
// aktualisieren der Website wenn sich der Status ändert
sendNfcData(nullptr);
vTaskDelay(100 / portTICK_PERIOD_MS);
oledShowMessage("Waiting for NFC-Tag");
// Wait 10sec for tag
uint8_t success = 0;
String uidString = "";
@ -326,20 +287,30 @@ void writeJsonToTag(void *parameter) {
Serial.println("NDEF-Message erfolgreich auf den Tag geschrieben");
//oledShowMessage("NFC-Tag written");
oledShowIcon("success");
vTaskDelay(2000 / portTICK_PERIOD_MS);
hasReadRfidTag = 5;
vTaskDelay(1000 / portTICK_PERIOD_MS);
nfcReaderState = NFC_WRITE_SUCCESS;
// aktualisieren der Website wenn sich der Status ändert
sendNfcData(nullptr);
vTaskResume(RfidReaderTask);
pauseBambuMqttTask = false;
updateSpoolTagId(uidString, payload);
if (updateSpoolTagId(uidString, payload)) {
uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 }; // Buffer to store the returned UID
uint8_t uidLength;
oledShowIcon("success");
while (nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength, 500)) {
yield();
}
}
vTaskResume(RfidReaderTask);
vTaskDelay(500 / portTICK_PERIOD_MS);
}
else
{
Serial.println("Fehler beim Schreiben der NDEF-Message auf den Tag");
oledShowIcon("failed");
vTaskDelay(2000 / portTICK_PERIOD_MS);
hasReadRfidTag = 4;
nfcReaderState = NFC_WRITE_ERROR;
}
}
else
@ -347,7 +318,7 @@ void writeJsonToTag(void *parameter) {
Serial.println("Fehler: Kein Tag zu schreiben gefunden.");
oledShowMessage("No NFC-Tag found");
vTaskDelay(2000 / portTICK_PERIOD_MS);
hasReadRfidTag = 0;
nfcReaderState = NFC_IDLE;
}
sendWriteResult(nullptr, success);
@ -361,23 +332,26 @@ void writeJsonToTag(void *parameter) {
void startWriteJsonToTag(const char* payload) {
char* payloadCopy = strdup(payload);
// Erstelle die Task
xTaskCreate(
writeJsonToTag, // Task-Funktion
"WriteJsonToTagTask", // Task-Name
4096, // Stackgröße in Bytes
(void*)payloadCopy, // Parameter
rfidWriteTaskPrio, // Priorität
NULL // Task-Handle (nicht benötigt)
);
// Task nicht mehrfach starten
if (nfcReaderState != NFC_WRITING) {
// Erstelle die Task
xTaskCreate(
writeJsonToTag, // Task-Funktion
"WriteJsonToTagTask", // Task-Name
5115, // Stackgröße in Bytes
(void*)payloadCopy, // Parameter
rfidWriteTaskPrio, // Priorität
NULL // Task-Handle (nicht benötigt)
);
}
}
void scanRfidTask(void * parameter) {
Serial.println("RFID Task gestartet");
for(;;) {
// Wenn geschrieben wird Schleife aussetzen
if (hasReadRfidTag != 3)
if (nfcReaderState != NFC_WRITING)
{
yield();
@ -389,58 +363,63 @@ void scanRfidTask(void * parameter) {
foundNfcTag(nullptr, success);
if (success && hasReadRfidTag != 1)
if (success && nfcReaderState != NFC_READ_SUCCESS)
{
// Display some basic information about the card
Serial.println("Found an ISO14443A card");
hasReadRfidTag = 6;
nfcReaderState = NFC_READING;
oledShowIcon("transfer");
vTaskDelay(1000 / portTICK_PERIOD_MS);
vTaskDelay(500 / portTICK_PERIOD_MS);
if (uidLength == 7)
{
uint8_t data[256];
uint16_t tagSize = readTagSize();
if(tagSize > 0)
{
// Create a buffer depending on the size of the tag
uint8_t* data = (uint8_t*)malloc(tagSize);
memset(data, 0, tagSize);
// We probably have an NTAG2xx card (though it could be Ultralight as well)
Serial.println("Seems to be an NTAG2xx tag (7 byte UID)");
for (uint8_t i = 0; i < 45; i++) {
/*
if (i < uidLength) {
uidString += String(uid[i], HEX);
if (i < uidLength - 1) {
uidString += ":"; // Optional: Trennzeichen hinzufügen
// We probably have an NTAG2xx card (though it could be Ultralight as well)
Serial.println("Seems to be an NTAG2xx tag (7 byte UID)");
uint8_t numPages = readTagSize()/4;
for (uint8_t i = 4; i < 4+numPages; i++) {
if (!nfc.ntag2xx_ReadPage(i, data+(i-4) * 4))
{
break; // Stop if reading fails
}
}
*/
if (!nfc.mifareclassic_ReadDataBlock(i, data + (i - 4) * 4))
{
break; // Stop if reading fails
}
// Check for NDEF message end
if (data[(i - 4) * 4] == 0xFE)
{
break; // End of NDEF message
// Check for NDEF message end
if (data[(i - 4) * 4] == 0xFE)
{
break; // End of NDEF message
}
yield();
esp_task_wdt_reset();
vTaskDelay(pdMS_TO_TICKS(1));
}
yield();
esp_task_wdt_reset();
vTaskDelay(pdMS_TO_TICKS(1));
}
if (!decodeNdefAndReturnJson(data))
{
oledShowMessage("NFC-Tag unknown");
vTaskDelay(2000 / portTICK_PERIOD_MS);
nfcReaderState = NFC_READ_ERROR;
}
else
{
nfcReaderState = NFC_READ_SUCCESS;
}
if (!decodeNdefAndReturnJson(data))
{
oledShowMessage("NFC-Tag unknown");
vTaskDelay(2000 / portTICK_PERIOD_MS);
hasReadRfidTag = 2;
free(data);
}
else
else
{
hasReadRfidTag = 1;
oledShowMessage("NFC-Tag read error");
nfcReaderState = NFC_READ_ERROR;
}
}
else
{
@ -448,13 +427,13 @@ void scanRfidTask(void * parameter) {
}
}
if (!success && hasReadRfidTag > 0)
if (!success && nfcReaderState != NFC_IDLE)
{
hasReadRfidTag = 0;
nfcReaderState = NFC_IDLE;
//uidString = "";
nfcJsonData = "";
Serial.println("Tag entfernt");
oledShowWeight(0);
if (!autoSendToBambu) oledShowWeight(weight);
}
// aktualisieren der Website wenn sich der Status ändert
@ -490,7 +469,7 @@ void startNfc() {
BaseType_t result = xTaskCreatePinnedToCore(
scanRfidTask, /* Function to implement the task */
"RfidReader", /* Name of the task */
10000, /* Stack size in words */
5115, /* Stack size in words */
NULL, /* Task input parameter */
rfidTaskPrio, /* Priority of the task */
&RfidReaderTask, /* Task handle. */

View File

@ -3,6 +3,16 @@
#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 scanRfidTask(void * parameter);
void startWriteJsonToTag(const char* payload);
@ -10,7 +20,9 @@ void startWriteJsonToTag(const char* payload);
extern TaskHandle_t RfidReaderTask;
extern String nfcJsonData;
extern String spoolId;
extern volatile uint8_t hasReadRfidTag;
extern volatile nfcReaderStateType nfcReaderState;
extern volatile bool pauseBambuMqttTask;
#endif

266
src/ota.cpp Normal file
View File

@ -0,0 +1,266 @@
#include <Arduino.h>
#include <website.h>
#include <commonFS.h>
#include "scale.h"
#include "bambu.h"
#include "nfc.h"
// Globale Variablen für Config Backups hinzufügen
String bambuCredentialsBackup;
String spoolmanUrlBackup;
// Globale Variable für den Update-Typ
static int currentUpdateCommand = 0;
// Globale Update-Variablen
static size_t updateTotalSize = 0;
static size_t updateWritten = 0;
static bool isSpiffsUpdate = false;
/**
* Compares two version strings and determines if version1 is less than version2
*
* @param version1 First version string (format: x.y.z)
* @param version2 Second version string (format: x.y.z)
* @return true if version1 is less than version2
*/
bool isVersionLessThan(const String& version1, const String& version2) {
int major1 = 0, minor1 = 0, patch1 = 0;
int major2 = 0, minor2 = 0, patch2 = 0;
// Parse version1
sscanf(version1.c_str(), "%d.%d.%d", &major1, &minor1, &patch1);
// Parse version2
sscanf(version2.c_str(), "%d.%d.%d", &major2, &minor2, &patch2);
// Compare major version
if (major1 < major2) return true;
if (major1 > major2) return false;
// Major versions equal, compare minor
if (minor1 < minor2) return true;
if (minor1 > minor2) return false;
// Minor versions equal, compare patch
return patch1 < patch2;
}
void backupJsonConfigs() {
// Bambu Credentials backup
if (LittleFS.exists("/bambu_credentials.json")) {
File file = LittleFS.open("/bambu_credentials.json", "r");
if (file) {
bambuCredentialsBackup = file.readString();
file.close();
Serial.println("Bambu credentials backed up");
}
}
// Spoolman URL backup
if (LittleFS.exists("/spoolman_url.json")) {
File file = LittleFS.open("/spoolman_url.json", "r");
if (file) {
spoolmanUrlBackup = file.readString();
file.close();
Serial.println("Spoolman URL backed up");
}
}
}
void restoreJsonConfigs() {
// Restore Bambu credentials
if (bambuCredentialsBackup.length() > 0) {
File file = LittleFS.open("/bambu_credentials.json", "w");
if (file) {
file.print(bambuCredentialsBackup);
file.close();
Serial.println("Bambu credentials restored");
}
bambuCredentialsBackup = ""; // Clear backup
}
// Restore Spoolman URL
if (spoolmanUrlBackup.length() > 0) {
File file = LittleFS.open("/spoolman_url.json", "w");
if (file) {
file.print(spoolmanUrlBackup);
file.close();
Serial.println("Spoolman URL restored");
}
spoolmanUrlBackup = ""; // Clear backup
}
}
void espRestart() {
yield();
vTaskDelay(5000 / portTICK_PERIOD_MS);
ESP.restart();
}
void sendUpdateProgress(int progress, const char* status = nullptr, const char* message = nullptr) {
static int lastSentProgress = -1;
// Verhindere zu häufige Updates
if (progress == lastSentProgress && !status && !message) {
return;
}
String progressMsg = "{\"type\":\"updateProgress\",\"progress\":" + String(progress);
if (status) {
progressMsg += ",\"status\":\"" + String(status) + "\"";
}
if (message) {
progressMsg += ",\"message\":\"" + String(message) + "\"";
}
progressMsg += "}";
if (progress >= 100) {
// Sende die Nachricht nur einmal für den Abschluss
ws.textAll("{\"type\":\"updateProgress\",\"progress\":100,\"status\":\"success\",\"message\":\"Update successful! Restarting device...\"}");
delay(50);
}
// Sende die Nachricht mehrmals mit Verzögerung für wichtige Updates
if (status || abs(progress - lastSentProgress) >= 10 || progress == 100) {
for (int i = 0; i < 2; i++) {
ws.textAll(progressMsg);
delay(100); // Längerer Delay zwischen Nachrichten
}
} else {
ws.textAll(progressMsg);
delay(50);
}
lastSentProgress = progress;
}
void handleUpdate(AsyncWebServer &server) {
AsyncCallbackWebHandler* updateHandler = new AsyncCallbackWebHandler();
updateHandler->setUri("/update");
updateHandler->setMethod(HTTP_POST);
// Check if current version is less than defined TOOLVERSION before proceeding with update
if (isVersionLessThan(VERSION, TOOLDVERSION)) {
updateHandler->onRequest([](AsyncWebServerRequest *request) {
request->send(400, "application/json",
"{\"success\":false,\"message\":\"Your current version is too old. Please perform a full upgrade.\"}");
});
server.addHandler(updateHandler);
return;
}
updateHandler->onUpload([](AsyncWebServerRequest *request, String filename,
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) {
updateTotalSize = request->contentLength();
updateWritten = 0;
isSpiffsUpdate = (filename.indexOf("website") > -1);
if (isSpiffsUpdate) {
// Backup vor dem Update
sendUpdateProgress(0, "backup", "Backing up configurations...");
vTaskDelay(200 / portTICK_PERIOD_MS);
backupJsonConfigs();
vTaskDelay(200 / portTICK_PERIOD_MS);
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)) {
request->send(400, "application/json", "{\"success\":false,\"message\":\"Update initialization failed\"}");
return;
}
sendUpdateProgress(5, "starting", "Starting SPIFFS update...");
vTaskDelay(200 / portTICK_PERIOD_MS);
} else {
if (!Update.begin(updateTotalSize)) {
request->send(400, "application/json", "{\"success\":false,\"message\":\"Update initialization failed\"}");
return;
}
sendUpdateProgress(0, "starting", "Starting firmware update...");
vTaskDelay(200 / portTICK_PERIOD_MS);
}
}
if (len) {
if (Update.write(data, len) != len) {
request->send(400, "application/json", "{\"success\":false,\"message\":\"Write failed\"}");
return;
}
updateWritten += len;
int currentProgress;
// Berechne den Fortschritt basierend auf dem Update-Typ
if (isSpiffsUpdate) {
// SPIFFS: 5-75% für Upload
currentProgress = 6 + (updateWritten * 100) / updateTotalSize;
} else {
// Firmware: 0-100% für Upload
currentProgress = 1 + (updateWritten * 100) / updateTotalSize;
}
static int lastProgress = -1;
if (currentProgress != lastProgress && (currentProgress % 10 == 0 || final)) {
sendUpdateProgress(currentProgress, "uploading");
oledShowMessage("Update: " + String(currentProgress) + "%");
vTaskDelay(50 / portTICK_PERIOD_MS);
lastProgress = currentProgress;
}
}
if (final) {
if (Update.end(true)) {
if (isSpiffsUpdate) {
restoreJsonConfigs();
}
} else {
request->send(400, "application/json", "{\"success\":false,\"message\":\"Update finalization failed\"}");
}
}
});
updateHandler->onRequest([](AsyncWebServerRequest *request) {
if (Update.hasError()) {
request->send(400, "application/json", "{\"success\":false,\"message\":\"Update failed\"}");
return;
}
// Erste 100% Nachricht
ws.textAll("{\"type\":\"updateProgress\",\"progress\":100,\"status\":\"success\",\"message\":\"Update successful! Restarting device...\"}");
vTaskDelay(2000 / portTICK_PERIOD_MS);
AsyncWebServerResponse *response = request->beginResponse(200, "application/json",
"{\"success\":true,\"message\":\"Update successful! Restarting device...\"}");
response->addHeader("Connection", "close");
request->send(response);
// Zweite 100% Nachricht zur Sicherheit
ws.textAll("{\"type\":\"updateProgress\",\"progress\":100,\"status\":\"success\",\"message\":\"Update successful! Restarting device...\"}");
espRestart();
});
server.addHandler(updateHandler);
}

9
src/ota.h Normal file
View File

@ -0,0 +1,9 @@
#ifndef OTA_H
#define OTA_H
#include <ArduinoOTA.h>
#include <ESPAsyncWebServer.h>
void handleUpdate(AsyncWebServer &server);
#endif

View File

@ -3,10 +3,9 @@
#include <ArduinoJson.h>
#include "config.h"
#include "HX711.h"
#include <EEPROM.h>
#include "display.h"
#include "nfc.h"
#include "esp_task_wdt.h"
#include <Preferences.h>
HX711 scale;
@ -16,9 +15,30 @@ int16_t weight = 0;
uint8_t weigthCouterToApi = 0;
uint8_t scale_tare_counter = 0;
bool scaleTareRequest = false;
uint8_t pauseMainTask = 0;
uint8_t scaleCalibrated = 1;
Preferences preferences;
const char* NVS_NAMESPACE = "scale";
const char* NVS_KEY_CALIBRATION = "cal_value";
const char* NVS_KEY_AUTOTARE = "auto_tare";
bool autoTare = true;
// ##### 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() {
Serial.println("Tare scale");
scale.tare();
@ -30,39 +50,69 @@ void scale_loop(void * parameter) {
Serial.println("++++++++++++++++++++++++++++++");
Serial.println("Scale Loop started");
Serial.println("++++++++++++++++++++++++++++++");
for(;;) {
if (scale.is_ready())
{
// Waage nochmal Taren, wenn zu lange Abweichung
if (scale_tare_counter >= 5)
// 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)
{
Serial.println("Re-Tare scale");
oledShowMessage("TARE Scale");
vTaskDelay(pdMS_TO_TICKS(1000));
scale.tare();
vTaskDelay(pdMS_TO_TICKS(1000));
oledShowWeight(0);
scaleTareRequest = false;
}
weight = round(scale.get_units());
}
vTaskDelay(pdMS_TO_TICKS(100)); // Verzögerung, um die CPU nicht zu überlasten
vTaskDelay(pdMS_TO_TICKS(100));
}
}
void start_scale() {
void start_scale(bool touchSensorConnected) {
Serial.println("Prüfe Calibration Value");
long calibrationValue; // calibration value (see example file "Calibration.ino")
//calibrationValue = 696.0; // uncomment this if you want to set the calibration value in the sketch
float calibrationValue;
EEPROM.begin(512);
EEPROM.get(calVal_eepromAdress, calibrationValue); // uncomment this if you want to fetch the calibration value from eeprom
// NVS lesen
preferences.begin(NVS_NAMESPACE, true); // true = readonly
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);
//calibrationValue = EEPROM.read(calVal_eepromAdress);
preferences.end();
Serial.print("Read Scale Calibration Value ");
Serial.println(calibrationValue);
scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
if (isnan(calibrationValue) || calibrationValue < 1) calibrationValue = defaultScaleCalibrationValue;
if (isnan(calibrationValue) || calibrationValue < 1) {
calibrationValue = defaultScaleCalibrationValue;
scaleCalibrated = 0;
oledShowMessage("Scale not calibrated!");
for (uint16_t i = 0; i < 50000; i++) {
yield();
vTaskDelay(pdMS_TO_TICKS(1));
esp_task_wdt_reset();
}
}
oledShowMessage("Scale Tare Please remove all");
for (uint16_t i = 0; i < 2000; i++) {
@ -84,7 +134,7 @@ void start_scale() {
BaseType_t result = xTaskCreatePinnedToCore(
scale_loop, /* Function to implement the task */
"ScaleLoop", /* Name of the task */
10000, /* Stack size in words */
2048, /* Stack size in words */
NULL, /* Task input parameter */
scaleTaskPrio, /* Priority of the task */
&ScaleTask, /* Task handle. */
@ -98,15 +148,18 @@ void start_scale() {
}
uint8_t calibrate_scale() {
long newCalibrationValue;
uint8_t returnState = 0;
float newCalibrationValue;
vTaskSuspend(RfidReaderTask);
vTaskSuspend(ScaleTask);
//vTaskSuspend(RfidReaderTask);
vTaskDelete(RfidReaderTask);
pauseBambuMqttTask = true;
pauseMainTask = 1;
if (scale.wait_ready_timeout(1000))
{
scale.set_scale();
oledShowMessage("Step 1 empty Scale");
@ -128,7 +181,7 @@ uint8_t calibrate_scale() {
esp_task_wdt_reset();
}
long newCalibrationValue = scale.get_units(10);
float newCalibrationValue = scale.get_units(10);
Serial.print("Result: ");
Serial.println(newCalibrationValue);
@ -138,30 +191,36 @@ uint8_t calibrate_scale() {
{
Serial.print("New calibration value has been set to: ");
Serial.println(newCalibrationValue);
Serial.print("Save this value to EEPROM adress ");
Serial.println(calVal_eepromAdress);
//EEPROM.put(calVal_eepromAdress, newCalibrationValue);
EEPROM.put(calVal_eepromAdress, newCalibrationValue);
EEPROM.commit();
// Speichern mit NVS
preferences.begin(NVS_NAMESPACE, false); // false = readwrite
preferences.putFloat(NVS_KEY_CALIBRATION, newCalibrationValue);
preferences.end();
EEPROM.get(calVal_eepromAdress, newCalibrationValue);
//newCalibrationValue = EEPROM.read(calVal_eepromAdress);
// Verifizieren
preferences.begin(NVS_NAMESPACE, true);
float verifyValue = preferences.getFloat(NVS_KEY_CALIBRATION, 0);
preferences.end();
Serial.print("Read Value ");
Serial.println(newCalibrationValue);
Serial.print("Verified stored value: ");
Serial.println(verifyValue);
Serial.println("End calibration, revome weight");
Serial.println("End calibration, remove weight");
oledShowMessage("Remove weight");
scale.set_scale(newCalibrationValue);
for (uint16_t i = 0; i < 2000; i++) {
yield();
vTaskDelay(pdMS_TO_TICKS(1));
esp_task_wdt_reset();
}
oledShowMessage("Scale calibrated");
oledShowMessage("Calibration done");
// For some reason it is not possible to re-tare the scale here, it will result in a wdt timeout. Instead let the scale loop do the taring
//scale.tare();
scaleTareRequest = true;
for (uint16_t i = 0; i < 2000; i++) {
yield();
@ -169,8 +228,9 @@ uint8_t calibrate_scale() {
esp_task_wdt_reset();
}
//ESP.restart();
returnState = 1;
}
else
{
{
@ -183,10 +243,10 @@ uint8_t calibrate_scale() {
vTaskDelay(pdMS_TO_TICKS(1));
esp_task_wdt_reset();
}
return 0;
returnState = 0;
}
}
}
}
}
else
{
Serial.println("HX711 not found.");
@ -198,17 +258,13 @@ uint8_t calibrate_scale() {
vTaskDelay(pdMS_TO_TICKS(1));
esp_task_wdt_reset();
}
return 0;
returnState = 0;
}
oledShowMessage("Scale Ready");
Serial.println("starte Scale Task");
start_scale();
vTaskResume(RfidReaderTask);
vTaskResume(ScaleTask);
pauseBambuMqttTask = false;
pauseMainTask = 0;
return 1;
return returnState;
}

View File

@ -4,8 +4,8 @@
#include <Arduino.h>
#include "HX711.h"
void start_scale();
uint8_t setAutoTare(bool autoTareValue);
uint8_t start_scale(bool touchSensorConnected);
uint8_t calibrate_scale();
uint8_t tareScale();
@ -13,6 +13,11 @@ extern HX711 scale;
extern int16_t weight;
extern uint8_t weigthCouterToApi;
extern uint8_t scale_tare_counter;
extern uint8_t scaleTareRequest;
extern uint8_t pauseMainTask;
extern uint8_t scaleCalibrated;
extern bool autoTare;
extern TaskHandle_t ScaleTask;
#endif

View File

@ -3,48 +3,61 @@
#include "api.h"
#include <ArduinoJson.h>
#include <ESPAsyncWebServer.h>
//#include <AsyncWebSocket.h>
#include "bambu.h"
#include "nfc.h"
#include "scale.h"
#include "esp_task_wdt.h"
#include <Update.h>
#include "display.h"
#include "ota.h"
#ifndef VERSION
#define VERSION "1.1.0"
#endif
// Cache-Control Header definieren
#define CACHE_CONTROL "max-age=31536000" // Cache für 1 Jahr
#define CACHE_CONTROL "max-age=604800" // Cache für 1 Woche
AsyncWebServer server(webserverPort);
AsyncWebSocket ws("/ws");
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) {
if (type == WS_EVT_CONNECT) {
Serial.println("Neuer Client verbunden!");
// Sende die AMS-Daten an den neuen Client
sendAmsData(client);
if (!bambuDisabled) sendAmsData(client);
sendNfcData(client);
foundNfcTag(client, 0);
sendWriteResult(client, 3);
} else if (type == WS_EVT_DISCONNECT) {
Serial.println("Client getrennt.");
} else if (type == WS_EVT_ERROR) {
Serial.printf("WebSocket Client #%u error(%u): %s\n", client->id(), *((uint16_t*)arg), (char*)data);
} else if (type == WS_EVT_PONG) {
Serial.printf("WebSocket Client #%u pong\n", client->id());
} else if (type == WS_EVT_DATA) {
String message = String((char*)data);
JsonDocument doc;
deserializeJson(doc, message);
bool spoolmanConnected = (spoolmanApiState != API_INIT);
if (doc["type"] == "heartbeat") {
// Sende Heartbeat-Antwort
ws.text(client->id(), "{"
"\"type\":\"heartbeat\","
"\"freeHeap\":" + String(ESP.getFreeHeap()/1024) + ","
"\"bambu_connected\":" + String(bambu_connected) + ","
"\"spoolman_connected\":" + String(spoolman_connected) + ""
"\"spoolman_connected\":" + String(spoolmanConnected) + ""
"}");
}
else if (doc["type"] == "writeNfcTag") {
if (doc.containsKey("payload")) {
if (doc["payload"].is<JsonObject>()) {
// Versuche NFC-Daten zu schreiben
String payloadString;
serializeJson(doc["payload"], payloadString);
@ -62,6 +75,10 @@ void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventTyp
success = calibrate_scale();
}
if (doc["payload"] == "setAutoTare") {
success = setAutoTare(doc["enabled"].as<bool>());
}
if (success) {
ws.textAll("{\"type\":\"scale\",\"payload\":\"success\"}");
} else {
@ -84,6 +101,15 @@ void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventTyp
setBambuSpool(doc["payload"]);
}
else if (doc["type"] == "setSpoolmanSettings") {
Serial.println(doc["payload"].as<String>());
if (updateSpoolBambuData(doc["payload"].as<String>())) {
ws.textAll("{\"type\":\"setSpoolmanSettings\",\"payload\":\"success\"}");
} else {
ws.textAll("{\"type\":\"setSpoolmanSettings\",\"payload\":\"error\"}");
}
}
else {
Serial.println("Unbekannter WebSocket-Typ: " + doc["type"].as<String>());
}
@ -93,12 +119,12 @@ void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventTyp
// Funktion zum Laden und Ersetzen des Headers in einer HTML-Datei
String loadHtmlWithHeader(const char* filename) {
Serial.println("Lade HTML-Datei: " + String(filename));
if (!SPIFFS.exists(filename)) {
if (!LittleFS.exists(filename)) {
Serial.println("Fehler: Datei nicht gefunden!");
return "Fehler: Datei nicht gefunden!";
}
File file = SPIFFS.open(filename, "r");
File file = LittleFS.open(filename, "r");
String html = file.readString();
file.close();
@ -119,43 +145,51 @@ void foundNfcTag(AsyncWebSocketClient *client, uint8_t success) {
}
void sendNfcData(AsyncWebSocketClient *client) {
if (lastHasReadRfidTag == hasReadRfidTag) return;
if (hasReadRfidTag == 0) {
ws.textAll("{\"type\":\"nfcData\", \"payload\":{}}");
if (lastnfcReaderState == nfcReaderState) return;
// TBD: Why is there no status for reading the tag?
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) {
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;
lastnfcReaderState = nfcReaderState;
}
void sendAmsData(AsyncWebSocketClient *client) {
if (ams_count > 0) {
ws.textAll("{\"type\":\"amsData\", \"payload\":" + amsJsonData + "}");
ws.textAll("{\"type\":\"amsData\",\"payload\":" + amsJsonData + "}");
}
}
void setupWebserver(AsyncWebServer &server) {
// Deaktiviere alle Debug-Ausgaben
Serial.setDebugOutput(false);
// WebSocket-Optimierungen
ws.onEvent(onWsEvent);
ws.enable(true);
// Konfiguriere Server für große Uploads
server.onRequestBody([](AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total){});
server.onFileUpload([](AsyncWebServerRequest *request, const String& filename, size_t index, uint8_t *data, size_t len, bool final){});
// Lade die Spoolman-URL beim Booten
spoolmanUrl = loadSpoolmanUrl();
Serial.print("Geladene Spoolman-URL: ");
@ -164,7 +198,7 @@ void setupWebserver(AsyncWebServer &server) {
// Route für about
server.on("/about", HTTP_GET, [](AsyncWebServerRequest *request){
Serial.println("Anfrage für /about erhalten");
AsyncWebServerResponse *response = request->beginResponse(SPIFFS, "/about.html.gz", "text/html");
AsyncWebServerResponse *response = request->beginResponse(LittleFS, "/index.html.gz", "text/html");
response->addHeader("Content-Encoding", "gzip");
response->addHeader("Cache-Control", CACHE_CONTROL);
request->send(response);
@ -173,33 +207,29 @@ void setupWebserver(AsyncWebServer &server) {
// Route für Waage
server.on("/waage", HTTP_GET, [](AsyncWebServerRequest *request){
Serial.println("Anfrage für /waage erhalten");
AsyncWebServerResponse *response = request->beginResponse(SPIFFS, "/waage.html.gz", "text/html");
response->addHeader("Content-Encoding", "gzip");
response->addHeader("Cache-Control", CACHE_CONTROL);
request->send(response);
//AsyncWebServerResponse *response = request->beginResponse(LittleFS, "/waage.html.gz", "text/html");
//response->addHeader("Content-Encoding", "gzip");
//response->addHeader("Cache-Control", CACHE_CONTROL);
String html = loadHtmlWithHeader("/waage.html");
html.replace("{{autoTare}}", (autoTare) ? "checked" : "");
request->send(200, "text/html", html);
});
// Route für RFID
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
Serial.println("Anfrage für /rfid erhalten");
AsyncWebServerResponse *response = request->beginResponse(SPIFFS, "/rfid.html.gz", "text/html");
String page = (bambuDisabled) ? "/rfid.html.gz" : "/rfid_bambu.html.gz";
AsyncWebServerResponse *response = request->beginResponse(LittleFS, page, "text/html");
response->addHeader("Content-Encoding", "gzip");
response->addHeader("Cache-Control", CACHE_CONTROL);
request->send(response);
Serial.println("RFID-Seite gesendet");
});
/*
// Neue API-Route für das Abrufen der Spool-Daten
server.on("/api/spools", HTTP_GET, [](AsyncWebServerRequest *request){
Serial.println("API-Aufruf: /api/spools");
JsonDocument spoolsData = fetchSpoolsForWebsite();
String response;
serializeJson(spoolsData, response);
request->send(200, "application/json", response);
});
*/
server.on("/api/url", HTTP_GET, [](AsyncWebServerRequest *request){
Serial.println("API-Aufruf: /api/url");
String jsonResponse = "{\"spoolman_url\": \"" + String(spoolmanUrl) + "\"}";
@ -209,7 +239,7 @@ void setupWebserver(AsyncWebServer &server) {
// Route für WiFi
server.on("/wifi", HTTP_GET, [](AsyncWebServerRequest *request){
Serial.println("Anfrage für /wifi erhalten");
AsyncWebServerResponse *response = request->beginResponse(SPIFFS, "/wifi.html.gz", "text/html");
AsyncWebServerResponse *response = request->beginResponse(LittleFS, "/wifi.html.gz", "text/html");
response->addHeader("Content-Encoding", "gzip");
response->addHeader("Cache-Control", CACHE_CONTROL);
request->send(response);
@ -219,13 +249,18 @@ void setupWebserver(AsyncWebServer &server) {
server.on("/spoolman", HTTP_GET, [](AsyncWebServerRequest *request){
Serial.println("Anfrage für /spoolman erhalten");
String html = loadHtmlWithHeader("/spoolman.html");
html.replace("{{spoolmanUrl}}", spoolmanUrl);
html.replace("{{spoolmanUrl}}", (spoolmanUrl != "") ? spoolmanUrl : "");
html.replace("{{spoolmanOctoEnabled}}", octoEnabled ? "checked" : "");
html.replace("{{spoolmanOctoUrl}}", (octoUrl != "") ? octoUrl : "");
html.replace("{{spoolmanOctoToken}}", (octoToken != "") ? octoToken : "");
JsonDocument doc;
if (loadJsonValue("/bambu_credentials.json", doc) && doc.containsKey("bambu_ip")) {
if (loadJsonValue("/bambu_credentials.json", doc) && doc["bambu_ip"].is<String>())
{
String bambuIp = doc["bambu_ip"].as<String>();
String bambuSerial = doc["bambu_serialnr"].as<String>();
String bambuCode = doc["bambu_accesscode"].as<String>();
autoSendToBambu = doc["autoSendToBambu"].as<bool>();
bambuIp.trim();
bambuSerial.trim();
bambuCode.trim();
@ -233,7 +268,17 @@ void setupWebserver(AsyncWebServer &server) {
html.replace("{{bambuIp}}", bambuIp ? bambuIp : "");
html.replace("{{bambuSerial}}", bambuSerial ? bambuSerial : "");
html.replace("{{bambuCode}}", bambuCode ? bambuCode : "");
}
html.replace("{{autoSendToBambu}}", autoSendToBambu ? "checked" : "");
html.replace("{{autoSendTime}}", String(autoSetBambuAmsCounter));
}
else
{
html.replace("{{bambuIp}}", "");
html.replace("{{bambuSerial}}", "");
html.replace("{{bambuCode}}", "");
html.replace("{{autoSendToBambu}}", "");
html.replace("{{autoSendTime}}", String(autoSetBambuAmsCounter));
}
request->send(200, "text/html", html);
});
@ -245,17 +290,45 @@ void setupWebserver(AsyncWebServer &server) {
return;
}
if (request->getParam("octoEnabled")->value() == "true" && (!request->hasParam("octoUrl") || !request->hasParam("octoToken"))) {
request->send(400, "application/json", "{\"success\": false, \"error\": \"Missing OctoPrint URL or Token parameter\"}");
return;
}
String url = request->getParam("url")->value();
url.trim();
if (url.indexOf("http://") == -1 && url.indexOf("https://") == -1) {
url = "http://" + url;
}
// Remove trailing slash if exists
if (url.length() > 0 && url.charAt(url.length()-1) == '/') {
url = url.substring(0, url.length()-1);
}
bool healthy = saveSpoolmanUrl(url);
bool octoEnabled = (request->getParam("octoEnabled")->value() == "true") ? true : false;
String octoUrl = request->getParam("octoUrl")->value();
String octoToken = (request->getParam("octoToken")->value() != "") ? request->getParam("octoToken")->value() : "";
url.trim();
octoUrl.trim();
octoToken.trim();
bool healthy = saveSpoolmanUrl(url, octoEnabled, octoUrl, octoToken);
String jsonResponse = "{\"healthy\": " + String(healthy ? "true" : "false") + "}";
request->send(200, "application/json", jsonResponse);
});
// Route für das Überprüfen der Spoolman-Instanz
// Route für das Überprüfen der Bambu-Instanz
server.on("/api/bambu", HTTP_GET, [](AsyncWebServerRequest *request){
if (request->hasParam("remove")) {
if (removeBambuCredentials()) {
request->send(200, "application/json", "{\"success\": true}");
} else {
request->send(500, "application/json", "{\"success\": false, \"error\": \"Fehler beim Löschen der Bambu-Credentials\"}");
}
return;
}
if (!request->hasParam("bambu_ip") || !request->hasParam("bambu_serialnr") || !request->hasParam("bambu_accesscode")) {
request->send(400, "application/json", "{\"success\": false, \"error\": \"Missing parameter\"}");
return;
@ -264,16 +337,20 @@ void setupWebserver(AsyncWebServer &server) {
String bambu_ip = request->getParam("bambu_ip")->value();
String bambu_serialnr = request->getParam("bambu_serialnr")->value();
String bambu_accesscode = request->getParam("bambu_accesscode")->value();
bool autoSend = (request->getParam("autoSend")->value() == "true") ? true : false;
String autoSendTime = request->getParam("autoSendTime")->value();
bambu_ip.trim();
bambu_serialnr.trim();
bambu_accesscode.trim();
autoSendTime.trim();
if (bambu_ip.length() == 0 || bambu_serialnr.length() == 0 || bambu_accesscode.length() == 0) {
request->send(400, "application/json", "{\"success\": false, \"error\": \"Empty parameter\"}");
return;
}
bool success = saveBambuCredentials(bambu_ip, bambu_serialnr, bambu_accesscode);
bool success = saveBambuCredentials(bambu_ip, bambu_serialnr, bambu_accesscode, autoSend, autoSendTime);
request->send(200, "application/json", "{\"healthy\": " + String(success ? "true" : "false") + "}");
});
@ -286,7 +363,7 @@ void setupWebserver(AsyncWebServer &server) {
// Route für das Laden der CSS-Datei
server.on("/style.css", HTTP_GET, [](AsyncWebServerRequest *request){
Serial.println("Lade style.css");
AsyncWebServerResponse *response = request->beginResponse(SPIFFS, "/style.css.gz", "text/css");
AsyncWebServerResponse *response = request->beginResponse(LittleFS, "/style.css.gz", "text/css");
response->addHeader("Content-Encoding", "gzip");
response->addHeader("Cache-Control", CACHE_CONTROL);
request->send(response);
@ -295,7 +372,7 @@ void setupWebserver(AsyncWebServer &server) {
// Route für das Logo
server.on("/logo.png", HTTP_GET, [](AsyncWebServerRequest *request){
AsyncWebServerResponse *response = request->beginResponse(SPIFFS, "/logo.png.gz", "image/png");
AsyncWebServerResponse *response = request->beginResponse(LittleFS, "/logo.png.gz", "image/png");
response->addHeader("Content-Encoding", "gzip");
response->addHeader("Cache-Control", CACHE_CONTROL);
request->send(response);
@ -304,7 +381,7 @@ void setupWebserver(AsyncWebServer &server) {
// Route für Favicon
server.on("/favicon.ico", HTTP_GET, [](AsyncWebServerRequest *request){
AsyncWebServerResponse *response = request->beginResponse(SPIFFS, "/favicon.ico", "image/x-icon");
AsyncWebServerResponse *response = request->beginResponse(LittleFS, "/favicon.ico", "image/x-icon");
response->addHeader("Cache-Control", CACHE_CONTROL);
request->send(response);
Serial.println("favicon.ico gesendet");
@ -312,17 +389,26 @@ void setupWebserver(AsyncWebServer &server) {
// Route für spool_in.png
server.on("/spool_in.png", HTTP_GET, [](AsyncWebServerRequest *request){
AsyncWebServerResponse *response = request->beginResponse(SPIFFS, "/spool_in.png.gz", "image/png");
AsyncWebServerResponse *response = request->beginResponse(LittleFS, "/spool_in.png.gz", "image/png");
response->addHeader("Content-Encoding", "gzip");
response->addHeader("Cache-Control", CACHE_CONTROL);
request->send(response);
Serial.println("spool_in.png gesendet");
});
// Route für set_spoolman.png
server.on("/set_spoolman.png", HTTP_GET, [](AsyncWebServerRequest *request){
AsyncWebServerResponse *response = request->beginResponse(LittleFS, "/set_spoolman.png.gz", "image/png");
response->addHeader("Content-Encoding", "gzip");
response->addHeader("Cache-Control", CACHE_CONTROL);
request->send(response);
Serial.println("set_spoolman.png gesendet");
});
// Route für JavaScript Dateien
server.on("/spoolman.js", HTTP_GET, [](AsyncWebServerRequest *request){
Serial.println("Anfrage für /spoolman.js erhalten");
AsyncWebServerResponse *response = request->beginResponse(SPIFFS, "/spoolman.js.gz", "text/javascript");
AsyncWebServerResponse *response = request->beginResponse(LittleFS, "/spoolman.js.gz", "text/javascript");
response->addHeader("Content-Encoding", "gzip");
response->addHeader("Cache-Control", CACHE_CONTROL);
request->send(response);
@ -331,13 +417,30 @@ void setupWebserver(AsyncWebServer &server) {
server.on("/rfid.js", HTTP_GET, [](AsyncWebServerRequest *request){
Serial.println("Anfrage für /rfid.js erhalten");
AsyncWebServerResponse *response = request->beginResponse(SPIFFS,"/rfid.js.gz", "text/javascript");
AsyncWebServerResponse *response = request->beginResponse(LittleFS,"/rfid.js.gz", "text/javascript");
response->addHeader("Content-Encoding", "gzip");
response->addHeader("Cache-Control", CACHE_CONTROL);
request->send(response);
Serial.println("RFID.js gesendet");
});
// Vereinfachter Update-Handler
server.on("/upgrade", HTTP_GET, [](AsyncWebServerRequest *request) {
AsyncWebServerResponse *response = request->beginResponse(LittleFS, "/upgrade.html.gz", "text/html");
response->addHeader("Content-Encoding", "gzip");
response->addHeader("Cache-Control", "no-store");
request->send(response);
});
// Update-Handler registrieren
handleUpdate(server);
server.on("/api/version", HTTP_GET, [](AsyncWebServerRequest *request){
String fm_version = VERSION;
String jsonResponse = "{\"version\": \""+ fm_version +"\"}";
request->send(200, "application/json", jsonResponse);
});
// Fehlerbehandlung für nicht gefundene Seiten
server.onNotFound([](AsyncWebServerRequest *request){
Serial.print("404 - Nicht gefunden: ");

View File

@ -6,8 +6,8 @@
#include "commonFS.h"
#include "api.h"
#include <ArduinoJson.h>
#include <ESPAsyncWebServer.h>
#include <AsyncWebSocket.h>
#include <Update.h>
#include <AsyncTCP.h>
#include "bambu.h"
#include "nfc.h"
#include "scale.h"
@ -17,7 +17,12 @@ extern String spoolmanUrl;
extern AsyncWebServer server;
extern AsyncWebSocket ws;
// Server-Initialisierung und Handler
void initWebServer();
void handleBody(AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total);
void setupWebserver(AsyncWebServer &server);
// WebSocket-Funktionen
void sendAmsData(AsyncWebSocketClient *client);
void sendNfcData(AsyncWebSocketClient *client);
void foundNfcTag(AsyncWebSocketClient *client, uint8_t success);

129
src/wlan.cpp Normal file
View File

@ -0,0 +1,129 @@
#include <Arduino.h>
#include "wlan.h"
#include <WiFi.h>
#include <esp_wifi.h>
#include <WiFiManager.h>
#include <DNSServer.h>
#include <ESPmDNS.h>
#include "display.h"
#include "config.h"
WiFiManager wm;
bool wm_nonblocking = false;
uint8_t wifiErrorCounter = 0;
void wifiSettings() {
// Optimierte WiFi-Einstellungen
WiFi.mode(WIFI_STA); // explicitly set mode, esp defaults to STA+AP
WiFi.setSleep(false); // disable sleep mode
WiFi.setHostname("FilaMan");
esp_wifi_set_ps(WIFI_PS_NONE);
// Maximale Sendeleistung
WiFi.setTxPower(WIFI_POWER_19_5dBm); // Set maximum transmit power
// Optimiere TCP/IP Stack
esp_wifi_set_protocol(WIFI_IF_STA, WIFI_PROTOCOL_11B | WIFI_PROTOCOL_11G | WIFI_PROTOCOL_11N);
// Aktiviere WiFi-Roaming für bessere Stabilität
esp_wifi_set_rssi_threshold(-80);
}
void startMDNS() {
if (!MDNS.begin("filaman")) {
Serial.println("Error setting up MDNS responder!");
while(1) {
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
Serial.println("mDNS responder started");
}
void configModeCallback (WiFiManager *myWiFiManager) {
Serial.println("Entered config mode");
oledShowTopRow();
oledShowMessage("WiFi Config Mode");
}
void initWiFi() {
// load Wifi settings
wifiSettings();
wm.setAPCallback(configModeCallback);
wm.setSaveConfigCallback([]() {
Serial.println("Configurations updated");
ESP.restart();
});
if(wm_nonblocking) wm.setConfigPortalBlocking(false);
//wm.setConfigPortalTimeout(320); // Portal nach 5min schließen
wm.setWiFiAutoReconnect(true);
wm.setConnectTimeout(10);
oledShowTopRow();
oledShowMessage("WiFi Setup");
//bool res = wm.autoConnect("FilaMan"); // anonymous ap
if(!wm.autoConnect("FilaMan")) {
Serial.println("Failed to connect or hit timeout");
// ESP.restart();
oledShowTopRow();
oledShowMessage("WiFi not connected Check Portal");
}
else {
wifiOn = true;
//if you get here you have connected to the WiFi
Serial.println("connected...yeey :)");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
oledShowTopRow();
display.display();
vTaskDelay(500 / portTICK_PERIOD_MS);
// mDNS
startMDNS();
}
}
void checkWiFiConnection() {
if (WiFi.status() != WL_CONNECTED)
{
Serial.println("WiFi connection lost. Reconnecting...");
wifiOn = false;
oledShowTopRow();
oledShowMessage("WiFi reconnecting");
WiFi.reconnect(); // Versuche, die Verbindung wiederherzustellen
vTaskDelay(5000 / portTICK_PERIOD_MS); // Warte 5 Sekunden, bevor erneut geprüft wird
if (WiFi.status() != WL_CONNECTED)
{
Serial.println("Failed to reconnect. Restarting WiFi...");
WiFi.disconnect();
Serial.println("WiFi disconnected.");
vTaskDelay(1000 / portTICK_PERIOD_MS);
wifiErrorCounter++;
//wifiSettings();
WiFi.reconnect();
Serial.println("WiFi reconnecting...");
WiFi.waitForConnectResult();
}
else
{
Serial.println("WiFi reconnected.");
wifiErrorCounter = 0;
wifiOn = true;
oledShowTopRow();
startMDNS();
}
}
if (wifiErrorCounter >= 5)
{
Serial.println("Too many WiFi errors. Restarting...");
ESP.restart();
}
}

9
src/wlan.h Normal file
View File

@ -0,0 +1,9 @@
#ifndef WLAN_H
#define WLAN_H
#include <Arduino.h>
void initWiFi();
void checkWiFiConnection();
#endif

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 540 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 525 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 KiB

View File

@ -0,0 +1,12 @@
## **Heat insert location**
Housing:
- every hole is made to fit a heat insert
![](./Housing_Heatinsert_Location_usermod_spitzbirne32_.png)
---
Scale top:
- two heat inserts for the NFC Reader
![](./ScaleTop_Heatinsert_Location_usermod_spitzbirne32_.png)

Binary file not shown.

After

Width:  |  Height:  |  Size: 491 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 834 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

View File

@ -0,0 +1,69 @@
## Modifications
To reduce costs, components were sourced from AliExpress instead of Amazon. However, differences in dimensions and mounting hole spacing necessitated adjustments to the 3D-printed parts. Additionally M3 heat inserts were used to limit M4 screws to a minimum.
![](./Images/Showcase_usermod_spitzbirne32.gif)
---
List of parts that were used:
- Display: https://aliexpress.com/item/1005007389730469.html
- Scale(5KG with HX711): https://aliexpress.com/item/1005006827930173.html
- NFC Reader: https://aliexpress.com/item/1005005973913526.html
- NFC Chips: https://aliexpress.com/item/1005006332360160.html
- [VORON](https://vorondesign.com/) Heat Inserts M3 OD5mm L4mm: https://aliexpress.com/item/1005003582355741.html - make sure to select the correct size
---
- **Parts are designed to be printed in ABS/ASA.** Shrinking compensation not needed.
- **Display and Scale Adjustments:** The AliExpress-sourced display and scale had different dimensions and hole spacings compared to the Amazon versions. The 3D models were modified to accommodate these differences, ensuring proper fit and functionality.
- measurement of my Display & Scale to check if your parts will fit can be found in the images folder
- **Screw Size and Heat Inserts:** All holes originally designed for M4 screws were resized to fit M3 screws. Standard VORON heat inserts were incorporated to provide durable threading. This change standardizes the hardware and simplifies assembly.
- **Display Mounting:** The display is now mounted using M3 screws with VORON heat inserts. The display's mounting holes need to be drilled to 3mm to accommodate the M3 screws.
- **Scale Top Surface:** The top surface of the scale was modified to allow M3 socket head cap screws to sit flush with the 3D-printed part. This design ensures that the filament spool rests flat without interference.
- **NFC Reader Mounting:** The NFC reader is also secured using M3 screws and VORON heat inserts, maintaining consistency across all components.
- **Scale Base Mounting:** The only M4 screws required are for attaching the metal part of the scale to its base.
## Benefits of Modifications
- **Cost Reduction:** Sourcing components from AliExpress offers a more affordable alternative to Amazon, making the project more accessible.
- **Standardized Hardware:** Using M3 screws and [VORON](https://vorondesign.com/) heat inserts throughout the assembly simplifies the build process and reduces the variety of required hardware.
- **Enhanced Compatibility:** Adjustments to the 3D models ensure compatibility with readily available components, accommodating variations in part dimensions.
## Assembly Instructions
1. **Component Preparation:**
- Carefully drill the display's mounting holes to 3mm to fit M3 screws.
2. **Heat Insert Installation:**
- install VORON M3 heat inserts into the designated holes in the 3D-printed housing/case for the ESP32 and Scale top &#8594; [heat insert location pictures](./Images/README.md)
3. **Component Mounting:**
- Attach the display, scale, and NFC reader to their respective mounts using M3 screws.
- Secure the metal part of the scale to its base using M4 screws.
4. **Final Assembly:**
- Assemble all components according to the original FilaMan instructions, ensuring that all modified parts fit correctly and function as intended.
For detailed assembly guides and additional resources, refer to the [original FilaMan documentation](https://github.com/ManuelW77/Filaman).
## Conclusion
These modifications to the FilaMan project provide a cost-effective and standardized approach to building a filament management system. By sourcing components from AliExpress and adjusting the 3D models accordingly, users can achieve the same functionality at a reduced cost, with the added benefit of using uniform hardware throughout the assembly.
## Changelog
### Version 1.0 - 2025-03-04
- Initial release of modifications for AliExpress-sourced components.
- Adjusted 3D models to fit different display and scale dimensions.
- Replaced M4 screws with M3 screws and integrated VORON heat inserts.
- Modified display mounting, requiring drilling to 3mm for M3 screws.
- Adjusted scale top surface for flush screw placement.
- Standardized NFC reader mounting with M3 screws and VORON heat inserts.
- Retained M4 screws only for metal scale attachment.

Binary file not shown.