Commit Graph

76 Commits

Author SHA1 Message Date
MaPaLo76
b47c781f2d docs: FR-011 als erledigt markiert (Commit 1ef0464, v1.4.1) 2026-03-01 17:52:15 +01:00
MaPaLo76
1ef0464be9 fix(mqtt): FR-011 Heap-Korruption bei TLS-Verbindungsabbruch
- _rebuildClient(): WiFiClientSecure + PubSubClient vor jedem
  Reconnect-Versuch sauber delete + new auf Core 0
- mbedTLS startet damit immer mit sauberem Heap-Kontext
- Verhindert CORRUPT HEAP / PANIC wenn Broker die TLS-Session
  unerwartet abbricht (MBEDTLS_ERR_NET_CONN_RESET)
- _broker/_port als Members gecacht fuer _rebuildClient()
2026-03-01 17:50:18 +01:00
MaPaLo76
c61a67f812 feat(web+mqtt): FR-010 Webinterface-Redesign + MQTT-Steuerung
Webinterface:
- /: oeffentlich, Laser Cutter Status, m:ss, an/aus, Display-Toggle (fetch/204)
- /config: H2-Abschnitte (Status, MQTT, Webzugang, Geraet, Tools)
  Maschinenlaufzeit h:mm:ss, Reboot-Button (disabled bei aktivem Laser)
- /reset-total: neue POST-Route fuer NVS-Maschinenlaufzeit-Reset (Auth)
- /display-toggle: POST, 204, kein Seitenwechsel
- /reboot: POST, Auth, ESP.restart()

DisplayManager:
- setEnabled()/isEnabled() via MAX7219 SHUTDOWN-Modus

MQTT:
- lasercutter/reset -> lasercutter/cmd (MQTT_TOPIC_CMD)
- Kommandos: reset_session_nvs, reset_session_ram, display, reboot
- Heartbeat lasercutter/status: display_on-Feld hinzugefuegt
2026-03-01 17:28:47 +01:00
MaPaLo76
d9322f67d8 chore(version): bump zu 1.3.0
- feat: reset_reason im MQTT Heartbeat-JSON
- fix: Heap-Leak (String _logBuf, JsonDocument) behoben
2026-03-01 15:06:05 +01:00
MaPaLo76
c4d03bf1b7 fix(stability): Heap-Leak durch String/JsonDocument-Objekte behoben
- web_server.cpp: static String _logBuf -> char[6001] im BSS-Segment
  Jeder LOG_I/E/D-Aufruf loeste String-Reallokation aus (~280 Bytes/min Drift)
  Fix: memmove-basierter Ring-Puffer, kein malloc/free mehr
- mqtt_client.cpp: JsonDocument in publishHeartbeat() und _doPublishSession()
  durch snprintf-JSON ersetzt (kein ArduinoJson-Heap-Pool alle 60 s)
- config.h: LOG-Puffer von 200 auf 320 Bytes erhoeht (Truncation fix)
- platformio.ini: CORE_DEBUG_LEVEL wieder auf 1 (war 3 fuer Heap-Diagnose)
2026-03-01 12:11:00 +01:00
MaPaLo76
7935dfbba4 feat(mqtt): reset_reason im Heartbeat-JSON hinzugefuegt
- esp_reset_reason() einmalig in begin() gespeichert (_resetReason[32])
- reset_reason-Feld in publishHeartbeat() JSON-Payload
- Moegliche Werte: POWERON, SOFTWARE, PANIC, TASK_WDT, INT_WDT, WDT, BROWNOUT, EXT_PIN, DEEPSLEEP, SDIO, UNKNOWN
- README.md: Status-JSON-Beispiel und Werteliste dokumentiert
2026-03-01 12:10:07 +01:00
MaPaLo76
323d4d0261 docs(README-md, Feature-Requests.md) 2026-03-01 10:11:28 +01:00
MaPaLo76
d0131cc8b0 docs: FR-007/009 in Erledigt verschoben; Offen-Sektion bereinigt 2026-03-01 00:04:47 +01:00
MaPaLo76
c40668f216 feat(FR-007): session_id in MQTT Session-Payload; Reset bei reset/reset_session; Version 1.2.0 2026-03-01 00:04:17 +01:00
MaPaLo76
f655a9d9c1 docs: FR-009 Commit-Hash ergänzt 2026-02-28 23:56:37 +01:00
MaPaLo76
aae34fe84a fix(FR-009): startTime in SessionPayload speichern – session_start_time bei Queue-Nachlieferung korrekt 2026-02-28 23:56:11 +01:00
MaPaLo76
af533965c4 docs: FR-006 Commit-Hash ergänzt; FR-009 session_start_time in Queue-Payload 2026-02-28 23:50:30 +01:00
MaPaLo76
96508910b0 fix(FR-006): MQTT Session-Queue (128 Slots) statt volatile Einzelslot; Dequeue erst nach erfolgreichem Publish 2026-02-28 23:49:29 +01:00
MaPaLo76
abde7fb154 fix: showIdle() zeigt AUS statt -- bei Laser aus; BMP_S Shape korrigiert; Version 1.1.3 2026-02-28 23:09:41 +01:00
MaPaLo76
c636add134 fix(laser): FR-008 getTotalMinutes() Doppelzaehlung entfernt, MQTT reset->resetSessionSum 2026-02-28 22:41:51 +01:00
MaPaLo76
4a7801e2a8 fix(display): showSessionRing 1-basiert (1..60), kein Flash bei Session-Start 2026-02-28 22:38:59 +01:00
MaPaLo76
c75dd8eee1 docs: FR-005 zweiten Commit-Hash nachtragen (b91b3ca) 2026-02-28 19:05:26 +01:00
MaPaLo76
b91b3ca96f fix(mqtt): Netzwerk-Objekte per new auf Core 0 anlegen - Heap-Korruption behoben
- WiFiClient, WiFiClientSecure, PubSubClient als Pointer deklariert (nullptr init)
- Objekte werden erst in _taskLoop() auf Core 0 per 'new' erstellt
- mbedtls bindet Heap-Allokationen an den erstellenden Core/Task
  -> Anlegen auf Core 1 (globaler Konstruktor) + Nutzung auf Core 0 = Heap-Korruption
  -> Fix: Anlegen UND Nutzung ausschliesslich auf Core 0
