diff --git a/tasmota/language/bg-BG.h b/tasmota/language/bg-BG.h index 6ba44eb4a..5a771ec11 100644 --- a/tasmota/language/bg-BG.h +++ b/tasmota/language/bg-BG.h @@ -567,7 +567,8 @@ #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" #define D_SENSOR_BACKLIGHT "Подсветка" -#define D_SENSOR_PMS5003 "PMS5003" +#define D_SENSOR_PMS5003_TX "PMS5003 Tx" +#define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" #define D_SENSOR_SDS0X1_TX "SDS0X1 Tx" #define D_SENSOR_HPMA_RX "HPMA Rx" diff --git a/tasmota/language/cs-CZ.h b/tasmota/language/cs-CZ.h index a51b2905d..de709d07e 100644 --- a/tasmota/language/cs-CZ.h +++ b/tasmota/language/cs-CZ.h @@ -567,7 +567,8 @@ #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" #define D_SENSOR_BACKLIGHT "Backlight" -#define D_SENSOR_PMS5003 "PMS5003" +#define D_SENSOR_PMS5003_TX "PMS5003 Tx" +#define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" #define D_SENSOR_SDS0X1_TX "SDS0X1 Tx" #define D_SENSOR_HPMA_RX "HPMA Rx" diff --git a/tasmota/language/de-DE.h b/tasmota/language/de-DE.h index d57b65ba1..675ea9786 100644 --- a/tasmota/language/de-DE.h +++ b/tasmota/language/de-DE.h @@ -567,7 +567,8 @@ #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" #define D_SENSOR_BACKLIGHT "Backlight" -#define D_SENSOR_PMS5003 "PMS5003" +#define D_SENSOR_PMS5003_TX "PMS5003 Tx" +#define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" #define D_SENSOR_SDS0X1_TX "SDS0X1 Tx" #define D_SENSOR_HPMA_RX "HPMA Rx" diff --git a/tasmota/language/el-GR.h b/tasmota/language/el-GR.h index 837ec8570..19c0a0c56 100644 --- a/tasmota/language/el-GR.h +++ b/tasmota/language/el-GR.h @@ -567,7 +567,8 @@ #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" #define D_SENSOR_BACKLIGHT "Backlight" -#define D_SENSOR_PMS5003 "PMS5003" +#define D_SENSOR_PMS5003_TX "PMS5003 Tx" +#define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" #define D_SENSOR_SDS0X1_TX "SDS0X1 Tx" #define D_SENSOR_HPMA_RX "HPMA Rx" diff --git a/tasmota/language/en-GB.h b/tasmota/language/en-GB.h index 4d6b20fc8..4da4ba276 100644 --- a/tasmota/language/en-GB.h +++ b/tasmota/language/en-GB.h @@ -567,7 +567,8 @@ #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" #define D_SENSOR_BACKLIGHT "Backlight" -#define D_SENSOR_PMS5003 "PMS5003" +#define D_SENSOR_PMS5003_TX "PMS5003 Tx" +#define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" #define D_SENSOR_SDS0X1_TX "SDS0X1 Tx" #define D_SENSOR_HPMA_RX "HPMA Rx" diff --git a/tasmota/language/es-ES.h b/tasmota/language/es-ES.h index a4037619f..e074dcf6b 100644 --- a/tasmota/language/es-ES.h +++ b/tasmota/language/es-ES.h @@ -567,7 +567,8 @@ #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" #define D_SENSOR_BACKLIGHT "Backlight" -#define D_SENSOR_PMS5003 "PMS5003" +#define D_SENSOR_PMS5003_TX "PMS5003 Tx" +#define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" #define D_SENSOR_SDS0X1_TX "SDS0X1 Tx" #define D_SENSOR_HPMA_RX "HPMA Rx" diff --git a/tasmota/language/fr-FR.h b/tasmota/language/fr-FR.h index 66089ebf7..a00ef34a1 100644 --- a/tasmota/language/fr-FR.h +++ b/tasmota/language/fr-FR.h @@ -567,7 +567,8 @@ #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" #define D_SENSOR_BACKLIGHT "RétroÉcl" -#define D_SENSOR_PMS5003 "PMS5003" +#define D_SENSOR_PMS5003_TX "PMS5003 Tx" +#define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 RX" #define D_SENSOR_SDS0X1_TX "SDS0X1 TX" #define D_SENSOR_HPMA_RX "HPMA RX" diff --git a/tasmota/language/he-HE.h b/tasmota/language/he-HE.h index 1ff5b8f51..f86a0abfe 100644 --- a/tasmota/language/he-HE.h +++ b/tasmota/language/he-HE.h @@ -567,7 +567,8 @@ #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" #define D_SENSOR_BACKLIGHT "Backlight" -#define D_SENSOR_PMS5003 "PMS5003" +#define D_SENSOR_PMS5003_TX "PMS5003 Tx" +#define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" #define D_SENSOR_SDS0X1_TX "SDS0X1 Tx" #define D_SENSOR_HPMA_RX "HPMA Rx" diff --git a/tasmota/language/hu-HU.h b/tasmota/language/hu-HU.h index 7c206c48c..8efaf236d 100644 --- a/tasmota/language/hu-HU.h +++ b/tasmota/language/hu-HU.h @@ -567,7 +567,8 @@ #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" #define D_SENSOR_BACKLIGHT "Háttérfény" -#define D_SENSOR_PMS5003 "PMS5003" +#define D_SENSOR_PMS5003_TX "PMS5003 Tx" +#define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" #define D_SENSOR_SDS0X1_TX "SDS0X1 Tx" #define D_SENSOR_HPMA_RX "HPMA Rx" diff --git a/tasmota/language/it-IT.h b/tasmota/language/it-IT.h index 1827f0d60..934fcfc75 100644 --- a/tasmota/language/it-IT.h +++ b/tasmota/language/it-IT.h @@ -567,7 +567,8 @@ #define D_SENSOR_SPI_MOSI "SPI - MOSI" #define D_SENSOR_SPI_CLK "SPI - CLK" #define D_SENSOR_BACKLIGHT "Retroilluminazione" -#define D_SENSOR_PMS5003 "PMS5003" +#define D_SENSOR_PMS5003_TX "PMS5003 Tx" +#define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 - RX" #define D_SENSOR_SDS0X1_TX "SDS0X1 - TX" #define D_SENSOR_HPMA_RX "HPMA - RX" diff --git a/tasmota/language/ko-KO.h b/tasmota/language/ko-KO.h index 761957ef6..75925b2d3 100644 --- a/tasmota/language/ko-KO.h +++ b/tasmota/language/ko-KO.h @@ -567,7 +567,8 @@ #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" #define D_SENSOR_BACKLIGHT "Backlight" -#define D_SENSOR_PMS5003 "PMS5003" +#define D_SENSOR_PMS5003_TX "PMS5003 Tx" +#define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" #define D_SENSOR_SDS0X1_TX "SDS0X1 Tx" #define D_SENSOR_HPMA_RX "HPMA Rx" diff --git a/tasmota/language/nl-NL.h b/tasmota/language/nl-NL.h index cf974002b..7a3ad605d 100644 --- a/tasmota/language/nl-NL.h +++ b/tasmota/language/nl-NL.h @@ -567,7 +567,8 @@ #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" #define D_SENSOR_BACKLIGHT "Backlight" -#define D_SENSOR_PMS5003 "PMS5003" +#define D_SENSOR_PMS5003_TX "PMS5003 Tx" +#define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" #define D_SENSOR_SDS0X1_TX "SDS0X1 Tx" #define D_SENSOR_HPMA_RX "HPMA Rx" diff --git a/tasmota/language/pl-PL.h b/tasmota/language/pl-PL.h index 886bc457e..5dba67103 100644 --- a/tasmota/language/pl-PL.h +++ b/tasmota/language/pl-PL.h @@ -567,7 +567,8 @@ #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" #define D_SENSOR_BACKLIGHT "Podświetlanie" -#define D_SENSOR_PMS5003 "PMS5003" +#define D_SENSOR_PMS5003_TX "PMS5003 Tx" +#define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" #define D_SENSOR_SDS0X1_TX "SDS0X1 Tx" #define D_SENSOR_HPMA_RX "HPMA Rx" diff --git a/tasmota/language/pt-BR.h b/tasmota/language/pt-BR.h index 6259ed410..58bc33d91 100644 --- a/tasmota/language/pt-BR.h +++ b/tasmota/language/pt-BR.h @@ -567,7 +567,8 @@ #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" #define D_SENSOR_BACKLIGHT "Luz de fundo" -#define D_SENSOR_PMS5003 "PMS5003" +#define D_SENSOR_PMS5003_TX "PMS5003 Tx" +#define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" #define D_SENSOR_SDS0X1_TX "SDS0X1 Tx" #define D_SENSOR_HPMA_RX "HPMA Rx" diff --git a/tasmota/language/pt-PT.h b/tasmota/language/pt-PT.h index 332ab93d4..e31997ecb 100644 --- a/tasmota/language/pt-PT.h +++ b/tasmota/language/pt-PT.h @@ -567,7 +567,8 @@ #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" #define D_SENSOR_BACKLIGHT "Luz fundo" -#define D_SENSOR_PMS5003 "PMS5003" +#define D_SENSOR_PMS5003_TX "PMS5003 Tx" +#define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" #define D_SENSOR_SDS0X1_TX "SDS0X1 Tx" #define D_SENSOR_HPMA_RX "HPMA Rx" diff --git a/tasmota/language/ro-RO.h b/tasmota/language/ro-RO.h index 88e35577e..0d29cd8dd 100644 --- a/tasmota/language/ro-RO.h +++ b/tasmota/language/ro-RO.h @@ -567,7 +567,8 @@ #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" #define D_SENSOR_BACKLIGHT "Backlight" -#define D_SENSOR_PMS5003 "PMS5003" +#define D_SENSOR_PMS5003_TX "PMS5003 Tx" +#define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" #define D_SENSOR_SDS0X1_TX "SDS0X1 Tx" #define D_SENSOR_HPMA_RX "HPMA Rx" diff --git a/tasmota/language/ru-RU.h b/tasmota/language/ru-RU.h index 8b873254a..12696e0bf 100644 --- a/tasmota/language/ru-RU.h +++ b/tasmota/language/ru-RU.h @@ -567,7 +567,8 @@ #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" #define D_SENSOR_BACKLIGHT "Backlight" -#define D_SENSOR_PMS5003 "PMS5003" +#define D_SENSOR_PMS5003_TX "PMS5003 Tx" +#define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" #define D_SENSOR_SDS0X1_TX "SDS0X1 Tx" #define D_SENSOR_HPMA_RX "HPMA Rx" diff --git a/tasmota/language/sk-SK.h b/tasmota/language/sk-SK.h index 21eec20ac..93c02cddd 100644 --- a/tasmota/language/sk-SK.h +++ b/tasmota/language/sk-SK.h @@ -567,7 +567,8 @@ #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" #define D_SENSOR_BACKLIGHT "Backlight" -#define D_SENSOR_PMS5003 "PMS5003" +#define D_SENSOR_PMS5003_TX "PMS5003 Tx" +#define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" #define D_SENSOR_SDS0X1_TX "SDS0X1 Tx" #define D_SENSOR_HPMA_RX "HPMA Rx" diff --git a/tasmota/language/sv-SE.h b/tasmota/language/sv-SE.h index 2a659aa73..9fdd52c5d 100644 --- a/tasmota/language/sv-SE.h +++ b/tasmota/language/sv-SE.h @@ -567,7 +567,8 @@ #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" #define D_SENSOR_BACKLIGHT "Backlight" -#define D_SENSOR_PMS5003 "PMS5003" +#define D_SENSOR_PMS5003_TX "PMS5003 Tx" +#define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" #define D_SENSOR_SDS0X1_TX "SDS0X1 Tx" #define D_SENSOR_HPMA_RX "HPMA Rx" diff --git a/tasmota/language/tr-TR.h b/tasmota/language/tr-TR.h index cb6bbdcb6..2d568bf4a 100644 --- a/tasmota/language/tr-TR.h +++ b/tasmota/language/tr-TR.h @@ -567,7 +567,8 @@ #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" #define D_SENSOR_BACKLIGHT "Backlight" -#define D_SENSOR_PMS5003 "PMS5003" +#define D_SENSOR_PMS5003_TX "PMS5003 Tx" +#define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" #define D_SENSOR_SDS0X1_TX "SDS0X1 Tx" #define D_SENSOR_HPMA_RX "HPMA Rx" diff --git a/tasmota/language/uk-UA.h b/tasmota/language/uk-UA.h index b4fa2e9be..64f97093c 100644 --- a/tasmota/language/uk-UA.h +++ b/tasmota/language/uk-UA.h @@ -567,7 +567,8 @@ #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" #define D_SENSOR_BACKLIGHT "OLED Light" -#define D_SENSOR_PMS5003 "PMS5003" +#define D_SENSOR_PMS5003_TX "PMS5003 Tx" +#define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" #define D_SENSOR_SDS0X1_TX "SDS0X1 Tx" #define D_SENSOR_HPMA_RX "HPMA Rx" diff --git a/tasmota/language/zh-CN.h b/tasmota/language/zh-CN.h index 0c15e3fff..b98006123 100644 --- a/tasmota/language/zh-CN.h +++ b/tasmota/language/zh-CN.h @@ -567,7 +567,8 @@ #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" #define D_SENSOR_BACKLIGHT "Backlight" -#define D_SENSOR_PMS5003 "PMS5003" +#define D_SENSOR_PMS5003_TX "PMS5003 Tx" +#define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" #define D_SENSOR_SDS0X1_TX "SDS0X1 Tx" #define D_SENSOR_HPMA_RX "HPMA Rx" diff --git a/tasmota/language/zh-TW.h b/tasmota/language/zh-TW.h index c7068b811..d4fa149d5 100644 --- a/tasmota/language/zh-TW.h +++ b/tasmota/language/zh-TW.h @@ -567,7 +567,8 @@ #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" #define D_SENSOR_BACKLIGHT "Backlight" -#define D_SENSOR_PMS5003 "PMS5003" +#define D_SENSOR_PMS5003_TX "PMS5003 Tx" +#define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" #define D_SENSOR_SDS0X1_TX "SDS0X1 Tx" #define D_SENSOR_HPMA_RX "HPMA Rx" diff --git a/tasmota/settings.h b/tasmota/settings.h index ae4d2eaf9..a9b6d0bc6 100644 --- a/tasmota/settings.h +++ b/tasmota/settings.h @@ -505,8 +505,9 @@ struct PACKED SYSCFG { uint16_t zb_pan_id; // F30 uint8_t zb_channel; // F32 uint8_t zb_free_byte; // F33 + uint16_t pms_wake_interval; - uint8_t free_f18[132]; // F34 + uint8_t free_f18[130]; // F34 uint16_t pulse_counter_debounce_low; // FB8 uint16_t pulse_counter_debounce_high; // FBA diff --git a/tasmota/tasmota_template.h b/tasmota/tasmota_template.h index 14b79598f..ffb520013 100644 --- a/tasmota/tasmota_template.h +++ b/tasmota/tasmota_template.h @@ -93,7 +93,7 @@ enum UserSelectablePins { GPIO_SPI_CS, // SPI Chip Select GPIO_SPI_DC, // SPI Data Direction GPIO_BACKLIGHT, // Display backlight control - GPIO_PMS5003, // Plantower PMS5003 Serial interface + GPIO_PMS5003_RX, // Plantower PMS5003 Serial interface GPIO_SDS0X1_RX, // Nova Fitness SDS011 Serial interface GPIO_SBR_TX, // Serial Bridge Serial interface GPIO_SBR_RX, // Serial Bridge Serial interface @@ -227,6 +227,7 @@ enum UserSelectablePins { GPIO_HRXL_RX, // Data from MaxBotix HRXL sonar range sensor GPIO_ELECTRIQ_MOODL_TX, // ElectriQ iQ-wifiMOODL Serial TX GPIO_AS3935, + GPIO_PMS5003_TX, // Plantower PMS5003 Serial interface GPIO_SENSOR_END }; // Programmer selectable GPIO functionality @@ -260,7 +261,7 @@ const char kSensorNames[] PROGMEM = D_SENSOR_PZEM0XX_TX "|" D_SENSOR_PZEM004_RX "|" D_SENSOR_SAIR_TX "|" D_SENSOR_SAIR_RX "|" D_SENSOR_SPI_CS "|" D_SENSOR_SPI_DC "|" D_SENSOR_BACKLIGHT "|" - D_SENSOR_PMS5003 "|" D_SENSOR_SDS0X1_RX "|" + D_SENSOR_PMS5003_RX "|" D_SENSOR_SDS0X1_RX "|" D_SENSOR_SBR_TX "|" D_SENSOR_SBR_RX "|" D_SENSOR_SR04_TRIG "|" D_SENSOR_SR04_ECHO "|" D_SENSOR_SDM120_TX "|" D_SENSOR_SDM120_RX "|" @@ -314,7 +315,7 @@ const char kSensorNames[] PROGMEM = D_SENSOR_CC1101_GDO0 "|" D_SENSOR_CC1101_GDO2 "|" D_SENSOR_HRXL_RX "|" D_SENSOR_ELECTRIQ_MOODL "|" - D_SENSOR_AS3935 + D_SENSOR_AS3935 "|" D_SENSOR_PMS5003_TX ; const char kSensorNamesFixed[] PROGMEM = @@ -582,7 +583,8 @@ const uint8_t kGpioNiceList[] PROGMEM = { GPIO_HPMA_RX, // Honeywell HPMA115S0 Serial interface #endif #ifdef USE_PMS5003 - GPIO_PMS5003, // Plantower PMS5003 Serial interface + GPIO_PMS5003_TX, // Plantower PMS5003 Serial interface + GPIO_PMS5003_RX, // Plantower PMS5003 Serial interface #endif #if defined(USE_TX20_WIND_SENSOR) || defined(USE_TX23_WIND_SENSOR) GPIO_TX2X_TXD_BLACK, // TX20/TX23 Transmission Pin diff --git a/tasmota/xsns_18_pms5003.ino b/tasmota/xsns_18_pms5003.ino index 0909921dc..2ad18ba35 100644 --- a/tasmota/xsns_18_pms5003.ino +++ b/tasmota/xsns_18_pms5003.ino @@ -32,10 +32,41 @@ #include +#ifndef WARMUP_PERIOD +#define WARMUP_PERIOD 30 // Turn on PMSX003 XX-seconds before read in passive mode +#endif + +#ifndef MIN_INTERVAL_PERIOD +#define MIN_INTERVAL_PERIOD 60 // minimum interval period in seconds required for passive mode +#endif + TasmotaSerial *PmsSerial; uint8_t pms_type = 1; uint8_t pms_valid = 0; +uint16_t pms_time = 0; +uint8_t wake_mode = 1; +uint8_t pms_ready = 1; + +const char ACTIVE_MODE[] = "Active Mode"; +const char PASSIVE_MODE[] = "Passive Mode"; + +enum PmsCommands +{ + CMD_MODE_ACTIVE, + CMD_SLEEP, + CMD_WAKEUP, + CMD_MODE_PASSIVE, + CMD_READ_DATA +}; + +const uint8_t kPmsCommands[][7] PROGMEM = { + // 0 1 2 3 4 5 6 + {0x42, 0x4D, 0xE1, 0x00, 0x01, 0x01, 0x71}, // pms_set_active_mode + {0x42, 0x4D, 0xE4, 0x00, 0x00, 0x01, 0x73}, // pms_sleep + {0x42, 0x4D, 0xE4, 0x00, 0x01, 0x01, 0x74}, // pms_wake + {0x42, 0x4D, 0xE1, 0x00, 0x00, 0x01, 0x70}, // pms_set_passive_mode + {0x42, 0x4D, 0xE2, 0x00, 0x00, 0x01, 0x71}}; // pms_passive_mode_read struct pmsX003data { uint16_t framelen; @@ -52,6 +83,13 @@ struct pmsX003data { /*********************************************************************************************/ +size_t PmsSendCmd(uint8_t command_id) +{ + return PmsSerial->write(kPmsCommands[command_id], sizeof(kPmsCommands[command_id])); +} + +/*********************************************************************************************/ + bool PmsReadData(void) { if (! PmsSerial->available()) { @@ -122,15 +160,94 @@ bool PmsReadData(void) return true; } +/*********************************************************************************************\ + * Command Sensor18 + * + * Warmup time for sensor is 30 seconds, therfore setting interval time to less than 60 + * seconds doesn't really make sense. + * + * 0 - 59 - Active Mode (continuous sensor readings) + * 60 .. 65535 - Passive Mode (read sensor every x seconds) +\*********************************************************************************************/ + +bool PmsCommandSensor(void) +{ + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload < 65536)) + { + if (XdrvMailbox.payload < MIN_INTERVAL_PERIOD) { + // Set Active Mode if interval is less than 60 seconds + Settings.pms_wake_interval = 0; + wake_mode = 1; + pms_ready = 1; + PmsSendCmd(CMD_MODE_ACTIVE); + PmsSendCmd(CMD_WAKEUP); + } else { + // Set Passive Mode and schedule read once per interval time + Settings.pms_wake_interval = XdrvMailbox.payload; + PmsSendCmd(CMD_MODE_PASSIVE); + PmsSendCmd(CMD_SLEEP); + wake_mode = 0; + pms_ready = 0; + } + } + + if (pin[GPIO_PMS5003_TX] >= 99) + { + // setting interval not supported if TX pin not connected + Settings.pms_wake_interval = 0; + } + + Response_P(S_JSON_SENSOR_INDEX_NVALUE, XSNS_18, Settings.pms_wake_interval); + + return true; +} + /*********************************************************************************************/ void PmsSecond(void) // Every second { - if (PmsReadData()) { - pms_valid = 10; - } else { - if (pms_valid) { - pms_valid--; + if (Settings.pms_wake_interval >= MIN_INTERVAL_PERIOD) + { + // Passive Mode + pms_time++; + if ((Settings.pms_wake_interval - pms_time <= WARMUP_PERIOD) && !wake_mode) + { + // wakeup sensor WARMUP_PERIOD before read interval + wake_mode = 1; + PmsSendCmd(CMD_WAKEUP); + } + if (pms_time >= Settings.pms_wake_interval) + { + // sensor is awake and warmed up, set up for reading + PmsSendCmd(CMD_READ_DATA); + pms_ready = 1; + pms_time = 0; + } + } + + if (pms_ready) + { + if (PmsReadData()) + { + pms_valid = 10; + if (Settings.pms_wake_interval >= MIN_INTERVAL_PERIOD) + { + PmsSendCmd(CMD_SLEEP); + wake_mode = 0; + pms_ready = 0; + } + } + else + { + if (pms_valid) + { + pms_valid--; + if (Settings.pms_wake_interval >= MIN_INTERVAL_PERIOD) + { + PmsSendCmd(CMD_READ_DATA); + pms_ready = 1; + } + } } } } @@ -140,13 +257,26 @@ void PmsSecond(void) // Every second void PmsInit(void) { pms_type = 0; - if (pin[GPIO_PMS5003] < 99) { - PmsSerial = new TasmotaSerial(pin[GPIO_PMS5003], -1, 1); + if ((pin[GPIO_PMS5003_RX] < 99) && (pin[GPIO_PMS5003_TX] < 99)) + { + PmsSerial = new TasmotaSerial(pin[GPIO_PMS5003_RX], pin[GPIO_PMS5003_TX], 1); if (PmsSerial->begin(9600)) { if (PmsSerial->hardwareSerial()) { ClaimSerial(); } pms_type = 1; } } + else if ((pin[GPIO_PMS5003_RX] < 99)) + { + PmsSerial = new TasmotaSerial(pin[GPIO_PMS5003_RX], -1, 1); + if (PmsSerial->begin(9600)) + { + if (PmsSerial->hardwareSerial()) + { + ClaimSerial(); + } + pms_type = 1; + } + } } #ifdef USE_WEBSERVER @@ -230,6 +360,12 @@ bool Xsns18(uint8_t function) case FUNC_EVERY_SECOND: PmsSecond(); break; + case FUNC_COMMAND_SENSOR: + if (XSNS_18 == XdrvMailbox.index) + { + result = PmsCommandSensor(); + } + break; case FUNC_JSON_APPEND: PmsShow(1); break;