Problem mit AnotherIFTTTWebhook | cannot convert 'String' to 'char*'

Hallo zusammen kurz zu dem was ich mache.

ich habe mit dem ESP8266 einen Webserver erstellt, darauf ist eine Webseite die eine Eingabe () hat mit der ich mir 2 Werte holle:

Nachricht und Betreff

Ich lese die 2 Eingaben aus und gebe sie auf dem Serialmonitor aus, zum testen. das geht.
Beider Variablen speichere ich in einem String.

So nun will ich ifttt.com nutzen und quasi mit dem Webhook eine Mail versenden die genau diese 2 Eingabe hat also Betreff und die Nachricht.

mein Code ist bei diesem Abschnicht dann so:

....
send_webhook(IFTTT_Event,IFTTT_Key,betreff,nachricht,"");
...

so und wenn ich das probiere kommt der Fehler:

cannot convert 'String' to 'char*'

aber wenn ich das dann Teste mit zum Beispiel

....
send_webhook(IFTTT_Event,IFTTT_Key,"Mein Betreff","Meine Nachricht","");
...

dann geht es.

Es ist doch egal ob ich das ganze mit einer String Variable aufrufe oder das ganze quasi fix mit ".." mache. Das ist doch das selbe warum geht das eine mit "..." und das mit den Variablen zeigt nen Fehler. Das verstehe ich net ganz.

Hier mal ein Teil des Codes, wenn es interessiert:

. . . 

String subject="";
String msg="";
. . . 

void setup() {
  Serial.begin(9600);
 
  Serial.print("Connecting to ");
  Serial.print(WIFI_SSID);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(100);
    Serial.print(".");
  }
  
  Serial.println();
  Serial.print("Connected! IP address: ");
  Serial.println(WiFi.localIP());

  

  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/html", index_html);
  });

  server.on("/action_page", HTTP_GET, [](AsyncWebServerRequest *request){
    subject = request->getParam("subject")->value().c_str(); 
    msg = request->getParam("msg")->value().c_str();
    Serial.println(subject);
    Serial.println(msg);

   send_webhook(IFTTT_Event,IFTTT_Key,subject,msg,"");
    
    request->redirect("/");
  });



  server.begin();
}

. . .

PS: Habe das Thema auch noch in einem anderen Forum gepostet.

Es ist doch egal ob ich das ganze mit einer String Variable aufrufe oder das ganze quasi fix mit ".." mache.

Es ist dir egal, wenn dir der Compiler den Kram um die Ohren haut?
Scheinbar doch nicht....

cannot convert 'String' to 'char*'

Was ist der Unterschied zwischen 'String' und 'char*'?
Mache ihn dir bitte klar.

send_webhook(IFTTT_Event,IFTTT_Key,betreff.c_str(),nachricht.c_str(),"");

combie:
Es ist dir egal, wenn dir der Compiler den Kram um die Ohren haut?
Scheinbar doch nicht....
Was ist der Unterschied zwischen 'String' und 'char*'?
Mache ihn dir bitte klar.

send_webhook(IFTTT_Event,IFTTT_Key,betreff.c_str(),nachricht.c_str(),"");

Hallo also der Unterschied zwischen String und char*

Also String ist einfach der Datentyp, so wie ich das verstehe ist das dann ein Array aus lauter Chars

und char* heißt das es ein Array von “Zeigern” ist

Dann muss ich eigentlich wissen wie ich aus dem String einen char* Array mache.

send_webhook(IFTTT_Event,IFTTT_Key,betreff.c_str(),nachricht.c_str(),"");

Das hab ich probiert dann kamm der Fehler:

invalid conversion from 'const char*' to 'char*' [-fpermissive]

Irgendwie erinnert mich das an: Problem mit AnotherIFTTTWebhook | cannot convert 'const char*' to 'char*'

Wenigstens hast Du jetzt nen neuen Fehler :wink:

Ja das ist das selbe PRoblem dachte auf 2 Plattfromen findet sich schneller ne Lösung.

Jetzt ist der Fehler:

cannot convert 'const char*' to 'char*'

Dann wäre es schön wenn Du jeweils in den Threads auf den anderen verlinkst, damit die, die dir helfen wollen, auch nachlesen können was schon versucht wurde.
Ansonsten mal über Crossposting nachlesen (wird in Foren nicht gern gesehen)

Ich habe jetzt ne Lösung für das Problem gefunden, hab es nun so gemacht:

Hier nur der Ausschnit ausm loop:

void loop() {

  if(button == "a"){ 

    char msg_temp[msg.length()+1]; 
    char sb_temp[subject.length()+1]; 
  
    for (int i = 0; i < sizeof(msg_temp); i++) { 
      if(i<sizeof(msg_temp)-1){
        msg_temp[i] = msg[i];
      }else{
        msg_temp[i] = {'\0'};
      }
         
    }
    for (int y = 0; y < sizeof(sb_temp); y++) { 
        if(y<sizeof(sb_temp)-1){
        sb_temp[y] = subject[y]; 
        }else{
          sb_temp[y] = {'\0'};
        }
    }  
    
    Serial.println(msg_temp);
    Serial.println(sb_temp);
    send_webhook(IFTTT_Event,IFTTT_Key,sb_temp,msg_temp,"");
    button="x";

  }

ich hab das Gefühl da es eine eher unschöne Lösung ist. Gibt es da evtl. etwas schöneres um aus
einem Const String ein char[] zu machen.

Also String ist einfach der Datentyp, so wie ich das verstehe ist das dann ein Array aus lauter Chars

String ist eine Klasse, nicht einfach nur ein Datentype für einen C-String.
Beinhaltet auch Methoden usw...

Gibt es da evtl. etwas schöneres um aus
einem Const String ein char[] zu machen.

String hat eine Methode um das zu tun.

In welchen Forum hättest Du gern die Antworten?

Gruß Tommy

combie:
String ist eine Klasse, nicht einfach nur ein Datentype für einen C-String.
Beinhaltet auch Methoden usw...
String hat eine Methode um das zu tun.

Hallo danke ich glaub ich hab da was gefunden: toCharArray()

ich werde mich mal daran versuchen

Tommy56:
In welchen Forum hättest Du gern die Antworten?

Gruß Tommy

Hallo sry wegen dem doppelten Post in 2 Foren wird nicht mehr gemacht.
Aber ich schau ich beide rein :slight_smile:

Hallo zusammen habe von Tommy56 in dem anderen Foum(sry dafür) die Lösung

send_webhook(IFTTT_Event,IFTTT_Key,(char *)subject.c_str(),(char *) msg.c_str(),"");

das kalppt wunderbar und ich wie ich finde sauberer als meine Lösung.
Danke an alle :slight_smile:

und ich wie ich finde sauberer als meine Lösung.

Du hast ihm jetzt den const Modifizierer auf die harte Art genommen.
Eigentlich hatte der schon seinen Grund gehabt.
z.B. um Modifikationen der Zeichenkette zu unterbinden.

Das fehlt jetzt.
Jetzt kann dich der Compiler nicht mehr vor unerwünschten Seiteneffekten warnen, oder sie gar unterbinden.

Ich sehe da also eher einen knallharten "dirty hack", und keine "schöne Lösung".
So gewinnt man vielleicht diese eine Schlacht, aber keinen Krieg.

Der Vorschlag kam von mir. Ich sehe den Fehler eher beim Autor der Lib, dass dieser kein const char * in der Funktionssignatur verwendet hat, denn die Zeichenketten werden nicht verändert.

Gruß Tommy