- isConnected(), printToSerial(): Null-Checks ergaenzt
2026-02-28 19:05:09 +01:00
MaPaLo76
eeede50f1c docs: FR-005 Commit-Hash nachtragen (a7c6edb) 2026-02-28 18:07:45 +01:00
MaPaLo76
a7c6edb458 fix(mqtt): MQTT-Task auf Core 0 auslagern - TLS-Blocking behebt WDT-Crash und Display-Freeze
- WiFiClientSecure/mbedtls ausschliesslich auf Core 0 initialisiert und verwendet
  (Cross-Core-Heap-Korruption durch mbedtls vermieden)
- xTaskCreatePinnedToCore('mqtt_task', Core 0, 16 KB Stack)
- begin() startet nur Task, kein Netzwerk-Zugriff auf Core 1
- mqttClient.loop() in main.cpp ist No-Op
- publishSession() von Core 1 via volatile-Flags an Core-0-Task uebergeben
- Version: 1.1.0 -> 1.1.1
2026-02-28 18:07:27 +01:00
MaPaLo76
b70c459ca8 docs: FR-002 Commit-Hash nachtragen (4dd4ce0) 2026-02-28 17:26:08 +01:00
MaPaLo76
4dd4ce0620 feat(FR-002): Web Console via HTTP-Polling (/log + /log-data) -- v1.1.0
- Ring-Buffer _logBuf in web_server.cpp: webLogForward() schreibt auf Core 1
- GET /log-data liefert Puffer als Plain-Text (kein WebSocket, kein Core-Konflikt)
- Browser pollt alle 2 s, Auto-Scroll, dunkles Terminal-Theme
- LOG_I/LOG_E/LOG_D: Timestamp (HH:MM:SS nach NTP, sonst +Xs), webLogForward()
- Alle Serial.* in laser_tracker.cpp, mqtt_client.cpp, web_server.cpp auf LOG_I/LOG_E
- main.cpp: esp_reset_reason() beim Booten loggen (POWER_ON / WATCHDOG / PANIC...)
- telnet_logger.h entfernt (war nur noch Deprecated-Stub)
- Feature-Requests.md: FR-002 abgeschlossen
2026-02-28 17:24:56 +01:00
MaPaLo76
a97fa0c111 fix(mqtt): session_sum Binaerzahl-Bug behoben
- String(int, 2) interpretiert 2. Argument als Basis (binaer), nicht Dezimalstellen
  Beispiel: 18 Min -> '10010' (binaer)
- Fix: direkter int-Wert als JSON-Integer (kein serialized/String noetig)
- platformio.ini: Version 1.0.1 -> 1.0.2
- Feature-Requests.md: FR-004 dokumentiert und abgeschlossen
2026-02-27 21:18:02 +01:00
MaPaLo76
44929934bc docs(fr): FR-003 Commit-Hash korrigiert 2026-02-26 22:46:10 +01:00
MaPaLo76
3a310828b6 fix(ntp): Zeitzone CET/CEST + Lokalzeit im MQTT-Payload
- wifi_connector.cpp: configTime(0,0) -> configTzTime(CET-1CEST,M3.5.0,M10.5.0/3)
  Automatische Sommer-/Winterzeitumschaltung fuer Deutschland
