/* ESP32 MQTT-Beispiel
 *  Benötigt die Bibliothek MQTT (by Joel Gaeswiller)
 *  Der ESP verbindet sich mit einem Broker, der Port kann hier nicht angegeben werden
 *  
 *  Per MQTT werden verschiedenen Nachrichten ausgetauscht
 *  Angepasst an simulierte Hardware in WokWi
 *  Autor: Spi 
 *  Version: 1.4
 *  Datum: 2024-01-20
 ***************************************************************************/  
#include <WiFi.h>
#include <MQTT.h>
// Update these with values suitable for your network.
const char* ssid = "IZZI-1EC0";
const char* password = "A9Q8R4ZZK71S";
const byte  channel = 6;    // wifi channel only for Wokwi
//#include <credentials.h>
//const char* mqtt_server = "192.168.1.1";
//const char* mqtt_server = "broker.hivemq.com";
const char* mqtt_server = "test.mosquitto.org";
const int LED_rot=32, Taster4=4;
WiFiClient net;
MQTTClient client;
unsigned long lastMillis = 0, lastToggle = 0;
bool Zustand;
char msg[50];
void connect() {
  Serial.print("Suche WLAN...");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(1000);
  }
  Serial.print("\nverbinde...");
  // ändern Sie den Client-Namen bitte ab
  while (!client.connect("20250228xx", "try", "try")) {
    Serial.print(".");
    delay(1000);
  }
  Serial.println("\nverbunden!");
  // subscribe topics
  client.subscribe("wvss/esp10/#");  
  // client.unsubscribe("wss/2ki2/chat/");
}
void messageReceived(String &topic, String &payload) {
  Serial.println("incoming: " + topic + " - " + payload);
  // Switch the LED if topic wvss/esp1/led was received  
  // and check the first character 
  if (topic == "wvss/esp10/led") {
    Serial.println("MQTT-Befehl erhalten");
    if ((char)payload[0] == '1') {
      digitalWrite(LED_rot, LOW);   // turn the LED on (low active)
    } else if ((char)payload[0] == '0'){
      digitalWrite(LED_rot, HIGH);  // turn the LED off 
    }
  }
  
}
void setup() {
  Serial.begin(115200);
  //WiFi.begin(ssid, password);   // automatic selsctrion of wifi-channel => use with local AP
  WiFi.begin(ssid, password, channel);
  pinMode(LED_rot, OUTPUT);
  pinMode(Taster4, INPUT_PULLUP);
  
  Zustand = true;
  // start MQTT connection to server
  client.begin(mqtt_server, net);
  // callback-function for received messages
  client.onMessage(messageReceived);
  connect();
  delay(1000);
  // send test message 
  client.publish("wvss/esp10/chat", "simulierter esp");
}
void loop() {
  client.loop();  // handle incoming MQTT messages
  
  if (!client.connected()) { // lost MQTT-connection? Reconnect 
    connect();
  }
  // publish a message every 2 seconds
  if (millis() - lastMillis > 2000) {
    lastMillis = millis();
    int iTaste = digitalRead(Taster4);
    snprintf (msg, 2, "%d", iTaste); // convert int to string
    client.publish("wvss/esp10/taster4", msg);
  }
  // send toggle-message every 5 seconds (heartbeat)
  if (millis() - lastToggle > 5000) {
    lastToggle = millis();
    Serial.println("Toggle");
    if(Zustand == true) {
      client.publish("wvss/esp10/toggle", "true");
    }
    else {
      client.publish("wvss/esp10/toggle", "false");
    }
    Zustand = ! Zustand;
  }
}