Skip to content

Commit

Permalink
Changed MQTT payload and topic from char[] to String
Browse files Browse the repository at this point in the history
  • Loading branch information
matthias-bs committed Jul 9, 2023
1 parent 3368ffe commit c3db05c
Showing 1 changed file with 42 additions and 44 deletions.
86 changes: 42 additions & 44 deletions examples/BresserWeatherSensorMQTT/BresserWeatherSensorMQTT.ino
Original file line number Diff line number Diff line change
Expand Up @@ -408,18 +408,18 @@ void messageReceived(String &topic, String &payload)
*/
void publishWeatherdata(bool complete)
{
char mqtt_payload[PAYLOAD_SIZE]; // sensor data
char mqtt_payload2[PAYLOAD_SIZE]; // calculated extra data
char mqtt_topic[TOPIC_SIZE+31]; // add space for ID/name
String mqtt_payload; // sensor data
String mqtt_payload2; // calculated extra data
String mqtt_topic; // MQTT topic including ID/name

// ArduinoJson does not allow to set number of decimals for floating point data -
// neither does MQTT Dashboard...
// Therefore the JSON string is created manually.

for (int i=0; i<NUM_SENSORS; i++) {
// Reset string buffers
mqtt_payload[0] = '\0';
mqtt_payload2[0] = '\0';
mqtt_payload = "";
mqtt_payload2 = "";

if (!weatherSensor.sensor[i].valid)
continue;
Expand All @@ -432,84 +432,82 @@ void publishWeatherdata(bool complete)

// Example:
// {"ch":0,"battery_ok":true,"humidity":44,"wind_gust":1.2,"wind_avg":1.2,"wind_dir":150,"rain":146}
sprintf(&mqtt_payload[strlen(mqtt_payload)], "{");
sprintf(&mqtt_payload2[strlen(mqtt_payload2)], "{");
sprintf(&mqtt_payload[strlen(mqtt_payload)], "\"id\":%u", weatherSensor.sensor[i].sensor_id);
mqtt_payload = "{";
mqtt_payload2 = "{";
mqtt_payload += "\"id\":" + String(weatherSensor.sensor[i].sensor_id);
#ifdef BRESSER_6_IN_1
sprintf(&mqtt_payload[strlen(mqtt_payload)], ",\"ch\":%d", weatherSensor.sensor[i].chan);
mqtt_payload += ",\"ch\":" + String(weatherSensor.sensor[i].chan);
#endif
sprintf(&mqtt_payload[strlen(mqtt_payload)], ",\"battery_ok\":%d", weatherSensor.sensor[i].battery_ok ? 1 : 0);
mqtt_payload += ",\"battery_ok\"" + (weatherSensor.sensor[i].battery_ok ? "1" : "0");
if (weatherSensor.sensor[i].temp_ok || complete) {
sprintf(&mqtt_payload[strlen(mqtt_payload)], ",\"temp_c\":%.1f", weatherSensor.sensor[i].temp_c);
mqtt_payload += ",\"temp_c\":" + String(weatherSensor.sensor[i].temp_c, 1);
}
if (weatherSensor.sensor[i].humidity_ok || complete) {
sprintf(&mqtt_payload[strlen(mqtt_payload)], ",\"humidity\":%d", weatherSensor.sensor[i].humidity);
mqtt_payload += ",\"humidity\":" + String(weatherSensor.sensor[i].humidity);
}
if (weatherSensor.sensor[i].wind_ok || complete) {
sprintf(&mqtt_payload[strlen(mqtt_payload)], ",\"wind_gust\":%.1f", weatherSensor.sensor[i].wind_gust_meter_sec);
sprintf(&mqtt_payload[strlen(mqtt_payload)], ",\"wind_avg\":%.1f", weatherSensor.sensor[i].wind_avg_meter_sec);
sprintf(&mqtt_payload[strlen(mqtt_payload)], ",\"wind_dir\":%.1f", weatherSensor.sensor[i].wind_direction_deg);
mqtt_payload += ",\"wind_gust\":" + String(weatherSensor.sensor[i].wind_gust_meter_sec, 1);
mqtt_payload += ",\"wind_avg\":" + String(weatherSensor.sensor[i].wind_avg_meter_sec, 1);
mqtt_payload += ",\"wind_dir\":" + String(weatherSensor.sensor[i].wind_direction_deg, 1);
}
if (weatherSensor.sensor[i].wind_ok) {
char buf[4];
sprintf(&mqtt_payload2[strlen(mqtt_payload2)], "\"wind_dir_txt\":\"%s\"",
winddir_flt_to_str(weatherSensor.sensor[i].wind_direction_deg, buf));
sprintf(&mqtt_payload2[strlen(mqtt_payload2)], ",\"wind_gust_bft\":%d",
windspeed_ms_to_bft(weatherSensor.sensor[i].wind_gust_meter_sec));
sprintf(&mqtt_payload2[strlen(mqtt_payload2)], ",\"wind_avg_bft\":%d",
windspeed_ms_to_bft(weatherSensor.sensor[i].wind_avg_meter_sec));
mqtt_payload2 += "\"wind_dir_txt\":\"" + String(winddir_flt_to_str(weatherSensor.sensor[i].wind_direction_deg, buf)) + "\"";
mqtt_payload2 += ",\"wind_gust_bft\":" + String(windspeed_ms_to_bft(weatherSensor.sensor[i].wind_gust_meter_sec));
mqtt_payload2 += ",\"wind_avg_bft\":" + String(windspeed_ms_to_bft(weatherSensor.sensor[i].wind_avg_meter_sec));
}
if ((weatherSensor.sensor[i].temp_ok) && (weatherSensor.sensor[i].humidity_ok)) {
sprintf(&mqtt_payload2[strlen(mqtt_payload2)], ",\"dewpoint_c\":%.1f",
calcdewpoint(weatherSensor.sensor[i].temp_c, weatherSensor.sensor[i].humidity));
mqtt_payload2 += ",\"dewpoint_c\":" + String(calcdewpoint(weatherSensor.sensor[i].temp_c, weatherSensor.sensor[i].humidity), 1);

if (weatherSensor.sensor[i].wind_ok) {
sprintf(&mqtt_payload2[strlen(mqtt_payload2)], ",\"perceived_temp_c\":%.1f",
perceived_temperature(weatherSensor.sensor[i].temp_c, weatherSensor.sensor[i].wind_avg_meter_sec, weatherSensor.sensor[i].humidity));
mqtt_payload2 += ",\"perceived_temp_c\":"
+ String(perceived_temperature(weatherSensor.sensor[i].temp_c, weatherSensor.sensor[i].wind_avg_meter_sec, weatherSensor.sensor[i].humidity), 1);
}
}
if (weatherSensor.sensor[i].uv_ok || complete) {
sprintf(&mqtt_payload[strlen(mqtt_payload)], ",\"uv\":%.1f", weatherSensor.sensor[i].uv);
mqtt_payload += ",\"uv\":" + String(weatherSensor.sensor[i].uv, 1);
}
if (weatherSensor.sensor[i].light_ok || complete) {
sprintf(&mqtt_payload[strlen(mqtt_payload)], ",\"light_klx\":%.1f", weatherSensor.sensor[i].light_klx);
mqtt_payload += ",\"light_klx\":" + String(weatherSensor.sensor[i].light_klx, 1);
}
if (weatherSensor.sensor[i].rain_ok || complete) {
sprintf(&mqtt_payload[strlen(mqtt_payload)], ",\"rain\":%.1f", weatherSensor.sensor[i].rain_mm);
sprintf(&mqtt_payload[strlen(mqtt_payload)], ",\"rain_d\":%.1f", rainGauge.currentDay());
sprintf(&mqtt_payload[strlen(mqtt_payload)], ",\"rain_w\":%.1f", rainGauge.currentWeek());
sprintf(&mqtt_payload[strlen(mqtt_payload)], ",\"rain_m\":%.1f", rainGauge.currentMonth());
mqtt_payload += ",\"rain\":" + String(weatherSensor.sensor[i].rain_mm, 1);
mqtt_payload += ",\"rain_d\":" + String(rainGauge.currentDay(), 1);
mqtt_payload += ",\"rain_w\":" + String(rainGauge.currentWeek(), 1);
mqtt_payload += ",\"rain_m\":" + String(rainGauge.currentMonth(), 1);
}
if (weatherSensor.sensor[i].moisture_ok || complete) {
sprintf(&mqtt_payload[strlen(mqtt_payload)], ",\"moisture\":%d", weatherSensor.sensor[i].moisture);
mqtt_payload += ",\"moisture\":" + String(weatherSensor.sensor[i].moisture);
}
if (weatherSensor.sensor[i].lightning_ok || complete) {
sprintf(&mqtt_payload[strlen(mqtt_payload)], ",\"lightning_count\":%d", weatherSensor.sensor[i].lightning_count);
sprintf(&mqtt_payload[strlen(mqtt_payload)], ",\"lightning_distance_km\":%d", weatherSensor.sensor[i].lightning_distance_km);
sprintf(&mqtt_payload[strlen(mqtt_payload)], ",\"lightning_unknown1\":\"0x%03X\"", weatherSensor.sensor[i].lightning_unknown1);
sprintf(&mqtt_payload[strlen(mqtt_payload)], ",\"lightning_unknown2\":\"0x%04X\"", weatherSensor.sensor[i].lightning_unknown2);
mqtt_payload += ",\"lightning_count\":" + String(weatherSensor.sensor[i].lightning_count);
mqtt_payload += ",\"lightning_distance_km\":" + String(weatherSensor.sensor[i].lightning_distance_km);
mqtt_payload += ",\"lightning_unknown1\":\"0x"
+ String(weatherSensor.sensor[i].lightning_unknown1, HEX).toUpperCase() + "\"";
mqtt_payload += ",\"lightning_unknown2\":\"0x"
+ String(weatherSensor.sensor[i].lightning_unknown2, HEX).toUpperCase() + "\"";
}
sprintf(&mqtt_payload[strlen(mqtt_payload)], "}");
sprintf(&mqtt_payload2[strlen(mqtt_payload2)], "}");
mqtt_payload += "}";
mqtt_payload2 += "}";

// Try to map sensor ID to name to make MQTT topic explanatory
for (int n=0; n<NUM_SENSORS; n++) {
mqtt_topic = String(mqttPubData);
if (sensor_map[n].id == weatherSensor.sensor[i].sensor_id) {
snprintf(mqtt_topic, TOPIC_SIZE+31, "%s/%s", mqttPubData, sensor_map[n].name.substr(0, 30).c_str());
break;
mqtt_topic += "/" + sensor_map[n].name;
}
else {
snprintf(mqtt_topic, TOPIC_SIZE+31, "%s/%8X", mqttPubData, weatherSensor.sensor[i].sensor_id);
mqtt_topic += "/" + String(weatherSensor.sensor[i].sensor_id, HEX).toUpperCase();
}
}

// sensor data
Serial.printf("%s: %s\n", mqtt_topic, mqtt_payload);
log_i("%s: %s\n", mqtt_topic.c_str(), mqtt_payload.c_str());
client.publish(mqtt_topic, mqtt_payload, false, 0);

// extra data
if (strlen(mqtt_payload2) > 2) {
Serial.printf("%s: %s\n", mqttPubExtra, mqtt_payload2);
log_i("%s: %s\n", mqttPubExtra.c_str(), mqtt_payload2.c_str());
client.publish(mqttPubExtra, mqtt_payload2, false, 0);
}
} // for (int i=0; i<NUM_SENSORS; i++)
Expand All @@ -527,7 +525,7 @@ void publishRadio(void)

payload["rssi"] = weatherSensor.rssi;
serializeJson(payload, mqtt_payload);
Serial.printf("%s: %s\n", mqttPubRadio, mqtt_payload);
log_i("%s: %s\n", mqttPubRadio, mqtt_payload);
client.publish(mqttPubRadio, mqtt_payload, false, 0);
payload.clear();
}
Expand Down

0 comments on commit c3db05c

Please sign in to comment.