- mqtt_client.cpp: gmtime() -> localtime(), Z-Suffix entfernt
  session_start_time zeigt Lokalzeit (CET/CEST)
- platformio.ini: Version 1.0.0 -> 1.0.1 (Patch)
- README.md: session_start_time Dokumentation aktualisiert
- Feature-Requests.md: FR-003 abgeschlossen
2026-02-26 22:45:53 +01:00
MaPaLo76
6eceadf011 docs(fr): FR-002 Web Console (WebSerial) eingetragen 2026-02-26 22:26:00 +01:00
MaPaLo76
75f5b7a576 feat(web,mqtt): Firmware-Version auf Webseite und MQTT-Status
- platformio.ini: -DFIRMWARE_VERSION='1.0.0' als build_flag (Single Source of Truth)
- config.h: #ifndef FIRMWARE_VERSION Fallback fuer Arduino IDE
- web_server.cpp: config.h eingebunden; Firmware-Zeile in Statustabelle (/);
  Footer 'v1.0.0 (Feb 26 2026)' auf /config
- mqtt_client.cpp: firmware_version im lasercutter/status Payload;
  buf von 160 auf 220 Bytes vergroessert
- Feature-Requests.md: FR-001 dokumentiert
2026-02-26 21:53:05 +01:00
MaPaLo76
234a3a4b9b docs(plan): Phase 10 abgeschlossen, Projekt vollstaendig dokumentiert
- Implementation-Plan.md: Phase 10 alle Tasks als erledigt markiert
- README.md: Implementierungsstand-Tabelle aktualisiert (Phase 8-10 abgeschlossen)
2026-02-26 21:41:08 +01:00
MaPaLo76
fcb992d5d1 docs(plan): Phase 9 abgeschlossen, Feature-Requests.md eingeführt
- Implementation-Plan.md: Phase 9 als abgeschlossen markiert
- copilot-instructions.md: Commit-Regel geändert
  Bug Fix / kleines Feature -> Feature-Requests.md
  Neue Phase / Architektur -> Implementation-Plan.md
- Feature-Requests.md: neu erstellt für laufende Bug Fixes und Feature Requests
2026-02-26 21:40:11 +01:00
MaPaLo76
6bef93210e feat(ota): ArduinoOTA integration + platformio.ini refactor
- ArduinoOTA in web_server.cpp integriert (Hostname: lasercutter-display)
- WebServerManager::loop() hinzugefuegt -> ArduinoOTA.handle()
- webServer.loop() in main.cpp aufgerufen
- platformio.ini: gemeinsamer [env]-Basisblock (lib_deps einmalig)
- Neues env az-delivery-devkit-v4-ota (espota, upload_flags --auth Anleitung)
- Neues env az-delivery-devkit-v4-ota-http (ElegantOTA HTTP Fallback)
- upload_ota.py: HTTP-Multipart-Upload Script fuer ElegantOTA
- README.md: Abschnitt Via WiFi (OTA) mit Passwort-Anleitung
- Implementation-Plan.md: Task 9.9 dokumentiert
2026-02-26 21:35:55 +01:00
MaPaLo76
974616aee2 refactor(wifi): non-blocking WiFi-Architektur (Proposal B+D)
- WiFiManager als Pointer, lazy new in begin() verhindert Crash durch
  globale Konstruktoren vor Arduino-Framework-Init
- WiFi.mode(WIFI_STA) vor Credentials-Pruefung; getWiFiSSID(true) statt
  WiFi.SSID() (erfordert gestarteten Stack)
- Credentials vorhanden: WiFi.begin() non-blocking, Ergebnis in loop()
- Keine Credentials: setConfigPortalBlocking(false) + process() in loop()
- Nach 3 Fehlversuchen: startConfigPortal() automatisch
- onConnect(): stopWebPortal() vor AsyncWebServer-Start (Port-80-Konflikt)
- main.cpp: LaserTracker startet vor WiFi (Prioritaet 1)
- MQTT + WebServer: Lazy-Init beim ersten WiFi-Connect
- Display rate-limited: W 500ms-Blinker, Minuten 60s, Sekunden 1s, M bei Aenderung
- Manuell getestet: LaserTracker laeuft sofort, WiFi non-blocking verifiziert
2026-02-26 21:05:22 +01:00
MaPaLo76
7fb14307ea Vor Architektur Änderung 2026-02-26 18:50:45 +01:00
MaPaLo76
e045dcb756 Update - Screeshots 2026-02-23 22:58:17 +01:00
MaPaLo76
3516e58dc6 feat(web): Konfigurationsseite Buttons gleich breit
- buildConfigPage(): width:100% fuer alle Buttons (via .btn-Klasse)
- Flex-Spalten-Layout identisch zur Statusseite (gap:.6rem, margin-top:1.5rem)
- Farben unveraendert: Blau=Speichern, Grau=Abbrechen
- Implementation-Plan.md Phase 7.8 ergaenzt
2026-02-23 22:56:09 +01:00
MaPaLo76
99b5c25e37 feat(tracker): resetSessionSum + MQTT reset_session + UI-Verbesserungen
- resetSession() umbenannt in resetSessionSum() (klarere Semantik)
- Bug fix: resetSessionSum() setzt laufende Session-Timer korrekt zurueck
  (vorher: getAllSessionsSumMinutes() blieb > 0 nach Reset)
