Files
esphome-lsm6ds/esphome/components/smt100/smt100.cpp
T
2026-03-09 20:39:58 -04:00

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