Compare commits

..

6 Commits

18 changed files with 152 additions and 79 deletions

View File

@ -43,12 +43,17 @@ jobs:
--flash_mode dio \ --flash_mode dio \
--flash_freq 40m \ --flash_freq 40m \
--flash_size 4MB \ --flash_size 4MB \
-o .pio/build/esp32dev/filaman.bin \ -o .pio/build/esp32dev/filaman_full.bin \
0x1000 .pio/build/esp32dev/bootloader.bin \ 0x1000 .pio/build/esp32dev/bootloader.bin \
0x8000 .pio/build/esp32dev/partitions.bin \ 0x8000 .pio/build/esp32dev/partitions.bin \
0x10000 .pio/build/esp32dev/firmware.bin \ 0x10000 .pio/build/esp32dev/firmware.bin \
0x290000 .pio/build/esp32dev/spiffs.bin 0x290000 .pio/build/esp32dev/spiffs.bin
- name: Prepare OTA firmware
run: |
# Use PlatformIO to create a proper OTA image
cp .pio/build/esp32dev/firmware.bin .pio/build/esp32dev/filaman_ota.bin
- name: Get version from tag - name: Get version from tag
id: get_version id: get_version
run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT
@ -71,9 +76,10 @@ jobs:
- name: Create Release with GitHub CLI - name: Create Release with GitHub CLI
env: env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Changed from GITHUB_TOKEN to GH_TOKEN GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: | run: |
gh release create "${{ github.ref_name }}" \ gh release create "${{ github.ref_name }}" \
--title "Release ${{ steps.get_version.outputs.VERSION }}" \ --title "Release ${{ steps.get_version.outputs.VERSION }}" \
--notes "${{ steps.changelog.outputs.CHANGES }}" \ --notes "${{ steps.changelog.outputs.CHANGES }}" \
".pio/build/esp32dev/filaman.bin#filaman.bin" ".pio/build/esp32dev/filaman_full.bin#filaman_full.bin" \
".pio/build/esp32dev/filaman_ota.bin#filaman_ota.bin"

View File

@ -1,5 +1,22 @@
# Changelog # Changelog
## [1.2.0] - 2025-02-17
### Added
- implement OTA functionality and update build scripts; change upgrade link to OTA in HTML
- update version to v1.2.0 and modify build scripts in platformio.ini; remove unused includes in scale.cpp and website.cpp
- update version to v1.2.0 and add upgrade link in HTML files
- add esp_wifi.h and set maximum transmit power in WiFi initialization
### Changed
- update changelog for version 1.1.0
- clean up changelog and update script execution in platformio.ini
- update changelog for version 1.1.0
### Fixed
- update version number in header to v1.1.0
- correct version number in nav bar
## [1.1.0] - 2025-02-16 ## [1.1.0] - 2025-02-16
### Changed ### Changed
- clean up changelog and update script execution in platformio.ini - clean up changelog and update script execution in platformio.ini

View File

@ -12,7 +12,7 @@
<div style="display: flex; align-items: center; gap: 2rem;"> <div style="display: flex; align-items: center; gap: 2rem;">
<img src="/logo.png" alt="FilaMan Logo" class="logo"> <img src="/logo.png" alt="FilaMan Logo" class="logo">
<div class="logo-text"> <div class="logo-text">
<h1>FilaMan<span class="version">v1.0.9</span></h1> <h1>FilaMan<span class="version">v1.2.0</span></h1>
<h4>Filament Management Tool</h4> <h4>Filament Management Tool</h4>
</div> </div>
</div> </div>
@ -21,6 +21,7 @@
<a href="/waage">Scale</a> <a href="/waage">Scale</a>
<a href="/spoolman">Spoolman/Bambu</a> <a href="/spoolman">Spoolman/Bambu</a>
<a href="/about">About</a> <a href="/about">About</a>
<a href="/ota">Upgrade</a>
</nav> </nav>
<div class="status-container"> <div class="status-container">
<div class="status-item"> <div class="status-item">

View File

