MQTT String, Char-Array, Speicherverbrauch

Ich habe ein paar empfangene Integer Werte, die ich über MQTT publishen möchte. Es funktioniert soweit hervorragend. Da man aber mit Strings stark den Arbeitsspeicher beansprucht, wollte ich fragen, ob es so gut ist. Oder ob der Speicher irgendwann voll läuft. Oder andere Probleme in längerer Laufzeit auftreten könnten.

Das Topic, wo die Daten veröffentlicht werden, erstelle ich mir zum Teil aus einem Integer der Empfangen wird. Dieser beinhaltet die Sensor-ID. Somit kann ich die Werte dann später auch prima zuordnen.

Zum Topic erstellen habe ich mir ein paar Char-Array Zeichenketten erstellt

const char*     topicBegin = "nRF24/";
const char*     topicTemp = "/Temp";
const char*     topicHumi = "/Humi";
const char*     topicDruck = "/Druck";
const char*     topicVcc = "/Vcc";
const char*     topicWert1 = "/Wert1";
const char*     topicWert2 = "/Wert2";
char            topicSend[20];

Die ich dann zum senden zusammensetze

    strcpy(topicSend,topicBegin);                   
    strcat(topicSend,String(payload.ID).c_str());   
    strcat(topicSend,topicTemp);                    
    mqttclient.publish(topicSend,String(payload.Temp/10.0,1).c_str());
    strcpy(topicSend,topicBegin);
    strcat(topicSend,String(payload.ID).c_str());
    strcat(topicSend,topicHumi);
    mqttclient.publish(topicSend,String(payload.Humi/10.0,1).c_str());
    strcpy(topicSend,topicBegin);
    strcat(topicSend,String(payload.ID).c_str());
    strcat(topicSend,topicDruck);
    mqttclient.publish(topicSend,String(payload.Druck).c_str());
    strcpy(topicSend,topicBegin);
    strcat(topicSend,String(payload.ID).c_str());
    strcat(topicSend,topicVcc);
    mqttclient.publish(topicSend,String(payload.Vcc/1000.0,2).c_str());
    strcpy(topicSend,topicBegin);
    strcat(topicSend,String(payload.ID).c_str());
    strcat(topicSend,topicWert1);
    mqttclient.publish(topicSend,String(payload.Wert1).c_str());
    strcpy(topicSend,topicBegin);
    strcat(topicSend,String(payload.ID).c_str());
    strcat(topicSend,topicWert2);
    mqttclient.publish(topicSend,String(payload.Wert2).c_str());

Und damit es sich auch kompileren lässt, der ganze Code.

#include <ESP.h>
#include <ESP8266WiFi.h>               // ESP8266 WLAN Bibliothek
#include <PubSubClient.h>              // MQTT Bibliothek https://github.com/knolleary/pubsubclient
#include "RF24.h"                      // nRF24l01+ Bibliothek https://github.com/nRF24/RF24

struct PaketStruktur{
  uint16_t ID;                        // (0..65535) - Eindeutige ID des Senders
  int16_t  Temp;                      // Wert für die Temperatur * 10
  uint16_t Humi;                      // Wert für die Luftfeuchtigkeit % * 10
  uint16_t Druck;                     // Wert für den Druck hPa
  uint16_t Vcc;                       // Wert der Batteriespannung in mV
  uint16_t Wert1;                     // Zusätzlicher Wert 1
  uint16_t Wert2;                     // Zusätzlicher Wert 2
};
PaketStruktur payload;

RF24 radio(D2,D8); // CE, CSN
uint8_t address[][6] = {"xxxxx"}; // Adressen der Kanäle, sollten bei den beteiligten Modulen gleich sein

const char*     ssid = "";                                                  // WLAN Name (SSID)
const char*     password = "";                                      // WLAN Passwort
const char*     mqtt_server = "xxx.xxx.xxx.xxx";                             // IP des MQTT Brokers (z.b. IP des Raspberry PI)
const uint16_t  port = xxx;                                                // Port des MQTT Brokers
const char*     clientName = "nRF24 Zentrale";

