MQTT-Display-LaserCutter/include/web_server.h
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

63 lines
2.2 KiB
C++
Raw 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.

#pragma once
// =============================================================================
// web_server.h HTTP-Webinterface für Statusanzeige und Konfiguration
// Projekt: MQTT-Display LaserCutter
//
// Basierend auf ESPAsyncWebServer (non-blocking, Task-safe).
//
// Routen:
// GET / Statusseite (Session, Gesamtzeit, WLAN/MQTT-Status)
// GET /config Konfigurationsformular (MQTT, Gratiszeit, Polarität)
// POST /config Konfiguration speichern (NVS via SettingsManager)
// POST /reset Gesamtzeit zurücksetzen (laserTracker.resetTotal())
// GET /update OTA-Update-Seite (ElegantOTA)
// POST /update Firmware-Upload (ElegantOTA)
// GET /log Web-Log-Console (WebSocket-Empfänger)
// WS /log-ws WebSocket-Endpunkt für Live-Log-Streaming
//
// Verwendung:
// webServer.begin(); // einmalig in setup(), nach WiFi-Connect
// // kein loop() nötig ESPAsyncWebServer ist vollständig async
// =============================================================================
#include <Arduino.h>
// Forward-Declarations: ESPAsyncWebServer.h nur in web_server.cpp einbinden
// (verhindert HTTP_GET/POST-Enum-Konflikt mit WiFiManager in main.cpp)
class AsyncWebServer;
class AsyncWebServerRequest;
class AsyncWebSocket;
class WebServerManager {
public:
WebServerManager();
// Routen registrieren und Server starten (einmalig nach WiFi-Connect)
void begin();
// ArduinoOTA verarbeiten in jedem loop()-Durchlauf aufrufen
void loop();
// WebSocket: Status-JSON an alle /status-ws Clients pushen
void sendStatusWs();
private:
AsyncWebServer* _server; // PIMPL: Pointer, full type only in web_server.cpp
AsyncWebSocket* _ws; // WebSocket-Endpunkt /log-ws
AsyncWebSocket* _statusWs; // WebSocket-Endpunkt /status-ws
void registerRoutes();
// HTTP-Basic-Auth pruefen; gibt false zurueck und sendet 401 wenn nicht autorisiert
bool requireAuth(AsyncWebServerRequest* request);
// HTML-Seiten als Strings aufbauen
String buildStatusPage();
String buildConfigPage();
String buildLogPage();
};
// Globale Instanz
extern WebServerManager webServer;