MQTT-Display-LaserCutter/platformio.ini
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

297 lines
12 KiB
INI
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
; =============================================================================
; GEMEINSAME BASIS - wird von allen Environments geerbt
; =============================================================================
[env]
platform = espressif32
board = az-delivery-devkit-v4
framework = arduino
monitor_speed = 115200
monitor_echo = yes
monitor_filters = esp32_exception_decoder, default
board_build.partitions = min_spiffs.csv
build_flags =
-DCORE_DEBUG_LEVEL=0 ; 0=keine, 1=Fehler, 3=Info, 5=Verbose
-DARDUINO_LOOP_STACK_SIZE=8192
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1
-DFIRMWARE_VERSION='"1.6.4"' ; Semantic Versioning hier erhöhen bei neuem Release
lib_deps =
majicDesigns/MD_Parola @ ^3.7.3
majicDesigns/MD_MAX72XX @ ^3.5.1
knolleary/PubSubClient @ ^2.8
tzapu/WiFiManager @ ^2.0.17
https://github.com/me-no-dev/AsyncTCP.git
https://github.com/me-no-dev/ESPAsyncWebServer.git
bblanchon/ArduinoJson @ ^7.3.0
https://github.com/ayushsharma82/ElegantOTA.git
; =============================================================================
; HAUPT-ENVIRONMENT - USB Flash & Monitor
; pio run -e az-delivery-devkit-v4 --target upload
; =============================================================================
[env:az-delivery-devkit-v4]
upload_port = COM3
monitor_dtr = 0
monitor_rts = 0
; =============================================================================
; OTA ENVIRONMENT Firmware via WiFi flashen (ArduinoOTA / espota)
; Erscheint in Arduino IDE als Netzwerk-Port: lasercutter-display.local
; PlatformIO: pio run -e az-delivery-devkit-v4-ota --target upload
; IP anpassen: upload_port = <IP des ESP32> (oder lasercutter-display.local)
;
; Falls ein Web-Passwort gesetzt ist, muss es hier eingetragen werden:
; upload_flags = --auth=DEIN_WEBPASSWORT
; Oder als Umgebungsvariable (empfohlen, damit das Passwort nicht im Repo landet):
; Vor dem Upload: set LASERCUTTER_OTA_PW=DEIN_PASSWORT (Windows)
; upload_flags = --auth=${sysenv.LASERCUTTER_OTA_PW}
; =============================================================================
[env:az-delivery-devkit-v4-ota]
;upload_port = 172.30.30.90
upload_port = 192.168.2.65
upload_protocol = espota
#upload_flags = --auth=${sysenv.LASERCUTTER_OTA_PW} --timeout=60
; Vor dem Upload in PowerShell: $env:LASERCUTTER_OTA_PW = "DeinPasswort"
; Vor dem Upload in CMD: set LASERCUTTER_OTA_PW=DeinPasswort
; Kein Passwort gesetzt: Variable leer lassen oder weglassen (espota ignoriert leeren --auth)
; =============================================================================
; OTA ENVIRONMENT (HTTP) Firmware via ElegantOTA Webinterface
; Nur als Fallback falls ArduinoOTA nicht erreichbar
; pio run -e az-delivery-devkit-v4-ota-http --target upload
; =============================================================================
[env:az-delivery-devkit-v4-ota-http]
;upload_port = 172.30.30.90
upload_port = 192.168.2.65
upload_protocol = custom
extra_scripts = upload_ota.py
; =============================================================================
; TEST ENVIRONMENT 1.4 Dot-Matrix-Display Verdrahtungstest
; Flash: pio run -e test-display --target upload
; =============================================================================
[env:test-display]
platform = espressif32
board = az-delivery-devkit-v4
framework = arduino
upload_port = COM3
monitor_speed = 115200
monitor_echo = yes
build_src_filter = -<*> +<../test_sketches/test_display.cpp>
; SPI auf 1 MHz reduzieren: robuster bei 8 verketteten Modulen / langen Leitungen
build_flags =
-DMAX_SPI_CLOCK_SPEED=1000000L
-Wno-cpp ; unterdrückt "INFO: ARDUINO SPI interface selected"-Warning aus MD_MAX72XX
lib_deps =
majicDesigns/MD_Parola @ ^3.7.3
majicDesigns/MD_MAX72XX @ ^3.5.1
; =============================================================================
; TEST ENVIRONMENT Telnet-Server Verifikation (ohne externe Libraries)
; Testet ob WiFiServer/WiFiClient auf dem ESP32 korrekt schreibt.
; Credentials: TEST_WIFI_SSID + TEST_WIFI_PASSWORD in mqtt_test_secrets.h
; Flash: pio run -e test-telnet --target upload
; Monitor: pio device monitor (USB Serial, 115200)
; Telnet: telnet <IP> 23 (oder PuTTY Telnet Port 23)
; =============================================================================
[env:test-telnet]
platform = espressif32
board = az-delivery-devkit-v4
framework = arduino
upload_port = 172.30.30.90
upload_protocol = espota
monitor_speed = 115200
board_build.partitions = min_spiffs.csv
build_src_filter = -<*> +<../test_sketches/test_telnet.cpp>
; =============================================================================
; TEST ENVIRONMENT 1.5 Push Button / Potentialfreier Schalter Verdrahtungstest
; Flash: pio run -e test-button --target upload
; =============================================================================
[env:test-button]
platform = espressif32
board = az-delivery-devkit-v4
framework = arduino
upload_port = COM3
monitor_speed = 115200
monitor_echo = yes
build_src_filter = -<*> +<../test_sketches/test_button.cpp>
; =============================================================================
; TEST ENVIRONMENT 2.2 NVS Persistenz-Verifizierung
; Flash: pio run -e test-nvs --target upload
; Monitor: pio device monitor -e test-nvs
; =============================================================================
[env:test-nvs]
platform = espressif32
board = az-delivery-devkit-v4
framework = arduino
upload_port = COM3
monitor_speed = 115200
monitor_echo = yes
build_src_filter = -<*> +<../test_sketches/test_nvs.cpp> +<../src/settings.cpp>
; MD_MAX72XX wird nur wegen config.h -> DISPLAY_HW_TYPE benötigt
lib_deps =
majicDesigns/MD_MAX72XX @ ^3.5.1
; =============================================================================
; TEST ENVIRONMENT 3.3 WiFiManager Verbindungstest
; Flash: pio run -e test-wifi --target upload
; Monitor: pio device monitor -e test-wifi
; Credentials löschen: BOOT-Taste (GPIO 0) beim Start 3 s gedrückt halten
; =============================================================================
[env:test-wifi]
platform = espressif32
board = az-delivery-devkit-v4
framework = arduino
upload_port = COM3
monitor_speed = 115200
monitor_echo = yes
board_build.partitions = min_spiffs.csv
build_src_filter = -<*> +<../test_sketches/test_wifi.cpp> +<../src/wifi_connector.cpp>
lib_deps =
tzapu/WiFiManager @ ^2.0.17
majicDesigns/MD_MAX72XX @ ^3.5.1
; =============================================================================
; TEST ENVIRONMENT 5.6 LaserTracker Verifikation
; Flash: pio run -e test-laser-tracker --target upload
; Monitor: pio device monitor -e test-laser-tracker
; Button (GPIO 4) druecken = Laser aktiv simulieren
; BOOT-Taste (GPIO 0) 3s halten = Gesamtzeit loeschen
; =============================================================================
[env:test-laser-tracker]
platform = espressif32
board = az-delivery-devkit-v4
framework = arduino
upload_port = COM3
monitor_speed = 115200
monitor_echo = yes
build_src_filter = -<*> +<../test_sketches/test_laser_tracker.cpp> +<../src/display_manager.cpp> +<../src/settings.cpp> +<../src/laser_tracker.cpp>
build_flags =
-Wno-cpp
lib_deps =
majicDesigns/MD_MAX72XX @ ^3.5.1
; =============================================================================
; TEST ENVIRONMENT 4.3 DisplayManager Verifikation
; Flash: pio run -e test-display-mgr --target upload
; Monitor: pio device monitor -e test-display-mgr
; =============================================================================
[env:test-display-mgr]
platform = espressif32
board = az-delivery-devkit-v4
framework = arduino
upload_port = COM3
monitor_speed = 115200
monitor_echo = yes
build_src_filter = -<*> +<../test_sketches/test_display_manager.cpp> +<../src/display_manager.cpp>
build_flags =
-Wno-cpp
lib_deps =
majicDesigns/MD_MAX72XX @ ^3.5.1
; =============================================================================
; TEST ENVIRONMENT 6.5 MqttClient Verifikation
; Flash: pio run -e test-mqtt --target upload
; Monitor: pio device monitor -e test-mqtt
;
; Verifikation:
; - MQTT Explorer -> broker.hivemq.com:1883
; - Subscribe: lasercutter/#
; - lasercutter/status erscheint beim Connect (retained) und alle 60s
; - lasercutter/session erscheint nach Laser-AUS (GPIO 4 loslassen)
; - Publish lasercutter/reset Payload "1" -> Gesamtzeit wird geloescht
; - BOOT-Taste 3s halten -> lokaler Reset
; =============================================================================
[env:test-mqtt]
platform = espressif32
board = az-delivery-devkit-v4
framework = arduino
upload_port = COM3
monitor_speed = 115200
monitor_echo = yes
board_build.partitions = min_spiffs.csv
build_src_filter = -<*> +<../test_sketches/test_mqtt_client.cpp> +<../src/settings.cpp> +<../src/display_manager.cpp> +<../src/laser_tracker.cpp> +<../src/wifi_connector.cpp> +<../src/mqtt_client.cpp>
build_flags =
-Wno-cpp
lib_deps =
majicDesigns/MD_MAX72XX @ ^3.5.1
knolleary/PubSubClient @ ^2.8
tzapu/WiFiManager @ ^2.0.17
bblanchon/ArduinoJson @ ^7.3.0
; =============================================================================
; TEST ENVIRONMENT 7.7 WebServer Verifikation
; Flash: pio run -e test-web --target upload
; Monitor: pio device monitor -e test-web
;
; Verifikation:
; - IP-Adresse aus Serial Monitor ablesen
; - Browser: http://<IP>/ -> Statusseite
; - Browser: http://<IP>/config -> Konfigurationsformular
; - Browser: http://<IP>/update -> ElegantOTA
; - Gesamtzeit-Reset-Button testen
; - Konfiguration aendern + nach Neustart pruefen
; =============================================================================
[env:test-web]
platform = espressif32
board = az-delivery-devkit-v4
framework = arduino
upload_port = COM3
monitor_speed = 115200
monitor_echo = yes
board_build.partitions = min_spiffs.csv
build_src_filter =
-<*>
+<../test_sketches/test_web_server.cpp>
+<../src/settings.cpp>
+<../src/display_manager.cpp>
+<../src/laser_tracker.cpp>
+<../src/wifi_connector.cpp>
+<../src/mqtt_client.cpp>
+<../src/web_server.cpp>
build_flags =
-Wno-cpp
-DASYNC_TCP_SSL_ENABLED=0
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1
lib_deps =
majicDesigns/MD_MAX72XX @ ^3.5.1
knolleary/PubSubClient @ ^2.8
tzapu/WiFiManager @ ^2.0.17
bblanchon/ArduinoJson @ ^7.3.0
https://github.com/me-no-dev/AsyncTCP.git
https://github.com/me-no-dev/ESPAsyncWebServer.git
https://github.com/ayushsharma82/ElegantOTA.git
; =============================================================================
; WOKWI ENVIRONMENT Simulation im Wokwi-Simulator
; Baut die vollstaendige Firmware ohne WiFiManager-Portal.
; pio run -e wokwi
; Danach: F1 → "Wokwi: Start Simulator" (wokwi.toml zeigt auf dieses Build)
;
; Unterschiede zum echten Build:
; - WOKWI_BUILD=1: WiFi direkt via Wokwi-GUEST (kein WiFiManager-Portal)
; - Kein OTA
; - board = esp32dev (Standard Wokwi-Board)
; - board_build.partitions: default (Wokwi unterstuetzt keine custom partitions)
; =============================================================================
[env:wokwi]
board = esp32dev
build_flags =
${env.build_flags}
-DWOKWI_BUILD=1
-DDEFAULT_MQTT_BROKER='"${sysenv.LC_MQTT_BROKER}"'
-DDEFAULT_MQTT_PORT=${sysenv.LC_MQTT_PORT}
-DDEFAULT_MQTT_USER='"${sysenv.LC_MQTT_USER}"'
-DDEFAULT_MQTT_PASSWORD='"${sysenv.LC_MQTT_PASSWORD}"'