mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 07:03:55 +00:00 
			
		
		
		
	Analog threshold (#3190)
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
This commit is contained in:
		| @@ -19,6 +19,7 @@ esphome/components/airthings_wave_mini/* @ncareau | |||||||
| esphome/components/airthings_wave_plus/* @jeromelaban | esphome/components/airthings_wave_plus/* @jeromelaban | ||||||
| esphome/components/am43/* @buxtronix | esphome/components/am43/* @buxtronix | ||||||
| esphome/components/am43/cover/* @buxtronix | esphome/components/am43/cover/* @buxtronix | ||||||
|  | esphome/components/analog_threshold/* @ianchi | ||||||
| esphome/components/animation/* @syndlex | esphome/components/animation/* @syndlex | ||||||
| esphome/components/anova/* @buxtronix | esphome/components/anova/* @buxtronix | ||||||
| esphome/components/api/* @OttoWinter | esphome/components/api/* @OttoWinter | ||||||
|   | |||||||
							
								
								
									
										1
									
								
								esphome/components/analog_threshold/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								esphome/components/analog_threshold/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | CODEOWNERS = ["@ianchi"] | ||||||
| @@ -0,0 +1,40 @@ | |||||||
|  | #include "analog_threshold_binary_sensor.h" | ||||||
|  | #include "esphome/core/log.h" | ||||||
|  |  | ||||||
|  | namespace esphome { | ||||||
|  | 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_)); | ||||||
|  |     } | ||||||
|  |   }); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void AnalogThresholdBinarySensor::dump_config() { | ||||||
|  |   LOG_BINARY_SENSOR("", "Analog Threshold Binary Sensor", this); | ||||||
|  |   LOG_SENSOR("  ", "Sensor", this->sensor_); | ||||||
|  |   ESP_LOGCONFIG(TAG, "  Upper threshold: %.11f", this->upper_threshold_); | ||||||
|  |   ESP_LOGCONFIG(TAG, "  Lower threshold: %.11f", this->lower_threshold_); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | }  // namespace analog_threshold | ||||||
|  | }  // namespace esphome | ||||||
| @@ -0,0 +1,29 @@ | |||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "esphome/core/component.h" | ||||||
|  | #include "esphome/components/binary_sensor/binary_sensor.h" | ||||||
|  | #include "esphome/components/sensor/sensor.h" | ||||||
|  |  | ||||||
|  | namespace esphome { | ||||||
|  | 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; } | ||||||
|  |  | ||||||
|  |   void set_sensor(sensor::Sensor *analog_sensor); | ||||||
|  |   void set_upper_threshold(float threshold) { this->upper_threshold_ = threshold; } | ||||||
|  |   void set_lower_threshold(float threshold) { this->lower_threshold_ = threshold; } | ||||||
|  |  | ||||||
|  |  protected: | ||||||
|  |   sensor::Sensor *sensor_{nullptr}; | ||||||
|  |  | ||||||
|  |   float upper_threshold_; | ||||||
|  |   float lower_threshold_; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | }  // namespace analog_threshold | ||||||
|  | }  // namespace esphome | ||||||
							
								
								
									
										44
									
								
								esphome/components/analog_threshold/binary_sensor.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								esphome/components/analog_threshold/binary_sensor.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,44 @@ | |||||||
|  | import esphome.codegen as cg | ||||||
|  | import esphome.config_validation as cv | ||||||
|  | from esphome.components import binary_sensor, sensor | ||||||
|  | from esphome.const import ( | ||||||
|  |     CONF_SENSOR_ID, | ||||||
|  |     CONF_THRESHOLD, | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | analog_threshold_ns = cg.esphome_ns.namespace("analog_threshold") | ||||||
|  |  | ||||||
|  | AnalogThresholdBinarySensor = analog_threshold_ns.class_( | ||||||
|  |     "AnalogThresholdBinarySensor", binary_sensor.BinarySensor, cg.Component | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | CONF_UPPER = "upper" | ||||||
|  | CONF_LOWER = "lower" | ||||||
|  |  | ||||||
|  | CONFIG_SCHEMA = binary_sensor.BINARY_SENSOR_SCHEMA.extend( | ||||||
|  |     { | ||||||
|  |         cv.GenerateID(): cv.declare_id(AnalogThresholdBinarySensor), | ||||||
|  |         cv.Required(CONF_SENSOR_ID): cv.use_id(sensor.Sensor), | ||||||
|  |         cv.Required(CONF_THRESHOLD): cv.Any( | ||||||
|  |             cv.float_, | ||||||
|  |             cv.Schema( | ||||||
|  |                 {cv.Required(CONF_UPPER): cv.float_, cv.Required(CONF_LOWER): cv.float_} | ||||||
|  |             ), | ||||||
|  |         ), | ||||||
|  |     } | ||||||
|  | ).extend(cv.COMPONENT_SCHEMA) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | async def to_code(config): | ||||||
|  |     var = await binary_sensor.new_binary_sensor(config) | ||||||
|  |     await cg.register_component(var, config) | ||||||
|  |  | ||||||
|  |     sens = await cg.get_variable(config[CONF_SENSOR_ID]) | ||||||
|  |     cg.add(var.set_sensor(sens)) | ||||||
|  |  | ||||||
|  |     if isinstance(config[CONF_THRESHOLD], float): | ||||||
|  |         cg.add(var.set_upper_threshold(config[CONF_THRESHOLD])) | ||||||
|  |         cg.add(var.set_lower_threshold(config[CONF_THRESHOLD])) | ||||||
|  |     else: | ||||||
|  |         cg.add(var.set_upper_threshold(config[CONF_THRESHOLD][CONF_UPPER])) | ||||||
|  |         cg.add(var.set_lower_threshold(config[CONF_THRESHOLD][CONF_LOWER])) | ||||||
| @@ -1307,6 +1307,21 @@ binary_sensor: | |||||||
|         ] |         ] | ||||||
|   - platform: as3935 |   - platform: as3935 | ||||||
|     name: "Storm Alert" |     name: "Storm Alert" | ||||||
|  |   - platform: analog_threshold | ||||||
|  |     name: Analog Trheshold 1 | ||||||
|  |     sensor_id: template_sensor | ||||||
|  |     threshold:  | ||||||
|  |       upper: 110 | ||||||
|  |       lower: 90 | ||||||
|  |     filters:  | ||||||
|  |       - delayed_on: 0s | ||||||
|  |       - delayed_off: 10s | ||||||
|  |   - platform: analog_threshold | ||||||
|  |     name: Analog Trheshold 2 | ||||||
|  |     sensor_id: template_sensor | ||||||
|  |     threshold: 100 | ||||||
|  |     filters:  | ||||||
|  |       - invert:  | ||||||
|  |  | ||||||
| pca9685: | pca9685: | ||||||
|   frequency: 500 |   frequency: 500 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user