const char*     topicBegin = "nRF24/";
const char*     topicTemp = "/Temp";
const char*     topicHumi = "/Humi";
const char*     topicDruck = "/Druck";
const char*     topicVcc = "/Vcc";
const char*     topicWert1 = "/Wert1";
const char*     topicWert2 = "/Wert2";
char            topicSend[20];

WiFiClient espClient;                                                     // WLAN initialisieren
PubSubClient mqttclient(mqtt_server,port,0,espClient);                    // MQTT initialisieren

void setup() {
  Serial.begin(9600);
  delay(200);
  pinMode(D4,OUTPUT);                              // LED an D4
  
  // WLAN einstellungen
  IPAddress ip(xxx, xxx, xxx, xxx);                                        // IP Adresse des ESPs
  IPAddress gateway(xxx, xxx, xxx, xxx);                                    // Gateway für den ESP
  IPAddress subnet(xxx, xxx, xxx, xxx);                                     // Subnet für den ESP
  IPAddress dns(xxx, xxx, xxx, xxx);                                        // DNS für den ESP
  WiFi.config(ip, dns, gateway, subnet);                                  // WLAN am ESP einsellen
  WiFi.persistent(false);                                                 // auskommentieren wenn Netzwerkname oder Passwort in den Flash geschrieben werden sollen
  WiFi.mode(WIFI_STA);
  WiFiStart();

  //nRF24 Einstellungen
  if(radio.begin()){                              // Stellt SPI Verbindung zum nRF24-Modul her
    radio.setChannel(84);                         // Sendekanal (zwischen 0 - 125), untere Kanäle oft von WIFI belegt, 0 - 84 in Europa erlaubt
    radio.setPayloadSize(sizeof(payload));        // Sende nur so viele Daten, wie nötig
    radio.setAutoAck(true);                       // Automatische Bestätigung bei Empfang Daten
    radio.setPALevel(RF24_PA_MAX);                // Sendeleistung definieren (RF24_PA_MAX), (RF24_PA_HIGH), ...
    radio.setDataRate(RF24_1MBPS);                // Übertragungsgeschwindigkeit definieren
    radio.setRetries (3, 8);                      // Abstand von 1ms (X+1 steps of 250μs)  8x wiederholen
    radio.openWritingPipe(address[1]);            // Erstellt Sendekanal mit Addresse
    radio.openReadingPipe(0, address[0]);         // Erstellt Empfangskanal mit Nummer (0-5) mit Addresse
    radio.startListening();                       // Setzt das Modul in den Empangsmodus-Modus
    Serial.println("nRF24 Ready");
  }
  else
  {
    digitalWrite(D4,HIGH);
  }

  // MQTT starten
  mqttclient.connect(clientName);
}

void loop() {
  uint8_t pipe;
  if (radio.available(&pipe)) empfSend();
  }

void empfSend(){
  radio.read(&payload, sizeof(payload));        // Lesen des Payloads
    //uint32_t Zeitstempel=micros();
    strcpy(topicSend,topicBegin);                   
    strcat(topicSend,String(payload.ID).c_str());   
    strcat(topicSend,topicTemp);                    
    mqttclient.publish(topicSend,String(payload.Temp/10.0,1).c_str());
    strcpy(topicSend,topicBegin);
    strcat(topicSend,String(payload.ID).c_str());
    strcat(topicSend,topicHumi);
    mqttclient.publish(topicSend,String(payload.Humi/10.0,1).c_str());
    strcpy(topicSend,topicBegin);
    strcat(topicSend,String(payload.ID).c_str());
    strcat(topicSend,topicDruck);
    mqttclient.publish(topicSend,String(payload.Druck).c_str());
    strcpy(topicSend,topicBegin);
    strcat(topicSend,String(payload.ID).c_str());
    strcat(topicSend,topicVcc);
    mqttclient.publish(topicSend,String(payload.Vcc/1000.0,2).c_str());
    strcpy(topicSend,topicBegin);
    strcat(topicSend,String(payload.ID).c_str());
    strcat(topicSend,topicWert1);
    mqttclient.publish(topicSend,String(payload.Wert1).c_str());
    strcpy(topicSend,topicBegin);
    strcat(topicSend,String(payload.ID).c_str());
    strcat(topicSend,topicWert2);
    mqttclient.publish(topicSend,String(payload.Wert2).c_str());
    //Serial.print("ID: "); Serial.println(payload.ID);
    //Serial.print("Temp: "); Serial.println(payload.Temp);
    //Serial.print("Humi: "); Serial.println(payload.Humi);
    //Serial.print("Druck: "); Serial.println(payload.Druck);
    //Serial.print("mVCC: "); Serial.println(payload.Vcc);
    //Serial.print("Reed1: "); Serial.println(payload.Wert1);
    //Serial.print("Reed2: "); Serial.println(payload.Wert2);
    //Serial.print("Micros: ");Serial.println(micros()-Zeitstempel);
    //Serial.println();
}

