Zwei Werte per MQTT an ESP-8266 übergeben

Hallo,

ich bin relativer Anfänger in der Programmierung mit Ardunio.

Ich habe mir mal das Beispiel aus dem PubSubClient genommen und möchte jetzt zwei verschiedene Werte an den ESP per MQTT übergeben. Aus den Beispielen werde ich nicht so ganz schlau. Im CALLBACK, durch den die Änderungen durchgeführt werden, die ich im Broker eintrage, wird ja ein TOPIC übergeben.

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
  // Switch on the LED if an 1 was received as first character
  if ((char)payload[0] == '1') {
    digitalWrite(13, LOW);   // Turn the LED on (Note that LOW is the voltage level
    // but actually the LED is on; this is because
    // it is active low on the ESP-01)
  } else {
    digitalWrite(13, HIGH);  // Turn the LED off by making the voltage HIGH
  }
  
}

Woher er weiß, welchen Wert er für den TOPIC nehmen soll, erschließt sich mir nicht so ganz. Ich nehme nur an, dass der TOPIC aus dem client.subscribe(“inTopic”) kommt.

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Create a random client ID
    String clientId = "ESP8266Client-";
    clientId += String(random(0xffff), HEX);
    // Attempt to connect
    if (client.connect(clientId.c_str())) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      client.publish("outTopic", "hello world");
      // ... and resubscribe
      client.subscribe("inTopic");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

Wie kann ich aber z.B. einen Wert für das Umschalten eines Relais (/cmnd/ESP-Client/Relais) und einen weiteren Werte für das Umstellen von Sommer- auf Winterzeit (/cmnd/ESP-Client/MEZ-MESZ) übergeben?

Frank67:
Ich nehme nur an, dass der TOPIC aus dem client.subscribe("inTopic") kommt.

Nein. Ich kenne zwar die MQTT library nicht, aber wenn die Methoden das machen, was ihr Name sagt, dann machst du mit client.subscribe("Topic") der library klar, dass du Nachrichten für eben jenes Topic empfangen möchtest. Wenn der ESP nun ein anderes Topic empfängt, wird dieses einfach verworfen.

Die callback methode wird von der MQTT library aufgerufen, wenn eine Nachricht auf einem Topic empfangen wurde, das du auch abonniert hast (subscribe). Die library packt dann einfach das empfangene Topic in den Parameter topic, die empfangenen Daten in payload und die Anzahl der Daten in length. Damit kannst du dann machen was du willst.

Frank67:
Wie kann ich aber z.B. einen Wert für das Umschalten eines Relais (/cmnd/ESP-Client/Relais) und einen weiteren Werte für das Umstellen von Sommer- auf Winterzeit (/cmnd/ESP-Client/MEZ-MESZ) übergeben?

Das wiederum hat etwas mit client.subscribe zu tun. Wenn du Nachrichten auf dem Topic empfangen willst, dann musst du das Topic auch abonnieren:

client.subscribe("/cmnd/ESP-Client/Relais");
client.subscribe("/cmnd/ESP-Client/MEZ-MESZ");

In deiner callback-Routine kannst du dann prüfen, welches Topic du empfangen hast:

void callback(char* topic, byte* payload, unsigned int length) {
  if(strcmp(topic, "/cmnd/ESP-Client/Relais") == 0) {
    // Nachricht verarbeiten
  } else if(strcmp(topic, "/cmnd/ESP-Client/MEZ-MESZ") == 0) {
    // Anderes Topic verarbeiten
}