Commit Graph

38 Commits

Author SHA1 Message Date
MaPaLo76
f89db0787c docs: add commit hash to FR-020 2026-05-15 15:08:39 +02:00
MaPaLo76
9e3e06eb09 feat(state-machine): add grace time state after free time
Implements FR-020: Grace Time (buffer period after free time)

Problem: Fan relay signal continues ~5s after laser stops, causing
false billable time charges when user stops at countdown 1 second.

Solution: New GRACE state between GRATIS and NET_COUNTING with
configurable grace period (default 5s, range 0-30s). During grace
time, display shows blinking 0 (number of blinks = remaining seconds).
If laser stops during GRACE, no billable session is created.

State machine: INACTIVE -> GRATIS -> GRACE -> NET_COUNTING

Changes:
- config.h: Add DEFAULT_GRACE_TIME_S (5), MIN/MAX constants
- settings.h/cpp: Add graceTimeSeconds field, NVS persistence
- laser_tracker.h/cpp: Add GRACE state, transition logic
- display_manager.h/cpp: Add showGraceBlinking() with blink animation
- main.cpp: Add GRACE state handling in display update loop
- mqtt_client.cpp: Add grace_time_s field to session JSON
- web_server.cpp: Add Grace Time input field in config page
- README.md: Update documentation with GRACE state details
- Feature-Requests.md: Mark FR-020 as completed (v1.6.4)

Version: 1.6.4
Tested: Manual testing with logs and MQTT Explorer
2026-05-15 15:08:15 +02:00
MaPaLo76
da7842853e docs: Commit-Hash FR-019 nachtragen 2026-04-02 00:13:49 +02:00
MaPaLo76
94d86ae2e3 fix(display): reinit() respektiert _enabled-Flag, kein SHUTDOWN-Reset (FR-019, v1.6.3) 2026-04-02 00:13:36 +02:00
MaPaLo76
c625ed95da docs: Commit-Hash FR-018 nachtragen 2026-04-01 23:51:07 +02:00
MaPaLo76
a5717b2bc0 fix(display): reinit() nach Display-Einschalten via MQTT und Web-Toggle (FR-018, v1.6.2) 2026-04-01 23:50:55 +02:00
MaPaLo76
17bde6b765 docs: FR-017 Commit-Hash 1524a2a eingetragen 2026-03-07 16:32:16 +01:00
MaPaLo76
1524a2a585 fix(mqtt): FR-017 – Discovery-Sensor Maschinenlaufzeit hinzugefuegt (v1.6.1) 2026-03-07 16:31:38 +01:00
MaPaLo76
7a09b4ac94 docs: FR-015 + FR-016 Commit-Hash fc5e169 eingetragen 2026-03-07 16:18:00 +01:00
MaPaLo76
fc5e1694fd feat(mqtt,web): FR-015 + FR-016 sofortiger MQTT-Publish + WebSocket Live-Update (v1.6.0)
FR-015:
- publishHeartbeat() nach Display-Toggle, Session-Reset und Reboot-CMD
- publishHeartbeat() von private nach public (mqtt_client.h)
- Heartbeat-Intervall 60s -> 10s (config.h)
- HA Discovery Switch: state_on/state_off ergaenzt (mqtt_client.cpp)

FR-016:
- Neuer WebSocket-Endpunkt /status-ws (AsyncWebSocket)
- sendStatusWs() am Ende von publishHeartbeat() -> alle Ausloeser abgedeckt
- Statusseite: DOM-Updates via WebSocket, kein location.reload() mehr
- Config-Seite: Reboot-Button live deaktiviert wenn Laser aktiv
- Alle Action-Buttons auf fetch() umgestellt (Reboot, WLAN-Reset, Laufzeit-Reset)
- Display-Button: blau+gelb wenn an, grau+grau wenn aus
2026-03-07 16:17:39 +01:00
MaPaLo76
e6ad5363ea docs: FR-015 + FR-016 konkretisiert und korrekt geordnet (v1.6.0) 2026-03-07 13:10:15 +01:00
MaPaLo76
cf4bbf3177 docs: FR-014 als erledigt markiert (Commit 6c8be70, v1.5.2) 2026-03-06 21:49:02 +01:00
MaPaLo76
b6610dffc7 docs: FR-013 Commit-Hash nachgetragen (db1fd0b) 2026-03-04 21:41:09 +01:00
MaPaLo76
db1fd0b787 fix(mqtt): FR-013 device_class aus binary_sensor Discovery entfernt (v1.5.1)
- binary_sensor laser_active: device_class 'running' entfernt
- HA zeigt jetzt 'An' / 'Aus' statt 'In Betrieb' / 'Ausser Betrieb'
2026-03-04 21:40:45 +01:00
MaPaLo76
29f0970d62 docs: FR-012 als erledigt markiert (Commit ae3e40f, v1.5.0) 2026-03-04 19:43:06 +01:00
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
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
c75dd8eee1 docs: FR-005 zweiten Commit-Hash nachtragen (b91b3ca) 2026-02-28 19:05:26 +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
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