Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: J. Nick Koston <nick@home-assistant.io>
96 lines
2.6 KiB
C++
96 lines
2.6 KiB
C++
#include "smt100.h"
|
|
#include "esphome/core/log.h"
|
|
|
|
namespace esphome {
|
|
namespace smt100 {
|
|
|
|
static const char *const TAG = "smt100";
|
|
|
|
void SMT100Component::update() {
|
|
ESP_LOGV(TAG, "Sending measurement request");
|
|
this->write_str("GetAllMeasurements!\r");
|
|
}
|
|
|
|
void SMT100Component::loop() {
|
|
while (this->available() != 0) {
|
|
if (this->readline_(this->read(), this->readline_buffer_, MAX_LINE_LENGTH) > 0) {
|
|
char *token = strtok(this->readline_buffer_, ",");
|
|
if (!token)
|
|
continue;
|
|
int counts = (int) strtol(token, nullptr, 10);
|
|
token = strtok(nullptr, ",");
|
|
if (!token)
|
|
continue;
|
|
float permittivity = (float) strtod(token, nullptr);
|
|
token = strtok(nullptr, ",");
|
|
if (!token)
|
|
continue;
|
|
float moisture = (float) strtod(token, nullptr);
|
|
token = strtok(nullptr, ",");
|
|
if (!token)
|
|
continue;
|
|
float temperature = (float) strtod(token, nullptr);
|
|
token = strtok(nullptr, ",");
|
|
if (!token)
|
|
continue;
|
|
float voltage = (float) strtod(token, nullptr);
|
|
|
|
if (this->counts_sensor_ != nullptr) {
|
|
counts_sensor_->publish_state(counts);
|
|
}
|
|
|
|
if (this->permittivity_sensor_ != nullptr) {
|
|
permittivity_sensor_->publish_state(permittivity);
|
|
}
|
|
|
|
if (this->moisture_sensor_ != nullptr) {
|
|
moisture_sensor_->publish_state(moisture);
|
|
}
|
|
|
|
if (this->temperature_sensor_ != nullptr) {
|
|
temperature_sensor_->publish_state(temperature);
|
|
}
|
|
|
|
if (this->voltage_sensor_ != nullptr) {
|
|
voltage_sensor_->publish_state(voltage);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void SMT100Component::dump_config() {
|
|
ESP_LOGCONFIG(TAG, "SMT100:");
|
|
|
|
LOG_SENSOR(TAG, "Counts", this->counts_sensor_);
|
|
LOG_SENSOR(TAG, "Permittivity", this->permittivity_sensor_);
|
|
LOG_SENSOR(TAG, "Temperature", this->temperature_sensor_);
|
|
LOG_SENSOR(TAG, "Moisture", this->moisture_sensor_);
|
|
LOG_UPDATE_INTERVAL(this);
|
|
this->check_uart_settings(9600);
|
|
}
|
|
|
|
int SMT100Component::readline_(int readch, char *buffer, int len) {
|
|
int rpos;
|
|
|
|
if (readch > 0) {
|
|
switch (readch) {
|
|
case '\n': // Ignore new-lines
|
|
break;
|
|
case '\r': // Return on CR
|
|
rpos = this->readline_pos_;
|
|
this->readline_pos_ = 0; // Reset position index ready for next time
|
|
return rpos;
|
|
default:
|
|
if (this->readline_pos_ < len - 1) {
|
|
buffer[this->readline_pos_++] = readch;
|
|
buffer[this->readline_pos_] = 0;
|
|
}
|
|
}
|
|
}
|
|
// No end of line has been found, so return -1.
|
|
return -1;
|
|
}
|
|
|
|
} // namespace smt100
|
|
} // namespace esphome
|