void WiFiStart(){                                               // wird zum verbinden bzw. wiederverbinden zum WLAN ausgeführt  
  WiFi.begin(ssid, password);
  int i = 20;                                                   // Max Verbindungsversuchszeit i*0,5s
  while (WiFi.status() != WL_CONNECTED && i > 0) {
    delay(500);
    i--;
  }
  Serial.println("Wifi Ready");
}

Muss ich mir bei den Strings sorgen um den Arbeitsspeicher machen? Viel mehr wird nicht dazu kommen. Der ESP8266 dient eigentlich nur als Gateway um die Daten vom nRF24 ins MQTT zu bringen.

Also wenn Du schon mit char-Arrays arbeitest, dann sind solche Konstrukte Gift.
Dann nimm lieber snprintf oder gleich snprintf_P mit dem Formatstring im Flash.

Gruß Tommy

mqttclient.publish(xxx,xxx); erwartet halt zwei Char-Arrays.

Ich habe folgendes versucht:

    int i =;
    //strcpy(topicSend,topicBegin);                   
    //strcat(topicSend,String(payload.ID).c_str());   
    //strcat(topicSend,topicTemp);                    
    i=snprintf(topicSend,20,"%s%d%s",topicBegin,payload.ID,topicTemp);
    mqttclient.publish(topicSend,String(payload.Temp/10.0,1).c_str());

So ok?

snprintf ist etwas schwer verständlich, zumindest als Laie.
Die Variable i braucht es ja immer, obwohl ich den nicht unbedingt brauche, oder?
Gibt es eigentlich eine Liste mit den %s. Mir fehlt da das Suchwort.

Formate
Warum nimmst Du kein zweites char-Array für die Zahl und auch snprintf?

Gruß Tommy

Danke für den Link.

Eigentlich nur weil es neu für mich ist, und auch weil ich das % für Float noch nicht wusste.
Aber es braucht ein neues "Buffer" char-Array, oder?

    //strcpy(topicSend,topicBegin);                   
    //strcat(topicSend,String(payload.ID).c_str());   
    //strcat(topicSend,topicTemp);                    
    //mqttclient.publish(topicSend,String(payload.Temp/10.0,1).c_str());
    i=snprintf(topicSend,20,"%s%d%s",topicBegin,payload.ID,topicTemp);
    i=snprintf(mqttPayload,20,"%.1f",(payload.Temp/10.0));
    mqttclient.publish(topicSend,mqttPayload);

Ja, Du brauchst 2. ich würde an Deiner Stelle gleich weg von der 20 hin zu sizeof gehen. Wofür ist das /10.0?

Gruß Tommy

:+1:

    i=snprintf(topicSend,sizeof(topicSend),"%s%d%s",topicBegin,payload.ID,topicTemp);
    i=snprintf(mqttPayload,sizeof(mqttPayload),"%.1f",(payload.Temp/10.0));
    mqttclient.publish(topicSend,mqttPayload);

Der Temperatur Payload Wert kommt vom nRF24 Sender mit 10 multipliziert, damit die Nachkommastelle in ein Integer passt. Statt z.B. 21.4 wird halt 214 übertragen. Spart Speicher und ist einfacher zu händeln.

ok, verstanden. Es wird doch.

