diff --git a/homeassistant/helpers/config_validation.py b/homeassistant/helpers/config_validation.py index c34b104e0f7..948fb017d9d 100644 --- a/homeassistant/helpers/config_validation.py +++ b/homeassistant/helpers/config_validation.py @@ -489,8 +489,9 @@ def template_complex(value): for key, element in return_value.items(): return_value[key] = template_complex(element) return return_value - - return template(value) + if isinstance(value, str): + return template(value) + return value def datetime(value): diff --git a/homeassistant/helpers/template.py b/homeassistant/helpers/template.py index f23d9cddfdd..7dcf08ebf92 100644 --- a/homeassistant/helpers/template.py +++ b/homeassistant/helpers/template.py @@ -69,7 +69,9 @@ def render_complex(value, variables=None): return [render_complex(item, variables) for item in value] if isinstance(value, dict): return {key: render_complex(item, variables) for key, item in value.items()} - return value.async_render(variables) + if isinstance(value, Template): + return value.async_render(variables) + return value def extract_entities( diff --git a/tests/helpers/test_config_validation.py b/tests/helpers/test_config_validation.py index 1f5d6ddfc40..57554d37bb1 100644 --- a/tests/helpers/test_config_validation.py +++ b/tests/helpers/test_config_validation.py @@ -395,7 +395,7 @@ def test_template_complex(): """Test template_complex validator.""" schema = vol.Schema(cv.template_complex) - for value in (None, "{{ partial_print }", "{% if True %}Hello"): + for value in ("{{ partial_print }", "{% if True %}Hello"): with pytest.raises(vol.MultipleInvalid): schema(value) @@ -420,6 +420,10 @@ def test_template_complex(): ["{{ beer }}", 1], ) + # Ensure we don't mutate non-string types that cannot be templates. + for value in (1, True, None): + assert schema(value) == value + def test_time_zone(): """Test time zone validation.""" diff --git a/tests/helpers/test_template.py b/tests/helpers/test_template.py index f2066ce2c6f..f463149bc28 100644 --- a/tests/helpers/test_template.py +++ b/tests/helpers/test_template.py @@ -1796,3 +1796,10 @@ def test_length_of_states(hass): tpl = template.Template("{{ states.sensor | length }}", hass) assert tpl.async_render() == "2" + + +def test_render_complex_handling_non_template_values(hass): + """Test that we can render non-template fields.""" + assert template.render_complex( + {True: 1, False: template.Template("{{ hello }}", hass)}, {"hello": 2} + ) == {True: 1, False: "2"}