MQTT mit PubSubClient auf NodeMCU

Hallo Freunde
hat jemand von euch den IPS INTERNEN MQTT Broker mit dem PubSubClient Library auf einem Arduino oder NodeMCU laufen ?

Daten vom Client zu IPS zu schicken haut prima hin, überhaupt kein Problem. Hab da einige Clients laufen.
Aber von IPS zum Client will es mir einfach nicht gelingen.
lt. log gehen die Daten bei IPS raus, d.h. das Topic wurde abonniert und vom Client abgeholt.
Aber die callback() Funktion am Client läuft einfach nicht an. Kein Ahnung warum.
Google findet ein paar Hinweise das es nur mit dem Mosquito sauber funktioniert. Mit anderen Brokern hat der PubSubClient wohl Probleme. (??)

Weiß jemand was dazu ? Toll wäre zu wissen ob das bei jemandem von euch läuft.

gruß
bb

Habe ich noch nicht so probiert, hab immer nur Tasmota genutzt.

Hallo Bernhard,

habe da einige Projekte am Start. Sowohl ESP32 als auch NodeMCUs. Die laufen bei mir mit MQTT in beiden Richtungen. Nutze allerdings die normale MQTT.h zusammen mit der ESP8266WiFi.h und nich die PubSubClient. Mit der hatte ich auch so meine Probleme.

Nutzt Du VS Code zum Programmieren? Dann kann ich Dir mal eine Code-Schnipsel schicken.

Grüße
Jürgen

Ja, ich nehme immer Vs Code. Wäre wenn du ein Beispiel hast. Ich folge genau der PubSubClint Beispielcode geht trotzdem nicht. IPS Seite ist aber alles richtig. Mit dem in VS Code eingebauten MQTT Client Plugin kann ich das Topic lesen.

Danke im voraus
Bb

wie gesagt: war bei mir auch nicht zielführend. Wenn Du eine NodeMCU nimmst, dann brauchst Du zunächst die 256dpi/MQTT-Library. dann geht es eigentlich ganz einfach

  #include <ESP8266WiFi.h>
  #include <ESP8266mDNS.h>
  #include <ArduinoOTA.h>
  #include <MQTT.h>

// -----------------------------------------------------------------------------------------
// Definitionen WIFI und MQTT
// -----------------------------------------------------------------------------------------

  String Topic          = "Kueche/Motion"; 
  const char* host      = "Kueche-Motion";
  const char* wifi_ssid = "blabla";
  const char* wifi_key  = "noname!blabla";
  const char* mqtt_host = "xxx.xxx.xxx.xxx";

  WiFiClient wifi_client;
  MQTTClient mqtt_client(512);


// *****************************************************************************************
// connect() WIFI - MQTT
// *****************************************************************************************

  void connect() {
    if(WiFi.status() != WL_CONNECTED) {
      Serial.print("Connecting to WiFi: ");
      Serial.println(wifi_ssid);
      WiFi.begin(wifi_ssid, wifi_key);
      int tries = 0;
      digitalWrite(LED_PIN, LOW);
      while (WiFi.status() != WL_CONNECTED) {
        if(tries++ > 10)return;
        delay(1000);
        Serial.print(".");
      }
      // Good. We have WiFi now!
      Serial.println(" Success!");
    }
    
    if(WiFi.status() == WL_CONNECTED) {
      if(!mqtt_client.connected()) {
        // Connect to MQTT server
        Serial.print("Connecting to MQTT server: ");
        Serial.println(mqtt_host);
        while (!mqtt_client.connect(host, "", "")) {
          delay(5000);
          Serial.print(".");
        }

        Serial.println(" Success!");
        mqtt_client.subscribe(Topic+"/reset");
      }
    }

  }

// *****************************************************************************************
// messageReceived
// *****************************************************************************************

  void messageReceived(String &topic, String &payload) {
    Serial.println("incoming: " + topic + " - " + payload);
    if(topic == Topic+"/reset"){
      ESP.restart();
    }
  }

// *****************************************************************************************
// setup()
// *****************************************************************************************

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

// -----------------------------------------------------------------------------------------
// WIFI und MQTT starten  
// -----------------------------------------------------------------------------------------

    WiFi.mode(WIFI_STA);
    WiFi.hostname(host);
    mqtt_client.begin(mqtt_host, wifi_client);
    mqtt_client.onMessage(messageReceived);
    connect();

// -----------------------------------------------------------------------------------------
// OTA starten  
// -----------------------------------------------------------------------------------------

    ArduinoOTA.setHostname(host);
    ArduinoOTA.setPassword("vielBlaBlaumNichts!");
    ArduinoOTA.begin();
  
}

// *****************************************************************************************
// loop()
// *****************************************************************************************
  void loop() {

// -----------------------------------------------------------------------------------------
// OTA-Abfrage
// -----------------------------------------------------------------------------------------

    ArduinoOTA.handle();
  
// -----------------------------------------------------------------------------------------
// MQTT
// -----------------------------------------------------------------------------------------

    if(!mqtt_client.connected())connect();
    mqtt_client.loop();

// -----------------------------------------------------------------------------------------
// Und hier Deine Funktionalität
// -----------------------------------------------------------------------------------------

          .....

          .....

          .....
          mqtt_client.publish(Topic+"/Motion", statusMotion);
  }

Vielen Dank.
Werds gleich mal mit dieser MQTT.h Library probieren.
Sollte einfach gehen, die API erscheint mir am ersten Blick eh komplett gleich.

gruß
bb

Manchmal sieht man den Wald vor lauter Bäumen nicht…
es hat nur ein
mqtt_client.loop();
gefehlt.
Daran hab ich jetzt 2Tage rumgewürgt.

Vielen Vielen Dank, ohne dein Beispiel hätte ich das nie gefunden.
Bernhard

PS. Die Libs sind schein

Schön dass es jetzt läuft.

was meinst Du damit?

Ups, irgendwie den Gedanken nicht fertiggetippt.
Meinte die Libs sind scheinbar die gleichen, bzw. einer hat nur vom anderen abgeschrieben. Weil API ist ja komplett ident. Nachdem ich das client.loop() hinzugefügt hatte gings dann auch mit dem PubSubClient.

gruß und danke nochmal
bb

1 „Gefällt mir“