From 565a7fa9fd78b08f1784ef6035307b0504d43eef Mon Sep 17 00:00:00 2001 From: samuelbles07 Date: Sun, 23 Nov 2025 18:16:26 +0700 Subject: [PATCH] Build CE payload format for extended measures --- examples/OneOpenAir/OneOpenAir.ino | 3 +- src/AgValue.cpp | 72 +++++++++++++++++++++++++++++- src/AgValue.h | 2 +- 3 files changed, 74 insertions(+), 3 deletions(-) diff --git a/examples/OneOpenAir/OneOpenAir.ino b/examples/OneOpenAir/OneOpenAir.ino index d7377f1..0aa9f45 100644 --- a/examples/OneOpenAir/OneOpenAir.ino +++ b/examples/OneOpenAir/OneOpenAir.ino @@ -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 diff --git a/src/AgValue.cpp b/src/AgValue.cpp index d9316ea..c8a4fb5 100644 --- a/src/AgValue.cpp +++ b/src/AgValue.cpp @@ -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(); } diff --git a/src/AgValue.h b/src/AgValue.h index 175bb88..d8c66cc 100644 --- a/src/AgValue.h +++ b/src/AgValue.h @@ -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