dfrobot_sen0395: Use setLatency instead of outputLatency (#5665)

Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
This commit is contained in:
Jean-François Roy 2024-02-04 17:57:11 -08:00 committed by GitHub
parent 0fa0904bc5
commit b28821d846
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 19 additions and 28 deletions

View file

@ -1,7 +1,6 @@
import esphome.codegen as cg import esphome.codegen as cg
import esphome.config_validation as cv import esphome.config_validation as cv
from esphome import automation from esphome import automation
from esphome import core
from esphome.automation import maybe_simple_id from esphome.automation import maybe_simple_id
from esphome.const import CONF_ID from esphome.const import CONF_ID
from esphome.components import uart from esphome.components import uart
@ -101,7 +100,7 @@ def range_segment_list(input):
largest_distance = -1 largest_distance = -1
for distance in input: for distance in input:
if isinstance(distance, core.Lambda): if isinstance(distance, cv.Lambda):
continue continue
m = cv.distance(distance) m = cv.distance(distance)
if m > 9: if m > 9:
@ -128,14 +127,14 @@ MMWAVE_SETTINGS_SCHEMA = cv.Schema(
cv.Optional(CONF_OUTPUT_LATENCY): { cv.Optional(CONF_OUTPUT_LATENCY): {
cv.Required(CONF_DELAY_AFTER_DETECT): cv.templatable( cv.Required(CONF_DELAY_AFTER_DETECT): cv.templatable(
cv.All( cv.All(
cv.positive_time_period, cv.positive_time_period_milliseconds,
cv.Range(max=core.TimePeriod(seconds=1638.375)), cv.Range(max=cv.TimePeriod(seconds=1638.375)),
) )
), ),
cv.Required(CONF_DELAY_AFTER_DISAPPEAR): cv.templatable( cv.Required(CONF_DELAY_AFTER_DISAPPEAR): cv.templatable(
cv.All( cv.All(
cv.positive_time_period, cv.positive_time_period_milliseconds,
cv.Range(max=core.TimePeriod(seconds=1638.375)), cv.Range(max=cv.TimePeriod(seconds=1638.375)),
) )
), ),
}, },

View file

@ -50,7 +50,7 @@ class DfrobotSen0395SettingsAction : public Action<Ts...>, public Parented<Dfrob
float detect = this->delay_after_detect_.value(x...); float detect = this->delay_after_detect_.value(x...);
float disappear = this->delay_after_disappear_.value(x...); float disappear = this->delay_after_disappear_.value(x...);
if (detect >= 0 && disappear >= 0) { if (detect >= 0 && disappear >= 0) {
this->parent_->enqueue(make_unique<OutputLatencyCommand>(detect, disappear)); this->parent_->enqueue(make_unique<SetLatencyCommand>(detect, disappear));
} }
} }
if (this->start_after_power_on_.has_value()) { if (this->start_after_power_on_.has_value()) {

View file

@ -1,5 +1,7 @@
#include "commands.h" #include "commands.h"
#include <cmath>
#include "esphome/core/log.h" #include "esphome/core/log.h"
#include "dfrobot_sen0395.h" #include "dfrobot_sen0395.h"
@ -194,32 +196,22 @@ uint8_t DetRangeCfgCommand::on_message(std::string &message) {
return 0; // Command not done yet. return 0; // Command not done yet.
} }
OutputLatencyCommand::OutputLatencyCommand(float delay_after_detection, float delay_after_disappear) { SetLatencyCommand::SetLatencyCommand(float delay_after_detection, float delay_after_disappear) {
delay_after_detection = round(delay_after_detection / 0.025) * 0.025; delay_after_detection = std::round(delay_after_detection / 0.025f) * 0.025f;
delay_after_disappear = round(delay_after_disappear / 0.025) * 0.025; delay_after_disappear = std::round(delay_after_disappear / 0.025f) * 0.025f;
if (delay_after_detection < 0) this->delay_after_detection_ = clamp(delay_after_detection, 0.0f, 1638.375f);
delay_after_detection = 0; this->delay_after_disappear_ = clamp(delay_after_disappear, 0.0f, 1638.375f);
if (delay_after_detection > 1638.375) this->cmd_ = str_sprintf("setLatency %.03f %.03f", this->delay_after_detection_, this->delay_after_disappear_);
delay_after_detection = 1638.375;
if (delay_after_disappear < 0)
delay_after_disappear = 0;
if (delay_after_disappear > 1638.375)
delay_after_disappear = 1638.375;
this->delay_after_detection_ = delay_after_detection;
this->delay_after_disappear_ = delay_after_disappear;
this->cmd_ = str_sprintf("outputLatency -1 %.0f %.0f", delay_after_detection / 0.025, delay_after_disappear / 0.025);
}; };
uint8_t OutputLatencyCommand::on_message(std::string &message) { uint8_t SetLatencyCommand::on_message(std::string &message) {
if (message == "sensor is not stopped") { if (message == "sensor is not stopped") {
ESP_LOGE(TAG, "Cannot configure output latency. Sensor is not stopped!"); ESP_LOGE(TAG, "Cannot configure output latency. Sensor is not stopped!");
return 1; // Command done return 1; // Command done
} else if (message == "Done") { } else if (message == "Done") {
ESP_LOGI(TAG, "Updated output latency config:"); ESP_LOGI(TAG, "Updated output latency config:");
ESP_LOGI(TAG, "Signal that someone was detected is delayed by %.02fs.", this->delay_after_detection_); ESP_LOGI(TAG, "Signal that someone was detected is delayed by %.03f s.", this->delay_after_detection_);
ESP_LOGI(TAG, "Signal that nobody is detected anymore is delayed by %.02fs.", this->delay_after_disappear_); ESP_LOGI(TAG, "Signal that nobody is detected anymore is delayed by %.03f s.", this->delay_after_disappear_);
ESP_LOGD(TAG, "Used command: %s", this->cmd_.c_str()); ESP_LOGD(TAG, "Used command: %s", this->cmd_.c_str());
return 1; // Command done return 1; // Command done
} }

View file

@ -62,9 +62,9 @@ class DetRangeCfgCommand : public Command {
// TODO: Set min max values in component, so they can be published as sensor. // TODO: Set min max values in component, so they can be published as sensor.
}; };
class OutputLatencyCommand : public Command { class SetLatencyCommand : public Command {
public: public:
OutputLatencyCommand(float delay_after_detection, float delay_after_disappear); SetLatencyCommand(float delay_after_detection, float delay_after_disappear);
uint8_t on_message(std::string &message) override; uint8_t on_message(std::string &message) override;
protected: protected: