Build CE payload format for extended measures

This commit is contained in:
samuelbles07
2025-11-23 18:16:26 +07:00
parent 9e07b67951
commit 565a7fa9fd
3 changed files with 74 additions and 3 deletions

View File

@@ -1416,11 +1416,12 @@ void postUsingCellular(bool forcePost) {
// Build payload include all measurements from queue
std::string payload;
bool extendPmMeasures = configuration.isExtendedPmMeasuresEnabled();
payload += std::to_string(CELLULAR_MEASUREMENT_INTERVAL / 1000); // Convert to seconds
for (int i = 0; i < queueSize; i++) {
auto mc = measurementCycleQueue.at(i);
payload += ",";
payload += measurements.buildMeasuresPayload(mc);
payload += measurements.buildMeasuresPayload(mc, extendPmMeasures);
}
// Release before actually post measures that might takes too long

View File

@@ -885,7 +885,7 @@ Measurements::Measures Measurements::getMeasures() {
return mc;
}
std::string Measurements::buildMeasuresPayload(Measures &mc) {
std::string Measurements::buildMeasuresPayload(Measures &mc, bool extendedPmMeasures) {
std::ostringstream oss;
// CO2
@@ -984,6 +984,76 @@ std::string Measurements::buildMeasuresPayload(Measures &mc) {
oss << mc.signal;
}
if (extendedPmMeasures) {
oss << ",,,,,,,,"; // Add placeholder for MAX payload (BMS & O3/NO2)
/// PM 0.5 particle count
if (utils::isValidPm03Count(mc.pm_05_pc[0]) && utils::isValidPm03Count(mc.pm_05_pc[1])) {
oss << std::round((mc.pm_05_pc[0] + mc.pm_05_pc[1]) / 2.0f);
} else if (utils::isValidPm03Count(mc.pm_05_pc[0])) {
oss << std::round(mc.pm_05_pc[0]);
} else if (utils::isValidPm03Count(mc.pm_05_pc[1])) {
oss << std::round(mc.pm_05_pc[1]);
}
oss << ",";
/// PM 1.0 particle count
if (utils::isValidPm03Count(mc.pm_01_pc[0]) && utils::isValidPm03Count(mc.pm_01_pc[1])) {
oss << std::round((mc.pm_01_pc[0] + mc.pm_01_pc[1]) / 2.0f);
} else if (utils::isValidPm03Count(mc.pm_01_pc[0])) {
oss << std::round(mc.pm_01_pc[0]);
} else if (utils::isValidPm03Count(mc.pm_01_pc[1])) {
oss << std::round(mc.pm_01_pc[1]);
}
oss << ",";
/// PM 2.5 particle count
if (utils::isValidPm03Count(mc.pm_25_pc[0]) && utils::isValidPm03Count(mc.pm_25_pc[1])) {
oss << std::round((mc.pm_25_pc[0] + mc.pm_25_pc[1]) / 2.0f);
} else if (utils::isValidPm03Count(mc.pm_25_pc[0])) {
oss << std::round(mc.pm_25_pc[0]);
} else if (utils::isValidPm03Count(mc.pm_25_pc[1])) {
oss << std::round(mc.pm_25_pc[1]);
}
oss << ",";
/// PM 5.0 particle count
if (utils::isValidPm03Count(mc.pm_5_pc[0]) && utils::isValidPm03Count(mc.pm_5_pc[1])) {
oss << std::round((mc.pm_5_pc[0] + mc.pm_5_pc[1]) / 2.0f);
} else if (utils::isValidPm03Count(mc.pm_5_pc[0])) {
oss << std::round(mc.pm_5_pc[0]);
} else if (utils::isValidPm03Count(mc.pm_5_pc[1])) {
oss << std::round(mc.pm_5_pc[1]);
}
oss << ",";
/// PM 10 particle count
if (utils::isValidPm03Count(mc.pm_10_pc[0]) && utils::isValidPm03Count(mc.pm_10_pc[1])) {
oss << std::round((mc.pm_10_pc[0] + mc.pm_10_pc[1]) / 2.0f);
} else if (utils::isValidPm03Count(mc.pm_10_pc[0])) {
oss << std::round(mc.pm_10_pc[0]);
} else if (utils::isValidPm03Count(mc.pm_10_pc[1])) {
oss << std::round(mc.pm_10_pc[1]);
}
oss << ",";
/// PM2.5 standard particle
if (utils::isValidPm(mc.pm_25_sp[0]) && utils::isValidPm(mc.pm_25_sp[1])) {
float pm10 = (mc.pm_25_sp[0] + mc.pm_25_sp[1]) / 2.0f;
oss << std::round(pm10 * 10);
} else if (utils::isValidPm(mc.pm_25_sp[0])) {
oss << std::round(mc.pm_25_sp[0] * 10);
} else if (utils::isValidPm(mc.pm_25_sp[1])) {
oss << std::round(mc.pm_25_sp[1] * 10);
}
}
return oss.str();
}

View File

@@ -184,7 +184,7 @@ public:
Measures getMeasures();
std::string buildMeasuresPayload(Measures &measures);
std::string buildMeasuresPayload(Measures &mc, bool extendedPmMeasures);
/**
* Set to true if want to debug every update value