mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 07:03:55 +00:00 
			
		
		
		
	Merge branch 'integration' into memory_api
This commit is contained in:
		
							
								
								
									
										2
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							| @@ -171,7 +171,7 @@ jobs: | |||||||
|       - uses: actions/checkout@v4.2.2 |       - uses: actions/checkout@v4.2.2 | ||||||
|  |  | ||||||
|       - name: Download digests |       - name: Download digests | ||||||
|         uses: actions/download-artifact@v4.3.0 |         uses: actions/download-artifact@v5.0.0 | ||||||
|         with: |         with: | ||||||
|           pattern: digests-* |           pattern: digests-* | ||||||
|           path: /tmp/digests |           path: /tmp/digests | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ from esphome.const import ( | |||||||
|     CONF_EQUATION, |     CONF_EQUATION, | ||||||
|     CONF_HUMIDITY, |     CONF_HUMIDITY, | ||||||
|     CONF_TEMPERATURE, |     CONF_TEMPERATURE, | ||||||
|     ICON_WATER, |     DEVICE_CLASS_ABSOLUTE_HUMIDITY, | ||||||
|     STATE_CLASS_MEASUREMENT, |     STATE_CLASS_MEASUREMENT, | ||||||
|     UNIT_GRAMS_PER_CUBIC_METER, |     UNIT_GRAMS_PER_CUBIC_METER, | ||||||
| ) | ) | ||||||
| @@ -27,8 +27,8 @@ EQUATION = { | |||||||
| CONFIG_SCHEMA = ( | CONFIG_SCHEMA = ( | ||||||
|     sensor.sensor_schema( |     sensor.sensor_schema( | ||||||
|         unit_of_measurement=UNIT_GRAMS_PER_CUBIC_METER, |         unit_of_measurement=UNIT_GRAMS_PER_CUBIC_METER, | ||||||
|         icon=ICON_WATER, |  | ||||||
|         accuracy_decimals=2, |         accuracy_decimals=2, | ||||||
|  |         device_class=DEVICE_CLASS_ABSOLUTE_HUMIDITY, | ||||||
|         state_class=STATE_CLASS_MEASUREMENT, |         state_class=STATE_CLASS_MEASUREMENT, | ||||||
|     ) |     ) | ||||||
|     .extend( |     .extend( | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| #ifdef USE_ESP32 |  | ||||||
|  |  | ||||||
| #include "ble.h" | #include "ble.h" | ||||||
|  |  | ||||||
|  | #ifdef USE_ESP32 | ||||||
|  |  | ||||||
| #include "esphome/core/application.h" | #include "esphome/core/application.h" | ||||||
| #include "esphome/core/helpers.h" | #include "esphome/core/helpers.h" | ||||||
| #include "esphome/core/log.h" | #include "esphome/core/log.h" | ||||||
|   | |||||||
| @@ -1,5 +1,7 @@ | |||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
|  | #include "esphome/core/defines.h" | ||||||
|  |  | ||||||
| #include <array> | #include <array> | ||||||
| #include <functional> | #include <functional> | ||||||
| #include <vector> | #include <vector> | ||||||
|   | |||||||
| @@ -333,33 +333,37 @@ class ESP32BLETracker : public Component, | |||||||
|     return counts; |     return counts; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   uint8_t app_id_{0}; |   // Group 1: Large objects (12+ bytes) - vectors and callback manager | ||||||
|  |   std::vector<ESPBTDeviceListener *> listeners_; | ||||||
|  |   std::vector<ESPBTClient *> clients_; | ||||||
|  |   CallbackManager<void(ScannerState)> scanner_state_callbacks_; | ||||||
| #ifdef USE_ESP32_BLE_DEVICE | #ifdef USE_ESP32_BLE_DEVICE | ||||||
|   /// Vector of addresses that have already been printed in print_bt_device_info |   /// Vector of addresses that have already been printed in print_bt_device_info | ||||||
|   std::vector<uint64_t> already_discovered_; |   std::vector<uint64_t> already_discovered_; | ||||||
| #endif | #endif | ||||||
|   std::vector<ESPBTDeviceListener *> listeners_; |  | ||||||
|   /// Client parameters. |   // Group 2: Structs (aligned to 4 bytes) | ||||||
|   std::vector<ESPBTClient *> clients_; |  | ||||||
|   /// A structure holding the ESP BLE scan parameters. |   /// A structure holding the ESP BLE scan parameters. | ||||||
|   esp_ble_scan_params_t scan_params_; |   esp_ble_scan_params_t scan_params_; | ||||||
|  |   ClientStateCounts client_state_counts_; | ||||||
|  |  | ||||||
|  |   // Group 3: 4-byte types | ||||||
|   /// The interval in seconds to perform scans. |   /// The interval in seconds to perform scans. | ||||||
|   uint32_t scan_duration_; |   uint32_t scan_duration_; | ||||||
|   uint32_t scan_interval_; |   uint32_t scan_interval_; | ||||||
|   uint32_t scan_window_; |   uint32_t scan_window_; | ||||||
|  |   esp_bt_status_t scan_start_failed_{ESP_BT_STATUS_SUCCESS}; | ||||||
|  |   esp_bt_status_t scan_set_param_failed_{ESP_BT_STATUS_SUCCESS}; | ||||||
|  |  | ||||||
|  |   // Group 4: 1-byte types (enums, uint8_t, bool) | ||||||
|  |   uint8_t app_id_{0}; | ||||||
|   uint8_t scan_start_fail_count_{0}; |   uint8_t scan_start_fail_count_{0}; | ||||||
|  |   ScannerState scanner_state_{ScannerState::IDLE}; | ||||||
|   bool scan_continuous_; |   bool scan_continuous_; | ||||||
|   bool scan_active_; |   bool scan_active_; | ||||||
|   ScannerState scanner_state_{ScannerState::IDLE}; |  | ||||||
|   CallbackManager<void(ScannerState)> scanner_state_callbacks_; |  | ||||||
|   bool ble_was_disabled_{true}; |   bool ble_was_disabled_{true}; | ||||||
|   bool raw_advertisements_{false}; |   bool raw_advertisements_{false}; | ||||||
|   bool parse_advertisements_{false}; |   bool parse_advertisements_{false}; | ||||||
|  |  | ||||||
|   esp_bt_status_t scan_start_failed_{ESP_BT_STATUS_SUCCESS}; |  | ||||||
|   esp_bt_status_t scan_set_param_failed_{ESP_BT_STATUS_SUCCESS}; |  | ||||||
|   ClientStateCounts client_state_counts_; |  | ||||||
| #ifdef USE_ESP32_BLE_SOFTWARE_COEXISTENCE | #ifdef USE_ESP32_BLE_SOFTWARE_COEXISTENCE | ||||||
|   bool coex_prefer_ble_{false}; |   bool coex_prefer_ble_{false}; | ||||||
| #endif | #endif | ||||||
|   | |||||||
| @@ -171,8 +171,8 @@ class ESP32TouchComponent : public Component { | |||||||
|   // based on the filter configuration |   // based on the filter configuration | ||||||
|   uint32_t read_touch_value(touch_pad_t pad) const; |   uint32_t read_touch_value(touch_pad_t pad) const; | ||||||
|  |  | ||||||
|   // Helper to update touch state with a known state |   // Helper to update touch state with a known state and value | ||||||
|   void update_touch_state_(ESP32TouchBinarySensor *child, bool is_touched); |   void update_touch_state_(ESP32TouchBinarySensor *child, bool is_touched, uint32_t value); | ||||||
|  |  | ||||||
|   // Helper to read touch value and update state for a given child |   // Helper to read touch value and update state for a given child | ||||||
|   bool check_and_update_touch_state_(ESP32TouchBinarySensor *child); |   bool check_and_update_touch_state_(ESP32TouchBinarySensor *child); | ||||||
| @@ -234,9 +234,13 @@ class ESP32TouchBinarySensor : public binary_sensor::BinarySensor { | |||||||
|   touch_pad_t get_touch_pad() const { return this->touch_pad_; } |   touch_pad_t get_touch_pad() const { return this->touch_pad_; } | ||||||
|   uint32_t get_threshold() const { return this->threshold_; } |   uint32_t get_threshold() const { return this->threshold_; } | ||||||
|   void set_threshold(uint32_t threshold) { this->threshold_ = threshold; } |   void set_threshold(uint32_t threshold) { this->threshold_ = threshold; } | ||||||
| #ifdef USE_ESP32_VARIANT_ESP32 |  | ||||||
|  |   /// Get the raw touch measurement value. | ||||||
|  |   /// @note Although this method may appear unused within the component, it is a public API | ||||||
|  |   /// used by lambdas in user configurations for custom touch value processing. | ||||||
|  |   /// @return The current raw touch sensor reading | ||||||
|   uint32_t get_value() const { return this->value_; } |   uint32_t get_value() const { return this->value_; } | ||||||
| #endif |  | ||||||
|   uint32_t get_wakeup_threshold() const { return this->wakeup_threshold_; } |   uint32_t get_wakeup_threshold() const { return this->wakeup_threshold_; } | ||||||
|  |  | ||||||
|  protected: |  protected: | ||||||
| @@ -245,9 +249,8 @@ class ESP32TouchBinarySensor : public binary_sensor::BinarySensor { | |||||||
|   touch_pad_t touch_pad_{TOUCH_PAD_MAX}; |   touch_pad_t touch_pad_{TOUCH_PAD_MAX}; | ||||||
|   uint32_t threshold_{0}; |   uint32_t threshold_{0}; | ||||||
|   uint32_t benchmark_{}; |   uint32_t benchmark_{}; | ||||||
| #ifdef USE_ESP32_VARIANT_ESP32 |   /// Stores the last raw touch measurement value. | ||||||
|   uint32_t value_{0}; |   uint32_t value_{0}; | ||||||
| #endif |  | ||||||
|   bool last_state_{false}; |   bool last_state_{false}; | ||||||
|   const uint32_t wakeup_threshold_{0}; |   const uint32_t wakeup_threshold_{0}; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -100,6 +100,8 @@ void ESP32TouchComponent::process_setup_mode_logging_(uint32_t now) { | |||||||
| #else | #else | ||||||
|       // Read the value being used for touch detection |       // Read the value being used for touch detection | ||||||
|       uint32_t value = this->read_touch_value(child->get_touch_pad()); |       uint32_t value = this->read_touch_value(child->get_touch_pad()); | ||||||
|  |       // Store the value for get_value() access in lambdas | ||||||
|  |       child->value_ = value; | ||||||
|       ESP_LOGD(TAG, "Touch Pad '%s' (T%d): %d", child->get_name().c_str(), child->get_touch_pad(), value); |       ESP_LOGD(TAG, "Touch Pad '%s' (T%d): %d", child->get_name().c_str(), child->get_touch_pad(), value); | ||||||
| #endif | #endif | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -10,8 +10,11 @@ namespace esp32_touch { | |||||||
|  |  | ||||||
| static const char *const TAG = "esp32_touch"; | static const char *const TAG = "esp32_touch"; | ||||||
|  |  | ||||||
| // Helper to update touch state with a known state | // Helper to update touch state with a known state and value | ||||||
| void ESP32TouchComponent::update_touch_state_(ESP32TouchBinarySensor *child, bool is_touched) { | void ESP32TouchComponent::update_touch_state_(ESP32TouchBinarySensor *child, bool is_touched, uint32_t value) { | ||||||
|  |   // Store the value for get_value() access in lambdas | ||||||
|  |   child->value_ = value; | ||||||
|  |  | ||||||
|   // Always update timer when touched |   // Always update timer when touched | ||||||
|   if (is_touched) { |   if (is_touched) { | ||||||
|     child->last_touch_time_ = App.get_loop_component_start_time(); |     child->last_touch_time_ = App.get_loop_component_start_time(); | ||||||
| @@ -21,9 +24,8 @@ void ESP32TouchComponent::update_touch_state_(ESP32TouchBinarySensor *child, boo | |||||||
|     child->last_state_ = is_touched; |     child->last_state_ = is_touched; | ||||||
|     child->publish_state(is_touched); |     child->publish_state(is_touched); | ||||||
|     if (is_touched) { |     if (is_touched) { | ||||||
|       // ESP32-S2/S3 v2: touched when value > threshold |  | ||||||
|       ESP_LOGV(TAG, "Touch Pad '%s' state: ON (value: %" PRIu32 " > threshold: %" PRIu32 ")", child->get_name().c_str(), |       ESP_LOGV(TAG, "Touch Pad '%s' state: ON (value: %" PRIu32 " > threshold: %" PRIu32 ")", child->get_name().c_str(), | ||||||
|                this->read_touch_value(child->touch_pad_), child->threshold_ + child->benchmark_); |                value, child->threshold_ + child->benchmark_); | ||||||
|     } else { |     } else { | ||||||
|       ESP_LOGV(TAG, "Touch Pad '%s' state: OFF", child->get_name().c_str()); |       ESP_LOGV(TAG, "Touch Pad '%s' state: OFF", child->get_name().c_str()); | ||||||
|     } |     } | ||||||
| @@ -41,7 +43,7 @@ bool ESP32TouchComponent::check_and_update_touch_state_(ESP32TouchBinarySensor * | |||||||
|            child->get_name().c_str(), child->touch_pad_, value, child->threshold_, child->benchmark_); |            child->get_name().c_str(), child->touch_pad_, value, child->threshold_, child->benchmark_); | ||||||
|   bool is_touched = value > child->benchmark_ + child->threshold_; |   bool is_touched = value > child->benchmark_ + child->threshold_; | ||||||
|  |  | ||||||
|   this->update_touch_state_(child, is_touched); |   this->update_touch_state_(child, is_touched, value); | ||||||
|   return is_touched; |   return is_touched; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -296,7 +298,9 @@ void ESP32TouchComponent::loop() { | |||||||
|           this->check_and_update_touch_state_(child); |           this->check_and_update_touch_state_(child); | ||||||
|         } else if (event.intr_mask & TOUCH_PAD_INTR_MASK_ACTIVE) { |         } else if (event.intr_mask & TOUCH_PAD_INTR_MASK_ACTIVE) { | ||||||
|           // We only get ACTIVE interrupts now, releases are detected by timeout |           // We only get ACTIVE interrupts now, releases are detected by timeout | ||||||
|           this->update_touch_state_(child, true);  // Always touched for ACTIVE interrupts |           // Read the current value | ||||||
|  |           uint32_t value = this->read_touch_value(child->touch_pad_); | ||||||
|  |           this->update_touch_state_(child, true, value);  // Always touched for ACTIVE interrupts | ||||||
|         } |         } | ||||||
|         break; |         break; | ||||||
|       } |       } | ||||||
|   | |||||||
							
								
								
									
										18
									
								
								tests/components/esp32_touch/common-get-value.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								tests/components/esp32_touch/common-get-value.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | |||||||
|  | binary_sensor: | ||||||
|  |   - platform: esp32_touch | ||||||
|  |     name: ESP32 Touch Pad Get Value | ||||||
|  |     pin: ${pin} | ||||||
|  |     threshold: 1000 | ||||||
|  |     id: esp32_touch_pad_get_value | ||||||
|  |     on_press: | ||||||
|  |       then: | ||||||
|  |         - lambda: |- | ||||||
|  |             // Test that get_value() compiles and works | ||||||
|  |             uint32_t value = id(esp32_touch_pad_get_value).get_value(); | ||||||
|  |             ESP_LOGD("test", "Touch value on press: %u", value); | ||||||
|  |     on_release: | ||||||
|  |       then: | ||||||
|  |         - lambda: |- | ||||||
|  |             // Test get_value() on release | ||||||
|  |             uint32_t value = id(esp32_touch_pad_get_value).get_value(); | ||||||
|  |             ESP_LOGD("test", "Touch value on release: %u", value); | ||||||
| @@ -2,3 +2,4 @@ substitutions: | |||||||
|   pin: GPIO27 |   pin: GPIO27 | ||||||
|  |  | ||||||
| <<: !include common.yaml | <<: !include common.yaml | ||||||
|  | <<: !include common-get-value.yaml | ||||||
|   | |||||||
| @@ -2,3 +2,4 @@ substitutions: | |||||||
|   pin: GPIO12 |   pin: GPIO12 | ||||||
|  |  | ||||||
| <<: !include common-variants.yaml | <<: !include common-variants.yaml | ||||||
|  | <<: !include common-get-value.yaml | ||||||
|   | |||||||
| @@ -2,3 +2,4 @@ substitutions: | |||||||
|   pin: GPIO12 |   pin: GPIO12 | ||||||
|  |  | ||||||
| <<: !include common-variants.yaml | <<: !include common-variants.yaml | ||||||
|  | <<: !include common-get-value.yaml | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user