Compare commits
30 Commits
v1.3.49
...
fe7b57fe0e
Author | SHA1 | Date | |
---|---|---|---|
fe7b57fe0e | |||
c1ae6b7295 | |||
9eee89fac7 | |||
8c5e7e26ac | |||
7b52066378 | |||
d5afa38ded | |||
cf50baba2d | |||
aa9e7da94b | |||
71cd3ba4fc | |||
73e240e879 | |||
0d34e1d718 | |||
84cc8beb9b | |||
fd70e3179d | |||
c553640ad8 | |||
807eca3c43 | |||
b52730bf67 | |||
9a59b91e88 | |||
a5af4013d8 | |||
e54ce58ec4 | |||
142eafd232 | |||
63ab9e0993 | |||
aaa5506d40 | |||
8037adc045 | |||
6e7c728cd8 | |||
3fe8271344 | |||
f2bc6eab92 | |||
37df492339 | |||
c4b425403f | |||
73244689dd | |||
27296104d2 |
4
.github/workflows/gitea-release.yml
vendored
4
.github/workflows/gitea-release.yml
vendored
@ -40,8 +40,8 @@ jobs:
|
||||
# Copy firmware binary
|
||||
cp .pio/build/esp32dev/firmware.bin .pio/build/esp32dev/upgrade_filaman_firmware_v${VERSION}.bin
|
||||
|
||||
# Create SPIFFS binary with correct chip revision
|
||||
( printf '\xe9\x03\x01\x00' && cat .pio/build/esp32dev/spiffs.bin ) > .pio/build/esp32dev/upgrade_filaman_website_v${VERSION}.bin
|
||||
# Create SPIFFS binary - direct copy without header
|
||||
cp .pio/build/esp32dev/spiffs.bin .pio/build/esp32dev/upgrade_filaman_website_v${VERSION}.bin
|
||||
|
||||
# Create full binary
|
||||
(cd .pio/build/esp32dev &&
|
||||
|
4
.github/workflows/github-release.yml
vendored
4
.github/workflows/github-release.yml
vendored
@ -47,8 +47,8 @@ jobs:
|
||||
# Copy firmware binary
|
||||
cp .pio/build/esp32dev/firmware.bin .pio/build/esp32dev/upgrade_filaman_firmware_v${VERSION}.bin
|
||||
|
||||
# Create SPIFFS binary with correct chip revision
|
||||
( printf '\xe9\x03\x01\x00' && cat .pio/build/esp32dev/spiffs.bin ) > .pio/build/esp32dev/upgrade_filaman_website_v${VERSION}.bin
|
||||
# Create SPIFFS binary - direct copy without header
|
||||
cp .pio/build/esp32dev/spiffs.bin .pio/build/esp32dev/upgrade_filaman_website_v${VERSION}.bin
|
||||
|
||||
# Create full binary (always)
|
||||
(cd .pio/build/esp32dev &&
|
||||
|
58
CHANGELOG.md
58
CHANGELOG.md
@ -1,5 +1,63 @@
|
||||
# Changelog
|
||||
|
||||
## [1.3.58] - 2025-02-22
|
||||
### Added
|
||||
- implement backup and restore functionality for Bambu credentials and Spoolman URL
|
||||
|
||||
### Changed
|
||||
- update webpages for version v1.3.58
|
||||
- update upgrade page message and improve progress display logic
|
||||
|
||||
|
||||
## [1.3.57] - 2025-02-22
|
||||
### Changed
|
||||
- update webpages for version v1.3.57
|
||||
- update header title to 'Filament Management Tool' in multiple HTML files
|
||||
|
||||
|
||||
## [1.3.56] - 2025-02-22
|
||||
### Changed
|
||||
- update webpages for version v1.3.56
|
||||
- update header title and improve SPIFFS update error handling
|
||||
- clarify comments in Gitea and GitHub release workflows
|
||||
|
||||
|
||||
## [1.3.55] - 2025-02-22
|
||||
### Changed
|
||||
- update webpages for version v1.3.55
|
||||
- update component descriptions in README files
|
||||
|
||||
|
||||
## [1.3.54] - 2025-02-22
|
||||
### Changed
|
||||
- update webpages for version v1.3.54
|
||||
- workflow: update SPIFFS binary creation to exclude header
|
||||
|
||||
|
||||
## [1.3.53] - 2025-02-22
|
||||
### Changed
|
||||
- version: update to version 1.3.53
|
||||
- update changelog for version 1.3.51
|
||||
- update changelog for version 1.3.51
|
||||
- workflow: update SPIFFS binary magic byte and revert version to 1.3.51
|
||||
|
||||
|
||||
## [1.3.52] - 2025-02-22
|
||||
### Changed
|
||||
- update webpages for version v1.3.52
|
||||
- workflow: update SPIFFS binary creation to use correct chip revision (0xEB for Rev 3)
|
||||
|
||||
|
||||
## [1.3.51] - 2025-02-22
|
||||
### Changed
|
||||
- update changelog for version 1.3.51
|
||||
- workflow: update SPIFFS binary magic byte and revert version to 1.3.51
|
||||
|
||||
## [1.3.50] - 2025-02-22
|
||||
### Changed
|
||||
- update webpages for version v1.3.50
|
||||
|
||||
|
||||
## [1.3.49] - 2025-02-22
|
||||
### Changed
|
||||
- update webpages for version v1.3.49
|
||||
|
16
README.de.md
16
README.de.md
@ -53,14 +53,14 @@ Deutsches Erklärvideo: [Youtube](https://youtu.be/uNDe2wh9SS8?si=b-jYx4I1w62zaO
|
||||
### 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)
|
||||
- **HX711 5kg Wägezellen-Verstärker:** Für Gewichtsmessung.
|
||||
[Amazon Link](https://amzn.eu/d/06A0DLb)
|
||||
- **OLED 0.96 Zoll I2C weiß/gelb Display:** 128x64 SSD1306.
|
||||
[Amazon Link](https://amzn.eu/d/0AuBp2c)
|
||||
- **PN532 NFC NXP RFID-Modul V3:** Für NFC-Tag-Operationen.
|
||||
[Amazon Link](https://amzn.eu/d/jfIuQXb)
|
||||
- **NFC Tags Ntag215:** RFID Tag
|
||||
[Amazon Link](https://amzn.eu/d/9Z6mXc1)
|
||||
|
||||
### Pin-Konfiguration
|
||||
| Komponente | ESP32 Pin |
|
||||
|
16
README.md
16
README.md
@ -56,14 +56,14 @@ 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)
|
||||
- **HX711 5kg Load Cell Amplifier:** For weight measurement.
|
||||
[Amazon Link](https://amzn.eu/d/06A0DLb)
|
||||
- **OLED 0.96 Zoll I2C white/yellow Display:** 128x64 SSD1306.
|
||||
[Amazon Link](https://amzn.eu/d/0AuBp2c)
|
||||
- **PN532 NFC NXP RFID-Modul V3:** For NFC tag operations.
|
||||
[Amazon Link](https://amzn.eu/d/jfIuQXb)
|
||||
- **NFC Tags Ntag215:** RFID Tag
|
||||
[Amazon Link](https://amzn.eu/d/9Z6mXc1)
|
||||
|
||||
|
||||
### Pin Configuration
|
||||
|
@ -24,7 +24,7 @@
|
||||
<img src="/logo.png" alt="FilaMan Logo" class="logo">
|
||||
<div class="logo-text">
|
||||
<h1>FilaMan<span class="version"></span></h1>
|
||||
<h4>Hollo Lollo Trollo</h4>
|
||||
<h4>Filament Management Tool</h4>
|
||||
</div>
|
||||
</div>
|
||||
<nav style="display: flex; gap: 1rem;">
|
||||
|
@ -24,7 +24,7 @@
|
||||
<img src="/logo.png" alt="FilaMan Logo" class="logo">
|
||||
<div class="logo-text">
|
||||
<h1>FilaMan<span class="version"></span></h1>
|
||||
<h4>Hollo Lollo Trollo</h4>
|
||||
<h4>Filament Management Tool</h4>
|
||||
</div>
|
||||
</div>
|
||||
<nav style="display: flex; gap: 1rem;">
|
||||
|
@ -24,7 +24,7 @@
|
||||
<img src="/logo.png" alt="FilaMan Logo" class="logo">
|
||||
<div class="logo-text">
|
||||
<h1>FilaMan<span class="version"></span></h1>
|
||||
<h4>Hollo Lollo Trollo</h4>
|
||||
<h4>Filament Management Tool</h4>
|
||||
</div>
|
||||
</div>
|
||||
<nav style="display: flex; gap: 1rem;">
|
||||
|
@ -24,7 +24,7 @@
|
||||
<img src="/logo.png" alt="FilaMan Logo" class="logo">
|
||||
<div class="logo-text">
|
||||
<h1>FilaMan<span class="version"></span></h1>
|
||||
<h4>Hollo Lollo Trollo</h4>
|
||||
<h4>Filament Management Tool</h4>
|
||||
</div>
|
||||
</div>
|
||||
<nav style="display: flex; gap: 1rem;">
|
||||
|
@ -24,7 +24,7 @@
|
||||
<img src="/logo.png" alt="FilaMan Logo" class="logo">
|
||||
<div class="logo-text">
|
||||
<h1>FilaMan<span class="version"></span></h1>
|
||||
<h4>Hollo Lollo Trollo</h4>
|
||||
<h4>Filament Management Tool</h4>
|
||||
</div>
|
||||
</div>
|
||||
<nav style="display: flex; gap: 1rem;">
|
||||
@ -206,10 +206,10 @@
|
||||
progress.textContent = '100%';
|
||||
|
||||
// Automatischer Neustart nach erfolgreicher Aktualisierung
|
||||
status.textContent = "Update successful! Restarting device...";
|
||||
status.textContent = "Update successful! Restarting device... The page will reload in 30 seconds.";
|
||||
setTimeout(() => {
|
||||
window.location.reload();
|
||||
}, 5000);
|
||||
window.location.href = '/';
|
||||
}, 30000);
|
||||
} else {
|
||||
document.querySelectorAll('form input[type=submit]').forEach(btn => btn.disabled = false);
|
||||
}
|
||||
|
@ -24,7 +24,7 @@
|
||||
<img src="/logo.png" alt="FilaMan Logo" class="logo">
|
||||
<div class="logo-text">
|
||||
<h1>FilaMan<span class="version"></span></h1>
|
||||
<h4>Hollo Lollo Trollo</h4>
|
||||
<h4>Filament Management Tool</h4>
|
||||
</div>
|
||||
</div>
|
||||
<nav style="display: flex; gap: 1rem;">
|
||||
|
@ -24,7 +24,7 @@
|
||||
<img src="/logo.png" alt="FilaMan Logo" class="logo">
|
||||
<div class="logo-text">
|
||||
<h1>FilaMan<span class="version"></span></h1>
|
||||
<h4>Hollo Lollo Trollo</h4>
|
||||
<h4>Filament Management Tool</h4>
|
||||
</div>
|
||||
</div>
|
||||
<nav style="display: flex; gap: 1rem;">
|
||||
|
@ -9,7 +9,7 @@
|
||||
; https://docs.platformio.org/page/projectconf.html
|
||||
|
||||
[common]
|
||||
version = "1.3.49"
|
||||
version = "1.3.58"
|
||||
|
||||
#test
|
||||
|
||||
|
@ -7,7 +7,6 @@
|
||||
#include "nfc.h"
|
||||
#include "scale.h"
|
||||
#include "esp_task_wdt.h"
|
||||
#include "esp_log.h"
|
||||
#include <Update.h>
|
||||
#include "display.h"
|
||||
|
||||
@ -24,6 +23,10 @@ AsyncWebSocket ws("/ws");
|
||||
uint8_t lastSuccess = 0;
|
||||
uint8_t lastHasReadRfidTag = 0;
|
||||
|
||||
// Globale Variablen für Config Backups hinzufügen
|
||||
String bambuCredentialsBackup;
|
||||
String spoolmanUrlBackup;
|
||||
|
||||
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!");
|
||||
@ -166,6 +169,9 @@ void sendAmsData(AsyncWebSocketClient *client) {
|
||||
}
|
||||
|
||||
void setupWebserver(AsyncWebServer &server) {
|
||||
// Deaktiviere alle Debug-Ausgaben
|
||||
Serial.setDebugOutput(false);
|
||||
|
||||
// WebSocket-Optimierungen
|
||||
ws.onEvent(onWsEvent);
|
||||
ws.enable(true);
|
||||
@ -391,25 +397,29 @@ void setupWebserver(AsyncWebServer &server) {
|
||||
static size_t updateSize = 0;
|
||||
static int command = 0;
|
||||
|
||||
oledShowMessage("Upgrade please wait");
|
||||
//oledShowMessage("Upgrade please wait");
|
||||
|
||||
if (!index) {
|
||||
// Reduziere Debug-Level während des Updates
|
||||
esp_log_level_set("*", ESP_LOG_ERROR);
|
||||
|
||||
updateSize = request->contentLength();
|
||||
command = (filename.indexOf("spiffs") > -1) ? U_SPIFFS : U_FLASH;
|
||||
command = (filename.indexOf("website") > -1) ? U_SPIFFS : U_FLASH;
|
||||
|
||||
if (command == U_SPIFFS) {
|
||||
oledShowMessage("SPIFFS Update...");
|
||||
backupJsonConfigs();
|
||||
|
||||
if (!Update.begin(updateSize, command)) {
|
||||
// Get the actual SPIFFS partition size from ESP32
|
||||
const esp_partition_t *partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_SPIFFS, NULL);
|
||||
if (!partition) {
|
||||
restoreJsonConfigs();
|
||||
String errorMsg = "SPIFFS partition not found";
|
||||
request->send(400, "application/json", "{\"success\":false,\"message\":\"" + errorMsg + "\"}");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!Update.begin(partition->size, command)) {
|
||||
restoreJsonConfigs();
|
||||
String errorMsg = String("Update begin failed: ") + Update.errorString();
|
||||
request->send(400, "application/json", "{\"success\":false,\"message\":\"" + errorMsg + "\"}");
|
||||
// Stelle Debug-Level wieder her
|
||||
esp_log_level_set("*", ESP_LOG_INFO);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
@ -417,8 +427,6 @@ void setupWebserver(AsyncWebServer &server) {
|
||||
if (!Update.begin(updateSize, command)) {
|
||||
String errorMsg = String("Update begin failed: ") + Update.errorString();
|
||||
request->send(400, "application/json", "{\"success\":false,\"message\":\"" + errorMsg + "\"}");
|
||||
// Stelle Debug-Level wieder her
|
||||
esp_log_level_set("*", ESP_LOG_INFO);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -434,12 +442,17 @@ void setupWebserver(AsyncWebServer &server) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Update OLED Display alle 25%
|
||||
// Update OLED Display alle 5% und Webseite bei jeder Änderung
|
||||
static int lastProgress = -1;
|
||||
int currentProgress = (index + len) * 100 / updateSize;
|
||||
if (currentProgress % 25 == 0 && currentProgress != lastProgress) {
|
||||
if (currentProgress != lastProgress) {
|
||||
// OLED nur alle 5% aktualisieren
|
||||
if (currentProgress % 5 == 0) {
|
||||
oledShowMessage(String(currentProgress) + "% complete");
|
||||
}
|
||||
// Webseite bei jeder Änderung aktualisieren
|
||||
lastProgress = currentProgress;
|
||||
oledShowMessage(String(currentProgress) + "% complete");
|
||||
ws.textAll("{\"type\":\"updateProgress\",\"progress\":" + String(currentProgress) + "}");
|
||||
}
|
||||
}
|
||||
|
||||
@ -450,12 +463,8 @@ void setupWebserver(AsyncWebServer &server) {
|
||||
}
|
||||
String errorMsg = String("Update end failed: ") + Update.errorString();
|
||||
request->send(400, "application/json", "{\"success\":false,\"message\":\"" + errorMsg + "\"}");
|
||||
// Stelle Debug-Level wieder her
|
||||
esp_log_level_set("*", ESP_LOG_INFO);
|
||||
return;
|
||||
}
|
||||
// Stelle Debug-Level wieder her
|
||||
esp_log_level_set("*", ESP_LOG_INFO);
|
||||
}
|
||||
}
|
||||
);
|
||||
@ -485,23 +494,47 @@ void setupWebserver(AsyncWebServer &server) {
|
||||
|
||||
|
||||
void backupJsonConfigs() {
|
||||
const char* configs[] = {"/bambu_credentials.json", "/spoolman_url.json"};
|
||||
for (const char* config : configs) {
|
||||
if (SPIFFS.exists(config)) {
|
||||
String backupPath = String(config) + ".bak";
|
||||
SPIFFS.remove(backupPath);
|
||||
SPIFFS.rename(config, backupPath);
|
||||
// Bambu Credentials backup
|
||||
if (SPIFFS.exists("/bambu_credentials.json")) {
|
||||
File file = SPIFFS.open("/bambu_credentials.json", "r");
|
||||
if (file) {
|
||||
bambuCredentialsBackup = file.readString();
|
||||
file.close();
|
||||
Serial.println("Bambu credentials backed up");
|
||||
}
|
||||
}
|
||||
|
||||
// Spoolman URL backup
|
||||
if (SPIFFS.exists("/spoolman_url.json")) {
|
||||
File file = SPIFFS.open("/spoolman_url.json", "r");
|
||||
if (file) {
|
||||
spoolmanUrlBackup = file.readString();
|
||||
file.close();
|
||||
Serial.println("Spoolman URL backed up");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void restoreJsonConfigs() {
|
||||
const char* configs[] = {"/bambu_credentials.json", "/spoolman_url.json"};
|
||||
for (const char* config : configs) {
|
||||
String backupPath = String(config) + ".bak";
|
||||
if (SPIFFS.exists(backupPath)) {
|
||||
SPIFFS.remove(config);
|
||||
SPIFFS.rename(backupPath, config);
|
||||
// Restore Bambu credentials
|
||||
if (bambuCredentialsBackup.length() > 0) {
|
||||
File file = SPIFFS.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 = SPIFFS.open("/spoolman_url.json", "w");
|
||||
if (file) {
|
||||
file.print(spoolmanUrlBackup);
|
||||
file.close();
|
||||
Serial.println("Spoolman URL restored");
|
||||
}
|
||||
spoolmanUrlBackup = ""; // Clear backup
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user