/**************************************************
 Beispiel: 
 
 ESP32 publiziert Nachrichten auf dem Public-Broker
 von shiftr.io

 Visualisierung:
 https://www.shiftr.io/try

***************************************************/

//-----------------------------------------------------------
#include <WiFi.h>
#include <MQTT.h>

//-----------------------------------------------------------
// WiFi:
const char WIFI_SSID[] = "Wokwi-GUEST";
const char WIFI_PASSWORD[] = "";

// Objekte:
WiFiClient wifinetwork;
MQTTClient mqttclient;

// Variablen:
uint32_t zeitStempel = 0;

//-----------------------------------------------------------
void setup() {
  //---
  // UART starten (115200 Baud)
  Serial.begin(115200);

  //---
  // WiFi verbinden
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  Serial.print("Verbinde mit ");
  Serial.print(WIFI_SSID);

  // Warten bis mit WiFi verbunden...
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(250);
  }
  Serial.println(" Verbunden!");

  //---
  // MQTT: Client starten
  mqttclient.begin(wifinetwork);

  // MQTT: Init Broker-Name
  mqttclient.setHost("public.cloud.shiftr.io");
  Serial.print("Verbinde mit MQTT-Broker ");

  // MQTT: Mit Broker verbinden...
  // - Client-ID:     BBW_ESP32_MUSTER
  // - User-Name:     public (für public-Broker von shiftr.io)
  // - User-Passwort: public (für public-Broker von shiftr.io)
  while (mqttclient.connect("BBW_ESP32_MUSTER", "public", "public") == false) {
    Serial.print(".");
    delay(250);
  }
  Serial.println(" Verbunden!");
}

//-----------------------------------------------------------
void loop() {
  //---
  // MQTT: CPU-Zeit für Client (senden und empfangen)
  mqttclient.loop();

  //---
  // T=1000ms (1 Hz)
  if ((millis() - zeitStempel) > 1000) {
    zeitStempel = millis();

    // MQTT: Nachricht publizieren
    // - Topic:   /BBW/MUSTER/TEXT
    // - Payload: Hallo Welt
    mqttclient.publish("/BBW/MUSTER/TEXT", "Hallo Welt");

    Serial.println("Nachricht wurde publiziert :-)");
  }


  // delay() nur nötig für bessere Simulatorleistung!!!
  // Beim realen ESP32 diesen delay() entfernen!!!
  delay(10);
}