Die Formate für printf merkt man sich im Laufe der Zeit oder die Liste lokal abspeichern / ausdrucken. Ein Hinweis noch: Bei den kleinen Arduinos ist fie float-Unterstützung für die printf-Familie nicht ein compiliert.

Gruß Tommy

Kann man aber aktivieren.

void empfSend(){
  radio.read(&payload, sizeof(payload));        // Lesen des Payloads
  int i = 0;
  uint32_t Zeitstempel=micros();
  i=snprintf(mqttTopic,sizeof(mqttTopic),"%s%d%s",topicBegin,payload.ID,topicTemp);
  i=snprintf(mqttPayload,sizeof(mqttPayload),"%.1f",(payload.Temp/10.0));
  mqttclient.publish(mqttTopic,mqttPayload);
  i=snprintf(mqttTopic,sizeof(mqttTopic),"%s%d%s",topicBegin,payload.ID,topicHumi);
  i=snprintf(mqttPayload,sizeof(mqttPayload),"%.1f",(payload.Humi/10.0));
  mqttclient.publish(mqttTopic,mqttPayload);
  i=snprintf(mqttTopic,sizeof(mqttTopic),"%s%d%s",topicBegin,payload.ID,topicDruck);
  i=snprintf(mqttPayload,sizeof(mqttPayload),"%d",payload.Druck);
  mqttclient.publish(mqttTopic,mqttPayload);
  i=snprintf(mqttTopic,sizeof(mqttTopic),"%s%d%s",topicBegin,payload.ID,topicVcc);
  i=snprintf(mqttPayload,sizeof(mqttPayload),"%.2f",(payload.Vcc/1000.0));
  mqttclient.publish(mqttTopic,mqttPayload);
  i=snprintf(mqttTopic,sizeof(mqttTopic),"%s%d%s",topicBegin,payload.ID,topicWert1);
  i=snprintf(mqttPayload,sizeof(mqttPayload),"%d",payload.Wert1);
  mqttclient.publish(mqttTopic,mqttPayload);
  i=snprintf(mqttTopic,sizeof(mqttTopic),"%s%d%s",topicBegin,payload.ID,topicWert2);
  i=snprintf(mqttPayload,sizeof(mqttPayload),"%d",payload.Wert2);
  mqttclient.publish(mqttTopic,mqttPayload);
  //Serial.print("ID: "); Serial.println(payload.ID);
  //Serial.print("Temp: "); Serial.println(payload.Temp);
  //Serial.print("Humi: "); Serial.println(payload.Humi);
  //Serial.print("Druck: "); Serial.println(payload.Druck);
  //Serial.print("mVCC: "); Serial.println(payload.Vcc);
  //Serial.print("Reed1: "); Serial.println(payload.Wert1);
  //Serial.print("Reed2: "); Serial.println(payload.Wert2);
  Serial.print("Micros: ");Serial.println(micros()-Zeitstempel);
  //Serial.println();
}

Läuft auf einem ESP8266, damit er es ins WLAN publishen kann.

Langsamer als strcpy und strcat ist diese Abhandlung aber.
strcpy und strcat brauchen ca. 2,5 Millisekunden.
snprintf braucht ca. 3,1 Millisekunden.
Edit: Die Werte schwanken stark, letzten zwei Messungen unter 1,5 Millisekunden. Höhster Wert über 4 Millisekunden.

Für den Arbeitsspeicher und Systemstabilität ist es aber von Vorteil, wenn ich es richtig verstanden habe?

Ja, ist es.
Du hast doch keine zeitkritische Anwendung.

Gruß Tommy

Ja. Auf die Schnelle habe diese Beschreibung gefunden. Ich habe es aber noch nicht gebraucht.

Gruß Tommy

Wenn du i nicht verwendest brauchst du auch nichts zuzuweisen. Das geht auch ohne. Der Rückgabewert wird dann halt verworfen

Und sprintf() ist eine massive, sehr mächtige Funktion. Es sollte nicht überraschen dass es langsamer ist als eine stark optimierte spezialisierte Funktion. Ist hier aber nicht relevant. Einfacherer Code ist da wichtiger.

