Publishing String Variable Error

Hi,

I am sending multiple values to a database using webhook, but I am having trouble when trying to send a time format string. If I send data without using a time variable such as shown below:

    String test_message = String::format (
      "{\"Lat\":%f, \"Long\":%f, \"Uncertainty\":%d, \"Flag1\":%d, \"Temperature\":%.2f, \"Humidity\":%.2f, \"Flag3\":%d, \"Flag4\":%d, \"sensor1_0\":%.2f, \"sensor2_5\":%.2f, \"sensor10\":%.2f, \"sensor1_02\":%.2f, \"sensor2_52\":%.2f, \"sensor102\":%.2f, \"Sig\":\"%s\"}",
      Lat, Long, uncertainty, flag1, temperature, humidity, flag3, flag4, sensor1, sensor2_5, sensor10, sensor12, sensor2_52, sensor102, modemSignal
    );

I achieve the following output, which is what I expect:

{"source_device":"111111111111111111","datetime":"2018-09-30T22:36:06.024Z","Lat":"12.3456","Long":"-123.456","Uncertainty":"1880","Time":"","Flag1":"0","Temperature":"77.18","Humidity":"36.5","Flag3":"0","Flag4":"0","sensor1_0":"9.02","sensor2_5":"13.23","sensor10":"15.92","sensor1_02":"9","sensor2_52":"13.65","sensor102":"14.85","Sig":"12"}

But, once I try to send a time variable using the following string::format:

    String test_message = String::format (
      "{\"Lat\":%f, \"Long\":%f, \"Uncertainty\":%d, \"Time\":\"%s\", \"Flag1\":%d, \"Temperature\":%.2f, \"Humidity\":%.2f, \"Flag3\":%d, \"Flag4\":%d, \"sensor1_0\":%.2f, \"sensor2_5\":%.2f, \"sensor10\":%.2f, \"sensor1_02\":%.2f, \"sensor2_52\":%.2f, \"sensor102\":%.2f, \"Sig\":\"%s\"}",
      Lat, Long, uncertainty, dateTime.c_str(), flag1, temperature, humidity, flag3, flag4, sensor1, sensor2_5, sensor10, sensor12, sensor2_52, sensor102, modemSignal
    );

All my data values are missing as shown below.

{"source_device":"1111111111111111","datetime":"2018-09-30T22:29:08.389Z","Lat":"","Long":"","Uncertainty":"","Time":"","Flag1":"","Temperature":"","Humidity":"","Flag3":"","Flag4":"","sensor1_0":"","sensor2_5":"","sensor10":"","sensor1_02":"","sensor2_52":"","sensor102":"","Sig":""}

I am creating my dateTime string by:

String dateTime = Time.format(Time.now(), "%FT%TZ");

Any ideas why this is happening?

Thanks,
Jeff

If you want to use a String variable (like Time.format()) as intput for a printf() (which essentially is what String::format() uses) you need to either cast the String via (const char*) or call the translator function String.c_str().

However, I’ll always advocate against String and rather go with a character array.

  char msg[128];
  snprintf(msg, sizeof(msg), 
           "{\"Lat\":%f, \"Long\":%f, \"Uncertainty\":%d, \"Time\":\"%s\", \"Flag1\":%d, \"Temperature\":%.2f, \"Humidity\":%.2f, \"Flag3\":%d, \"Flag4\":%d, \"sensor1_0\":%.2f, \"sensor2_5\":%.2f, \"sensor10\":%.2f, \"sensor1_02\":%.2f, \"sensor2_52\":%.2f, \"sensor102\":%.2f, \"Sig\":\"%s\"}",
           Lat, Long, uncertainty, (const char*)Time.format("%FT%TZ"), flag1, temperature, humidity, flag3, flag4, sensor1, sensor2_5, sensor10, sensor12, sensor2_52, sensor102, modemSignal
          );
  Serial.println(msg);  // check output immediately and not only *after* it has gone through several transfers.

But what is odd - even in your “working” example - is that your values are wrapped in double quotes while your format string does not encode these.

4 Likes