Tau.Acuvim/firmware/include/web_server.h
Renier Forster 84a0668c54 Initial commit: Tau Acuvim IoT monitoring system
Complete IoT monitoring platform for Acuvim II power meters via ESP32.

Firmware (Phases 1-7):
- ESP32-WROVER-B (TTGO T-Call v1.4) with RS485 Modbus RTU
- WiFi STA+AP concurrent mode with GSM/GPRS failover
- Transport abstraction layer with 4 priority modes
- MQTT protocol with 20 commands, LWT, QoS, exponential backoff
- SD card offline buffering with JSONL rotation and non-blocking drain
- OTA firmware updates with dual partition rollback protection
- Watchdog timer, crash loop detection, Acuvim health monitoring
- Captive portal provisioning with AP mode

Console backend (Phase 8):
- .NET 10 minimal API with PostgreSQL + EF Core
- JWT authentication, SignalR real-time updates
- MQTTnet 5.x bridge service with health monitoring
- Device, telemetry, firmware, alert, group management
- Rate limiting, security headers, Swagger/OpenAPI

Frontend (Phase 9):
- React 18 + TypeScript + Vite with Ant Design 5
- ECharts telemetry visualization, TanStack Query
- SignalR live updates, device management UI
- Dashboard, fleet management, firmware deployment

Testing & Production (Phase 10):
- 28 firmware unit tests (Modbus, JSON, config, version)
- 23 xUnit backend tests (device, telemetry, command, alert)
- Docker Compose with nginx, TLS MQTT, PostgreSQL
- Production deployment, commissioning, and troubleshooting docs

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-16 19:05:32 +02:00

95 lines
3.4 KiB
C++

#ifndef WEB_SERVER_H
#define WEB_SERVER_H
#include <Arduino.h>
#include <ESPAsyncWebServer.h>
#include <DNSServer.h>
#include "config_manager.h"
#include "wifi_manager.h"
#include "gsm_manager.h"
#include "transport_manager.h"
#include "mqtt_client.h"
#include "acuvim_reader.h"
#include "sd_manager.h"
#include "ota_manager.h"
class WebPortal {
public:
WebPortal();
void begin(ConfigManager& config, WifiManager& wifi,
MqttClient& mqtt, AcuvimReader& acuvim,
GsmManager& gsm, TransportManager& transport,
SdManager& sd, OtaManager& ota);
void loop();
void stop();
void setLatestData(const AcuvimData& data) { _lastData = data; }
private:
AsyncWebServer _server;
DNSServer _dns;
ConfigManager* _config;
WifiManager* _wifi;
GsmManager* _gsm;
TransportManager* _transport;
MqttClient* _mqtt;
AcuvimReader* _acuvim;
SdManager* _sd;
OtaManager* _ota;
AcuvimData _lastData;
void setupRoutes();
void setupCaptivePortal();
void sendJsonResponse(AsyncWebServerRequest* req, int code, const String& json);
void sendSuccess(AsyncWebServerRequest* req, const char* message);
void sendError(AsyncWebServerRequest* req, int code, const char* message);
void handleStatus(AsyncWebServerRequest* req);
void handleDeviceInfo(AsyncWebServerRequest* req);
void handleLatestTelemetry(AsyncWebServerRequest* req);
void handleWifiScan(AsyncWebServerRequest* req);
void handleGetWifiConfig(AsyncWebServerRequest* req);
void handlePostWifiConfig(AsyncWebServerRequest* req, uint8_t* data, size_t len);
void handleWifiDisconnect(AsyncWebServerRequest* req);
void handleGetMqttConfig(AsyncWebServerRequest* req);
void handlePostMqttConfig(AsyncWebServerRequest* req, uint8_t* data, size_t len);
void handleGetSleepConfig(AsyncWebServerRequest* req);
void handlePostSleepConfig(AsyncWebServerRequest* req, uint8_t* data, size_t len);
void handleGetConsoleConfig(AsyncWebServerRequest* req);
void handlePostConsoleConfig(AsyncWebServerRequest* req, uint8_t* data, size_t len);
void handleGetModbusConfig(AsyncWebServerRequest* req);
void handlePostModbusConfig(AsyncWebServerRequest* req, uint8_t* data, size_t len);
void handleGetGsmConfig(AsyncWebServerRequest* req);
void handlePostGsmConfig(AsyncWebServerRequest* req, uint8_t* data, size_t len);
void handleGetGsmStatus(AsyncWebServerRequest* req);
void handleGetTransportConfig(AsyncWebServerRequest* req);
void handlePostTransportConfig(AsyncWebServerRequest* req, uint8_t* data, size_t len);
void handleGetSdStatus(AsyncWebServerRequest* req);
void handlePostSdDrain(AsyncWebServerRequest* req);
void handlePostSdCleanup(AsyncWebServerRequest* req);
void handleGetOtaStatus(AsyncWebServerRequest* req);
void handlePostOtaCheck(AsyncWebServerRequest* req);
void handlePostOtaInstall(AsyncWebServerRequest* req, uint8_t* data, size_t len);
void handleOtaUpload(AsyncWebServerRequest* req, const String& filename,
size_t index, uint8_t* data, size_t len, bool final);
void handlePostOtaRollback(AsyncWebServerRequest* req);
void handleGetOtaConfig(AsyncWebServerRequest* req);
void handlePostOtaConfig(AsyncWebServerRequest* req, uint8_t* data, size_t len);
void handleRestart(AsyncWebServerRequest* req);
void handleFactoryReset(AsyncWebServerRequest* req);
};
#endif