Kommazahl Abfrage (indexOf)

Guten Tag zusammen.
Ich habe hier ein Programm, welches einen definierten Account (zum Testen nehme ich meinen) aus dem Twitch Chat eines definierten Kanals auslesen soll und darauf soll (erstmal) eine LED leuchten.
Das Programm funktioniert auch soweit. Es wird gestartet, der "Bot" meldet sich mit "Hallo Welt" und schreibe ich das Wort "Test" in den Chat, antwortet der der "Bot" (in dem Fall ja mein Account) mit "Test bestanden" iin den Chat und die LED leuchtet wie gewünscht. Mit dem Programm kann ich auch andere Accounts, wie z.B. den StreamElements (Bot) abfragen. Bis jetzt aber nur ganze Wörter. Wie schaffe ich es z.B. einen €-Betrag abzufragen (es würde ja die Zahl reichen)? Bzw. ich würde dann gerne hingehen und eine Abfrage machen wie z.B: Bei Betrag 1-50 inklusive der Komma Beträge (12,57 usw) soll LED 1 leuchten und ab 50,01 und höher leuchtet LED 2.
Momentan ist LED 2 noch nicht im Programm integriert, diese einzubauen, ist aber nicht das Problem.

Das Programm sieht momentan so aus:

#include <ESP8266WiFi.h>         
#include <IRCClient.h>
 
#define IRC_SERVER   "ircchattwitchtv"
#define IRC_PORT     6667                   //Port 6667
 
char ssid[] = "Fake_WLAN";                    //WLAN Name
char password[] = "1234";            //WLAN Passwort

const String twitchChannelName = "testkanal";   //Twitch Name in klein. WICHTIG!

#define TWITCH_BOT_NAME "TestName"             //Eigener oder weiterer Account als Infogeber im Chat. Keine Muss!

#define TWITCH_OAUTH_TOKEN ""   //Token dieses Accounts

int led = 5;                          //GPIO5 wurde in led umbennant
String ircChannel = "TestKanal";        //ircChannel = Name des Kanals, zur besseren Übersicht

 
WiFiClient wiFiClient;
IRCClient client(IRC_SERVER, IRC_PORT, wiFiClient);

void setup() {
 
  pinMode(led, OUTPUT);
 
  Serial.begin(115200);
  Serial.println();

  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);
  
  Serial.print("Connecting Wifi: ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  IPAddress ip = WiFi.localIP();
  Serial.println(ip);
 
  ircChannel = "#" + twitchChannelName;
 
  client.setCallback(callback);
}
 