Ich weis nicht wie schnell und fast überlagernd die Daten von den verschiedenen nRF24 Sensoren, die es alle noch nicht gibt, eintrudeln. Nicht das da Daten verloren gehen, weil etwas zu lange dauert. Aber ich denke das zeigen dann Tests, wenn es soweit ist. Ich wollte nur mal drüber nachgedacht haben, was wie lange dauert.

Hmm. Es gibt Probleme.

Es wird nach 6-10 Durchgängen wo etwas publisht wird, nichts mehr publisht. Es gut daran zu erkennen, wenn der Timestamp, kürzer dauert.

19:50:01.076 -> Micros: 2555
19:50:02.857 -> Micros: 2438
19:51:51.299 -> Micros: 2514
19:52:59.080 -> Micros: 2491
19:53:05.411 -> Micros: 2448
19:54:53.867 -> Micros: 2483
19:56:42.276 -> Micros: 1136
19:57:38.310 -> Micros: 1144
19:57:41.019 -> Micros: 1061
19:59:29.482 -> Micros: 1121

Das ist unabhängig von der alten Methode mit strcpy/strcat oder snprintf.
Das Verhalten lässt sich provozieren, wenn z.B. in dem Topic oder Payload unzulässige Zeichen, wie z.B. \n enthalten sind. Ob dass das ist, was das verhalten auslöst kann ich nicht verifizieren. Es kann auch etwas anderes sein.

Die Daten kommen weiterhin vom nRF24 am ESP an. Auch wird die Funktion durchlaufen, wo publisht wird. Nur kommt nix im MQTT Netzwerk an. Andere Geräte, publishen munter weiter. Also liegt es nicht am MQTT Netzwerk selber.

Nach einem Reset, läuft alles wieder normal, für 6-10 Versuche normal.

Andere ESP8266, die auch im Netzwerk publishen, können nicht als vergleich hergenommen werden. Diese gehen in DeepSleep. Deren aufwecken kommt ja dem Reset gleich. Somit funktioniert dann dort das publishen.

Habt ihr Ideen wie ich den aussetzern auf die schliche kommen kann?

#include <ESP.h>
#include <ESP8266WiFi.h>               // ESP8266 WLAN Bibliothek
#include <PubSubClient.h>              // MQTT Bibliothek https://github.com/knolleary/pubsubclient
#include "RF24.h"                      // nRF24l01+ Bibliothek https://github.com/nRF24/RF24

struct PaketStruktur{
  uint16_t ID;                        // (0..65535) - Eindeutige ID des Senders
  int16_t  Temp;                      // Wert für die Temperatur * 10
  uint16_t Humi;                      // Wert für die Luftfeuchtigkeit % * 10
  uint16_t Druck;                     // Wert für den Druck hPa
  uint16_t Vcc;                       // Wert der Batteriespannung in mV
  uint16_t Wert1;                     // Zusätzlicher Wert 1
  uint16_t Wert2;                     // Zusätzlicher Wert 2
};
PaketStruktur payload;

RF24 radio(D2,D8); // CE, CSN
uint8_t address[][6] = {"xxx, xxx, xxx, xxx"}; // Adressen der Kanäle, sollten bei den beteiligten Modulen gleich sein

const char*     ssid = "xxx, xxx, xxx, xxx";                                         // WLAN Name (SSID)
const char*     password = "*xxx, xxx, xxx, xxx";                          // WLAN Passwort
const char*     mqtt_server = "xxx, xxx, xxx, xxx";                             // IP des MQTT Brokers (z.b. IP des Raspberry PI)
const uint16_t  port = xxx, xxx, xxx, xxx;                                                // Port des MQTT Brokers
const char*     clientName = "nRF24 Zentrale";

const char*     topicBegin = "nRF24/";
const char*     topicTemp = "/Temp";
const char*     topicHumi = "/Humi";
const char*     topicDruck = "/Druck";
const char*     topicVcc = "/Vcc";
const char*     topicWert1 = "/Wert1";
const char*     topicWert2 = "/Wert2";
char            mqttTopic[20];
char            mqttPayload[20];

WiFiClient espClient;                                                     // WLAN initialisieren
PubSubClient mqttclient(mqtt_server,port,0,espClient);                    // MQTT initialisieren

