mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 22:53:59 +00:00 
			
		
		
		
	[ld2410] Replace `throttle` with native filters (#10019)
				
					
				
			This commit is contained in:
		| @@ -14,18 +14,16 @@ ld2410_ns = cg.esphome_ns.namespace("ld2410") | ||||
| LD2410Component = ld2410_ns.class_("LD2410Component", cg.Component, uart.UARTDevice) | ||||
|  | ||||
| CONF_LD2410_ID = "ld2410_id" | ||||
|  | ||||
| CONF_MAX_MOVE_DISTANCE = "max_move_distance" | ||||
| CONF_MAX_STILL_DISTANCE = "max_still_distance" | ||||
| CONF_STILL_THRESHOLDS = [f"g{x}_still_threshold" for x in range(9)] | ||||
| CONF_MOVE_THRESHOLDS = [f"g{x}_move_threshold" for x in range(9)] | ||||
| CONF_STILL_THRESHOLDS = [f"g{x}_still_threshold" for x in range(9)] | ||||
|  | ||||
| CONFIG_SCHEMA = cv.Schema( | ||||
|     { | ||||
|         cv.GenerateID(): cv.declare_id(LD2410Component), | ||||
|         cv.Optional(CONF_THROTTLE, default="1000ms"): cv.All( | ||||
|             cv.positive_time_period_milliseconds, | ||||
|             cv.Range(min=cv.TimePeriod(milliseconds=1)), | ||||
|         cv.Optional(CONF_THROTTLE): cv.invalid( | ||||
|             f"{CONF_THROTTLE} has been removed; use per-sensor filters, instead" | ||||
|         ), | ||||
|         cv.Optional(CONF_MAX_MOVE_DISTANCE): cv.invalid( | ||||
|             f"The '{CONF_MAX_MOVE_DISTANCE}' option has been moved to the '{CONF_MAX_MOVE_DISTANCE}'" | ||||
| @@ -75,7 +73,6 @@ async def to_code(config): | ||||
|     var = cg.new_Pvariable(config[CONF_ID]) | ||||
|     await cg.register_component(var, config) | ||||
|     await uart.register_uart_device(var, config) | ||||
|     cg.add(var.set_throttle(config[CONF_THROTTLE])) | ||||
|  | ||||
|  | ||||
| CALIBRATION_ACTION_SCHEMA = maybe_simple_id( | ||||
|   | ||||
| @@ -22,19 +22,23 @@ CONFIG_SCHEMA = { | ||||
|     cv.GenerateID(CONF_LD2410_ID): cv.use_id(LD2410Component), | ||||
|     cv.Optional(CONF_HAS_TARGET): binary_sensor.binary_sensor_schema( | ||||
|         device_class=DEVICE_CLASS_OCCUPANCY, | ||||
|         filters=[{"settle": cv.TimePeriod(milliseconds=1000)}], | ||||
|         icon=ICON_ACCOUNT, | ||||
|     ), | ||||
|     cv.Optional(CONF_HAS_MOVING_TARGET): binary_sensor.binary_sensor_schema( | ||||
|         device_class=DEVICE_CLASS_MOTION, | ||||
|         filters=[{"settle": cv.TimePeriod(milliseconds=1000)}], | ||||
|         icon=ICON_MOTION_SENSOR, | ||||
|     ), | ||||
|     cv.Optional(CONF_HAS_STILL_TARGET): binary_sensor.binary_sensor_schema( | ||||
|         device_class=DEVICE_CLASS_OCCUPANCY, | ||||
|         filters=[{"settle": cv.TimePeriod(milliseconds=1000)}], | ||||
|         icon=ICON_MOTION_SENSOR, | ||||
|     ), | ||||
|     cv.Optional(CONF_OUT_PIN_PRESENCE_STATUS): binary_sensor.binary_sensor_schema( | ||||
|         device_class=DEVICE_CLASS_PRESENCE, | ||||
|         entity_category=ENTITY_CATEGORY_DIAGNOSTIC, | ||||
|         filters=[{"settle": cv.TimePeriod(milliseconds=1000)}], | ||||
|         icon=ICON_ACCOUNT, | ||||
|     ), | ||||
| } | ||||
|   | ||||
| @@ -188,9 +188,8 @@ void LD2410Component::dump_config() { | ||||
|   ESP_LOGCONFIG(TAG, | ||||
|                 "LD2410:\n" | ||||
|                 "  Firmware version: %s\n" | ||||
|                 "  MAC address: %s\n" | ||||
|                 "  Throttle: %u ms", | ||||
|                 version.c_str(), mac_str.c_str(), this->throttle_); | ||||
|                 "  MAC address: %s", | ||||
|                 version.c_str(), mac_str.c_str()); | ||||
| #ifdef USE_BINARY_SENSOR | ||||
|   ESP_LOGCONFIG(TAG, "Binary Sensors:"); | ||||
|   LOG_BINARY_SENSOR("  ", "Target", this->target_binary_sensor_); | ||||
| @@ -306,11 +305,6 @@ void LD2410Component::send_command_(uint8_t command, const uint8_t *command_valu | ||||
| } | ||||
|  | ||||
| void LD2410Component::handle_periodic_data_() { | ||||
|   // Reduce data update rate to reduce home assistant database growth | ||||
|   // Check this first to prevent unnecessary processing done in later checks/parsing | ||||
|   if (App.get_loop_component_start_time() - this->last_periodic_millis_ < this->throttle_) { | ||||
|     return; | ||||
|   } | ||||
|   // 4 frame header bytes + 2 length bytes + 1 data end byte + 1 crc byte + 4 frame footer bytes | ||||
|   // data header=0xAA, data footer=0x55, crc=0x00 | ||||
|   if (this->buffer_pos_ < 12 || !ld2410::validate_header_footer(DATA_FRAME_HEADER, this->buffer_data_) || | ||||
| @@ -318,9 +312,6 @@ void LD2410Component::handle_periodic_data_() { | ||||
|       this->buffer_data_[this->buffer_pos_ - 5] != CHECK) { | ||||
|     return; | ||||
|   } | ||||
|   // Save the timestamp after validating the frame so, if invalid, we'll take the next frame immediately | ||||
|   this->last_periodic_millis_ = App.get_loop_component_start_time(); | ||||
|  | ||||
|   /* | ||||
|     Data Type: 7th | ||||
|     0x01: Engineering mode | ||||
|   | ||||
| @@ -93,7 +93,6 @@ class LD2410Component : public Component, public uart::UARTDevice { | ||||
|   void set_gate_move_sensor(uint8_t gate, sensor::Sensor *s); | ||||
|   void set_gate_still_sensor(uint8_t gate, sensor::Sensor *s); | ||||
| #endif | ||||
|   void set_throttle(uint16_t value) { this->throttle_ = value; }; | ||||
|   void set_bluetooth_password(const std::string &password); | ||||
|   void set_engineering_mode(bool enable); | ||||
|   void read_all_info(); | ||||
| @@ -116,8 +115,6 @@ class LD2410Component : public Component, public uart::UARTDevice { | ||||
|   void query_light_control_(); | ||||
|   void restart_(); | ||||
|  | ||||
|   uint32_t last_periodic_millis_ = 0; | ||||
|   uint16_t throttle_ = 0; | ||||
|   uint8_t light_function_ = 0; | ||||
|   uint8_t light_threshold_ = 0; | ||||
|   uint8_t out_pin_level_ = 0; | ||||
|   | ||||
| @@ -18,42 +18,50 @@ from esphome.const import ( | ||||
| from . import CONF_LD2410_ID, LD2410Component | ||||
|  | ||||
| DEPENDENCIES = ["ld2410"] | ||||
| CONF_STILL_DISTANCE = "still_distance" | ||||
| CONF_MOVING_ENERGY = "moving_energy" | ||||
| CONF_STILL_ENERGY = "still_energy" | ||||
|  | ||||
| CONF_DETECTION_DISTANCE = "detection_distance" | ||||
| CONF_MOVE_ENERGY = "move_energy" | ||||
| CONF_MOVING_ENERGY = "moving_energy" | ||||
| CONF_STILL_DISTANCE = "still_distance" | ||||
| CONF_STILL_ENERGY = "still_energy" | ||||
|  | ||||
|  | ||||
| CONFIG_SCHEMA = cv.Schema( | ||||
|     { | ||||
|         cv.GenerateID(CONF_LD2410_ID): cv.use_id(LD2410Component), | ||||
|         cv.Optional(CONF_MOVING_DISTANCE): sensor.sensor_schema( | ||||
|             device_class=DEVICE_CLASS_DISTANCE, | ||||
|             unit_of_measurement=UNIT_CENTIMETER, | ||||
|             filters=[{"throttle_with_priority": cv.TimePeriod(milliseconds=1000)}], | ||||
|             icon=ICON_SIGNAL, | ||||
|             unit_of_measurement=UNIT_CENTIMETER, | ||||
|         ), | ||||
|         cv.Optional(CONF_STILL_DISTANCE): sensor.sensor_schema( | ||||
|             device_class=DEVICE_CLASS_DISTANCE, | ||||
|             unit_of_measurement=UNIT_CENTIMETER, | ||||
|             filters=[{"throttle_with_priority": cv.TimePeriod(milliseconds=1000)}], | ||||
|             icon=ICON_SIGNAL, | ||||
|             unit_of_measurement=UNIT_CENTIMETER, | ||||
|         ), | ||||
|         cv.Optional(CONF_MOVING_ENERGY): sensor.sensor_schema( | ||||
|             unit_of_measurement=UNIT_PERCENT, | ||||
|             filters=[{"throttle_with_priority": cv.TimePeriod(milliseconds=1000)}], | ||||
|             icon=ICON_MOTION_SENSOR, | ||||
|             unit_of_measurement=UNIT_PERCENT, | ||||
|         ), | ||||
|         cv.Optional(CONF_STILL_ENERGY): sensor.sensor_schema( | ||||
|             unit_of_measurement=UNIT_PERCENT, | ||||
|             filters=[{"throttle_with_priority": cv.TimePeriod(milliseconds=1000)}], | ||||
|             icon=ICON_FLASH, | ||||
|             unit_of_measurement=UNIT_PERCENT, | ||||
|         ), | ||||
|         cv.Optional(CONF_LIGHT): sensor.sensor_schema( | ||||
|             device_class=DEVICE_CLASS_ILLUMINANCE, | ||||
|             entity_category=ENTITY_CATEGORY_DIAGNOSTIC, | ||||
|             filters=[{"throttle_with_priority": cv.TimePeriod(milliseconds=1000)}], | ||||
|             icon=ICON_LIGHTBULB, | ||||
|         ), | ||||
|         cv.Optional(CONF_DETECTION_DISTANCE): sensor.sensor_schema( | ||||
|             device_class=DEVICE_CLASS_DISTANCE, | ||||
|             unit_of_measurement=UNIT_CENTIMETER, | ||||
|             filters=[{"throttle_with_priority": cv.TimePeriod(milliseconds=1000)}], | ||||
|             icon=ICON_SIGNAL, | ||||
|             unit_of_measurement=UNIT_CENTIMETER, | ||||
|         ), | ||||
|     } | ||||
| ) | ||||
| @@ -63,14 +71,20 @@ CONFIG_SCHEMA = CONFIG_SCHEMA.extend( | ||||
|         cv.Optional(f"g{x}"): cv.Schema( | ||||
|             { | ||||
|                 cv.Optional(CONF_MOVE_ENERGY): sensor.sensor_schema( | ||||
|                     unit_of_measurement=UNIT_PERCENT, | ||||
|                     entity_category=ENTITY_CATEGORY_DIAGNOSTIC, | ||||
|                     filters=[ | ||||
|                         {"throttle_with_priority": cv.TimePeriod(milliseconds=1000)} | ||||
|                     ], | ||||
|                     icon=ICON_MOTION_SENSOR, | ||||
|                     unit_of_measurement=UNIT_PERCENT, | ||||
|                 ), | ||||
|                 cv.Optional(CONF_STILL_ENERGY): sensor.sensor_schema( | ||||
|                     unit_of_measurement=UNIT_PERCENT, | ||||
|                     entity_category=ENTITY_CATEGORY_DIAGNOSTIC, | ||||
|                     filters=[ | ||||
|                         {"throttle_with_priority": cv.TimePeriod(milliseconds=1000)} | ||||
|                     ], | ||||
|                     icon=ICON_FLASH, | ||||
|                     unit_of_measurement=UNIT_PERCENT, | ||||
|                 ), | ||||
|             } | ||||
|         ) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user