From 8d1322984c8c3be6049d63d3368c4c7c34aca5b2 Mon Sep 17 00:00:00 2001 From: gururise Date: Wed, 8 Apr 2020 10:11:37 -0700 Subject: [PATCH 01/12] Add PMS5003 RX and TX gpio pints to tasmota_template.h --- tasmota/tasmota_template.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tasmota/tasmota_template.h b/tasmota/tasmota_template.h index e21260741..5ad118377 100644 --- a/tasmota/tasmota_template.h +++ b/tasmota/tasmota_template.h @@ -93,7 +93,8 @@ 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_TX, // 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 @@ -259,7 +260,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_TX "|" 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 "|" @@ -580,7 +581,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 From ffd533815032f4b8e7f960ed6b22c1806a6b0e4d Mon Sep 17 00:00:00 2001 From: gururise Date: Wed, 8 Apr 2020 10:22:32 -0700 Subject: [PATCH 02/12] PMS5003 RX TX pin handling in PmsInit --- tasmota/xsns_18_pms5003.ino | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/tasmota/xsns_18_pms5003.ino b/tasmota/xsns_18_pms5003.ino index 0909921dc..2f02ff454 100644 --- a/tasmota/xsns_18_pms5003.ino +++ b/tasmota/xsns_18_pms5003.ino @@ -140,13 +140,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 From a1f1065be89a39ceb0f9b2014be1e7fd3efc16b6 Mon Sep 17 00:00:00 2001 From: gururise Date: Wed, 8 Apr 2020 10:25:40 -0700 Subject: [PATCH 03/12] Add PMS5003 commands --- tasmota/xsns_18_pms5003.ino | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tasmota/xsns_18_pms5003.ino b/tasmota/xsns_18_pms5003.ino index 2f02ff454..3e12bb1d0 100644 --- a/tasmota/xsns_18_pms5003.ino +++ b/tasmota/xsns_18_pms5003.ino @@ -37,6 +37,23 @@ TasmotaSerial *PmsSerial; uint8_t pms_type = 1; uint8_t pms_valid = 0; +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; uint16_t pm10_standard, pm25_standard, pm100_standard; @@ -52,6 +69,13 @@ struct pmsX003data { /*********************************************************************************************/ +size_t PmsSendCmd(uint8_t command_id) +{ + return MhzSerial->write(kPmsCommands[command_id], sizeof(kPmsCommands[command_id])); +} + +/*********************************************************************************************/ + bool PmsReadData(void) { if (! PmsSerial->available()) { From b7e7fbdc15b734a5dc854151235e38722401d4fc Mon Sep 17 00:00:00 2001 From: gururise Date: Wed, 8 Apr 2020 10:27:49 -0700 Subject: [PATCH 04/12] define WARMUP_PERIOD for sensor warmup --- tasmota/xsns_18_pms5003.ino | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tasmota/xsns_18_pms5003.ino b/tasmota/xsns_18_pms5003.ino index 3e12bb1d0..d8bd5dc17 100644 --- a/tasmota/xsns_18_pms5003.ino +++ b/tasmota/xsns_18_pms5003.ino @@ -32,6 +32,10 @@ #include +#ifndef WARMUP_PERIOD +#define WARMUP_PERIOD 30 // Turn on PMSX003 XX-seconds before read in passive mode +#endif + TasmotaSerial *PmsSerial; uint8_t pms_type = 1; From 2a08a0e9e6fbb566a5086fec17a997d41b6a7ea6 Mon Sep 17 00:00:00 2001 From: gururise Date: Wed, 8 Apr 2020 10:29:54 -0700 Subject: [PATCH 05/12] PMS5003 allow config for continuous or interval readings --- tasmota/xsns_18_pms5003.ino | 89 ++++++++++++++++++++++++++++++++++--- 1 file changed, 84 insertions(+), 5 deletions(-) diff --git a/tasmota/xsns_18_pms5003.ino b/tasmota/xsns_18_pms5003.ino index d8bd5dc17..209d43380 100644 --- a/tasmota/xsns_18_pms5003.ino +++ b/tasmota/xsns_18_pms5003.ino @@ -40,6 +40,12 @@ 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 { @@ -150,15 +156,82 @@ bool PmsReadData(void) return true; } +/*********************************************************************************************\ + * Command Sensor15 + * + * 0 - Active Mode + * 1 .. 255 - Passive Mode (read sensor every x minutes) +\*********************************************************************************************/ + +bool PmsCommandSensor(void) +{ + if (XdrvMailbox.payload == 0) + { + // Set Active Mode + Settings.novasds_startingoffset = 0; + wake_mode = 1; + pms_ready = 1; + PmsSendCmd(CMD_MODE_ACTIVE); + } + else if ((XdrvMailbox.payload > 0) && (XdrvMailbox.payload < 256)) + { + // Set Passive Mode + Settings.novasds_startingoffset = XdrvMailbox.payload; + PmsSendCmd(CMD_MODE_PASSIVE); + PmsSendCmd(CMD_SLEEP); + wake_mode = 0; + pms_ready = 0; + } + + Response_P(S_JSON_SENSOR_INDEX_NVALUE, XSNS_18, Settings.novasds_startingoffset); + + return true; +} + /*********************************************************************************************/ void PmsSecond(void) // Every second { - if (PmsReadData()) { - pms_valid = 10; - } else { - if (pms_valid) { - pms_valid--; + if (Settings.novasds_startingoffset > 0) + { + // Passive Mode + pms_time++; + if ((((uint16_t)Settings.novasds_startingoffset) * 60 - pms_time <= WARMUP_PERIOD) && !wake_mode) + { + wake_mode = 1; + PmsSendCmd(CMD_WAKEUP); + } + if (pms_time >= ((uint16_t)Settings.novasds_startingoffset) * 60) + { + PmsSendCmd(CMD_READ_DATA); + pms_ready = 1; + pms_time = 0; + } + } + + if (pms_ready) + { + if (PmsReadData()) + { + pms_valid = 10; + if (Settings.novasds_startingoffset > 0) + { + PmsSendCmd(CMD_SLEEP); + wake_mode = 0; + pms_ready = 0; + } + } + else + { + if (pms_valid) + { + pms_valid--; + if (Settings.novasds_startingoffset > 0) + { + PmsSendCmd(CMD_READ_DATA); + pms_ready = 1; + } + } } } } @@ -271,6 +344,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; From 51909679d4ba7a097d6d5921b4f73f1917f8cb3d Mon Sep 17 00:00:00 2001 From: gururise Date: Wed, 8 Apr 2020 10:47:45 -0700 Subject: [PATCH 06/12] Update language files for PMS5003 RX and TX --- tasmota/language/bg-BG.h | 3 ++- tasmota/language/cs-CZ.h | 3 ++- tasmota/language/de-DE.h | 3 ++- tasmota/language/el-GR.h | 3 ++- tasmota/language/en-GB.h | 3 ++- tasmota/language/es-ES.h | 3 ++- tasmota/language/fr-FR.h | 3 ++- tasmota/language/he-HE.h | 3 ++- tasmota/language/hu-HU.h | 3 ++- tasmota/language/it-IT.h | 3 ++- tasmota/language/ko-KO.h | 3 ++- tasmota/language/nl-NL.h | 3 ++- tasmota/language/pl-PL.h | 3 ++- tasmota/language/pt-BR.h | 3 ++- tasmota/language/pt-PT.h | 3 ++- tasmota/language/ro-RO.h | 3 ++- tasmota/language/ru-RU.h | 3 ++- tasmota/language/sk-SK.h | 3 ++- tasmota/language/sv-SE.h | 3 ++- tasmota/language/tr-TR.h | 3 ++- tasmota/language/uk-UA.h | 3 ++- tasmota/language/zh-CN.h | 3 ++- tasmota/language/zh-TW.h | 3 ++- 23 files changed, 46 insertions(+), 23 deletions(-) diff --git a/tasmota/language/bg-BG.h b/tasmota/language/bg-BG.h index d4cb21b90..33bce1cc2 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 fb625af7b..fdf0c505c 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 a698297de..db78c327e 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 6e65f2dce..635addd81 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 322757d17..0862c0fbe 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 39f18f29d..213f9dedf 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 beb6e6b38..0fa74e022 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 99e15b7fd..cd56399b6 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 34ea7e8a6..5cc945849 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 151bda319..3e94424b1 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 434ae07e5..e807569d9 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 a129c764e..332ee935c 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 4c9da5559..ede297ffc 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 6ce132cb1..d64b134aa 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 f87c0db4c..b4f336e65 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 ce9a152e9..355dfd77b 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 d2d0c153f..41e909564 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 d925da9c6..037aeaaa8 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 d6be6cf9b..c52b6eaa2 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 09ca53017..f7431cc12 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 4a62825e8..e477b49a7 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 cb4221e75..b4b3348a3 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 6738d4208..17267128f 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" From ad673bec6c2aa12b3ea5ffb02400f5d683e20a51 Mon Sep 17 00:00:00 2001 From: gururise Date: Wed, 8 Apr 2020 11:41:10 -0700 Subject: [PATCH 07/12] send commands using correct serial object --- tasmota/xsns_18_pms5003.ino | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tasmota/xsns_18_pms5003.ino b/tasmota/xsns_18_pms5003.ino index 209d43380..8d526bfb6 100644 --- a/tasmota/xsns_18_pms5003.ino +++ b/tasmota/xsns_18_pms5003.ino @@ -81,7 +81,7 @@ struct pmsX003data { size_t PmsSendCmd(uint8_t command_id) { - return MhzSerial->write(kPmsCommands[command_id], sizeof(kPmsCommands[command_id])); + return PmsSerial->write(kPmsCommands[command_id], sizeof(kPmsCommands[command_id])); } /*********************************************************************************************/ @@ -172,6 +172,7 @@ bool PmsCommandSensor(void) wake_mode = 1; pms_ready = 1; PmsSendCmd(CMD_MODE_ACTIVE); + PmsSendCmd(CMD_WAKEUP); } else if ((XdrvMailbox.payload > 0) && (XdrvMailbox.payload < 256)) { From 9516f339d6d6ac46e079818fe45439afa61500dd Mon Sep 17 00:00:00 2001 From: gururise Date: Wed, 8 Apr 2020 12:36:44 -0700 Subject: [PATCH 08/12] PMS5003 use active mode if TX pin not connected --- tasmota/xsns_18_pms5003.ino | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tasmota/xsns_18_pms5003.ino b/tasmota/xsns_18_pms5003.ino index 8d526bfb6..39d60dbab 100644 --- a/tasmota/xsns_18_pms5003.ino +++ b/tasmota/xsns_18_pms5003.ino @@ -183,6 +183,12 @@ bool PmsCommandSensor(void) wake_mode = 0; pms_ready = 0; } + + if (pin[GPIO_PMS5003_TX] >= 99) + { + // setting interval not supported if TX pin not connected + Settings.novasds_startingoffset = 0; + } Response_P(S_JSON_SENSOR_INDEX_NVALUE, XSNS_18, Settings.novasds_startingoffset); From 873d0092e59c75ffd858888cd0da5f9cf28f0a75 Mon Sep 17 00:00:00 2001 From: gururise Date: Fri, 10 Apr 2020 23:22:27 -0700 Subject: [PATCH 09/12] settings value changed to uint16 and now in seconds --- tasmota/xsns_18_pms5003.ino | 61 +++++++++++++++++++++---------------- 1 file changed, 35 insertions(+), 26 deletions(-) diff --git a/tasmota/xsns_18_pms5003.ino b/tasmota/xsns_18_pms5003.ino index 39d60dbab..5629bf793 100644 --- a/tasmota/xsns_18_pms5003.ino +++ b/tasmota/xsns_18_pms5003.ino @@ -36,6 +36,10 @@ #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; @@ -157,40 +161,43 @@ bool PmsReadData(void) } /*********************************************************************************************\ - * Command Sensor15 + * Command Sensor18 (currently using mcp230xx_int_timer variable - should change) * - * 0 - Active Mode - * 1 .. 255 - Passive Mode (read sensor every x minutes) + * 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) + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload < 65536)) { - // Set Active Mode - Settings.novasds_startingoffset = 0; - wake_mode = 1; - pms_ready = 1; - PmsSendCmd(CMD_MODE_ACTIVE); - PmsSendCmd(CMD_WAKEUP); - } - else if ((XdrvMailbox.payload > 0) && (XdrvMailbox.payload < 256)) - { - // Set Passive Mode - Settings.novasds_startingoffset = XdrvMailbox.payload; - PmsSendCmd(CMD_MODE_PASSIVE); - PmsSendCmd(CMD_SLEEP); - wake_mode = 0; - pms_ready = 0; + if (XdrvMailbox.payload < MIN_INTERVAL_PERIOD) { + // Set Active Mode if interval is less than 60 seconds + Settings.mcp230xx_int_timer = 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.mcp230xx_int_timer = 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.novasds_startingoffset = 0; + Settings.mcp230xx_int_timer = 0; } - Response_P(S_JSON_SENSOR_INDEX_NVALUE, XSNS_18, Settings.novasds_startingoffset); + Response_P(S_JSON_SENSOR_INDEX_NVALUE, XSNS_18, Settings.mcp230xx_int_timer); return true; } @@ -199,17 +206,19 @@ bool PmsCommandSensor(void) void PmsSecond(void) // Every second { - if (Settings.novasds_startingoffset > 0) + if (Settings.mcp230xx_int_timer >= MIN_INTERVAL_PERIOD) { // Passive Mode pms_time++; - if ((((uint16_t)Settings.novasds_startingoffset) * 60 - pms_time <= WARMUP_PERIOD) && !wake_mode) + if ((Settings.mcp230xx_int_timer - pms_time <= WARMUP_PERIOD) && !wake_mode) { + // wakeup sensor WARMUP_PERIOD before read interval wake_mode = 1; PmsSendCmd(CMD_WAKEUP); } - if (pms_time >= ((uint16_t)Settings.novasds_startingoffset) * 60) + if (pms_time >= Settings.mcp230xx_int_timer) { + // sensor is awake and warmed up, set up for reading PmsSendCmd(CMD_READ_DATA); pms_ready = 1; pms_time = 0; @@ -221,7 +230,7 @@ void PmsSecond(void) // Every second if (PmsReadData()) { pms_valid = 10; - if (Settings.novasds_startingoffset > 0) + if (Settings.mcp230xx_int_timer >= MIN_INTERVAL_PERIOD) { PmsSendCmd(CMD_SLEEP); wake_mode = 0; @@ -233,7 +242,7 @@ void PmsSecond(void) // Every second if (pms_valid) { pms_valid--; - if (Settings.novasds_startingoffset > 0) + if (Settings.mcp230xx_int_timer >= MIN_INTERVAL_PERIOD) { PmsSendCmd(CMD_READ_DATA); pms_ready = 1; From 57b28112b0e4fbe3adad91855bd9582c036aef32 Mon Sep 17 00:00:00 2001 From: gururise Date: Sat, 11 Apr 2020 09:55:15 -0700 Subject: [PATCH 10/12] move new GPIO TX to end of enum to avoid breaking gpio numbering --- tasmota/tasmota_template.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/tasmota_template.h b/tasmota/tasmota_template.h index 83db4bace..164b5e758 100644 --- a/tasmota/tasmota_template.h +++ b/tasmota/tasmota_template.h @@ -93,7 +93,6 @@ enum UserSelectablePins { GPIO_SPI_CS, // SPI Chip Select GPIO_SPI_DC, // SPI Data Direction GPIO_BACKLIGHT, // Display backlight control - GPIO_PMS5003_TX, // 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 @@ -228,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 From 54f7cf475d7ea4f0493a58ea8f543d4a2e24b5c8 Mon Sep 17 00:00:00 2001 From: gururise Date: Sat, 11 Apr 2020 10:37:12 -0700 Subject: [PATCH 11/12] create new setting pms_wake_interval for PMS sensor interval time --- tasmota/settings.h | 3 ++- tasmota/xsns_18_pms5003.ino | 20 ++++++++++---------- 2 files changed, 12 insertions(+), 11 deletions(-) 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/xsns_18_pms5003.ino b/tasmota/xsns_18_pms5003.ino index 5629bf793..2ad18ba35 100644 --- a/tasmota/xsns_18_pms5003.ino +++ b/tasmota/xsns_18_pms5003.ino @@ -161,7 +161,7 @@ bool PmsReadData(void) } /*********************************************************************************************\ - * Command Sensor18 (currently using mcp230xx_int_timer variable - should change) + * Command Sensor18 * * Warmup time for sensor is 30 seconds, therfore setting interval time to less than 60 * seconds doesn't really make sense. @@ -176,14 +176,14 @@ bool PmsCommandSensor(void) { if (XdrvMailbox.payload < MIN_INTERVAL_PERIOD) { // Set Active Mode if interval is less than 60 seconds - Settings.mcp230xx_int_timer = 0; + 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.mcp230xx_int_timer = XdrvMailbox.payload; + Settings.pms_wake_interval = XdrvMailbox.payload; PmsSendCmd(CMD_MODE_PASSIVE); PmsSendCmd(CMD_SLEEP); wake_mode = 0; @@ -194,10 +194,10 @@ bool PmsCommandSensor(void) if (pin[GPIO_PMS5003_TX] >= 99) { // setting interval not supported if TX pin not connected - Settings.mcp230xx_int_timer = 0; + Settings.pms_wake_interval = 0; } - Response_P(S_JSON_SENSOR_INDEX_NVALUE, XSNS_18, Settings.mcp230xx_int_timer); + Response_P(S_JSON_SENSOR_INDEX_NVALUE, XSNS_18, Settings.pms_wake_interval); return true; } @@ -206,17 +206,17 @@ bool PmsCommandSensor(void) void PmsSecond(void) // Every second { - if (Settings.mcp230xx_int_timer >= MIN_INTERVAL_PERIOD) + if (Settings.pms_wake_interval >= MIN_INTERVAL_PERIOD) { // Passive Mode pms_time++; - if ((Settings.mcp230xx_int_timer - pms_time <= WARMUP_PERIOD) && !wake_mode) + 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.mcp230xx_int_timer) + if (pms_time >= Settings.pms_wake_interval) { // sensor is awake and warmed up, set up for reading PmsSendCmd(CMD_READ_DATA); @@ -230,7 +230,7 @@ void PmsSecond(void) // Every second if (PmsReadData()) { pms_valid = 10; - if (Settings.mcp230xx_int_timer >= MIN_INTERVAL_PERIOD) + if (Settings.pms_wake_interval >= MIN_INTERVAL_PERIOD) { PmsSendCmd(CMD_SLEEP); wake_mode = 0; @@ -242,7 +242,7 @@ void PmsSecond(void) // Every second if (pms_valid) { pms_valid--; - if (Settings.mcp230xx_int_timer >= MIN_INTERVAL_PERIOD) + if (Settings.pms_wake_interval >= MIN_INTERVAL_PERIOD) { PmsSendCmd(CMD_READ_DATA); pms_ready = 1; From 86455df73b885f3e96afd0ac5af98af971259bd6 Mon Sep 17 00:00:00 2001 From: gururise Date: Sat, 11 Apr 2020 12:02:09 -0700 Subject: [PATCH 12/12] move PMS5003_TX to end of kSensorNames[] array to avoid breaking gpio numbering --- tasmota/tasmota_template.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tasmota/tasmota_template.h b/tasmota/tasmota_template.h index 164b5e758..ffb520013 100644 --- a/tasmota/tasmota_template.h +++ b/tasmota/tasmota_template.h @@ -261,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_TX "|" D_SENSOR_PMS5003_RX "|" 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 "|" @@ -315,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 =