analog_threshold: Publish initial state only when available

This avoids spurious triggers since most sensors won't have state during setup().
This commit is contained in:
Adam Goode 2024-01-01 00:20:33 -05:00
parent e42ab71029
commit 694f6ca2b4
2 changed files with 7 additions and 14 deletions

View File

@ -6,25 +6,19 @@ namespace analog_threshold {
static const char *const TAG = "analog_threshold.binary_sensor";
void AnalogThresholdBinarySensor::setup() {
float sensor_value = this->sensor_->get_state();
// TRUE state is defined to be when sensor is >= threshold
// so when undefined sensor value initialize to FALSE
if (std::isnan(sensor_value)) {
this->publish_initial_state(false);
} else {
this->publish_initial_state(sensor_value >= (this->lower_threshold_ + this->upper_threshold_) / 2.0f);
}
}
void AnalogThresholdBinarySensor::set_sensor(sensor::Sensor *analog_sensor) {
this->sensor_ = analog_sensor;
this->sensor_->add_on_state_callback([this](float sensor_value) {
// if there is an invalid sensor reading, ignore the change and keep the current state
if (!std::isnan(sensor_value)) {
this->publish_state(sensor_value >= (this->state ? this->lower_threshold_ : this->upper_threshold_));
bool threshold_value = sensor_value >= (this->state ? this->lower_threshold_ : this->upper_threshold_);
if (this->has_state()) {
// This is not the initial state.
this->publish_state(threshold_value);
} else {
this->publish_initial_state(threshold_value);
}
}
});
}

View File

@ -10,7 +10,6 @@ namespace analog_threshold {
class AnalogThresholdBinarySensor : public Component, public binary_sensor::BinarySensor {
public:
void dump_config() override;
void setup() override;
float get_setup_priority() const override { return setup_priority::DATA; }