void loop() {
 
  // Try to connect to chat. If it loses connection try again
  if (!client.connected()) {
    Serial.println("Attempting to connect to " + ircChannel );
    // Attempt to connect
    // Second param is not needed by Twtich
    if (client.connect(TWITCH_BOT_NAME, "", TWITCH_OAUTH_TOKEN)) {
      client.sendRaw("JOIN " + ircChannel);
      Serial.println("connected and ready to rock");
      sendTwitchMessage("Hallo Welt"); //Begrüßung im Chat = Bot ist aktiv
    } else {
      Serial.println("failed... try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
    return;
  }
  client.loop();
}
 
void sendTwitchMessage(String message) {
  client.sendMessage(ircChannel, message);
}
 
 
void callback(IRCMessage ircMessage) {
  //Serial.println("In CallBack");
 
  if (ircMessage.command == "PRIVMSG" && ircMessage.text[0] != '\001') {
    //Serial.println("Passed private message.");
   
    ircMessage.nick.toUpperCase();
 
    String message("<" + ircMessage.nick + "> " + ircMessage.text);
 
    //prints chat to serial
    Serial.println(message);
  if (ircMessage.text.indexOf("Test") > -1 && ircMessage.nick == "TESTNAME") //Warte beim Namen TestName (alles muss groß geschrieben werden) auf den Text "Test" und führe dann das Programm aus
      {
   sendTwitchMessage("Test bestanden"); //Schreibt als Antwort den Text in den Chat
   digitalWrite(led, HIGH);
   delay(1000);
   digitalWrite(led, LOW);
   delay (25);
    }
   
    return;
  }
}

Setze Deinen Sketch bitte in Codetags, damit man ihn vernünftig lesen kann.
Wie das geht, ist hier erklärt.
Eine gute Formatierung hilft auch bei der Lesbarkeit. +T in der IDE hilft Dir dabei.

Ansonsten schaue Dir mal atof an.

Gruß Tommy

Ist getan. Danke für die Info. :+1:

char message[]="30,21€";

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  Serial.println(message);
  float f=atof(message);
  Serial.println(f);
  
}

void loop()
{


}

Achte drauf, das Du damit Rundungsdifferenzen bekommen kannst... die einen Vergleich unmöglich machen. Hatten wir gerade.

Hallo,
das heißt Du hast einen Fließtext ohne irgendwelche Trennzeichen und willst auf Zahlen abfragen ?
Wenn Du nicht weißt wo welche Zahlen vorkommen und wie viele kann das recht aufwendig werden.
aber schau dir mal atof an das könnte ein Anfang sein.
https://www.cplusplus.com/reference/cstdlib/atof/?kw=atof
Heinz
Nachtrag : @my_xy_projekt war schneller , hat sich überschnitten

Genau, ich bekomme einen Fließtext und dort taucht die Zahl als Text auf. Das Programm, das momentan läuft, kann ein definiertes Wort aus diesem Text erkennen und reagiert dann darauf. Mein Ziel ist es jetzt, diese "Aktion" variabel zu machen. Es soll z.B. eine Aktion bei einem definierten Wert 1,00 € - 49,99 € ausgelöst werden und die andere ab 50,00 € und höher. Der Text im Chat wird übrigens so ausgegeben: {user} just tipped {currency}{amount}. Momentan kann ich das Programm auf das Wort "tipped" reagieren lassen.
Wenn ich das richtig verstandne habe, kann ich mit indexOf...

... nur Wörter vergleichen.
Genau da liegt mein Problem. In dieser Zeile muss ich es hinbekommen, dass eine Zahl UND trozdem der Name verglichen wird.
Quasi so:
if (zahl zwischen x und y) > -1 && ircMessage.nick == "TESTNAME") { führe Aktion aus }

Ist die Zahl das einzige vorkommen von numerischen Zeichen?
Gib uns doch mal ein Beispiel für eine gültige Message.

Gruß Tommy

Die Meldung würde so aussehen...
StreamElements: UserXY just tipped €15.57
Das Währungszeichen kann ich auch von der Zahl trennen, da dieser Text anpassbar ist.
Mir fällt nur gerade ein, dass es besser wäre das Wort "tipped" mit abzufragen, da es auch andere Zahlen von diesem Bot "Streamelements" geben wird, wie z.B:
Streamelements: UserXY just cheered 300 bits
oder
UserXY is in our Gaming-Squad for 5 months in a row
Bei den letzten beiden Meldungen kommen aber keine Kommazahlen vor.

char message[] = "nickName just tipped €30.21";

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  Serial.println(message);
  char *a = strtok(message, "€");
  Serial.println(a);
  char *b = strtok(NULL, "€");
  Serial.println(b);
  float f = atof(b);
  Serial.println(f);
  char *c = strtok(a, " ");
  Serial.println(c);
  char *d = strtok(NULL, " ");
  Serial.println(d);
}

void loop()
{
}

Und beschwer Dich nicht, das da tipped nicht steht.

Wofür machst Du strtok auf " " (1 Blank)?
Wegen der Worte im Text?

Gruß Tommy

Inhalt von *a "nickName just tipped" Wie soll ich sonst an nickName kommen?

Mal aufgelöst:

char message[] = "nickName just tipped € 30.21";

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  Serial.println(message);
  char *a = strtok(message, "€");
  Serial.println(a);
  char *b = strtok(NULL, "€");
  Serial.println(b);
  float f = atof(b);
  Serial.println(f);
  char *c = strtok(a, " ");
  Serial.println(c);
  c = strtok(NULL, " ");
  Serial.println(c);
  c = strtok(NULL, " ");
  Serial.println(c);
}

void loop()
{
}

ok, wollte das jemand wissen?

Gruß Tommy

Ja.

ok, Du hast Recht.

Gruß Tommy

Vielen lieben Dank für eure schnellen Antworten. Ich bastle mich die Tage durch und melde mich dann.

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