9static const char *
const TAG =
"spa06";
12inline int16_t
decode16(uint8_t msb, uint8_t lsb,
size_t bits,
size_t head = 0) {
13 return static_cast<int16_t
>(
encode_uint16(msb, lsb) << head) >> (16 - bits);
17inline int32_t
decode32(uint8_t xmsb, uint8_t msb, uint8_t lsb, uint8_t xlsb,
size_t bits,
size_t head = 0) {
18 return static_cast<int32_t
>(
encode_uint32(xmsb, msb, lsb, xlsb) << head) >> (32 - bits);
22 ESP_LOGCONFIG(TAG,
"SPA06:");
23 LOG_UPDATE_INTERVAL(
this);
24 ESP_LOGCONFIG(TAG,
" Measurement conversion time: %ums", this->
conversion_time_);
72 this->
prod_id_.bit.prod_id, this->prod_id_.bit.rev_id);
77 this->
mark_failed(LOG_STR(
"Sensor status read failure"));
81 if (!
meas_.bit.coef_ready) {
82 this->
mark_failed(LOG_STR(
"Coefficients not ready"));
88 this->
mark_failed(LOG_STR(
"Coefficients read error"));
116 this->
mark_failed(LOG_STR(
"Temperature settings write fail"));
122 this->
mark_failed(LOG_STR(
"Pressure settings write fail"));
131 this->
mark_failed(LOG_STR(
"Comm settings write fail"));
138 this->
mark_failed(LOG_STR(
"Measurement settings write fail"));
157 ESP_LOGD(TAG,
"Config write: %02x", this->
pt_meas_cfg_.reg);
162 this->
meas_.bit.meas_crtl = crtl;
167 bool interrupt_fifo,
bool interrupt_tmp,
bool interrupt_prs,
168 bool enable_fifo,
bool spi_3wire) {
169 this->
cfg_.bit.p_shift = pressure_shift;
170 this->
cfg_.bit.t_shift = temperature_shift;
171 this->
cfg_.bit.int_hl = interrupt_hl;
172 this->
cfg_.bit.int_fifo = interrupt_fifo;
173 this->
cfg_.bit.int_tmp = interrupt_tmp;
174 this->
cfg_.bit.int_prs = interrupt_prs;
175 this->
cfg_.bit.fifo_en = enable_fifo;
187 this->
c00_ =
decode32(coef[3], coef[4], coef[5], 0, 20);
188 this->
c10_ =
decode32(coef[5], coef[6], coef[7], 0, 20, 4);
200 " c00: %" PRIi32
", c10: %" PRIi32
", c20: %i, c30: %i, c40: %i,\n"
201 " c01: %i, c11: %i, c21: %i, c31: %i",
213 this->
reset_.bit.fifo_flush =
true;
230 float p2_raw_sc = p_raw_sc * p_raw_sc;
231 float p3_raw_sc = p2_raw_sc * p_raw_sc;
232 float p4_raw_sc = p3_raw_sc * p_raw_sc;
233 return this->
c00_ + (float) this->
c10_ * p_raw_sc + (
float) this->
c20_ * p2_raw_sc + (float) this->
c30_ * p3_raw_sc +
234 (
float) this->
c40_ * p4_raw_sc +
235 t_raw_sc * ((float) this->
c01_ + (float) this->
c11_ * p_raw_sc + (float) this->
c21_ * p2_raw_sc +
236 (float) this->
c31_ * p3_raw_sc);
247 float raw_temperature;
253 ESP_LOGW(TAG,
"Cannot read meas config");
258 if (!this->
meas_.bit.prs_ready || !this->meas_.bit.tmp_ready) {
259 ESP_LOGW(TAG,
"Temperature and pressure not ready");
264 ESP_LOGW(TAG,
"Temperature and pressure read failure");
269 if (!this->
meas_.bit.tmp_ready) {
270 ESP_LOGW(TAG,
"Temperature not ready");
275 ESP_LOGW(TAG,
"Temperature read fail");
283 ESP_LOGV(TAG,
"No temperature sensor configured");
288 ESP_LOGV(TAG,
"No pressure sensor configured");
305 float p_raw_sc = (float)
decode32(buf[0], buf[1], buf[2], 0, 24) / (float) this->
kp_;
318 t_raw_sc = (float)
decode32(buf[0], buf[1], buf[2], 0, 24) / (float) this->
kt_;
void mark_failed()
Mark this component as failed.
void status_set_warning()
ESPDEPRECATED("Use const char* or uint32_t overload instead. Removed in 2026.7.0", "2026.1.0") void set_timeout(const std voi set_timeout)(const char *name, uint32_t timeout, std::function< void()> &&f)
Set a timeout function with a unique name.
void status_clear_warning()
void publish_state(float state)
Publish a new state to the front-end.
union esphome::spa06_base::SPA06Component::@159 reset_
uint16_t conversion_time_
union esphome::spa06_base::SPA06Component::@155 meas_
Oversampling temperature_oversampling_
Oversampling pressure_oversampling_
union esphome::spa06_base::SPA06Component::@160 prod_id_
union esphome::spa06_base::SPA06Component::@157 cfg_
virtual bool spa_read_bytes(uint8_t reg, uint8_t *data, size_t len)=0
SampleRate temperature_rate_
union esphome::spa06_base::SPA06Component::@154 pt_meas_cfg_
bool write_measurement_settings_(MeasCrtl crtl)
sensor::Sensor * pressure_sensor_
float convert_temperature_(const float &t_raw_sc)
bool read_temperature_(float &temperature, float &t_raw_sc)
virtual bool spa_write_byte(uint8_t reg, uint8_t data)=0
bool read_temperature_and_pressure_(float &temperature, float &pressure, float &t_raw_sc)
SampleRate pressure_rate_
bool write_temperature_settings_(Oversampling oversampling, SampleRate rate)
virtual void protocol_reset()
void dump_config() override
sensor::Sensor * temperature_sensor_
bool write_pressure_settings_(Oversampling oversampling, SampleRate rate)
virtual bool spa_read_byte(uint8_t reg, uint8_t *data)=0
bool write_communication_settings_(bool pressure_shift, bool temperature_shift, bool interrupt_hl=false, bool interrupt_fifo=false, bool interrupt_tmp=false, bool interrupt_prs=false, bool enable_fifo=false, bool spi_3wire=false)
bool write_sensor_settings_(Oversampling oversampling, SampleRate rate, uint8_t reg)
float convert_pressure_(const float &p_raw_sc, const float &t_raw_sc)
bool read_coefficients_()
constexpr size_t SPA06_COEF_LEN
int32_t decode32(uint8_t xmsb, uint8_t msb, uint8_t lsb, uint8_t xlsb, size_t bits, size_t head=0)
uint32_t oversampling_to_scale_factor(const Oversampling oversampling)
constexpr uint8_t SPA06_SOFT_RESET
int16_t decode16(uint8_t msb, uint8_t lsb, size_t bits, size_t head=0)
constexpr uint32_t encode_uint32(uint8_t byte1, uint8_t byte2, uint8_t byte3, uint8_t byte4)
Encode a 32-bit value given four bytes in most to least significant byte order.
constexpr uint16_t encode_uint16(uint8_t msb, uint8_t lsb)
Encode a 16-bit value given the most and least significant byte.
void HOT delay(uint32_t ms)