1
0
mirror of https://github.com/esphome/esphome.git synced 2026-02-08 00:31:58 +00:00

Merge branch 'cse7766_batch_read' into integration

This commit is contained in:
J. Nick Koston
2026-02-06 22:59:59 +01:00
2 changed files with 21 additions and 11 deletions

View File

@@ -7,7 +7,6 @@ namespace esphome {
namespace cse7766 { namespace cse7766 {
static const char *const TAG = "cse7766"; static const char *const TAG = "cse7766";
static constexpr size_t CSE7766_RAW_DATA_SIZE = 24;
void CSE7766Component::loop() { void CSE7766Component::loop() {
const uint32_t now = App.get_loop_component_start_time(); const uint32_t now = App.get_loop_component_start_time();
@@ -16,25 +15,33 @@ void CSE7766Component::loop() {
this->raw_data_index_ = 0; this->raw_data_index_ = 0;
} }
if (this->available() == 0) { int avail = this->available();
if (avail == 0) {
return; return;
} }
this->last_transmission_ = now; this->last_transmission_ = now;
while (this->available() != 0) {
this->read_byte(&this->raw_data_[this->raw_data_index_]); // Read all available bytes at once to reduce UART call overhead.
// At 4800 baud (~480 bytes/sec) with ~122 Hz loop rate, typically ~4 bytes per call.
uint8_t buf[CSE7766_RAW_DATA_SIZE];
size_t to_read = std::min(static_cast<size_t>(avail), sizeof(buf));
this->read_array(buf, to_read);
for (size_t i = 0; i < to_read; i++) {
this->raw_data_[this->raw_data_index_] = buf[i];
if (!this->check_byte_()) { if (!this->check_byte_()) {
this->raw_data_index_ = 0; this->raw_data_index_ = 0;
this->status_set_warning(); this->status_set_warning();
continue; continue;
} }
if (this->raw_data_index_ == 23) { if (this->raw_data_index_ == CSE7766_RAW_DATA_SIZE - 1) {
this->parse_data_(); this->parse_data_();
this->status_clear_warning(); this->status_clear_warning();
} }
this->raw_data_index_ = (this->raw_data_index_ + 1) % 24; this->raw_data_index_ = (this->raw_data_index_ + 1) % CSE7766_RAW_DATA_SIZE;
} }
} }
@@ -53,14 +60,15 @@ bool CSE7766Component::check_byte_() {
return true; return true;
} }
if (index == 23) { if (index == CSE7766_RAW_DATA_SIZE - 1) {
uint8_t checksum = 0; uint8_t checksum = 0;
for (uint8_t i = 2; i < 23; i++) { for (uint8_t i = 2; i < CSE7766_RAW_DATA_SIZE - 1; i++) {
checksum += this->raw_data_[i]; checksum += this->raw_data_[i];
} }
if (checksum != this->raw_data_[23]) { if (checksum != this->raw_data_[CSE7766_RAW_DATA_SIZE - 1]) {
ESP_LOGW(TAG, "Invalid checksum from CSE7766: 0x%02X != 0x%02X", checksum, this->raw_data_[23]); ESP_LOGW(TAG, "Invalid checksum from CSE7766: 0x%02X != 0x%02X", checksum,
this->raw_data_[CSE7766_RAW_DATA_SIZE - 1]);
return false; return false;
} }
return true; return true;

View File

@@ -8,6 +8,8 @@
namespace esphome { namespace esphome {
namespace cse7766 { namespace cse7766 {
static constexpr size_t CSE7766_RAW_DATA_SIZE = 24;
class CSE7766Component : public Component, public uart::UARTDevice { class CSE7766Component : public Component, public uart::UARTDevice {
public: public:
void set_voltage_sensor(sensor::Sensor *voltage_sensor) { voltage_sensor_ = voltage_sensor; } void set_voltage_sensor(sensor::Sensor *voltage_sensor) { voltage_sensor_ = voltage_sensor; }
@@ -33,7 +35,7 @@ class CSE7766Component : public Component, public uart::UARTDevice {
this->raw_data_[start_index + 2]); this->raw_data_[start_index + 2]);
} }
uint8_t raw_data_[24]; uint8_t raw_data_[CSE7766_RAW_DATA_SIZE];
uint8_t raw_data_index_{0}; uint8_t raw_data_index_{0};
uint32_t last_transmission_{0}; uint32_t last_transmission_{0};
sensor::Sensor *voltage_sensor_{nullptr}; sensor::Sensor *voltage_sensor_{nullptr};