/*
	28.06.2025
	12_OLED_WiFi-Manager2.ino	
	ESP8266-IoT-Manager mit MQTT
	
	WiFi Manager für IoT mit myWiFi_Manager.h mit zusätzlichen MQTT Parametern in LittleFS gespeichert
	Die eingegebenen Verbindungsdaten werden im nichtflüchtigen Speicher des ESP gespeichert (LittleFS)
	***** ACHTUNG ******  LittleFS.format(); beim ersten Mal aufrufen. (Siehe im void startWiFi_Manager() )
	Es folgt Prüfung ob MQTT Verbindungseinstellung ok ist. 

	
	Mit OLED und Lib: u8g2.h   (•	myOLED_u8g2.h und myLogo_u8g2.h)
	BuiltIn-LED  
	Taster D5 (GPIO_14) bei WiFi-Setup (nach RESET) abgefragt
      Es wird der LittleFS-Speicher gelöscht und der Wifi_Manager Start erzwungen.
  
	Access Point: 192.168.4.1 lebt nur 5 Min.
	siehe auch RandomNerdTutorial WiFi-Manager
	
*/

#include "myOLED_u8g2.h"     // Auslagerung der OLED Funktionen
#include "myWiFi_Manager.h"  // WiFi-Manager mit MQTT-Erweiterung

//const long timeout = 15000;  // 15 Sekunden Timeout für Verbindungen
unsigned long startReconnect = 0;
const int intervalMQTT_Test = 60000;  // 1 min

unsigned long startPart1 = 0;
const int intervalPart1 = 10000;  // 10 sec

void setup() {
  Serial.begin(115200);
  delay(100);
  Serial.println("\n\nWiFi Manager für IoT ohne WebServer. \nStart mit AP und 192.168.4.1 wenn kein WLAN verfügbar.");
  Serial.println("Mit MQTT Einstellungen");
  Serial.println("Wenn das verfügbare WLAN Probleme macht, dann mit der Taste an D5 (GPIO_14) den WiFi-Manager erzwingen\n");

  initOLED();  // siehe myOLED.h
  showLogo();
  delay(displayDelay);

  showStartText();
  delay(displayDelay);
  delay(displayDelay);

  snprintf(line1, sizeof(line1), "Start WiFi-Manager");        // Überschreibt line1 , Zeichenlänge 30 wird geprüft
  snprintf(line2, sizeof(line2), "Press Button for new");      //
  snprintf(line3, sizeof(line3), "WiFi + MQTT Setting");       //
  snprintf(line4, sizeof(line4), "            ********    ");  //
  snprintf(line5, sizeof(line5), "            ********    ");  //
  showTextOLED(lines, 5);                                      // siehe "myOLED_u8g2.h"

  startWiFi_Manager();  // siehe  "myWiFi_Manager.h"
  delay(displayDelay);    // wegen OLED

  Serial.println("\nStart Loop.\n");

}


void loop() {
  // MQTT Verbindung in bestimmten Intervallen prüfen und wiederherstellen, wenn nötig.  kein delay() verwenden
  if (millis() > startReconnect + intervalMQTT_Test) {
    // Teste zuerst die WLAN Netzwerkverbindung
    if (WiFi.status() != WL_CONNECTED) {
      Serial.println("Keine WiFi-Verbindung!");
      WiFi.reconnect();
    }

    // Teste die MQTT Verbindung
    if (!mqttClient.connected()) {
      reconnectMQTT();  // siehe myWiFi_Manager
    } else {
      snprintf(line4, sizeof(line4), "%s", config.mqtt_server);  // MQTT-Server-Adresse
      snprintf(line5, sizeof(line5), "MQTT: %s", brokerIP.toString().c_str());  // IP Adresse vom Broker
      showTextOLED(lines, 5);  // siehe "myOLED_u8g2.h"
    }

    startReconnect = millis();
  }

  mqttClient.loop();

  if (millis() > startPart1 + intervalPart1) {
    // YOUR CODE
    Serial.println("Fertig");
    startPart1 = millis();
  }

}


//
