From 3b207db27c44113a2fd95b805d9af312d89f106e Mon Sep 17 00:00:00 2001 From: FransOv <57999223+FransOv@users.noreply.github.com> Date: Sat, 12 Jul 2025 21:20:16 +0200 Subject: [PATCH] Correct handling of passive response of Winsen ZH03X Particle sensor in xsns_18_pms5003.ino (#23651) * Update xsns_18_pms5003.ino * Update xsns_18_pms5003.ino --- .../tasmota_xsns_sensor/xsns_18_pms5003.ino | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/tasmota/tasmota_xsns_sensor/xsns_18_pms5003.ino b/tasmota/tasmota_xsns_sensor/xsns_18_pms5003.ino index 88380531c..a60b09dcf 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_18_pms5003.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_18_pms5003.ino @@ -205,28 +205,26 @@ bool ZH03ReadDataPassive() // process the passive mode response of the ZH03x sen AddLogBuffer(LOG_LEVEL_DEBUG_MORE, buffer, 9); uint8_t sum = 0; - for (uint32_t i = 1; i < 7; i++) { + for (uint32_t i = 1; i < 8; i++) { sum += buffer[i]; } - sum=(~sum)+1; + sum=~(sum)+1; if (sum != buffer[8]) { AddLog(LOG_LEVEL_DEBUG, PSTR("ZH03x: " D_CHECKSUM_FAILURE)); return false; } - - uint16_t buffer_u16[12]; - for (uint32_t i = 1; i < 4; i++) { - buffer_u16[i] = buffer[i*2 + 1]; - buffer_u16[i] += (buffer[i*2] << 8); - buffer_u16[i+3] = buffer[i*2 + 1]; // Direct and Environment values identical - buffer_u16[i+3] += (buffer[i*2] << 8); // Direct and Environment values identical - buffer_u16[0] = 20; // set dummy framelength - buffer_u16[11] = buffer[8]; // copy checksum - } + + pms_data.pm10_standard = buffer[6]*256+buffer[7]; + pms_data.pm10_env = pms_data.pm10_standard; // Direct and Environment values identical + pms_data.pm25_standard = buffer[2]*256+buffer[3]; + pms_data.pm25_env = pms_data.pm25_standard; // Direct and Environment values identical + pms_data.pm100_standard = buffer[4]*256+buffer[5]; + pms_data.pm100_env = pms_data.pm100_standard; // Direct and Environment values identical + pms_data.framelen = 20; // set dummy framelength + pms_data.checksum = buffer[8]; // copy checksum - memcpy((void *)&pms_data, (void *)buffer_u16, 22); - - Pms.valid = 10; + + Pms.valid = Settings->pms_wake_interval*2; if (!Pms.discovery_triggered) { TasmotaGlobal.discovery_counter = 1; // Force discovery @@ -531,4 +529,4 @@ bool Xsns18(uint32_t function) return result; } -#endif // USE_PMS5003 \ No newline at end of file +#endif // USE_PMS5003