diff --git a/src/AgValue.cpp b/src/AgValue.cpp index 015a788..bca9aab 100644 --- a/src/AgValue.cpp +++ b/src/AgValue.cpp @@ -4,6 +4,39 @@ #include "Main/utils.h" #include "Libraries/Arduino_JSON/src/Arduino_JSON.h" +#define json_prop_pmFirmware "firmware" + +/** + * @brief Get PMS5003 firmware version string + * + * @param fwCode + * @return String + */ +String Measurements::pms5003FirmwareVersion(int fwCode) { + return pms5003FirmwareVersionBase("PMS5003x", fwCode); +} + +/** + * @brief Get PMS5003T firmware version string + * + * @param fwCode + * @return String + */ +String Measurements::pms5003TFirmwareVersion(int fwCode) { + return pms5003FirmwareVersionBase("PMS5003x", fwCode); +} + +/** + * @brief Get firmware version string + * + * @param prefix Prefix firmware string + * @param fwCode Version code + * @return string + */ +String Measurements::pms5003FirmwareVersionBase(String prefix, int fwCode) { + return prefix + String("-") + String(fwCode); +} + String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, void *_ag, void *_config) { AirGradient *ag = (AirGradient *)_ag; @@ -33,6 +66,11 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, if (utils::isValidPMS03Count(this->pm03PCount_1)) { root["pm003Count"] = this->pm03PCount_1; } + if (!localServer) { + + root[json_prop_pmFirmware] = + this->pms5003FirmwareVersion(ag->pms5003.getFirmwareVersion()); + } } if (config->hasSensorSHT) { @@ -134,6 +172,10 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, } } root["pm02Compensated"] = ag->pms5003t_1.compensated(this->pm25_1, this->temp_1); + if (!localServer) { + root[json_prop_pmFirmware] = + pms5003TFirmwareVersion(ag->pms5003t_1.getFirmwareVersion()); + } } if (config->hasSensorPMS2) { if(utils::isValidPMS(this->pm01_2)) { @@ -171,6 +213,10 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, } } root["pm02Compensated"] = ag->pms5003t_2.compensated(this->pm25_2, this->temp_2); + if(!localServer) { + root[json_prop_pmFirmware] = + pms5003TFirmwareVersion(ag->pms5003t_1.getFirmwareVersion()); + } } } else { if (fwMode == FW_MODE_O_1P) { @@ -208,6 +254,10 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, } } root["pm02Compensated"] = ag->pms5003t_1.compensated(this->pm25_1, this->temp_1); + if(!localServer) { + root[json_prop_pmFirmware] = + pms5003TFirmwareVersion(ag->pms5003t_1.getFirmwareVersion()); + } } else if (config->hasSensorPMS2) { if(utils::isValidPMS(this->pm01_2)) { root["pm01"] = this->pm01_2; @@ -242,6 +292,10 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, } } root["pm02Compensated"] = ag->pms5003t_1.compensated(this->pm25_1, this->temp_1); + if(!localServer) { + root[json_prop_pmFirmware] = + pms5003TFirmwareVersion(ag->pms5003t_2.getFirmwareVersion()); + } } } else { float val; @@ -279,6 +333,12 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, } } root["channels"]["1"]["pm02Compensated"] = ag->pms5003t_1.compensated(this->pm25_1, this->temp_1); + + // PMS5003T version + if(!localServer) { + root["channels"]["1"][json_prop_pmFirmware] = + pms5003TFirmwareVersion(ag->pms5003t_1.getFirmwareVersion()); + } } if (config->hasSensorPMS2) { float val; @@ -315,6 +375,11 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, } } root["channels"]["2"]["pm02Compensated"] = ag->pms5003t_2.compensated(this->pm25_2, this->temp_2); + // PMS5003T version + if(!localServer) { + root["channels"]["2"][json_prop_pmFirmware] = + pms5003TFirmwareVersion(ag->pms5003t_2.getFirmwareVersion()); + } } } } diff --git a/src/AgValue.h b/src/AgValue.h index 3176482..1957828 100644 --- a/src/AgValue.h +++ b/src/AgValue.h @@ -6,6 +6,9 @@ class Measurements { private: + String pms5003FirmwareVersion(int fwCode); + String pms5003TFirmwareVersion(int fwCode); + String pms5003FirmwareVersionBase(String prefix, int fwCode); public: Measurements() { pm25_1 = -1; diff --git a/src/PMS/PMS.cpp b/src/PMS/PMS.cpp index 1d1ad1c..842a0a3 100644 --- a/src/PMS/PMS.cpp +++ b/src/PMS/PMS.cpp @@ -267,6 +267,20 @@ int16_t PMSBase::getTemp(void) { return toI16(&package[24]); } */ uint16_t PMSBase::getHum(void) { return toU16(&package[26]); } +/** + * @brief Get firmware version code + * + * @return uint8_t + */ +uint8_t PMSBase::getFirmwareVersion(void) { return package[28]; } + +/** + * @brief Ge PMS5003 error code + * + * @return uint8_t + */ +uint8_t PMSBase::getErrorCode(void) { return package[29]; } + /** * @brief Convert PMS2.5 to US AQI unit * diff --git a/src/PMS/PMS.h b/src/PMS/PMS.h index 96057d5..eee0e9b 100644 --- a/src/PMS/PMS.h +++ b/src/PMS/PMS.h @@ -32,6 +32,8 @@ public: /** For PMS5003T*/ int16_t getTemp(void); uint16_t getHum(void); + uint8_t getFirmwareVersion(void); + uint8_t getErrorCode(void); int pm25ToAQI(int pm02); int compensated(int pm25, float humidity); diff --git a/src/PMS/PMS5003.cpp b/src/PMS/PMS5003.cpp index 73dd569..e1ec896 100644 --- a/src/PMS/PMS5003.cpp +++ b/src/PMS/PMS5003.cpp @@ -78,7 +78,7 @@ bool PMS5003::begin(void) { return false; } #endif - + _ver = pms.getFirmwareVersion(); this->_isBegin = true; return true; } @@ -132,6 +132,20 @@ int PMS5003::compensated(int pm25, float humidity) { return pms.compensated(pm25, humidity); } +/** + * @brief Get sensor firmware version + * + * @return int + */ +int PMS5003::getFirmwareVersion(void) { return _ver; } + +/** + * @brief Get sensor error code + * + * @return uint8_t + */ +uint8_t PMS5003::getErrorCode(void) { return pms.getErrorCode(); } + /** * @brief Check device initialized or not * diff --git a/src/PMS/PMS5003.h b/src/PMS/PMS5003.h index 8be8e8f..148819e 100644 --- a/src/PMS/PMS5003.h +++ b/src/PMS/PMS5003.h @@ -29,9 +29,12 @@ public: int getPm03ParticleCount(void); int convertPm25ToUsAqi(int pm25); int compensated(int pm25, float humidity); + int getFirmwareVersion(void); + uint8_t getErrorCode(void); private: bool _isBegin = false; + int _ver; BoardType _boardDef; PMSBase pms; const BoardDef *bsp; diff --git a/src/PMS/PMS5003T.cpp b/src/PMS/PMS5003T.cpp index 8493504..8706ae0 100644 --- a/src/PMS/PMS5003T.cpp +++ b/src/PMS/PMS5003T.cpp @@ -103,7 +103,7 @@ bool PMS5003T::begin(void) { return false; } #endif - + _ver = pms.getFirmwareVersion(); this->_isBegin = true; return true; } @@ -175,6 +175,20 @@ float PMS5003T::compensated(int pm25, float humidity) { return pms.compensated(pm25, humidity); } +/** + * @brief Get module(s) firmware version + * + * @return int Version code + */ +int PMS5003T::getFirmwareVersion(void) { return _ver; } + +/** + * @brief Get sensor error code + * + * @return uint8_t + */ +uint8_t PMS5003T::getErrorCode(void) { return pms.getErrorCode(); } + /** * @brief Check device initialized or not * diff --git a/src/PMS/PMS5003T.h b/src/PMS/PMS5003T.h index f3d58e7..93e2fdd 100644 --- a/src/PMS/PMS5003T.h +++ b/src/PMS/PMS5003T.h @@ -34,10 +34,13 @@ public: float getTemperature(void); float getRelativeHumidity(void); float compensated(int pm25, float humidity); + int getFirmwareVersion(void); + uint8_t getErrorCode(void); private: bool _isBegin = false; bool _isSleep = false; + int _ver; /** Firmware version code */ BoardType _boardDef; const BoardDef *bsp;