MQTT senden Verständnisproblem

Hallo zusammen,
ich wollte mich auch einmal mit MQTT beschäftigen.
Das Empfang von Daten über den MQTT-Server ist ja einfach, quasi selbst erklärend.
Ich habe nach paresy´s Anleitung ein ESP8266 programmiert, alles gut.
Nun will ich aber mit dem ESP8266 Daten empfangen, was muss ich auf der IPS anlegen/einstellen.

Code ESP:

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

const char* SSID = "**";
const char
PSK = „*****“;
const char
MQTT_BROKER = „IP-IPS“;

WiFiClient espClient;
PubSubClient client(espClient);

void setup_wifi() {
WiFi.begin(SSID, PSK);

while (WiFi.status() != WL_CONNECTED) {
    delay(2100);
}

Serial.println(WiFi.localIP());

}

void callback(char* topic, byte* payload, unsigned int length) {
String msg;
for (byte i = 0; i < length; i++) {
char tmp = char(payload[i]);
msg += tmp;
}
Serial.println(msg);
}

void setup() {
Serial.begin(9600);
setup_wifi();
client.setServer(MQTT_BROKER, 1883);
client.setCallback(callback);
}

void loop() {
if (!client.connected()) {
while (!client.connected()) {
client.connect(„ESP8266Client“);
client.subscribe(„test/test/baum“);
delay(100);
}
}
client.loop();
client.publish("/home/data", „Hello World“);
delay(1000);
}`
Daten kommen jede Sekunde in IPS an, nur das Senden von IPS zum ESP funktioniert nicht.

Hallo meike0_0,

also ich mache das so (Hier ein Beispiel von einem Bewegungsmelder:

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

// -----------------------------------------------------------------------------------------
// Statusvariablen
// -----------------------------------------------------------------------------------------

  unsigned long statusSend    = 0;
  unsigned long statusTarget  = 60000;
  unsigned long motionDeteced = 0;
  unsigned long motionTarget  = 180000;
  int           readContact   = 0;
  #define LED_PIN LED_BUILTIN

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

  String Topic          = "Ort/Sensor"; 
  const char* host      = "Ort_Sensor";
  const char* wifi_ssid = "WIFI-SSID";
  const char* wifi_key  = "myPassword";
  const char* mqtt_host = "123.zzz.yyy.xx";

  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;
      while (WiFi.status() != WL_CONNECTED) {
        if(tries++ > 10)return;
        delay(1000);
        Serial.print(".");
      }
      // Good. We have WiFi now!
      Serial.println(" Success!");
    }
    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(".");
      }

      digitalWrite(LED_PIN, HIGH);
      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() {
    pinMode(LED_PIN, OUTPUT);
    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("das ist ganz geheim!");
    ArduinoOTA.begin();
  
// -----------------------------------------------------------------------------------------
// Sensor starten  
// -----------------------------------------------------------------------------------------

    pinMode(D1, INPUT);
  
}

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

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

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

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

// -----------------------------------------------------------------------------------------
//  Bewegung erkennen und senden
// -----------------------------------------------------------------------------------------

    if(digitalRead(D1)==HIGH){
      motionDeteced = millis();
      if(readContact==0){
        Serial.print("Bewegung erkannt\n");
        digitalWrite(LED_PIN, LOW);
        readContact = 1;
        mqtt_client.publish(Topic+"/Motion", "true");
      }
    }else{
      if(abs(millis() - motionDeteced) >= motionTarget){
        if(readContact==1){
          Serial.print("Keine Bewegung mehr\n");
          digitalWrite(LED_PIN, HIGH);
          readContact = 0;
          mqtt_client.publish(Topic+"/Motion", "false");
        }
      }

    }
 
// -----------------------------------------------------------------------------------------
// regelmäßig Status senden
// -----------------------------------------------------------------------------------------

    if(abs(millis() - statusSend) >= statusTarget){
      statusSend = millis();
      mqtt_client.publish(Topic+"/RSSI", String(WiFi.RSSI()));
    }
  }

In Symcon legst Du dann ein MQTT-Server-Device mit dem Topic

Ort/Sensor/reset

als Bool-Variable an. Und kannst dann über die Variable Deinen ESP8266 resetten.

Jürgen

Hallo Jürgen,
danke für deine Antwort.
Aber irgend wie sendet IPS nicht an den ESP. Ich müsste doch im Debug vom MQTT-Server etwas sehen.Instanz

ESP Debug

Wenn ich per SSCK_SendText auf den Server Socket „ort/sensor/reset“ sende, kommt als Meldung im ESP-Fenster zurück.

Connecting to MQTT server: xxx.xxx.xxx.xxx
 Success!

Also auf irgend etwas reagiert der ESP.

Aber es müsste doch eine Meldung mit
incoming: " + topic + " - " + payload
bringen

Zum Senden hast Du doch extra die Instanz angelegt. Wenn Du dort true/false umschaltest, dann müsste gesendet werden. Das Topic muß natürlich genauso heißen, wie bei Deinem ESP. Ansonsten kann nichts ankommen.
Jürgen

Das ist ja mein Problem, beim Umschalten der Variablen sollte man im Debug vom MQTT-Socket ja etwas sehen. Das Topic sollte doch erst einmal egal sein.

Ist die Instanz denn mit dem richtigen MQTT-Server verbunden?

Nö, wenn sich kein Client auf dieses topic subscribt hat, kann der Server ja nix senden.
Michael

Topic sollte dem MQTTSever zugeordnet sein


So wie NallChan geschrieben hat: Versuchs mal mit „Ort/Sensor/reset“
So wie das Subscribe aussieht.
Jürgen

Danke euch beiden.
Mit „Ort/Sensor/reset“ funktioniert es natürlich :sweat_smile:.
Mein Gedankenfehler war einfach, dass nichts im Debug zu sehen war.
Das heißt aber im Hintergrund wir automatisch eine Verbindung zum ESP aufgebaut und sobald die Verbindung zu „Ort/Sensor/reset“ steht sendet der Socket auch.

Ne, der MQTT Server in IPS merkt sich die Clients welche sich auf topics subscriben und sendet nur dann zielgerichtet an diese Clients.
Michael