mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 15:12:06 +00:00 
			
		
		
		
	Merge branch 'more_flexible_template' into integration
This commit is contained in:
		| @@ -52,6 +52,19 @@ number: | ||||
|     widget: spinbox_id | ||||
|     id: lvgl_spinbox_number | ||||
|     name: LVGL Spinbox Number | ||||
|   - platform: template | ||||
|     id: test_brightness | ||||
|     name: "Test Brightness" | ||||
|     min_value: 0 | ||||
|     max_value: 255 | ||||
|     step: 1 | ||||
|     optimistic: true | ||||
|     # Test lambda in automation accessing x parameter directly | ||||
|     # This is a real-world pattern from user configs | ||||
|     on_value: | ||||
|       - lambda: !lambda |- | ||||
|           // Direct use of x parameter in automation | ||||
|           ESP_LOGD("test", "Brightness: %.0f", x); | ||||
|  | ||||
| light: | ||||
|   - platform: lvgl | ||||
| @@ -110,3 +123,21 @@ text: | ||||
|     platform: lvgl | ||||
|     widget: hello_label | ||||
|     mode: text | ||||
|  | ||||
| text_sensor: | ||||
|   - platform: template | ||||
|     id: test_text_sensor | ||||
|     name: "Test Text Sensor" | ||||
|     # Test nested lambdas in LVGL actions can access automation parameters | ||||
|     on_value: | ||||
|       - lvgl.label.update: | ||||
|           id: hello_label | ||||
|           text: !lambda return x.c_str(); | ||||
|       - lvgl.label.update: | ||||
|           id: hello_label | ||||
|           text: !lambda |- | ||||
|             // Test complex lambda with conditionals accessing x parameter | ||||
|             if (x == "*") { | ||||
|               return "WILDCARD"; | ||||
|             } | ||||
|             return x.c_str(); | ||||
|   | ||||
| @@ -257,7 +257,30 @@ lvgl: | ||||
|             text: "Hello shiny day" | ||||
|             text_color: 0xFFFFFF | ||||
|             align: bottom_mid | ||||
|         - label: | ||||
|             id: setup_lambda_label | ||||
|             # Test lambda in widget property during setup (LvContext) | ||||
|             # Should NOT receive lv_component parameter | ||||
|             text: !lambda |- | ||||
|               char buf[32]; | ||||
|               snprintf(buf, sizeof(buf), "Setup: %d", 42); | ||||
|               return std::string(buf); | ||||
|             align: top_mid | ||||
|             text_font: space16 | ||||
|         - label: | ||||
|             id: chip_info_label | ||||
|             # Test complex setup lambda (real-world pattern) | ||||
|             # Should NOT receive lv_component parameter | ||||
|             text: !lambda |- | ||||
|               // Test conditional compilation and string formatting | ||||
|               char buf[64]; | ||||
|               #ifdef USE_ESP_IDF | ||||
|               snprintf(buf, sizeof(buf), "IDF: v%d.%d", ESP_IDF_VERSION_MAJOR, ESP_IDF_VERSION_MINOR); | ||||
|               #else | ||||
|               snprintf(buf, sizeof(buf), "Arduino"); | ||||
|               #endif | ||||
|               return std::string(buf); | ||||
|             align: top_left | ||||
|         - obj: | ||||
|             align: center | ||||
|             arc_opa: COVER | ||||
|   | ||||
| @@ -2,6 +2,7 @@ remote_transmitter: | ||||
|   - id: xmitr | ||||
|     pin: ${pin} | ||||
|     carrier_duty_percent: 50% | ||||
|     non_blocking: true | ||||
|     clock_resolution: ${clock_resolution} | ||||
|     rmt_symbols: ${rmt_symbols} | ||||
|  | ||||
|   | ||||
| @@ -9,6 +9,27 @@ esphome: | ||||
|         id: template_sens | ||||
|         state: !lambda "return 42.0;" | ||||
|  | ||||
|     # Test C++ API: set_template() with stateless lambda (no captures) | ||||
|     - lambda: |- | ||||
|         id(template_sens).set_template([]() -> esphome::optional<float> { | ||||
|           return 123.0f; | ||||
|         }); | ||||
|  | ||||
|     # Test C++ API: set_template() with stateful lambda (with captures) | ||||
|     # This is the regression test for issue #11555 | ||||
|     - lambda: |- | ||||
|         float captured_value = 456.0f; | ||||
|         id(template_sens).set_template([captured_value]() -> esphome::optional<float> { | ||||
|           return captured_value; | ||||
|         }); | ||||
|  | ||||
|     # Test C++ API: set_template() with more complex capture | ||||
|     - lambda: |- | ||||
|         auto sensor_id = id(template_sens); | ||||
|         id(template_number).set_template([sensor_id]() -> esphome::optional<float> { | ||||
|           return sensor_id->state * 2.0f; | ||||
|         }); | ||||
|  | ||||
|     - datetime.date.set: | ||||
|         id: test_date | ||||
|         date: | ||||
| @@ -215,6 +236,7 @@ cover: | ||||
|  | ||||
| number: | ||||
|   - platform: template | ||||
|     id: template_number | ||||
|     name: "Template number" | ||||
|     optimistic: true | ||||
|     min_value: 0 | ||||
|   | ||||
| @@ -261,6 +261,17 @@ def test_device_duplicate_id( | ||||
|     assert "ID duplicate_device redefined!" in captured.out | ||||
|  | ||||
|  | ||||
| def test_substitution_with_id( | ||||
|     yaml_file: Callable[[str], str], capsys: pytest.CaptureFixture[str] | ||||
| ) -> None: | ||||
|     """Test that a ids coming from substitutions do not cause false positive ID redefinition.""" | ||||
|     load_config_from_fixture( | ||||
|         yaml_file, "id_collision_with_substitution.yaml", FIXTURES_DIR | ||||
|     ) | ||||
|     captured = capsys.readouterr() | ||||
|     assert "ID some_switch_id redefined!" not in captured.out | ||||
|  | ||||
|  | ||||
| def test_add_platform_defines_priority() -> None: | ||||
|     """Test that _add_platform_defines runs after globals. | ||||
|  | ||||
|   | ||||
| @@ -0,0 +1,12 @@ | ||||
| esphome: | ||||
|   name: test | ||||
|  | ||||
| host: | ||||
|  | ||||
| substitutions: | ||||
|   support_switches: | ||||
|     - platform: gpio | ||||
|       id: some_switch_id | ||||
|       pin: 12 | ||||
|  | ||||
| switch: $support_switches | ||||
		Reference in New Issue
	
	Block a user