void setup() {
  Serial.begin(9600);
  //delay(200);
  pinMode(D4,OUTPUT);                              // LED an D4
  
  // WLAN einstellungen
  IPAddress ip(xxx, xxx, xxx, xxx);                                        // IP Adresse des ESPs
  IPAddress gateway(xxx, xxx, xxx, xxx);                                    // Gateway für den ESP
  IPAddress subnet(xxx, xxx, xxx, xxx);                                     // Subnet für den ESP
  IPAddress dns(xxx, xxx, xxx, xxx);                                        // DNS für den ESP
  WiFi.config(ip, dns, gateway, subnet);                                  // WLAN am ESP einsellen
  WiFi.persistent(false);                                                 // auskommentieren wenn Netzwerkname oder Passwort in den Flash geschrieben werden sollen
  WiFi.mode(WIFI_STA);
  WiFiStart();

  //nRF24 Einstellungen
  if(radio.begin()){                              // Stellt SPI Verbindung zum nRF24-Modul her
    radio.setChannel(84);                         // Sendekanal (zwischen 0 - 125), untere Kanäle oft von WIFI belegt, 0 - 84 in Europa erlaubt
    radio.setPayloadSize(sizeof(payload));        // Sende nur so viele Daten, wie nötig
    radio.setAutoAck(true);                       // Automatische Bestätigung bei Empfang Daten
    radio.setPALevel(RF24_PA_MAX);                // Sendeleistung definieren (RF24_PA_MAX), (RF24_PA_HIGH), ...
    radio.setDataRate(RF24_1MBPS);                // Übertragungsgeschwindigkeit definieren
    radio.setRetries (3, 8);                      // Abstand von 1ms (X+1 steps of 250μs)  8x wiederholen
    radio.openWritingPipe(address[1]);            // Erstellt Sendekanal mit Addresse
    radio.openReadingPipe(0, address[0]);         // Erstellt Empfangskanal mit Nummer (0-5) mit Addresse
    radio.startListening();                       // Setzt das Modul in den Empangsmodus-Modus
    // Serial.println("nRF24 Ready");
  }
  else
  {
    digitalWrite(D4,HIGH);
  }

  // MQTT starten
  mqttclient.connect(clientName);
}

void loop() {
  uint8_t pipe;
  if (radio.available(&pipe)) empfSend();
  mqttclient.loop();
}

void empfSend(){
  radio.read(&payload, sizeof(payload));        // Lesen des Payloads
  int i = 0;
  //uint32_t Zeitstempel=micros();
  i=snprintf(mqttTopic,sizeof(mqttTopic),"%s%d%s",topicBegin,payload.ID,topicTemp);
  i=snprintf(mqttPayload,sizeof(mqttPayload),"%.1f",(payload.Temp/10.0));
  mqttclient.publish(mqttTopic,mqttPayload);
  i=snprintf(mqttTopic,sizeof(mqttTopic),"%s%d%s",topicBegin,payload.ID,topicHumi);
  i=snprintf(mqttPayload,sizeof(mqttPayload),"%.1f",(payload.Humi/10.0));
  mqttclient.publish(mqttTopic,mqttPayload);
  i=snprintf(mqttTopic,sizeof(mqttTopic),"%s%d%s",topicBegin,payload.ID,topicDruck);
  i=snprintf(mqttPayload,sizeof(mqttPayload),"%d",payload.Druck);
  mqttclient.publish(mqttTopic,mqttPayload);
  i=snprintf(mqttTopic,sizeof(mqttTopic),"%s%d%s",topicBegin,payload.ID,topicVcc);
  i=snprintf(mqttPayload,sizeof(mqttPayload),"%.2f",(payload.Vcc/1000.0));
  mqttclient.publish(mqttTopic,mqttPayload);
  i=snprintf(mqttTopic,sizeof(mqttTopic),"%s%d%s",topicBegin,payload.ID,topicWert1);
  i=snprintf(mqttPayload,sizeof(mqttPayload),"%d",payload.Wert1);
  mqttclient.publish(mqttTopic,mqttPayload);
  i=snprintf(mqttTopic,sizeof(mqttTopic),"%s%d%s",topicBegin,payload.ID,topicWert2);
  i=snprintf(mqttPayload,sizeof(mqttPayload),"%d",payload.Wert2);
  mqttclient.publish(mqttTopic,mqttPayload);
  //Serial.print("ID: "); Serial.println(payload.ID);
  //Serial.print("Temp: "); Serial.println(payload.Temp);
  //Serial.print("Humi: "); Serial.println(payload.Humi);
  //Serial.print("Druck: "); Serial.println(payload.Druck);
  //Serial.print("mVCC: "); Serial.println(payload.Vcc);
  //Serial.print("Reed1: "); Serial.println(payload.Wert1);
  //Serial.print("Reed2: "); Serial.println(payload.Wert2);
  //Serial.print("Micros: ");Serial.println(micros()-Zeitstempel);
  //Serial.println();
}

