Compare commits

...

7 Commits

14 changed files with 168 additions and 104 deletions

View File

@ -206,36 +206,3 @@ jobs:
fi fi
fi fi
done done
- 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

@ -149,4 +149,37 @@ jobs:
else else
echo "Error: No files found to upload" echo "Error: No files found to upload"
exit 1 exit 1
fi 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,5 +1,20 @@
# Changelog # Changelog
## [1.3.90] - 2025-02-23
### Added
- update index.html for improved content structure and additional links
- improve UI for Spoolman and Bambu Lab printer credentials, enhancing layout and styling
- update README files with HSPI default PINs and add ESP32 pin diagram
- implement scale calibration checks and update start_scale function to return calibration status
- add FTP upload functionality to GitHub release workflow and update installation instructions in README
### Changed
- update webpages for version v1.3.90
### Fixed
- remove debug secrets check from Gitea release workflow
## [1.3.89] - 2025-02-23 ## [1.3.89] - 2025-02-23
### Changed ### Changed
- update webpages for version v1.3.89 - update webpages for version v1.3.89

View File

@ -76,6 +76,10 @@ Deutsches Erklärvideo: [Youtube](https://youtu.be/uNDe2wh9SS8?si=b-jYx4I1w62zaO
| PN532 MISO | 12 | | PN532 MISO | 12 |
| PN532 CS/SS | 15 | | PN532 CS/SS | 15 |
Ich nutze die HSPI default PINs + IRQ und RESET am PN532
![ESP32](./img/ESP32-SPI-Pins.png)
## Software-Abhängigkeiten ## Software-Abhängigkeiten
### ESP32-Bibliotheken ### ESP32-Bibliotheken
@ -102,6 +106,20 @@ Deutsches Erklärvideo: [Youtube](https://youtu.be/uNDe2wh9SS8?si=b-jYx4I1w62zaO
- Verbindungskabel - Verbindungskabel
### Schritt-für-Schritt Installation ### Schritt-für-Schritt Installation
## Einfache Installation
1. **Gehe auf 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:** 1. **Repository klonen:**
```bash ```bash
git clone https://github.com/ManuelW77/Filaman.git git clone https://github.com/ManuelW77/Filaman.git

View File

@ -80,6 +80,10 @@ german explanatory video: [Youtube](https://youtu.be/uNDe2wh9SS8?si=b-jYx4I1w62z
| PN532 MISO | 12 | | PN532 MISO | 12 |
| PN532 CS/SS | 15 | | PN532 CS/SS | 15 |
I use the HSPI default PINs + IRQ and RESET at the PN532
![ESP32](./img/ESP32-SPI-Pins.png)
## Software Dependencies ## Software Dependencies
### ESP32 Libraries ### ESP32 Libraries
@ -106,6 +110,19 @@ german explanatory video: [Youtube](https://youtu.be/uNDe2wh9SS8?si=b-jYx4I1w62z
- Connecting wires - Connecting wires
### Step-by-Step Installation ### Step-by-Step Installation
## Easy Installation
1. **Go to 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:** 1. **Clone the Repository:**
```bash ```bash
git clone https://github.com/ManuelW77/Filaman.git git clone https://github.com/ManuelW77/Filaman.git
@ -124,25 +141,6 @@ german explanatory video: [Youtube](https://youtu.be/uNDe2wh9SS8?si=b-jYx4I1w62z
- Configure WiFi settings through the captive portal. - Configure WiFi settings through the captive portal.
- Access the web interface at `http://filaman.local` or the IP address. - Access the web interface at `http://filaman.local` or the IP address.
## GitHub Actions Configuration
### Required Secrets for Gitea Releases
When using Gitea as your repository host, you need to configure the following secrets in your repository:
- `GITEA_API_URL`: The base URL of your Gitea instance, including protocol (e.g., `https://git.example.com`)
- `GITEA_TOKEN`: Your Gitea access token with permissions to create releases
- `GITEA_REPOSITORY`: The repository name in format `owner/repo` (e.g., `username/filaman`)
Example values:
```
GITEA_API_URL=https://git.example.com
GITEA_TOKEN=abcdef1234567890
GITEA_REPOSITORY=username/filaman
```
Make sure to set these secrets in your repository settings under Settings > Secrets and Variables > Actions.
## Documentation ## Documentation
### Relevant Links ### Relevant Links

View File

@ -47,7 +47,7 @@
<!-- head --> <!-- head -->
<div class="container"> <div class="content">
<h1>FilaMan</h1> <h1>FilaMan</h1>
<p>Filament Management Tool</p> <p>Filament Management Tool</p>
<p>Your smart solution for <strong>Filament Management</strong> in 3D printing.</p> <p>Your smart solution for <strong>Filament Management</strong> in 3D printing.</p>
@ -55,10 +55,11 @@
<h2>About FilaMan</h2> <h2>About FilaMan</h2>
<p> <p>
FilaMan is a tool designed to simplify filament spool management. It allows you to identify and weigh filament spools, 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, 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.
</p> </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="features">
<div class="feature"> <div class="feature">
<h3>Spool Identification</h3> <h3>Spool Identification</h3>
@ -73,12 +74,6 @@
<p>Works with OpenSpool to recognize and activate spools on Bambu printers.</p> <p>Works with OpenSpool to recognize and activate spools on Bambu printers.</p>
</div> </div>
</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> </div>
</body> </body>
</html> </html>

View File

@ -95,27 +95,36 @@
<div class="content"> <div class="content">
<h1>Spoolman API URL / Bambu Credentials</h1> <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="card">
<div class="bambu-settings"> <div class="card-body">
<div class="input-group"> <h5 class="card-title">Set URL/IP to your Spoolman-Instanz</h5>
<label for="bambuIp">Bambu Drucker IP-Adresse:</label> <input type="text" id="spoolmanUrl" placeholder="http://ip-or-url-of-your-spoolman-instanz:port">
<input type="text" id="bambuIp" placeholder="192.168.1.xxx" value="{{bambuIp}}"> <button onclick="checkSpoolmanInstance()">Save Spoolman URL</button>
<p id="statusMessage"></p>
</div> </div>
<div class="input-group"> </div>
<label for="bambuSerial">Drucker Seriennummer:</label>
<input type="text" id="bambuSerial" placeholder="BBLXXXXXXXX" value="{{bambuSerial}}"> <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>
<button onclick="saveBambuCredentials()">Save Bambu Credentials</button>
<p id="bambuStatusMessage"></p>
</div>
</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>
</div> </div>
</body> </body>

View File

@ -279,9 +279,10 @@ a:hover {
/* Karten-Stil für optische Trennung */ /* Karten-Stil für optische Trennung */
.card { .card {
background: #f9f9f9; background: var(--primary-color);
width: 500px;
padding: 15px; padding: 15px;
margin: 20px 0; margin: 20px auto;
border-radius: 8px; border-radius: 8px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
} }
@ -959,7 +960,6 @@ input[type="submit"]:disabled,
/* Bambu Settings Erweiterung */ /* Bambu Settings Erweiterung */
.bambu-settings { .bambu-settings {
background: white;
padding: 20px; padding: 20px;
border-radius: 8px; border-radius: 8px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

View File

@ -9,7 +9,7 @@
; https://docs.platformio.org/page/projectconf.html ; https://docs.platformio.org/page/projectconf.html
[common] [common]
version = "1.3.89" version = "1.3.90"
## ##
[env:esp32dev] [env:esp32dev]
platform = espressif32 platform = espressif32

View File

@ -58,7 +58,22 @@ void setup() {
startNfc(); startNfc();
start_scale(); uint8_t scaleCalibrated = start_scale();
if (scaleCalibrated == 3) {
oledShowMessage("Scale not calibrated!");
for (uint16_t i = 0; i < 50000; i++) {
yield();
vTaskDelay(pdMS_TO_TICKS(1));
esp_task_wdt_reset();
}
} else if (scaleCalibrated == 0) {
oledShowMessage("HX711 not found");
for (uint16_t i = 0; i < 50000; i++) {
yield();
vTaskDelay(pdMS_TO_TICKS(1));
esp_task_wdt_reset();
}
}
// WDT initialisieren mit 10 Sekunden Timeout // WDT initialisieren mit 10 Sekunden Timeout
bool panic = true; // Wenn true, löst ein WDT-Timeout einen System-Panik aus bool panic = true; // Wenn true, löst ein WDT-Timeout einen System-Panik aus
@ -84,33 +99,33 @@ uint8_t wifiErrorCounter = 0;
// ##### PROGRAM START ##### // ##### PROGRAM START #####
void loop() { 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(); unsigned long currentMillis = millis();
// Send AMS Data min every Minute // Send AMS Data min every Minute
if (currentMillis - lastAmsSendTime >= amsSendInterval) { if (currentMillis - lastAmsSendTime >= amsSendInterval)
{
lastAmsSendTime = currentMillis; lastAmsSendTime = currentMillis;
sendAmsData(nullptr); sendAmsData(nullptr);
} }
// 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 // Ausgabe der Waage auf Display
if (pauseMainTask == 0 && weight != lastWeight && hasReadRfidTag == 0) if (pauseMainTask == 0 && weight != lastWeight && hasReadRfidTag == 0)
{ {
(weight < 0) ? oledShowMessage("!! -1") : oledShowWeight(weight); (weight < 0) ? oledShowMessage("!! -1") : oledShowWeight(weight);
} }
// Wenn Timer abgelaufen und nicht gerade ein RFID-Tag geschrieben wird // Wenn Timer abgelaufen und nicht gerade ein RFID-Tag geschrieben wird
if (currentMillis - lastWeightReadTime >= weightReadInterval && hasReadRfidTag < 3) if (currentMillis - lastWeightReadTime >= weightReadInterval && hasReadRfidTag < 3)
{ {

View File

@ -16,6 +16,7 @@ int16_t weight = 0;
uint8_t weigthCouterToApi = 0; uint8_t weigthCouterToApi = 0;
uint8_t scale_tare_counter = 0; uint8_t scale_tare_counter = 0;
uint8_t pauseMainTask = 0; uint8_t pauseMainTask = 0;
uint8_t scaleCalibrated = 1;
Preferences preferences; Preferences preferences;
const char* NVS_NAMESPACE = "scale"; const char* NVS_NAMESPACE = "scale";
@ -50,7 +51,7 @@ void scale_loop(void * parameter) {
} }
} }
void start_scale() { uint8_t start_scale() {
Serial.println("Prüfe Calibration Value"); Serial.println("Prüfe Calibration Value");
long calibrationValue; long calibrationValue;
@ -64,7 +65,10 @@ void start_scale() {
scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN); 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 Tare Please remove all"); oledShowMessage("Scale Tare Please remove all");
for (uint16_t i = 0; i < 2000; i++) { for (uint16_t i = 0; i < 2000; i++) {
@ -97,6 +101,8 @@ void start_scale() {
} else { } else {
Serial.println("ScaleLoop-Task erfolgreich erstellt"); Serial.println("ScaleLoop-Task erfolgreich erstellt");
} }
return (scaleCalibrated == 1) ? 1 : 3;
} }
uint8_t calibrate_scale() { uint8_t calibrate_scale() {

View File

@ -5,7 +5,7 @@
#include "HX711.h" #include "HX711.h"
void start_scale(); uint8_t start_scale();
uint8_t calibrate_scale(); uint8_t calibrate_scale();
uint8_t tareScale(); uint8_t tareScale();
@ -14,6 +14,7 @@ extern int16_t weight;
extern uint8_t weigthCouterToApi; extern uint8_t weigthCouterToApi;
extern uint8_t scale_tare_counter; extern uint8_t scale_tare_counter;
extern uint8_t pauseMainTask; extern uint8_t pauseMainTask;
extern uint8_t scaleCalibrated;
extern TaskHandle_t ScaleTask; extern TaskHandle_t ScaleTask;

View File

@ -384,7 +384,8 @@ void setupWebserver(AsyncWebServer &server) {
html.replace("{{spoolmanUrl}}", spoolmanUrl); html.replace("{{spoolmanUrl}}", spoolmanUrl);
JsonDocument doc; JsonDocument doc;
if (loadJsonValue("/bambu_credentials.json", doc) && doc["bambu_ip"].is<String>()) { if (loadJsonValue("/bambu_credentials.json", doc) && doc["bambu_ip"].is<String>())
{
String bambuIp = doc["bambu_ip"].as<String>(); String bambuIp = doc["bambu_ip"].as<String>();
String bambuSerial = doc["bambu_serialnr"].as<String>(); String bambuSerial = doc["bambu_serialnr"].as<String>();
String bambuCode = doc["bambu_accesscode"].as<String>(); String bambuCode = doc["bambu_accesscode"].as<String>();
@ -395,7 +396,13 @@ void setupWebserver(AsyncWebServer &server) {
html.replace("{{bambuIp}}", bambuIp ? bambuIp : ""); html.replace("{{bambuIp}}", bambuIp ? bambuIp : "");
html.replace("{{bambuSerial}}", bambuSerial ? bambuSerial : ""); html.replace("{{bambuSerial}}", bambuSerial ? bambuSerial : "");
html.replace("{{bambuCode}}", bambuCode ? bambuCode : ""); html.replace("{{bambuCode}}", bambuCode ? bambuCode : "");
} }
else
{
html.replace("{{bambuIp}}", "");
html.replace("{{bambuSerial}}", "");
html.replace("{{bambuCode}}", "");
}
request->send(200, "text/html", html); request->send(200, "text/html", html);
}); });