- consumeSessionReset() nach consumeSessionEnd()-Muster (consume-Semantik)
- Vor Reset: akkumulierte Netto-Sekunden sichern -> publishSession() wie Session-Ende
- MQTT: payload {reset_session:true} via lasercutter/reset loest resetSessionSum() aus
- MQTT: Session-Reset publiziert identisches JSON wie normales Session-Ende
- Web: Button-Layout ueberarbeitet (alle 3 Buttons blau, uebereinander, gleich breit)
- Docs: README.md + Implementation-Plan.md aktualisiert
2026-02-23 22:49:30 +01:00
MaPaLo76
fde1f12315 fix(auth): HTTP Basic Auth funktioniert korrekt
- requestAuthentication() auf Basic Auth umgestellt (false = kein Digest)
- webPassword/webUser Buffer von 32 auf 64 Byte vergroessert
- POST /config: leeres Passwortfeld laesst bestehendes Passwort unveraendert
- Checkbox 'clear_auth' zum expliziten Deaktivieren des Schutzes
- Temporaere Debug-Ausgaben entfernt
2026-02-23 22:09:28 +01:00
MaPaLo76
07c99dc7d8 feat(web): HTTP-Basic-Auth fuer alle Routen; webUser/webPassword in NVS; ElegantOTA.setAuth() 2026-02-23 21:32:47 +01:00
MaPaLo76
18a1f67f64 feat(mqtt): session_start_time ISO-8601 UTC; NTP waitForNtp nach WLAN-Connect; docs: README + Plan Phase 9 abgeschlossen 2026-02-23 21:23:45 +01:00
MaPaLo76
2073c3678c feat(main): Phase 9 - LOG_D, getFreeHeap-Monitor; fix: PIMPL web_server loest ESPAsyncWebServer/WiFiManager HTTP-Enum-Konflikt 2026-02-23 21:06:59 +01:00
MaPaLo76
530d2f4670 feat(main): Phase 8 - WebServer, Watchdog, WLAN/MQTT-Fehlerstatus, Initialisierungsreihenfolge, Ceiling-Minuten pro Session 2026-02-23 20:50:04 +01:00
MaPaLo76
e273f1ea6c feat(display): showSessionRing - Sekunden-Kreisanzeige auf Modulen 5-7, 12-Uhr-Start (Phase 5b / 5.7 abgeschlossen) 2026-02-23 20:19:33 +01:00
MaPaLo76
4111f451d4 docs(tests): Burst-Begriff durch Session ersetzt, MQTT-Payloads aktualisiert 2026-02-23 19:53:35 +01:00
MaPaLo76
e98002db7b refactor(laser,web): getSessionMinutes->getAllSessionsSumMinutes, Platzhalter SESSION->ALLSESSIONS, BURST->LASTSESSION 2026-02-23 19:50:47 +01:00
MaPaLo76
d644ff4986 refactor(laser): Burst-Begriff durch Session ersetzt (BurstState->SessionState, getLastBurstSeconds->getLastSessionSeconds, consumeBurstEnd->consumeSessionEnd) 2026-02-23 19:33:40 +01:00
MaPaLo76
ff67b07144 fix(mqtt): publishSession nicht bei GRATIS-only Burst (lastBurstSec == 0) 2026-02-23 19:25:43 +01:00
MaPaLo76
d0d4666cf7 refactor(mqtt,web): Terminologie Session/Maschinenlaufzeit, JSON-Felder aktualisiert 2026-02-23 19:17:29 +01:00
MaPaLo76
dbe2e9791b Update README.md Screenshots 2026-02-22 21:22:54 +01:00
MaPaLo76
e18b00f37e Update README.md Screenshots 2026-02-22 21:21:24 +01:00
MaPaLo76
52b04ac9a6 Update README.md Screenshots 2026-02-22 21:20:06 +01:00
MaPaLo76
546b155af2 fix(web): POST /reset setzt nur Session zurueck (resetSession), nicht NVS-Gesamtzeit 2026-02-22 20:55:24 +01:00