@ -1,4 +1,4 @@
<!DOCTYPE html> <!-- head --><!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
@ -12,7 +12,7 @@
<div style="display: flex; align-items: center; gap: 2rem;"> <div style="display: flex; align-items: center; gap: 2rem;">
<img src="/logo.png" alt="FilaMan Logo" class="logo"> <img src="/logo.png" alt="FilaMan Logo" class="logo">
<div class="logo-text"> <div class="logo-text">
<h1>FilaMan<span class="version">v1.0.2</span></h1> <h1>FilaMan<span class="version">v1.2.0</span></h1>
<h4>Filament Management Tool</h4> <h4>Filament Management Tool</h4>
</div> </div>
</div> </div>
@ -21,6 +21,7 @@
<a href="/waage">Scale</a> <a href="/waage">Scale</a>
<a href="/spoolman">Spoolman/Bambu</a> <a href="/spoolman">Spoolman/Bambu</a>
<a href="/about">About</a> <a href="/about">About</a>
<a href="/upgrade">Upgrade</a>
</nav> </nav>
<div class="status-container"> <div class="status-container">
<div class="status-item"> <div class="status-item">
@ -33,7 +34,7 @@
</div> </div>
</div> </div>
<!-- head -->
<div class="container"> <div class="container">
<h1>FilaMan</h1> <h1>FilaMan</h1>

View File

@ -1,4 +1,4 @@
<!DOCTYPE html> <!-- head --><!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
@ -12,7 +12,7 @@
<div style="display: flex; align-items: center; gap: 2rem;"> <div style="display: flex; align-items: center; gap: 2rem;">
<img src="/logo.png" alt="FilaMan Logo" class="logo"> <img src="/logo.png" alt="FilaMan Logo" class="logo">
<div class="logo-text"> <div class="logo-text">
<h1>FilaMan<span class="version">v1.0.2</span></h1> <h1>FilaMan<span class="version">v1.2.0</span></h1>
<h4>Filament Management Tool</h4> <h4>Filament Management Tool</h4>
</div> </div>
</div> </div>
@ -21,6 +21,7 @@
<a href="/waage">Scale</a> <a href="/waage">Scale</a>
<a href="/spoolman">Spoolman/Bambu</a> <a href="/spoolman">Spoolman/Bambu</a>
<a href="/about">About</a> <a href="/about">About</a>
<a href="/upgrade">Upgrade</a>
</nav> </nav>
<div class="status-container"> <div class="status-container">
<div class="status-item"> <div class="status-item">
@ -33,6 +34,7 @@
</div> </div>
</div> </div>
<!-- head -->
<div class="connection-status hidden"> <div class="connection-status hidden">
<div class="spinner"></div> <div class="spinner"></div>

View File

