Ab zwei ESP-MQTT-Clients kommen Publish-Befehle immer unzuverlässiger an.

Hallo liebe “Bastelgemeinde”,
habe folgendes Problem und komme nicht weiter:
Um so mehr ESP’s mit u.g. Programm am Netz sind um so häufiger muss das Publish-Kommando wiederholt werden da die jeweiligen Callback-Funktionen immer seltener ausgeführt werden!

Hardware:
Raspi 3b am LAN
ESP32’s sind über PIN’s 18,19,21 codiert (je nach Standort der Rolläden) damit ich nur eine Programmversion benötige.

  • Bei einem ESP am Netzt läuft alles tadellos und um so mehr ESP’s ich ins Netzt bringe umso öfter muss ich publishen. Bei 2 Stück ca. 3 mal publishen, bei 4 Stück bis zu 20 mal.

  • Zwischen zwei Konsolen Auf Konsolenebene kommendie publish problemlos und schnell an, auch wenn mehrere ESP am Netz sind (MQTT-Broker dann wohl nicht überlastet)

Irgendetwas am Programm muss falsch programmiert sein und muss die ESP’s zu stark beschäftigen!!

Die Funktion reconnect loopt ununterbrochen und erzeugt viel Traffic. Ist das normal?

Würde mich freuen wenn mir jemand weitere Tipps zur Fehlersuche geben könnte.

[color=#444444]​#include <WiFi.h>
#include <PubSubClient.h>
 
const char* SSID = "xx";
const char* PSK = "xx";
const char* MQTT_BROKER = "192.168xx";

int gi_pin18, gi_pin19, gi_pin21;
char char1_oldmsg[1] ={'x'};
 
WiFiClient espClient;

PubSubClient client(espClient);
int hochpin = 32;
int runterpin = 33; 

void setup() {
 Serial.begin(115200);

 pinMode(hochpin, OUTPUT);
 pinMode(runterpin, OUTPUT);

 pinMode(18,INPUT_PULLUP);
 pinMode(19,INPUT_PULLUP);
 pinMode(21,INPUT_PULLUP);

 gi_pin18 = digitalRead(18);
 gi_pin19 = digitalRead(19);
 gi_pin21 = digitalRead(21);


 digitalWrite(hochpin, HIGH); /*Relais zu Anfang auf OFF */
 digitalWrite(runterpin, HIGH);/*Relais zu Anfang auf OFF */
 Serial.println("Pins auf off gesetzt");
 delay(1500);
 setup_wifi();
 client.setServer(MQTT_BROKER, 1883);
 client.setCallback(callback);
}
 
void setup_wifi() {
 delay(10);
 WiFi.begin(SSID, PSK);
 while (WiFi.status() != WL_CONNECTED) {
 Serial.print(".");
 delay(500);
 }
 Serial.println("IP address: ");
 Serial.println(WiFi.localIP());
 }
 
void callback(char* topic, byte* payload, unsigned int length) {
 Serial.print("Received message [");
 Serial.print(topic);
 Serial.println("] ");
 char msg[length+1];

 for (int i = 0; i < length; i++) {
 msg[i] = (char)payload[i];
 }
 msg[length] = '\0';

 if (msg[0] != char1_oldmsg[0])
 {
 if(strcmp(msg,"hoch")==0)
 {
 digitalWrite(runterpin, HIGH);
 delay(100);
 digitalWrite(hochpin, LOW);
 delay(100);
 Serial.println("---runter---");
 }
 else if(strcmp(msg,"runter")==0)
 { 
 digitalWrite(hochpin, HIGH);
 delay(100);
 digitalWrite(runterpin, LOW);
 delay(100);
 Serial.println("---hoch---");
 }
 else if(strcmp(msg,"stop")==0)
 { 
 digitalWrite(hochpin, HIGH);
 delay(100);
 digitalWrite(runterpin, HIGH);
 delay(100);
 Serial.println("---stop---");
 } 
 char1_oldmsg[0] = msg[0];
 } 
}

void reconnect() {
 while (!client.connected()) {
 
 if (client.connect("ESP32_Client")) 
 {
 Serial.println("verbunden zu MQTT: ");
 
 if ((gi_pin18==0) && (gi_pin19==1) && (gi_pin21==1))
 {
 client.subscribe("rollo1");
 } 
 else if ((gi_pin18==1) && (gi_pin19==0) && (gi_pin21==1))
 {
 client.subscribe("rollo2");
 } 
 else if ((gi_pin18==1) && (gi_pin19==1) && (gi_pin21==0))
 {
 client.subscribe("rollo3");
 } 
 }
 else
 {
 Serial.println("failed, rc=");
 Serial.println(client.state());
 Serial.println(" try again in 5 seconds");
 // Wait 5 seconds before retrying
 delay(5000);
 }
 }
} 
 
void loop() {
 if (!client.connected()) {
 reconnect(); /*wird nur einmal am Anfang ausgeführt*/
 }
 client.loop();
}[/color]

Bitte benutze die "code tags" um dein Sketch zu zeigen, das macht es für andere einfacher.

Welchen Broker verwendest du denn?

Ich bin kein Fan von einheitlichem Code, das macht es unübersichtlicher. Vergib mal feste IP Adressen und teste nochmal. Ich würde dir den MQTT-Explorer empfehlen. Mit dem Programm siehst du wer wann was sendet und unnötig Datenverkehr verursacht.

Gruß