MQTT :: PubSubClient verbindet alle ca. 8 Sek neu zu Mosquitto Broker

Hardware: Arduino Mega 2560 + W5100 Eth-Shield
MQTT-Broker: Home Assistant - Mosquitto - MQTT Protocol 3.1.1

Folgender Code sendet alle 1000ms (wie in am2_lebenszeichen_interval konfiguriert) erfolgreich(!) den wechselnden Status von am2/lebenszeichen (on/off)
Aber: ca. alle 8 Sek. wird die Verbindung zum MQTT-Broker neu aufgebaut, weil wohl aus irgendeinem Grund "if (!client.connected())" als false ausgewertet wird.

Das wirklich merkwürdige daran: an einem anderen Arduino Mega 2560 läuft ein ähnlicher Code anstandsfrei.

#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>
#include <Arduino.h> 

//----------------------------------
// DEBUG
//----------------------------------
bool debug = true;    // Meldungen aus loop() auf seriellem Monitor ausgeben (true/false) - Meldungen aus setup() werden aber immer ausgegeben. 

//----------------------------------
// BUZZER
//----------------------------------
const int buzzer = 9;  // Pin, an dem der Buzzer (Lautsprecher) angeschlossen ist

//----------------------------------
// LAN SHIELD & MQTT
//----------------------------------
byte mac[] = { 0xZZ, 0xZZ, 0xZZ, 0xZZ, 0xZZ, 0xZZ }; // MAC-Adresse des LAN-Shields, set it manually!
IPAddress ip(192, ZZ, ZZ, ZZ);                      // IP-Adresse des LAN-Shields
IPAddress MQTTserver(192, ZZ, ZZ, ZZ);              // IP Home Assistant / Mosqitto Broker
int MQTTport = ZZ;
EthernetClient ethClient;
PubSubClient client(MQTTserver, MQTTport, ethClient);


//----------------------------------
// MQTT Lebenszeichen
//----------------------------------
String MQTT_am2_is_alive="off";
unsigned long previousMillis_lebenszeichen = 0; 
const long am2_lebenszeichen_interval = 1000; // [x] nach wieviel ms soll MQTT-lLebenszeichen gesendet werden, default=60000, achtung: korrespondiert mit HA-Automation

//-----------------------------------------------------------------------------------------------------------
// MQTT connect / reconnect
//-----------------------------------------------------------------------------------------------------------
void reconnect() {
  // Loop until we're (re)connected
  if (!client.connected()) {
    Serial.print("Verbinde zu MQTT-Broker... ");
    delay(3000);
    if (client.connect("arduinoClient", "ZZ", "KEY")) {
      Serial.println("OK!");
      Serial.println("  Initialisiere und sende Topics...");
      Serial.println("    > am2/lebenszeichen = off");
      client.publish("am2/lebenszeichen","off"); // keine Leerzeichen nach Komma, nur Strings !!!
      Serial.println("      ...gesendet");
      Serial.println("=================================================================================================");
    } else {
      Serial.print("Fehler! -> rc=");
      Serial.print(client.state());
      Serial.println(" ...warte 5 Sek...");
      delay(5000);
    }
  }
    Serial.println(" ...Starte Loop (delay = 300 ms...)");
    Serial.println("=================================================================================================");
    if(debug==false) Serial.println("Loop gestartet... keine Ausgabe auf seriellem Monitor, da debug=false gesetzt ist.");
}

//###########################################################################################################//
//###########################################################################################################//
// Setup                                                                                                     //
//###########################################################################################################//
//###########################################################################################################//

void setup() {
  pinMode(buzzer, OUTPUT);  // Setze den Buzzer-Pin als Ausgang
  SoundOutput(0); // 0 = play init-sound
  
  // --------------- serial communication --------------- 
  Serial.begin(9600);

  Serial.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
  Serial.println(">>                          Arduino Mega 2560 für Home Assistant                               >>");
  Serial.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
  
  // --------------------- Ethernet --------------------- 
  Ethernet.begin(mac, ip);
  if (Ethernet.hardwareStatus() == EthernetNoHardware) {
    Serial.println("Ethernet-Shield nicht gefunden. Ohne Hardware geht nix! :(");
    while (true) {
      SoundOutput(6); // 6x Piepser = LAN Shield nicht gefunden, keine Funktion / Programm läuft nicht !
      delay(10000); // nix tun, kein Grund ohne LAN-Hardware etwas zu starten
    }
  }
  SoundOutput(102); // 102 = 2x kurzer, hoher Pieps
  Serial.println("Ethernet-Shield gefunden...");
  Serial.print("  statische IP: ");
  Serial.println(Ethernet.localIP());
  // --------------------- MQTT ----------------------------
  client.setServer(MQTTserver, MQTTport);
  
  Serial.println("====== ENDE SETUP ===========================================================================================");
  
} // ### Ende Setup ###

//###########################################################################################################//
//###########################################################################################################//
// LOOP                                                                                                      //
//###########################################################################################################//
//###########################################################################################################//

