diff --git a/homeassistant/helpers/template.py b/homeassistant/helpers/template.py index d79c68ffd5e..24275c87061 100644 --- a/homeassistant/helpers/template.py +++ b/homeassistant/helpers/template.py @@ -442,10 +442,18 @@ class TemplateMethods: return None -def forgiving_round(value, precision=0): +def forgiving_round(value, precision=0, method="common"): """Round accepted strings.""" try: - value = round(float(value), precision) + # support rounding methods like jinja + multiplier = float(10 ** precision) + if method == "ceil": + value = math.ceil(float(value) * multiplier) / multiplier + elif method == "floor": + value = math.floor(float(value) * multiplier) / multiplier + else: + # if method is common or something else, use common rounding + value = round(float(value), precision) return int(value) if precision == 0 else value except (ValueError, TypeError): # If value can't be converted to float diff --git a/tests/helpers/test_template.py b/tests/helpers/test_template.py index 73fe36af26d..e0aeb09976d 100644 --- a/tests/helpers/test_template.py +++ b/tests/helpers/test_template.py @@ -97,6 +97,16 @@ class TestHelpersTemplate(unittest.TestCase): '{{ states.sensor.temperature.state | multiply(10) | round }}', self.hass).render() + assert '12.7' == \ + template.Template( + '{{ states.sensor.temperature.state | round(1, "floor") }}', + self.hass).render() + + assert '12.8' == \ + template.Template( + '{{ states.sensor.temperature.state | round(1, "ceil") }}', + self.hass).render() + def test_rounding_value_get_original_value_on_error(self): """Test rounding value get original value on error.""" assert 'None' == \