smarthome-tricks.de

ESP8266 MQTT connection closed: timeout

Im Artikel zeige ich Dir, wie Du den Timeout-Fehler beheben kannst.

Für ein ESP8266 Projekt in Verbindung mit ioBroker und dem MQTT-Adapter bekam ich die folgenden Timeout-Meldungen im ioBroker Log. Wenige Sekunden nach dem Verbindungsaufbau kam die Meldung, dass die Verbindung aufgrund eines Timeouts wieder geschlossen wurde. Das Problem habe ich so aber auch in Verbindung mit anderen MQTT-Brokern (z.B. HomeAssistant) gefunden.

In dem ESP8266 Projekt wurde für das MQTT-Protokoll die Bibliothek PubSubClient mit Version 2.8.0 verwendet. Über den ArduinoIDE Boardverwalter kann diese einfach installiert werden.

Im folgenden Screenshot siehst Du die Meldungen im ioBroker Log.

Nach 1-2 Stunden Recherche und Studieren von anderen Beispiel-Sourcen, habe ich dann die Lösung für das Problem gefunden. In meinem Arduino-Code wurde in der Setup-Funktion die Verbindung zum MQTT-Broker aufgebaut (connect-Methode). In der Loop-Methode wurde dann nur ein publish mit dem neuen Wert durchgeführt. Hier liegt das Problem, da der PubSubClient in meinem Fall wohl nach wenigen Sekunden die Verbindung verliert. Die Lösung ist daher relativ einfach. In der Loop-Funktion muss zu beginn geprüft werden, ob die Verbindung geöffnet ist. Falls die Verbindung geschlossen ist, muss hier ein erneuter connect() durchgeführt werden. Im folgenden Code zeige ich Dir die entsprechenden Funktionen sowie die Verwendung in der loop() Funktion.

const char* clientId = "test-device";
const char* ssid = "WIFI-SSID";
const char* password = "WIFI-PWD";
const char* mqtt_server = "IP";
const int mqtt_port = 1883;

WiFiClient espClient;
PubSubClient client(espClient);

void connectToMQTT() {
  // Die folgende Zeile muss einkommentiert werden, falls der MQTT-Broker eine Authentifizierung benötigt
  //if (client.connect(clientId , mqtt_user, mqtt_password)) {
  if (client.connect(clientId) ) {
    Serial.println("connected");
  }
}

In der Funktion loop() wird dann zu Beginn die Verbindung geprüft und wenn benötigt ein erneuter connect durchgeführt.

void loop() {
  if (!client.connected()) {
    connectToMQTT();
  } 
  //...
}

Ich hoffe euch gefällt dieser Artikel. Über Kommentare unterhalb des Artikels oder per E-Mail freue ich mich wie immer 🙂

Die mobile Version verlassen