diff --git a/homeassistant/components/template/light.py b/homeassistant/components/template/light.py index 52560ea2732..c6d6656f134 100644 --- a/homeassistant/components/template/light.py +++ b/homeassistant/components/template/light.py @@ -378,6 +378,9 @@ class LightTemplate(Light): return try: brightness = self._level_template.async_render() + if brightness in ("None", ""): + self._brightness = None + return if 0 <= int(brightness) <= 255: self._brightness = int(brightness) else: @@ -385,9 +388,15 @@ class LightTemplate(Light): "Received invalid brightness : %s. Expected: 0-255", brightness ) self._brightness = None - except TemplateError as ex: - _LOGGER.error(ex) - self._state = None + except ValueError: + _LOGGER.error( + "Template must supply an integer brightness from 0-255, or 'None'", + exc_info=True, + ) + self._brightness = None + except TemplateError: + _LOGGER.error("Invalid template", exc_info=True) + self._brightness = None @callback def update_state(self): @@ -415,7 +424,11 @@ class LightTemplate(Light): if self._temperature_template is None: return try: - temperature = int(self._temperature_template.async_render()) + render = self._temperature_template.async_render() + if render in ("None", ""): + self._temperature = None + return + temperature = int(render) if self.min_mireds <= temperature <= self.max_mireds: self._temperature = temperature else: @@ -425,6 +438,12 @@ class LightTemplate(Light): self.max_mireds, ) self._temperature = None + except ValueError: + _LOGGER.error( + "Template must supply an integer temperature within the range for this light, or 'None'", + exc_info=True, + ) + self._temperature = None except TemplateError: _LOGGER.error("Cannot evaluate temperature template", exc_info=True) self._temperature = None @@ -435,10 +454,11 @@ class LightTemplate(Light): if self._color_template is None: return - self._color = None - try: render = self._color_template.async_render() + if render in ("None", ""): + self._color = None + return h_str, s_str = map( float, render.replace("(", "").replace(")", "").split(",", 1) ) @@ -455,7 +475,10 @@ class LightTemplate(Light): h_str, s_str, ) + self._color = None else: _LOGGER.error("Received invalid hs_color : (%s)", render) - except TemplateError as ex: - _LOGGER.error(ex) + self._color = None + except TemplateError: + _LOGGER.error("Cannot evaluate hs_color template", exc_info=True) + self._color = None diff --git a/tests/components/template/test_light.py b/tests/components/template/test_light.py index dccca97a1cc..d9adf6015c9 100644 --- a/tests/components/template/test_light.py +++ b/tests/components/template/test_light.py @@ -543,7 +543,13 @@ class TestTemplateLight: @pytest.mark.parametrize( "expected_level,template", - [(255, "{{255}}"), (None, "{{256}}"), (None, "{{x - 12}}")], + [ + (255, "{{255}}"), + (None, "{{256}}"), + (None, "{{x - 12}}"), + (None, "{{ none }}"), + (None, ""), + ], ) def test_level_template(self, expected_level, template): """Test the template for the level.""" @@ -588,7 +594,14 @@ class TestTemplateLight: @pytest.mark.parametrize( "expected_temp,template", - [(500, "{{500}}"), (None, "{{501}}"), (None, "{{x - 12}}")], + [ + (500, "{{500}}"), + (None, "{{501}}"), + (None, "{{x - 12}}"), + (None, "None"), + (None, "{{ none }}"), + (None, ""), + ], ) def test_temperature_template(self, expected_temp, template): """Test the template for the temperature.""" @@ -894,6 +907,8 @@ class TestTemplateLight: (None, "{{(361, 100)}}"), (None, "{{(360, 101)}}"), (None, "{{x - 12}}"), + (None, ""), + (None, "{{ none }}"), ], ) def test_color_template(self, expected_hs, template):