ESPHome  2024.11.0
honeywellabp2.cpp
Go to the documentation of this file.
1 #include "honeywellabp2.h"
2 #include "esphome/core/log.h"
3 #include "esphome/core/helpers.h"
4 
5 namespace esphome {
6 namespace honeywellabp2_i2c {
7 
8 static const uint8_t STATUS_BIT_POWER = 6;
9 static const uint8_t STATUS_BIT_BUSY = 5;
10 static const uint8_t STATUS_BIT_ERROR = 2;
11 static const uint8_t STATUS_MATH_SAT = 0;
12 
13 static const char *const TAG = "honeywellabp2";
14 
16  if (this->read(raw_data_, 7) != i2c::ERROR_OK) {
17  ESP_LOGE(TAG, "Communication with ABP2 failed!");
18  this->mark_failed();
19  return;
20  }
21  float press_counts = encode_uint24(raw_data_[1], raw_data_[2], raw_data_[3]); // calculate digital pressure counts
22  float temp_counts = encode_uint24(raw_data_[4], raw_data_[5], raw_data_[6]); // calculate digital temperature counts
23 
24  this->last_pressure_ = (((press_counts - this->min_count_) / (this->max_count_ - this->min_count_)) *
25  (this->max_pressure_ - this->min_pressure_)) +
26  this->min_pressure_;
27  this->last_temperature_ = (temp_counts * 200 / 16777215) - 50;
28 }
29 
31  if (this->write(i2c_cmd_, 3) != i2c::ERROR_OK) {
32  ESP_LOGE(TAG, "Communication with ABP2 failed!");
33  this->mark_failed();
34  return;
35  }
36  this->measurement_running_ = true;
37 }
38 
40  if (this->read(raw_data_, 1) != i2c::ERROR_OK) {
41  ESP_LOGE(TAG, "Communication with ABP2 failed!");
42  this->mark_failed();
43  return false;
44  }
45  if ((raw_data_[0] & (0x1 << STATUS_BIT_BUSY)) > 0) {
46  return false;
47  }
48  this->measurement_running_ = false;
49  return true;
50 }
51 
53  ESP_LOGE(TAG, "Timeout!");
54  this->measurement_running_ = false;
55  this->mark_failed();
56 }
57 
59 
61 
63  if (this->measurement_running_) {
64  if (this->is_measurement_ready()) {
65  this->cancel_timeout("meas_timeout");
66 
67  this->read_sensor_data();
68  if (pressure_sensor_ != nullptr) {
70  }
71  if (temperature_sensor_ != nullptr) {
73  }
74  }
75  }
76 }
77 
79  ESP_LOGV(TAG, "Update Honeywell ABP2 Sensor");
80 
81  this->start_measurement();
82  this->set_timeout("meas_timeout", 50, [this] { this->measurement_timeout(); });
83 }
84 
86  ESP_LOGCONFIG(TAG, " Min Pressure Range: %0.1f", this->min_pressure_);
87  ESP_LOGCONFIG(TAG, " Max Pressure Range: %0.1f", this->max_pressure_);
89  ESP_LOGCONFIG(TAG, " Transfer function A");
90  } else {
91  ESP_LOGCONFIG(TAG, " Transfer function B");
92  }
93  LOG_UPDATE_INTERVAL(this);
94 }
95 
97  this->transfer_function_ = transfer_function;
99  this->max_count_ = this->max_count_b_;
100  this->min_count_ = this->min_count_b_;
101  } else {
102  this->max_count_ = this->max_count_a_;
103  this->min_count_ = this->min_count_a_;
104  }
105 }
106 
107 } // namespace honeywellabp2_i2c
108 } // namespace esphome
bool cancel_timeout(const std::string &name)
Cancel a timeout function.
Definition: component.cpp:73
ErrorCode read(uint8_t *data, size_t len)
reads an array of bytes from the device using an I2CBus
Definition: i2c.h:160
void set_timeout(const std::string &name, uint32_t timeout, std::function< void()> &&f)
Set a timeout function with a unique name.
Definition: component.cpp:69
ErrorCode write(const uint8_t *data, size_t len, bool stop=true)
writes an array of bytes to a device using an I2CBus
Definition: i2c.h:186
No error found during execution of method.
Definition: i2c_bus.h:13
void publish_state(float state)
Publish a new state to the front-end.
Definition: sensor.cpp:39
constexpr uint32_t encode_uint24(uint8_t byte1, uint8_t byte2, uint8_t byte3)
Encode a 24-bit value given three bytes in most to least significant byte order.
Definition: helpers.h:192
virtual void mark_failed()
Mark this component as failed.
Definition: component.cpp:118
Implementation of SPI Controller mode.
Definition: a01nyub.cpp:7
void set_transfer_function(ABP2TRANFERFUNCTION transfer_function)