Ich hab mal kurz in die lib geschaut und halte das ganze construct um den mqttClient.poll(); für überflüssig.
Dann hast Du beim connect im setup() keine Routine dabei, wenn es keinen connect gibt. Die würde ich nicht raus lassen....
Mir ist noch nicht ganz klar, was Du mit den 4 LED's veranstaltest.
Zum einen lässt Du Dir die Zustände der Relais ausgeben, aber im gleichem Atemzug bastelst Du ein Lauflicht drauf...
Ich würde den ganzen Kram mal weg lassen und nur auf das notwendigste mit dem example "WifiSimpleReceive" zurück gehen und mit geänderten Zugangs und Brokerdaten versuchen, ob es überhaupt eine Verarbeitung gibt und dann von dort aus loslegen.
Ich habe Deinen mal bis hierhin umgebaut - noch nicht fertig, aber ich brauch den Rechner jetzt 
#include <ArduinoMqttClient.h>
//#include <Ethernet.h>
#include <WiFi.h>
const char ssid[] = "xxx";
const char password[] = "xxx?";
const char hostname[] = "xxx";
WiFiClient wlan;
//Ethernet
//const char hostname[] = "xxx";
//EthernetClient lanclient;
//MQTT
MqttClient mqttClient(wlan);
const char broker[] = "xxx";
int port = 1883;
const char topic[] = "xxx";
//LED
const int StatusLed[] = { LED_D0, LED_D1, LED_D2, LED_D3 };
const int SocSchaltpunkt[] = { 20, 50}; // SOC-Schaltpunkt
const int NUM_LED_and_Relais = 4;
//Inputs
const int Eingang[] = { A0, A1, A2 };
const int NUM_PINS = 3;
// Relais
int relais[] = { D0, D1, D2, D3 };
String buff = "";
int soc = 0;
int stufe = 2;
int umschaltsperre = 0;
int speicherMin = 80;
void setup()
{
Serial.begin(9600);
// Initialize LED_BUILTIN as an output
pinMode(LED_RESET, OUTPUT);
pinMode(LED_USER, OUTPUT);
// Initialize LED_D0-D3 as an output
for (int i = 0; i < NUM_LED_and_Relais; i++)
{
pinMode(StatusLed[i], OUTPUT);
pinMode(relais[i], OUTPUT);
}
pinMode(BTN_USER, INPUT);
for (int i = 0; i < NUM_PINS; i++)
{
pinMode(Eingang[i], INPUT);
}
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
digitalWrite(LED_RESET, HIGH);
delay(500);
digitalWrite(LED_RESET, LOW);
delay(500);
}
Serial.println("WiFi verbunden");
// Ethernet
//Ethernet.setHostname(hostname);
//Ethernet.begin();
// Connect to MQTT broker
Serial.print("MQTT connection ");
if (!mqttClient.connect(broker, port))
{
Serial.print("failed! Error code = ");
Serial.println(mqttClient.connectError());
while (1);
}
else
{
Serial.println("succesfull");
}
Serial.print("MQTT Subscribe: ");
Serial.println(mqttClient.subscribe("soc"));
// set the message receive callback
mqttClient.onMessage(onMqttMessage);
}
void getMQTTConnect()
{
//Steuerung, mqtt-Abfrage einschalten
if (mqttClient.connected())
{
digitalWrite(LED_USER, LOW);
}
else
{
Serial.print("MQTT connection failed! Error code = ");
Serial.println(mqttClient.connectError());
digitalWrite(LED_USER, HIGH);
delay(5000);
soc = 0;
}
}
void loadType()
{
if (digitalRead(Eingang[1]) == LOW)
{
umschaltsperre = 0;
}
if (umschaltsperre == 0)
{
switch (stufe)
{
case 1:
digitalWrite(relais[1], HIGH);
delay(500);
digitalWrite(relais[1], LOW);
stufe = 2;
umschaltsperre = 1;
break;
case 2:
digitalWrite(relais[1], HIGH);
delay(500);
digitalWrite(relais[1], LOW);
delay(500);
digitalWrite(relais[1], HIGH);
delay(500);
digitalWrite(relais[1], LOW);
stufe = 1;
umschaltsperre = 1;
break;
default:
stufe = 1;
break;
}
}
}
void lauflicht()
{
digitalWrite(StatusLed[0], LOW);
digitalWrite(StatusLed[1], LOW);
digitalWrite(StatusLed[2], LOW);
digitalWrite(StatusLed[3], LOW);
delay(100);
digitalWrite(StatusLed[0], HIGH);
delay(25);
digitalWrite(StatusLed[1], HIGH);
delay(25);
digitalWrite(StatusLed[2], HIGH);
digitalWrite(StatusLed[0], LOW);
delay(25);
digitalWrite(StatusLed[3], HIGH);
digitalWrite(StatusLed[1], LOW);
delay(25);
digitalWrite(StatusLed[2], LOW);
digitalWrite(StatusLed[3], LOW);
}
void onMqttMessage(int messageSize)
{
const uint32_t timeOut = 1000;
uint32_t startZeit = millis();
uint8_t idx = 0;
Serial.println(startZeit);
buff = "";
// we received a message, print out the topic and contents
//Serial.print("Received a message with topic '");
//Serial.print(mqttClient.messageTopic());
//Serial.print("', length ");
//Serial.print(messageSize);
//Serial.println(" bytes:");
// use the Stream interface to print the contents
while (mqttClient.available() &&
idx < messageSize &&
millis() - startZeit < timeOut
)
{
char c = mqttClient.read();
buff += c;
idx++;
Serial.print(idx); Serial.print(", ");
}
soc = buff.toInt();
lauflicht();
}
void loop()
{
if (digitalRead(Eingang[0]) == HIGH)
{
mqttClient.poll();
getMQTTConnect();
loadType();
}
else
{
soc = 0;
}
// Freigabe zum Laden
if (speicherMin <= soc)
{ digitalWrite(relais[0], HIGH); }
else if (speicherMin - 1 > soc)
{ digitalWrite(relais[0], LOW); }
for (byte b = 0; b < NUM_LED_and_Relais; b++)
{
digitalWrite(StatusLed[b], digitalRead(relais[b]));
}
}