PubSubClient - Topic in Variable

Moin!

Ich suche eine Möglichkeit, das Topic für das Publishen eines Wertes in einer Variable anzugeben. Also z.B.:

String meinTopic = "Temperatur";  //ich glaube da wird char benötigt?
client.publish(meinTopic, wert);

Der Wert muss umgewandelt werden, nicht der Name des topics. Ich nutze dazu dtostrf.

Dazu kann man einen Speicher anlegen:

char tempBuffer[50];

um dann so umzuwandeln:

 client.publish("Temperatur", dtostrf(wert, 6, 1, tempBuffer));

Die Zahlen stehen für die Nachrichtlänge und ob "retained" oder nicht.

Ist hier gut beschrieben:

https://pubsubclient.knolleary.net/api#publish

Moin!

Es geht mir um das Topic selbst, nicht um den Wert. Also das Topic "Temperatur" möchte ich in einer Variable übergeben. Hintergrund ist, dass ich mehrere Temperatursensoren habe. Nun möchte ich in einer Schleife die Werte in einzelne Topics publishen. Also z.B.: Temperatur 1, Temperatur 2, etc. Deshalb möchte ich das ungefähr so haben:

for(int i=0;i<sensorCount;i++){     //sensorCount ist Anzahl der gefunden Sensoren
     meinTopic = Temperatur[i];
     client.publish(meinTopic, wert);
}

Ich könnte natürlich auch schreiben:

client.publisch("Temperatur 1", wert);
client.publisch("Temperatur 2", wert);
client.publisch("Temperatur 3", wert);
client.publisch("Temperatur 4", wert);

Aber sollte ein Sensor dazukommen, muss der Code angepasst werden. Das will ich vermeiden.

Es geht mir um das Topic selbst, nicht um den Wert

Na, z.B. so:

static char meinTopic[] = "Temperatur #";    // 12 Zeichen + Endekennung = 13 Byte
const byte pos = sizeof(meinTopic)-2;   // 11 ist die Position des '#', hätte man auch von Hand zählen können 

for(int i=0 ;i<sensorCount; i++){     //sensorCount ist Anzahl der gefunden Sensoren
     meinTopic[pos] = i+'1' ;             // Das # ersetzen  ( 0 -> '1', 1 -> '2' , ... )
     client.publish(meinTopic, wert);
}

Dass du je nach i nicht nur einen anderen Topic, sondern auch einen anderen Wert publishen willst, kriegen wir später. :slight_smile:

Meinst Du das so?

String meinTopic = "Temperatur ";
const byte sensorCount = 4;

void setup() {
  delay(2000);
  Serial.begin(115200);    //only used for debug
  Serial.println(F("Start"));
  for (int i = 0; i < sensorCount; i++) { //sensorCount ist Anzahl der gefunden Sensoren
    Serial.println(meinTopic + String(i));
    //client.publisch(meinTopic + String(i), wert);
  }
}

void loop() {
}

@ michael_x

Das sieht gut aus. Ich werde es mal testen. Die Werte der einzelnen Sensoren ist kein Problem. Pro Schleifendurchlauf wird ein Wert gelesen. Das läuft.

Edit: Funktioniert. Vielen Dank!

Achso ok, dann hatte ich deine Frage nicht richtig verstanden. :cold_sweat:

Schön das es funktioniert und danke für die Rückmeldung.

Gruß

agmue:
Meinst Du das so?

Um Himmels willen, Nein.
Zwei Texte mittels eines + zu einem zusammenfügen, mag zwar einfach aussehen, ist aber fürchterlich umständlich.
Wenn dann eigentlich gar keine źwei beliebigen Texte zusammengefügt werden, sondern eigentlich nur ein Buchstabe ausgetauscht werden soll,
und man nur wegen diesem + überhaupt String-Objekte verwendet, graust es mich.

michael_x:
Um Himmels willen, Nein.

Dann bin ich beruhigt ;D

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.