void WiFiStart(){                                               // wird zum verbinden bzw. wiederverbinden zum WLAN ausgeführt  
  WiFi.begin(ssid, password);
  int i = 20;                                                   // Max Verbindungsversuchszeit i*0,5s
  while (WiFi.status() != WL_CONNECTED && i > 0) {
    delay(500);
    i--;
  }
  //Serial.println("Wifi Ready");
}

Kann man den "Buffer" irgendwie löschen? k.A. ob es daran liegt.

Welchen Puffer? Falls Du die Char-Arrays meinst, die werden bei snprintf jedesmal überschrieben.
Ansonsten kenne ich mich mit MQTT überhaupt nicht aus, da müssen andere ran.

Gruß Tommy

Ja die meinte ich. Hatte gedacht das vielleicht etwas fragmentiert. Oder Überbleibsel übrig bleiben.

Aber das Problem scheint woanders begraben zu sein. Ich habe mal in den Beispielen zur Bibliothek gesucht. Man kann die Verbindung überprüfen, und bei nicht Vorhandensein neu aufbauen. Und siehe da:

20:23:50.200 -> Wifi Ready
20:23:50.200 -> nRF24 Ready
20:24:14.265 -> Micros: 2977
20:25:05.544 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:25:15.815 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:25:26.132 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:25:36.403 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:25:46.722 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:25:56.992 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:26:07.263 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:26:17.534 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:26:27.853 -> Attempting MQTT connection...connected
20:26:27.900 -> Micros: 1886
20:27:13.195 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:27:23.461 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:27:33.773 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:27:44.058 -> Attempting MQTT connection...connected
20:27:51.152 -> Micros: 2965
20:28:15.583 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:28:25.867 -> Attempting MQTT connection...connected
20:29:39.549 -> Micros: 2951
20:31:28.037 -> Micros: 2874

Einige Abbrüche. Ist natürlich nicht so prickelnd, denn während der Wartezeit zum wiederverbinden, gehen einkommende Daten vom nRF24 verloren. Wahrscheinlich muss ich die Daten zwischenspeichern, wenn keine Verbindung da ist, und dann gesammelt raushauen, wenn die Verbindung wieder steht.

Vielleicht stört ja auch der nRF24 die Verbindung zum MQTT Netzwerk. Denn beide senden ja im 2,4GHz Bereich. Hach.

Was Du verarbeitst sind ja eigentlich Umgebungsdaten. Die ändern sich nur Langsam. Du solltest nach meiner Meinung schon das Versenden auf Minutenabstand verlangsamen. Dann die aktuellen Daten mit den voeherigen vergleichen und erst wenn sie sich geändert haben an MQTT senden.
Das radio.available wird erst wahr, wenn ein kompletter Datensatz empfangen wurde?

Gruß Tommy

