mirror of
https://github.com/esphome/esphome.git
synced 2025-02-21 04:18:16 +00:00
85 lines
2.4 KiB
C++
85 lines
2.4 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() {
|
|
static char buffer[MAX_LINE_LENGTH];
|
|
while (this->available() != 0) {
|
|
if (readline_(read(), buffer, MAX_LINE_LENGTH) > 0) {
|
|
int counts = (int) strtol((strtok(buffer, ",")), nullptr, 10);
|
|
float dielectric_constant = (float) strtod((strtok(nullptr, ",")), nullptr);
|
|
float moisture = (float) strtod((strtok(nullptr, ",")), nullptr);
|
|
float temperature = (float) strtod((strtok(nullptr, ",")), nullptr);
|
|
float voltage = (float) strtod((strtok(nullptr, ",")), nullptr);
|
|
|
|
if (this->counts_sensor_ != nullptr) {
|
|
counts_sensor_->publish_state(counts);
|
|
}
|
|
|
|
if (this->dielectric_constant_sensor_ != nullptr) {
|
|
dielectric_constant_sensor_->publish_state(dielectric_constant);
|
|
}
|
|
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
float SMT100Component::get_setup_priority() const { return setup_priority::DATA; }
|
|
|
|
void SMT100Component::dump_config() {
|
|
ESP_LOGCONFIG(TAG, "SMT100:");
|
|
|
|
LOG_SENSOR(TAG, "Counts", this->temperature_sensor_);
|
|
LOG_SENSOR(TAG, "Dielectric Constant", this->temperature_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) {
|
|
static int pos = 0;
|
|
int rpos;
|
|
|
|
if (readch > 0) {
|
|
switch (readch) {
|
|
case '\n': // Ignore new-lines
|
|
break;
|
|
case '\r': // Return on CR
|
|
rpos = pos;
|
|
pos = 0; // Reset position index ready for next time
|
|
return rpos;
|
|
default:
|
|
if (pos < len - 1) {
|
|
buffer[pos++] = readch;
|
|
buffer[pos] = 0;
|
|
}
|
|
}
|
|
}
|
|
// No end of line has been found, so return -1.
|
|
return -1;
|
|
}
|
|
|
|
} // namespace smt100
|
|
} // namespace esphome
|