@ -1,4 +1,4 @@
<!DOCTYPE html> <!-- head --><!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
@ -12,7 +12,7 @@
<div style="display: flex; align-items: center; gap: 2rem;"> <div style="display: flex; align-items: center; gap: 2rem;">
<img src="/logo.png" alt="FilaMan Logo" class="logo"> <img src="/logo.png" alt="FilaMan Logo" class="logo">
<div class="logo-text"> <div class="logo-text">
<h1>FilaMan<span class="version">v1.0.2</span></h1> <h1>FilaMan<span class="version">v1.2.0</span></h1>
<h4>Filament Management Tool</h4> <h4>Filament Management Tool</h4>
</div> </div>
</div> </div>
@ -21,6 +21,7 @@
<a href="/waage">Scale</a> <a href="/waage">Scale</a>
<a href="/spoolman">Spoolman/Bambu</a> <a href="/spoolman">Spoolman/Bambu</a>
<a href="/about">About</a> <a href="/about">About</a>
<a href="/upgrade">Upgrade</a>
</nav> </nav>
<div class="status-container"> <div class="status-container">
<div class="status-item"> <div class="status-item">
@ -33,6 +34,7 @@
</div> </div>
</div> </div>
<!-- head -->
<script> <script>
window.onload = function() { window.onload = function() {

View File

@ -1,4 +1,4 @@
<!DOCTYPE html> <!-- head --><!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
@ -12,7 +12,7 @@
<div style="display: flex; align-items: center; gap: 2rem;"> <div style="display: flex; align-items: center; gap: 2rem;">
<img src="/logo.png" alt="FilaMan Logo" class="logo"> <img src="/logo.png" alt="FilaMan Logo" class="logo">
<div class="logo-text"> <div class="logo-text">
<h1>FilaMan<span class="version">v1.0.2</span></h1> <h1>FilaMan<span class="version">v1.2.0</span></h1>
<h4>Filament Management Tool</h4> <h4>Filament Management Tool</h4>
</div> </div>
</div> </div>
@ -21,6 +21,7 @@
<a href="/waage">Scale</a> <a href="/waage">Scale</a>
<a href="/spoolman">Spoolman/Bambu</a> <a href="/spoolman">Spoolman/Bambu</a>
<a href="/about">About</a> <a href="/about">About</a>
<a href="/upgrade">Upgrade</a>
</nav> </nav>
<div class="status-container"> <div class="status-container">
<div class="status-item"> <div class="status-item">
@ -33,6 +34,7 @@
</div> </div>
</div> </div>
<!-- head -->
<div class="content"> <div class="content">
<h1>Scale Configuration Page</h1> <h1>Scale Configuration Page</h1>

View File

@ -1,4 +1,4 @@
<!DOCTYPE html> <!-- head --><!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
@ -12,7 +12,7 @@
<div style="display: flex; align-items: center; gap: 2rem;"> <div style="display: flex; align-items: center; gap: 2rem;">
<img src="/logo.png" alt="FilaMan Logo" class="logo"> <img src="/logo.png" alt="FilaMan Logo" class="logo">
<div class="logo-text"> <div class="logo-text">
<h1>FilaMan<span class="version">v1.0.2</span></h1> <h1>FilaMan<span class="version">v1.2.0</span></h1>
<h4>Filament Management Tool</h4> <h4>Filament Management Tool</h4>
</div> </div>
</div> </div>
@ -21,6 +21,7 @@
<a href="/waage">Scale</a> <a href="/waage">Scale</a>
<a href="/spoolman">Spoolman/Bambu</a> <a href="/spoolman">Spoolman/Bambu</a>
<a href="/about">About</a> <a href="/about">About</a>
<a href="/upgrade">Upgrade</a>
</nav> </nav>
<div class="status-container"> <div class="status-container">
<div class="status-item"> <div class="status-item">
@ -33,6 +34,7 @@
</div> </div>
</div> </div>
<!-- head -->
<div class="content"> <div class="content">
<h1>WiFi Configuration Page</h1> <h1>WiFi Configuration Page</h1>

View File

@ -9,7 +9,7 @@
; https://docs.platformio.org/page/projectconf.html ; https://docs.platformio.org/page/projectconf.html
[common] [common]
version = "1.1.0" version = "1.2.0"
[env:esp32dev] [env:esp32dev]
platform = espressif32 platform = espressif32
@ -29,6 +29,7 @@ lib_deps =
bblanchon/ArduinoJson @ ^7.3.0 bblanchon/ArduinoJson @ ^7.3.0
knolleary/PubSubClient @ ^2.8 knolleary/PubSubClient @ ^2.8
digitaldragon/SSLClient @ ^1.3.2 digitaldragon/SSLClient @ ^1.3.2
ipdotsetaf/ESPAsyncHTTPUpdateServer @ ^2.0.0
; Enable SPIFFS upload ; Enable SPIFFS upload
board_build.filesystem = spiffs board_build.filesystem = spiffs
@ -48,9 +49,16 @@ build_flags =
'-D VERSION="${common.version}"' '-D VERSION="${common.version}"'
extra_scripts = extra_scripts =
pre:scripts/pre_build.py scripts/extra_script.py
pre:scripts/combine_html.py pre:scripts/pre_build.py ; wird zuerst ausgeführt
pre:scripts/pre_spiffs.py pre:scripts/pre_spiffs.py ; wird als zweites ausgeführt
pre:scripts/gzip_files.py pre:scripts/combine_html.py ; wird als drittes ausgeführt
pre:scripts/extra_script.py scripts/gzip_files.py
#post:scripts/update_changelog.py
; Remove or comment out the targets line
;targets = buildfs, build
; Add a custom target to build both
[platformio]
default_envs = esp32dev

View File

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

View File

@ -1,10 +1,10 @@
#include <Arduino.h> #include <Arduino.h>
#include <WiFi.h>
#include <DNSServer.h> #include <DNSServer.h>
#include <WiFiManager.h>
#include <ESPmDNS.h> #include <ESPmDNS.h>
#include <Wire.h> #include <Wire.h>
#include <WiFi.h>
#include "wlan.h"
#include "config.h" #include "config.h"
#include "website.h" #include "website.h"
#include "api.h" #include "api.h"
@ -15,12 +15,6 @@
#include "esp_task_wdt.h" #include "esp_task_wdt.h"
#include "commonFS.h" #include "commonFS.h"
// ***** WIFI initialisieren
WiFiManager wm;
bool wm_nonblocking = false;
void initWiFi();
// ################### Functions
// ##### SETUP ##### // ##### SETUP #####
void setup() { void setup() {
Serial.begin(115200); Serial.begin(115200);
@ -96,9 +90,6 @@ void loop() {
unsigned long currentMillis = millis(); unsigned long currentMillis = millis();
// Falls WifiManager im nicht blockenden Modus ist
//if(wm_nonblocking) wm.process();
// Send AMS Data min every Minute // Send AMS Data min every Minute
if (currentMillis - lastAmsSendTime >= amsSendInterval) { if (currentMillis - lastAmsSendTime >= amsSendInterval) {
lastAmsSendTime = currentMillis; lastAmsSendTime = currentMillis;
@ -164,38 +155,3 @@ void loop() {
yield(); yield();
esp_task_wdt_reset(); 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 #####

11
src/ota.cpp Normal file
View File

@ -0,0 +1,11 @@
#include <Arduino.h>
#include "ota.h"
#include <ESPAsyncWebServer.h>
#include <ESPAsyncHTTPUpdateServer.h>
ESPAsyncHTTPUpdateServer updateServer;
void setupOTA(AsyncWebServer &server) {
updateServer.setup(&server, "/ota", "admin", "admin");
//updateServer.setup(&server);
}

8
src/ota.h Normal file
View File

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

View File

@ -5,7 +5,6 @@
#include "HX711.h" #include "HX711.h"
#include <EEPROM.h> #include <EEPROM.h>
#include "display.h" #include "display.h"
#include "nfc.h"
#include "esp_task_wdt.h" #include "esp_task_wdt.h"
HX711 scale; HX711 scale;

View File

@ -3,11 +3,11 @@
#include "api.h" #include "api.h"
#include <ArduinoJson.h> #include <ArduinoJson.h>
#include <ESPAsyncWebServer.h> #include <ESPAsyncWebServer.h>
//#include <AsyncWebSocket.h>
#include "bambu.h" #include "bambu.h"
#include "nfc.h" #include "nfc.h"
#include "scale.h" #include "scale.h"
#include "esp_task_wdt.h" #include "esp_task_wdt.h"
#include "ota.h"
// Cache-Control Header definieren // Cache-Control Header definieren
#define CACHE_CONTROL "max-age=31536000" // Cache für 1 Jahr #define CACHE_CONTROL "max-age=31536000" // Cache für 1 Jahr
@ -161,6 +161,8 @@ void setupWebserver(AsyncWebServer &server) {
Serial.print("Geladene Spoolman-URL: "); Serial.print("Geladene Spoolman-URL: ");
Serial.println(spoolmanUrl); Serial.println(spoolmanUrl);
setupOTA(server);
// Route für about // Route für about
server.on("/about", HTTP_GET, [](AsyncWebServerRequest *request){ server.on("/about", HTTP_GET, [](AsyncWebServerRequest *request){
Serial.println("Anfrage für /about erhalten"); Serial.println("Anfrage für /about erhalten");

45
src/wlan.cpp Normal file
View File

@ -0,0 +1,45 @@
#include <Arduino.h>
#include "wlan.h"
#include <WiFi.h>
#include <esp_wifi.h>
#include <WiFiManager.h>
#include "display.h"
#include "config.h"
WiFiManager wm;
bool wm_nonblocking = false;
void initWiFi() {
WiFi.mode(WIFI_STA); // explicitly set mode, esp defaults to STA+AP
esp_wifi_set_max_tx_power(72); // Setze maximale Sendeleistung auf 20dBm
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();
}
}

8
src/wlan.h Normal file
View File

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