void loop() {
  delay(100);
  if (!client.connected()) {
    Serial.print("   ###### MQTT-Client not connected -> ");
    SoundOutput(3); // 3x Piepser = (re)connect MQTT wird ausgeführt
    reconnect();
  }
  else {
    unsigned long currentMillis = millis();
      
    // ---------------------------------- //
    // ---- MQTT am2 Lebenszeichen ------ //
    // ---------------------------------- //

      if (currentMillis - previousMillis_lebenszeichen >= am2_lebenszeichen_interval) {
        previousMillis_lebenszeichen = currentMillis;
        if (MQTT_am2_is_alive == "off") {
          MQTT_am2_is_alive = "on";
          client.publish("am2/lebenszeichen","on"); // keine Leerzeichen nach Komma, nur Strings !!!
          if(debug==true) Serial.println("<<< <<<   mqtt_is_alive = on   >>> >>>");
        } else {
          MQTT_am2_is_alive = "off";
          client.publish("am2/lebenszeichen","off"); // keine Leerzeichen nach Komma, nur Strings !!!
          if(debug==true) Serial.println("--- <<<   mqtt_is_alive = off   >>> ---");
        }
      }
      // ======== //
      // LOOP IT! //
      client.loop();
  }
  
}

//###########################################################################################################//
//###########################################################################################################//
// Funktionen                                                                                                //
//###########################################################################################################//
//###########################################################################################################//

// #################################################################################### //
// # Funktion: Buzzer / Sound-Ausgabe                                                 # //
// #################################################################################### //

// 0 = Init-Sound
// 1-99 = Fehler-Codes
// 101-199 = OKs (Anzahl beeps = buzz_type-100)

void SoundOutput(int buzz_type) {
  if(buzz_type == 0){
    tone(buzzer, 523);  // Spiele 523 Hz auf dem Buzzer: C
    delay(210);  // Warte 210 ms
    noTone(buzzer);  // Stoppe die Wiedergabe des Tons
    tone(buzzer, 587); // D
    delay(310);
    noTone(buzzer);
    tone(buzzer, 784); // G
    delay(400);
    noTone(buzzer);
  }
  else if(buzz_type>0 and buzz_type<100){ // Fehler-Ausgabe
    for(int i=0; i<buzz_type; i++){
      tone(buzzer, 880); // das ist ein A
      delay(270);
      noTone(buzzer);
      delay(170);
    } // for
  } // else if
  else if(buzz_type>100){ // Bestätigungen / OK
    for(int i=0; i<buzz_type-100; i++){
      tone(buzzer, 1760); // das ist ein hohes A
      delay(170);
      noTone(buzzer);
      delay(50);
    } // for
  } // else if
} // void SoundOutput

Alle 8 Sek. höre ich "3 mal lang" auf dem Buzzer, bedeutet client.connected()==false --> reconnect().

In der Konsole:

>>                          Arduino Mega 2560 für Home Assistant                               >>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Ethernet-Shield gefunden...
  statische IP: 192.ZZ.ZZ.ZZ
====== ENDE SETUP ===========================================================================================
   ###### MQTT-Client not connected -> Verbinde zu MQTT-Broker... OK!
  Initialisiere und sende Topics...
    > am2/lebenszeichen = off
      ...gesendet
=================================================================================================
 ...Starte Loop (delay = 300 ms...)
=================================================================================================
<<< <<<   mqtt_is_alive = on   >>> >>>
--- <<<   mqtt_is_alive = off   >>> ---
<<< <<<   mqtt_is_alive = on   >>> >>>
--- <<<   mqtt_is_alive = off   >>> ---
<<< <<<   mqtt_is_alive = on   >>> >>>
   ###### MQTT-Client not connected -> Verbinde zu MQTT-Broker... OK!
  Initialisiere und sende Topics...
    > am2/lebenszeichen = off
      ...gesendet
=================================================================================================
 ...Starte Loop (delay = 300 ms...)
=================================================================================================
--- <<<   mqtt_is_alive = off   >>> ---
<<< <<<   mqtt_is_alive = on   >>> >>>
--- <<<   mqtt_is_alive = off   >>> ---
<<< <<<   mqtt_is_alive = on   >>> >>>
--- <<<   mqtt_is_alive = off   >>> ---
   ###### MQTT-Client not connected -> Verbinde zu MQTT-Broker... OK!
  Initialisiere und sende Topics...
    > am2/lebenszeichen = off
      ...gesendet
=================================================================================================
 ...Starte Loop (delay = 300 ms...)
=================================================================================================
<<< <<<   mqtt_is_alive = on   >>> >>>

Ich verzweifle und bin dankbar für jeden Tipp in jede Richtung. THX.

Selbstantwort:
Ich musste erst diesen ausführlichen Thred schreiben, um selbst dahinter zu kommen...

Mein erster Arduino nutzt

if (client.connect("arduinoClient", "ZZ", "KEY")) {

Der erste Parameter ist dabei die ClientID.
Der zweite/neue Arduino bedarf einer individuellen ClientID!

if (client.connect("arduinoClientNEU", "ZZ", "KEY")) {

Aus der Doku von PubSubClient:
connect (clientID, [username, password], [willTopic, willQoS, willRetain, willMessage], [cleanSession])

Quelle: https://pubsubclient.knolleary.net/api

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.