diff --git a/homeassistant/exceptions.py b/homeassistant/exceptions.py
index bd32d3566705bd4f7b38d05701ded7e04beeab22..510bc9b4e5497c55db20ed316426da0e31936f32 100644
--- a/homeassistant/exceptions.py
+++ b/homeassistant/exceptions.py
@@ -14,3 +14,10 @@ class InvalidEntityFormatError(HomeAssistantError):
 class NoEntitySpecifiedError(HomeAssistantError):
     """ When no entity is specified. """
     pass
+
+
+class TemplateError(HomeAssistantError):
+    """ Error during template rendering. """
+    def __init__(self, exception):
+        super().__init__('{}: {}'.format(exception.__class__.__name__,
+                                         exception))
diff --git a/homeassistant/util/template.py b/homeassistant/util/template.py
index bc89d053e60b793632a8a18de76b913fbf213852..ad0fabdab53dbfa203c38b6772c7864bff9e33f0 100644
--- a/homeassistant/util/template.py
+++ b/homeassistant/util/template.py
@@ -6,10 +6,17 @@ Template utility methods for rendering strings with HA data.
 """
 # pylint: disable=too-few-public-methods
 import json
+import logging
+import jinja2
 from jinja2.sandbox import ImmutableSandboxedEnvironment
+from homeassistant.exceptions import TemplateError
 
+_LOGGER = logging.getLogger(__name__)
+_SENTINEL = object()
 
-def render_with_possible_json_value(hass, template, value):
+
+def render_with_possible_json_value(hass, template, value,
+                                    error_value=_SENTINEL):
     """ Renders template with value exposed.
         If valid JSON will expose value_json too. """
     variables = {
@@ -20,7 +27,11 @@ def render_with_possible_json_value(hass, template, value):
     except ValueError:
         pass
 
-    return render(hass, template, variables)
+    try:
+        return render(hass, template, variables)
+    except TemplateError:
+        _LOGGER.exception('Error parsing value')
+        return value if error_value is _SENTINEL else error_value
 
 
 def render(hass, template, variables=None, **kwargs):
@@ -28,9 +39,12 @@ def render(hass, template, variables=None, **kwargs):
     if variables is not None:
         kwargs.update(variables)
 
-    return ENV.from_string(template, {
-        'states': AllStates(hass)
-    }).render(kwargs)
+    try:
+        return ENV.from_string(template, {
+            'states': AllStates(hass)
+        }).render(kwargs)
+    except jinja2.TemplateError as err:
+        raise TemplateError(err)
 
 
 class AllStates(object):
diff --git a/tests/util/test_template.py b/tests/util/test_template.py
index bbb4de3162608587d24188156b254ec365b9dadf..ba354f3e7bec2ff5bec54d6a869c6cfaaeed0faa 100644
--- a/tests/util/test_template.py
+++ b/tests/util/test_template.py
@@ -7,7 +7,7 @@ Tests Home Assistant util methods.
 # pylint: disable=too-many-public-methods
 import unittest
 import homeassistant.core as ha
-
+from homeassistant.exceptions import TemplateError
 from homeassistant.util import template
 
 
@@ -84,3 +84,19 @@ class TestUtilTemplate(unittest.TestCase):
             '',
             template.render_with_possible_json_value(
                 self.hass, '{{ value_json }}', '{ I AM NOT JSON }'))
+
+    def test_render_with_possible_json_value_with_template_error(self):
+        self.assertEqual(
+            'hello',
+            template.render_with_possible_json_value(
+                self.hass, '{{ value_json', 'hello'))
+
+    def test_render_with_possible_json_value_with_template_error_error_value(self):
+        self.assertEqual(
+            '-',
+            template.render_with_possible_json_value(
+                self.hass, '{{ value_json', 'hello', '-'))
+
+    def test_raise_exception_on_error(self):
+        with self.assertRaises(TemplateError):
+            template.render(self.hass, '{{ invalid_syntax')