#include <ESP8266WiFi.h> // Wifi-Bibliothek einbinden
#include <PubSubClient.h> // MQTT Bibliothek einbinden

const char* ssid = "DeineSSID"; // SSID deines Routers
const char* pwd = "DeinPasswort"; // WLan-Passwort deines Routers
const char* MeinBroker = "DeineBrokerAdresse"; // MQTT-Server (Broker) Adresse
const int BrokerPort = 1883; // Broker-Portnummer
const char* Topic = "test1"; // Topic-Name
int x = 0;

WiFiClient espClient;
PubSubClient client(espClient);

void WifiSetup() {
Serial.println(); // Leerzeile
Serial.println("ESP gestartet"); // Begrüßungstext
WiFi.begin(ssid, pwd); // SSID und Passwort übergeben
Serial.println("Starte WiFi-Verbindung");
while (WiFi.status() !=WL_CONNECTED) // gib Punkte aus bis WLan-Verbindung steht
{ delay(250); Serial.print("."); }
Serial.println(); // Leerzeile
Serial.print("Verbunden über IP: ");
Serial.println(WiFi.localIP()); // gibt die IP aus mit der der ESP8266 am Router angemeldet ist
}

void reconnect() {
while (!client.connected()){ // Verbinde mit Broker
Serial.print("Verbinde mit MQTT Broker...");
if (client.connect("UUID-0815")){ // // hier eine eindeutige Client-ID angeben
Serial.println(" verbunden");
client.subscribe(Topic); // Topic abonnieren (hier "test1")
} else {delay(5000);}} // in 5 Sekunden erneut versuchen
}

void callback(char *topic, byte *payload, unsigned int length){
Serial.print("Nachricht: ");
String message;
for (int i = 0; i < length; i++){message += (char)payload[i];}
Serial.println(message);

if (message == "ein"){ // wenn Nachricht "ein" eintrifft...
Serial.println("LED eingeschaltet");
digitalWrite(LED_BUILTIN, LOW);} // dann LED einschalten
if (message == "aus"){ // wenn Nachricht "aus" eintrifft...
Serial.println("LED ausgeschaltet");
digitalWrite(LED_BUILTIN, HIGH);} // dann LED ausschalten
}

void setup() {
Serial.begin(9600); // Übertragungsgeschwindigkeit Serial-Monitor
pinMode(LED_BUILTIN, OUTPUT); // LED initialisieren
digitalWrite(LED_BUILTIN, HIGH); // LED ausschalten
// initiale Wifi
WifiSetup();
// initiale Serververbindung
client.setServer(MeinBroker, BrokerPort);
client.setCallback(callback);
}

void loop() {
if (!client.connected()){reconnect();} // Rufe Funktion "reconnect" auf, wenn nicht mehr verbunden
client.loop();
}