Compare commits
22 Commits
Author | SHA1 | Date | |
---|---|---|---|
d9ae829503 | |||
2247b8ed6c | |||
d70b187bf9 | |||
1ade007473 | |||
0af14e2f7d | |||
de67cdbff3 | |||
98fce15ccc | |||
ab417ba64b | |||
320057bc49 | |||
9007a65fc2 | |||
2214f5f5de | |||
5c5846c52c | |||
517fa37a3d | |||
aaa7a6ee9c | |||
a0b8639488 | |||
a16c05287e | |||
ecb35a97bd | |||
ba968611ec | |||
6bd11ddce3 | |||
3eb313e61a | |||
aad35dc296 | |||
85ac636b1e |
64
.github/workflows/github-release.yml
vendored
64
.github/workflows/github-release.yml
vendored
@ -151,35 +151,35 @@ jobs:
|
||||
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
|
||||
- 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
|
39
CHANGELOG.md
39
CHANGELOG.md
@ -1,5 +1,44 @@
|
||||
# Changelog
|
||||
|
||||
## [1.3.93] - 2025-02-24
|
||||
### Added
|
||||
- implement auto send feature for Bambu spool management and update related configurations
|
||||
- add debug mode instructions for Spoolman in README
|
||||
- add wiring diagrams to README for PN532 I2C setup
|
||||
|
||||
### Changed
|
||||
- update webpages for version v1.3.93
|
||||
- simplify filament names in JSON configuration
|
||||
- update findFilamentIdx to return structured result and improve type searching logic
|
||||
- update README to reflect PN532 I2C configuration and remove SPI pin details
|
||||
|
||||
### Fixed
|
||||
- remove debug output from splitTextIntoLines and update weight display logic in scanRfidTask
|
||||
- enhance weight display logic for negative values
|
||||
- remove unnecessary CPU frequency configuration from setup function
|
||||
|
||||
|
||||
## [1.3.92] - 2025-02-24
|
||||
### Changed
|
||||
- update webpages for version v1.3.92
|
||||
- remove commented-out code in setBambuSpool function
|
||||
- update installation instructions and formatting in README files
|
||||
|
||||
### Fixed
|
||||
- configure CPU frequency settings in setup function only for testing
|
||||
- update comment to clarify NVS reading process
|
||||
- adjust weight display logic to handle cases for weight less than 2
|
||||
- update weight display logic to handle negative and specific weight cases
|
||||
|
||||
|
||||
## [1.3.91] - 2025-02-23
|
||||
### Added
|
||||
- update GitHub Actions workflow for FTP firmware upload with improved credential checks
|
||||
|
||||
### Changed
|
||||
- update webpages for version v1.3.91
|
||||
|
||||
|
||||
## [1.3.90] - 2025-02-23
|
||||
### Added
|
||||
- update index.html for improved content structure and additional links
|
||||
|
37
README.de.md
37
README.de.md
@ -71,14 +71,15 @@ 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 |
|
||||
|
||||
Ich nutze die HSPI default PINs + IRQ und RESET am PN532
|
||||
**Achte darauf, dass am PN532 die DIP-Schalter auf I2C gestellt sind**
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
## Software-Abhängigkeiten
|
||||
|
||||
@ -105,21 +106,31 @@ Ich nutze die HSPI default PINs + IRQ und RESET am PN532
|
||||
- PN532 NFC Modul
|
||||
- Verbindungskabel
|
||||
|
||||
### Schritt-für-Schritt Installation
|
||||
## Einfache Installation
|
||||
1. **Gehe auf https://www.filaman.app/installer.html
|
||||
## Wichtiger Hinweis
|
||||
Du musst Spoolman auf DEBUG Modus setzten, da man bisher in Spoolman keine CORS Domains setzen kann!
|
||||
|
||||
2. **Stecke dein ESP an den Rechner und klicke Connect
|
||||
```
|
||||
# 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
|
||||
```
|
||||
|
||||
3. **Wähle dein Device Port und klicke Intall
|
||||
## 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
|
||||
|
||||
### Compile by yourself
|
||||
1. **Repository klonen:**
|
||||
```bash
|
||||
git clone https://github.com/ManuelW77/Filaman.git
|
||||
|
41
README.md
41
README.md
@ -75,14 +75,15 @@ 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 |
|
||||
|
||||
I use the HSPI default PINs + IRQ and RESET at the PN532
|
||||
**Make sure that the DIP switches on the PN532 are set to I2C**
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
## Software Dependencies
|
||||
|
||||
@ -95,9 +96,9 @@ I use the HSPI default PINs + IRQ and RESET at the PN532
|
||||
- `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
|
||||
@ -109,20 +110,32 @@ I use the HSPI default PINs + IRQ and RESET at the PN532
|
||||
- PN532 NFC Module
|
||||
- Connecting wires
|
||||
|
||||
### Step-by-Step Installation
|
||||
## Easy Installation
|
||||
1. **Go to https://www.filaman.app/installer.html
|
||||
## Important Note
|
||||
You have to activate Spoolman in debug mode, because you are not able to set CORS Domains in Spoolman yet.
|
||||
|
||||
2. **Plug you device in and push Connect button
|
||||
```
|
||||
# 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
|
||||
```
|
||||
|
||||
3. **Select your Device Port and push Intall
|
||||
|
||||
## 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
|
||||
### Compile by yourself
|
||||
1. **Clone the Repository:**
|
||||
```bash
|
||||
git clone https://github.com/ManuelW77/Filaman.git
|
||||
|
@ -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"
|
||||
}
|
@ -74,8 +74,9 @@
|
||||
const ip = document.getElementById('bambuIp').value;
|
||||
const serial = document.getElementById('bambuSerial').value;
|
||||
const code = document.getElementById('bambuCode').value;
|
||||
const autoSend = document.getElementById('autoSend').checked;
|
||||
|
||||
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}`)
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
if (data.healthy) {
|
||||
@ -121,6 +122,12 @@
|
||||
<label for="bambuCode">Access Code:</label>
|
||||
<input type="text" id="bambuCode" placeholder="Access Code vom Drucker" value="{{bambuCode}}">
|
||||
</div>
|
||||
<div class="input-group">
|
||||
If activated, FilaMan will automatically update the next filled tray with the last scanned and weighed spool.
|
||||
<label for="autoSend">Auto Send to Bambu:</label>
|
||||
<input type="checkbox" id="autoSend">
|
||||
</div>
|
||||
|
||||
<button onclick="saveBambuCredentials()">Save Bambu Credentials</button>
|
||||
<p id="bambuStatusMessage"></p>
|
||||
</div>
|
||||
|
BIN
img/IMG_2589.jpeg
Normal file
BIN
img/IMG_2589.jpeg
Normal file
Binary file not shown.
After Width: | Height: | Size: 136 KiB |
BIN
img/IMG_2590.jpeg
Normal file
BIN
img/IMG_2590.jpeg
Normal file
Binary file not shown.
After Width: | Height: | Size: 143 KiB |
BIN
img/Schaltplan.png
Normal file
BIN
img/Schaltplan.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 283 KiB |
@ -9,7 +9,7 @@
|
||||
; https://docs.platformio.org/page/projectconf.html
|
||||
|
||||
[common]
|
||||
version = "1.3.90"
|
||||
version = "1.3.93"
|
||||
##
|
||||
[env:esp32dev]
|
||||
platform = espressif32
|
||||
|
111
src/api.cpp
111
src/api.cpp
@ -37,9 +37,9 @@ struct SendToApiParams {
|
||||
}
|
||||
*/
|
||||
|
||||
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 +56,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.add<JsonObject>();
|
||||
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["filament"].to<JsonObject>();
|
||||
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["vendor"].to<JsonObject>();
|
||||
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.add<JsonObject>();
|
||||
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["filament"].to<JsonObject>();
|
||||
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["vendor"].to<JsonObject>();
|
||||
vendor["id"] = spool["filament"]["vendor"]["id"];
|
||||
vendor["name"] = spool["filament"]["vendor"]["name"];
|
||||
|
||||
JsonObject extra = filament["extra"].to<JsonObject>();
|
||||
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: ");
|
||||
|
@ -14,8 +14,7 @@ bool checkSpoolmanInstance(const String& url);
|
||||
bool saveSpoolmanUrl(const String& url);
|
||||
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();
|
||||
JsonDocument fetchSingleSpoolInfo(int spoolId); // API-Funktion für die Webseite
|
||||
void sendAmsData(AsyncWebSocketClient *client); // Neue Funktion zum Senden von AMS-Daten
|
||||
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
|
||||
|
160
src/bambu.cpp
160
src/bambu.cpp
@ -24,13 +24,15 @@ const char* bambu_ip = nullptr;
|
||||
const char* bambu_accesscode = nullptr;
|
||||
const char* bambu_serialnr = nullptr;
|
||||
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 saveBambuCredentials(const String& ip, const String& serialnr, const String& accesscode, bool autoSend) {
|
||||
if (BambuMqttTask) {
|
||||
vTaskDelete(BambuMqttTask);
|
||||
}
|
||||
@ -39,6 +41,7 @@ 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;
|
||||
|
||||
if (!saveJsonValue("/bambu_credentials.json", doc)) {
|
||||
Serial.println("Fehler beim Speichern der Bambu-Credentials.");
|
||||
@ -49,6 +52,7 @@ 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;
|
||||
|
||||
vTaskDelay(100 / portTICK_PERIOD_MS);
|
||||
if (!setupMqtt()) return false;
|
||||
@ -63,6 +67,7 @@ bool loadBambuCredentials() {
|
||||
String ip = doc["bambu_ip"].as<String>();
|
||||
String code = doc["bambu_accesscode"].as<String>();
|
||||
String serial = doc["bambu_serialnr"].as<String>();
|
||||
autoSendToBambu = doc["autoSendToBambu"].as<bool>();
|
||||
|
||||
ip.trim();
|
||||
code.trim();
|
||||
@ -81,19 +86,23 @@ 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 bambu_filaments.json
|
||||
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
|
||||
}
|
||||
|
||||
// 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,20 +118,43 @@ 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) {
|
||||
@ -156,15 +188,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 +211,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 +233,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 +257,34 @@ 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);
|
||||
|
||||
if (sendMqttMessage(output)) {
|
||||
Serial.println("Filament Setting successfully set");
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.println("Failed to set Filament setting");
|
||||
return false;
|
||||
}
|
||||
|
||||
doc.clear();
|
||||
yield();
|
||||
}
|
||||
*/
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
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>());
|
||||
}
|
||||
|
||||
// id wieder zurücksetzen damit abgeschlossen
|
||||
autoSetToBambuSpoolId = 0;
|
||||
}
|
||||
|
||||
// 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,16 +292,27 @@ void mqtt_callback(char* topic, byte* payload, unsigned int length) {
|
||||
// JSON-Dokument parsen
|
||||
JsonDocument doc;
|
||||
DeserializationError error = deserializeJson(doc, message);
|
||||
if (error) {
|
||||
if (error)
|
||||
{
|
||||
Serial.print("Fehler beim Parsen des JSON: ");
|
||||
Serial.println(error.c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
// Wenn bambu auto set spool aktiv und eine spule erkannt und mqtt meldung das neue spule im ams
|
||||
if (autoSendToBambu && autoSetToBambuSpoolId > 0 &&
|
||||
doc["print"]["command"].as<String>() == "push_status" && doc["print"]["ams"]["tray_pre"].as<uint8_t>()
|
||||
&& !doc["print"]["ams"]["ams"].as<JsonArray>())
|
||||
{
|
||||
autoSetSpool(autoSetToBambuSpoolId, doc["print"]["ams"]["tray_pre"].as<uint8_t>());
|
||||
}
|
||||
|
||||
// Prüfen, ob "print->upgrade_state" und "print.ams.ams" existieren
|
||||
if (doc["print"]["upgrade_state"].is<String>()) {
|
||||
if (doc["print"]["upgrade_state"].is<JsonObject>())
|
||||
{
|
||||
// Prüfen ob AMS-Daten vorhanden sind
|
||||
if (!doc["print"]["ams"].is<String>() || !doc["print"]["ams"]["ams"].is<String>()) {
|
||||
if (!doc["print"]["ams"].is<JsonObject>() || !doc["print"]["ams"]["ams"].is<JsonArray>())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
@ -315,7 +355,7 @@ void mqtt_callback(char* topic, byte* payload, unsigned int length) {
|
||||
}
|
||||
|
||||
// Prüfe die externe Spule
|
||||
if (!hasChanges && doc["print"]["vt_tray"].is<String>()) {
|
||||
if (!hasChanges && doc["print"]["vt_tray"].is<JsonObject>()) {
|
||||
JsonObject vtTray = doc["print"]["vt_tray"];
|
||||
bool foundExternal = false;
|
||||
|
||||
@ -363,7 +403,7 @@ void mqtt_callback(char* topic, byte* payload, unsigned int length) {
|
||||
ams_count = amsArray.size();
|
||||
|
||||
// Wenn externe Spule vorhanden, füge sie hinzu
|
||||
if (doc["print"]["vt_tray"].is<String>()) {
|
||||
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
|
||||
@ -374,8 +414,12 @@ void mqtt_callback(char* topic, byte* payload, unsigned int length) {
|
||||
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>();
|
||||
|
||||
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>();
|
||||
}
|
||||
ams_count++; // Erhöhe ams_count für die externe Spule
|
||||
}
|
||||
|
||||
@ -415,7 +459,7 @@ void mqtt_callback(char* topic, byte* payload, unsigned int length) {
|
||||
int amsId = doc["print"]["ams_id"].as<int>();
|
||||
int trayId = doc["print"]["tray_id"].as<int>();
|
||||
String settingId = 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) {
|
||||
@ -462,7 +506,7 @@ void mqtt_callback(char* topic, byte* payload, unsigned int length) {
|
||||
void reconnect() {
|
||||
// Loop until we're reconnected
|
||||
while (!client.connected()) {
|
||||
Serial.print("Attempting MQTT connection...");
|
||||
Serial.println("Attempting MQTT connection...");
|
||||
bambu_connected = false;
|
||||
oledShowTopRow();
|
||||
|
||||
|
@ -28,9 +28,11 @@ extern bool bambu_connected;
|
||||
|
||||
extern int ams_count;
|
||||
extern AMSData ams_data[MAX_AMS];
|
||||
extern bool autoSendToBambu;
|
||||
extern int autoSetToBambuSpoolId;
|
||||
|
||||
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);
|
||||
bool setupMqtt();
|
||||
void mqtt_loop(void * parameter);
|
||||
bool setBambuSpool(String payload);
|
||||
|
@ -40,6 +40,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;
|
||||
|
@ -23,6 +23,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[];
|
||||
|
@ -117,7 +117,6 @@ std::vector<String> splitTextIntoLines(String text, uint8_t textSize) {
|
||||
lines.push_back(currentLine);
|
||||
}
|
||||
|
||||
Serial.println(lines.size());
|
||||
return lines;
|
||||
}
|
||||
|
||||
|
25
src/main.cpp
25
src/main.cpp
@ -90,6 +90,10 @@ void setup() {
|
||||
unsigned long lastWeightReadTime = 0;
|
||||
const unsigned long weightReadInterval = 1000; // 1 second
|
||||
|
||||
unsigned long lastAutoSetBambuAmsTime = 0;
|
||||
const unsigned long autoSetBambuAmsInterval = 1000; // 1 second
|
||||
uint8_t autoAmsCounter = 0;
|
||||
|
||||
unsigned long lastAmsSendTime = 0;
|
||||
const unsigned long amsSendInterval = 60000; // 1 minute
|
||||
|
||||
@ -108,6 +112,22 @@ void loop() {
|
||||
sendAmsData(nullptr);
|
||||
}
|
||||
|
||||
// Wenn Bambu auto set Spool aktiv
|
||||
if (autoSendToBambu && autoSetToBambuSpoolId > 0 && currentMillis - lastAutoSetBambuAmsTime >= autoSetBambuAmsInterval)
|
||||
{
|
||||
lastAutoSetBambuAmsTime = currentMillis;
|
||||
oledShowMessage("Auto Set " + String(autoSetBambuAmsCounter - autoAmsCounter) + "s");
|
||||
autoAmsCounter++;
|
||||
|
||||
if (autoAmsCounter >= autoSetBambuAmsCounter)
|
||||
{
|
||||
autoSetToBambuSpoolId = 0;
|
||||
autoAmsCounter = 0;
|
||||
oledShowWeight(weight);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Wenn Waage nicht Kalibriert
|
||||
if (scaleCalibrated == 3)
|
||||
{
|
||||
@ -120,9 +140,9 @@ void loop() {
|
||||
}
|
||||
|
||||
// Ausgabe der Waage auf Display
|
||||
if (pauseMainTask == 0 && weight != lastWeight && hasReadRfidTag == 0)
|
||||
if (pauseMainTask == 0 && weight != lastWeight && hasReadRfidTag == 0 && (!autoSendToBambu || autoSetToBambuSpoolId == 0))
|
||||
{
|
||||
(weight < 0) ? oledShowMessage("!! -1") : oledShowWeight(weight);
|
||||
(weight < 2) ? ((weight < -2) ? oledShowMessage("!! -0") : oledShowWeight(0)) : oledShowWeight(weight);
|
||||
}
|
||||
|
||||
|
||||
@ -169,6 +189,7 @@ void loop() {
|
||||
oledShowIcon("success");
|
||||
vTaskDelay(2000 / portTICK_PERIOD_MS);
|
||||
weightSend = 1;
|
||||
autoSetToBambuSpoolId = spoolId.toInt();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -420,7 +420,7 @@ void scanRfidTask(void * parameter) {
|
||||
//uidString = "";
|
||||
nfcJsonData = "";
|
||||
Serial.println("Tag entfernt");
|
||||
oledShowWeight(0);
|
||||
if (!autoSendToBambu) oledShowWeight(weight);
|
||||
}
|
||||
|
||||
// aktualisieren der Website wenn sich der Status ändert
|
||||
|
@ -55,7 +55,7 @@ uint8_t start_scale() {
|
||||
Serial.println("Prüfe Calibration Value");
|
||||
long calibrationValue;
|
||||
|
||||
// NVS
|
||||
// NVS lesen
|
||||
preferences.begin(NVS_NAMESPACE, true); // true = readonly
|
||||
calibrationValue = preferences.getLong(NVS_KEY_CALIBRATION, defaultScaleCalibrationValue);
|
||||
preferences.end();
|
||||
|
@ -351,17 +351,6 @@ void setupWebserver(AsyncWebServer &server) {
|
||||
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) + "\"}";
|
||||
@ -389,6 +378,7 @@ void setupWebserver(AsyncWebServer &server) {
|
||||
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();
|
||||
@ -396,12 +386,14 @@ void setupWebserver(AsyncWebServer &server) {
|
||||
html.replace("{{bambuIp}}", bambuIp ? bambuIp : "");
|
||||
html.replace("{{bambuSerial}}", bambuSerial ? bambuSerial : "");
|
||||
html.replace("{{bambuCode}}", bambuCode ? bambuCode : "");
|
||||
html.replace("{{autoSendToBambu}}", autoSendToBambu ? "checked" : "");
|
||||
}
|
||||
else
|
||||
{
|
||||
html.replace("{{bambuIp}}", "");
|
||||
html.replace("{{bambuSerial}}", "");
|
||||
html.replace("{{bambuCode}}", "");
|
||||
html.replace("{{autoSendToBambu}}", "");
|
||||
}
|
||||
|
||||
request->send(200, "text/html", html);
|
||||
@ -433,6 +425,8 @@ 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;
|
||||
Serial.println(autoSend);
|
||||
bambu_ip.trim();
|
||||
bambu_serialnr.trim();
|
||||
bambu_accesscode.trim();
|
||||
@ -442,7 +436,7 @@ void setupWebserver(AsyncWebServer &server) {
|
||||
return;
|
||||
}
|
||||
|
||||
bool success = saveBambuCredentials(bambu_ip, bambu_serialnr, bambu_accesscode);
|
||||
bool success = saveBambuCredentials(bambu_ip, bambu_serialnr, bambu_accesscode, autoSend);
|
||||
|
||||
request->send(200, "application/json", "{\"healthy\": " + String(success ? "true" : "false") + "}");
|
||||
});
|
||||
|
Reference in New Issue
Block a user