Auch Magnetkontakte (Tür/Fenster). DoorSens -> Nachbarforum.
Auf die Kontakte sollte schon relativ Zeitnah reagiert werden.
Die "Klima" Daten sind noch aus der Struktur vom SensEgg. Eine Option den DoorSens mit einem NTC auszustatten besteht.
radio.available gibt daten raus, wenn Daten empfangen wurden und die Daten in das payload und dessen Struktur passen.
Da nicht nur die DoorSens Daten liefern, sondern auch die SensEgg, wäre es von Vorteil, wenn die payload Strukturen gleich sind.
Der DoorSens ist aktuell so eingerichtet, das er mindestens aller ca. 2Minuten Daten sendet (Abhängig vom Widerstandswert am Timer). Wenn der Magnetkontakt seinen Wert ändert, wird sofort gesendet.

Es ist nicht wirklich ein Muster zu erkennen, wann es abbricht. Daher verhärtet sich der Verdacht auf Störung der Verbindung.

20:24:14.265 -> Micros: 2977
20:25:05.544 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:25:15.815 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:25:26.132 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:25:36.403 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:25:46.722 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:25:56.992 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:26:07.263 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:26:17.534 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:26:27.853 -> Attempting MQTT connection...connected
20:26:27.900 -> Micros: 1886
20:27:13.195 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:27:23.461 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:27:33.773 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:27:44.058 -> Attempting MQTT connection...connected
20:27:51.152 -> Micros: 2965
20:28:15.583 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:28:25.867 -> Attempting MQTT connection...connected
20:29:39.549 -> Micros: 2951
20:31:28.037 -> Micros: 2874
20:33:16.438 -> Micros: 2881
20:34:44.273 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:34:54.550 -> Attempting MQTT connection...connected
20:35:04.893 -> Micros: 2965
20:35:29.820 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:35:40.104 -> Attempting MQTT connection...connected
20:36:53.350 -> Micros: 2185
20:36:55.449 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:37:05.772 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:37:16.058 -> Attempting MQTT connection...connected
20:38:41.768 -> Micros: 2935
20:40:30.217 -> Micros: 2894
20:42:18.658 -> Micros: 2848
20:44:07.131 -> Micros: 2112
20:44:16.392 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:44:26.665 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:44:36.973 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:44:47.246 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:44:57.556 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:45:07.816 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:45:18.123 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:45:28.418 -> Attempting MQTT connection...connected
20:45:55.546 -> Micros: 2879
20:46:28.835 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:46:39.095 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:46:49.385 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:46:59.661 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:47:09.984 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:47:20.283 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:47:30.585 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:47:40.862 -> Attempting MQTT connection...connected
20:47:45.627 -> Micros: 1893
20:49:32.464 -> Micros: 2855
20:51:20.892 -> Micros: 2846
20:53:09.315 -> Micros: 2843
20:54:00.973 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:54:11.277 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:54:21.608 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:54:31.861 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:54:42.170 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:54:52.451 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:55:02.767 -> Attempting MQTT connection...connected
20:55:02.767 -> Micros: 1895
20:56:03.091 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:56:13.352 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:56:23.674 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:56:33.949 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:56:44.238 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:56:54.542 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:57:04.842 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
20:57:15.117 -> Attempting MQTT connection...connected
20:57:16.196 -> Micros: 1906
20:58:34.649 -> Micros: 2798
21:00:23.120 -> Micros: 2909
21:02:11.548 -> Micros: 2897
21:04:00.008 -> Micros: 2894
21:04:16.537 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
21:04:26.858 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
21:04:37.166 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
21:04:47.450 -> Attempting MQTT connection...connected
21:05:32.808 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
21:05:43.101 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
21:05:53.413 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
21:06:03.712 -> Attempting MQTT connection...connected
21:06:04.777 -> Micros: 1896
21:06:35.083 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
21:06:45.370 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
21:06:55.670 -> Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
21:07:05.977 -> Attempting MQTT connection...connected
21:07:36.876 -> Micros: 2968
21:09:25.328 -> Micros: 2892

Vermutlich wird es besser sein, die Daten ins LAN per Ethernet zu bringen. Da sollte die Verbindung bestehen bleiben.

Werde noch versuchen an der Leistung Sender etwas nach unten zu drosseln, und schauen ob es sich auswirkt. Heute nicht mehr.

Checke doch parallel mit ab, ob die WiFi-Connection noch besteht. Wenn ja, wird es nicht auf den rf24-Sender hinaus laufen.

Gruß Tommy