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

71 lines
2.3 KiB
C++

#pragma once
// =============================================================================
// mqtt_client.h - MQTT-Verbindung, Publish und Subscribe
// Projekt: MQTT-Display LaserCutter
//
// Wrapper um PubSubClient mit Non-Blocking Reconnect.
//
// Publish:
// publishSession() - beim Ende eines Laser-Bursts (aus LaserTracker)
// publishStatus() - Heartbeat alle MQTT_HEARTBEAT_MS
//
// Subscribe:
// lasercutter/reset - Payload "1" oder {"reset":true} -> laserTracker.resetTotal()
// Payload {"reset_session":true} -> laserTracker.resetSessionSum()
//
// Verwendung:
// mqttClient.begin(); // einmalig in setup(), nach WiFi-Connect
// mqttClient.loop(); // in jedem loop()-Aufruf
// =============================================================================
#include <Arduino.h>
#include <PubSubClient.h>
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include "config.h"
#include "settings.h"
class MqttClient {
public:
MqttClient();
// MQTT konfigurieren und erste Verbindung versuchen (einmalig in setup())
void begin();
// Verbindung halten, Reconnect, Heartbeat - in jedem loop()-Aufruf
void loop();
// Publish: Session-Ende (wird von LaserTracker-Logik in main aufgerufen)
// lastSessionSec : Netto-Sekunden der letzten Session
// gratisSec : konfigurierte Gratiszeit
// JSON-Felder: session_minutes (ceiling int), session_seconds (raw), freetime_s, ip
void publishSession(int lastSessionSec, int gratisSec);
// Verbindungsstatus
bool isConnected();
// Debug-Ausgabe auf Serial
void printToSerial();
private:
WiFiClient _wifiClient;
WiFiClientSecure _secureClient; // fuer TLS (Port 8883)
PubSubClient _client;
uint32_t _lastReconnectMs;
uint32_t _lastHeartbeatMs;
char _clientId[32]; // MQTT_CLIENT_ID + MAC-Suffix (eindeutig auf Public Broker)
// Verbindungsaufbau (intern, non-blocking: gibt true zurueck wenn verbunden)
bool reconnect();
// Heartbeat-Publish (lasercutter/status)
void publishHeartbeat();
// Callback fuer eingehende Nachrichten (static wegen PubSubClient-API)
static void onMessage(const char* topic, byte* payload, unsigned int length);
};
// Globale Instanz
extern MqttClient mqttClient;