From 4cb6f2c04609752711bc72d006146f43ace6ca2d Mon Sep 17 00:00:00 2001 From: Ross Tyler Date: Fri, 5 Jun 2026 11:35:33 -0700 Subject: [PATCH] [qmp6988] fix publishing bogus zero values on i2c error (#16840) --- esphome/components/qmp6988/qmp6988.cpp | 15 ++++++++++----- esphome/components/qmp6988/qmp6988.h | 2 +- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/esphome/components/qmp6988/qmp6988.cpp b/esphome/components/qmp6988/qmp6988.cpp index 293d8aa648..bb47e7b0f5 100644 --- a/esphome/components/qmp6988/qmp6988.cpp +++ b/esphome/components/qmp6988/qmp6988.cpp @@ -280,20 +280,21 @@ void QMP6988Component::calculate_altitude_(float pressure, float temp) { this->qmp6988_data_.altitude = altitude; } -void QMP6988Component::calculate_pressure_() { +bool QMP6988Component::calculate_pressure_() { uint8_t err = 0; uint32_t p_read, t_read; int32_t p_raw, t_raw; uint8_t a_data_uint8_tr[6] = {0}; int32_t t_int, p_int; - this->qmp6988_data_.temperature = 0; - this->qmp6988_data_.pressure = 0; err = this->read_register(QMP6988_PRESSURE_MSB_REG, a_data_uint8_tr, 6); if (err != i2c::ERROR_OK) { ESP_LOGE(TAG, "Error reading raw pressure/temp values"); - return; + this->status_set_warning(); + return false; } + this->status_clear_warning(); + p_read = encode_uint24(a_data_uint8_tr[0], a_data_uint8_tr[1], a_data_uint8_tr[2]); p_raw = (int32_t) (p_read - SUBTRACTOR); @@ -305,6 +306,7 @@ void QMP6988Component::calculate_pressure_() { this->qmp6988_data_.temperature = (float) t_int / 256.0f; this->qmp6988_data_.pressure = (float) p_int / 16.0f; + return true; } void QMP6988Component::setup() { @@ -336,7 +338,10 @@ void QMP6988Component::dump_config() { } void QMP6988Component::update() { - this->calculate_pressure_(); + if (!this->calculate_pressure_()) { + return; + } + float pressurehectopascals = this->qmp6988_data_.pressure / 100; float temperature = this->qmp6988_data_.temperature; diff --git a/esphome/components/qmp6988/qmp6988.h b/esphome/components/qmp6988/qmp6988.h index 26f858b5d2..41759478b8 100644 --- a/esphome/components/qmp6988/qmp6988.h +++ b/esphome/components/qmp6988/qmp6988.h @@ -98,7 +98,7 @@ class QMP6988Component : public PollingComponent, public i2c::I2CDevice { void write_oversampling_temperature_(QMP6988Oversampling oversampling_t); void write_oversampling_pressure_(QMP6988Oversampling oversampling_p); void write_filter_(QMP6988IIRFilter filter); - void calculate_pressure_(); + bool calculate_pressure_(); void calculate_altitude_(float pressure, float temp); int32_t get_compensated_pressure_(qmp6988_ik_data_t *ik, int32_t dp, int16_t tx);