- 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
71 lines
2.3 KiB
C++
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; |