1
0
mirror of https://github.com/home-assistant/core.git synced 2025-12-24 12:59:34 +00:00

Add state_as_number() helper

This adds state_as_number(), a helper method that tries to interpret
state as a number, for cases we can predict. It's a generalization of
what is copy-and-paste-ed into multiple other places.
This commit is contained in:
Dan Smith
2016-02-11 17:10:34 +00:00
parent 4ce1a67c13
commit 3aa34deaa2
2 changed files with 72 additions and 2 deletions

View File

@@ -13,6 +13,12 @@ import homeassistant.components as core_components
from homeassistant.const import SERVICE_TURN_ON
from homeassistant.util import dt as dt_util
from homeassistant.helpers import state
from homeassistant.const import (
STATE_OFF, STATE_OPEN, STATE_CLOSED,
STATE_LOCKED, STATE_UNLOCKED, STATE_UNKNOWN,
STATE_ON, STATE_OFF)
from homeassistant.components.sun import (STATE_ABOVE_HORIZON,
STATE_BELOW_HORIZON)
from tests.common import get_test_home_assistant, mock_service
@@ -146,3 +152,37 @@ class TestStateHelpers(unittest.TestCase):
self.assertEqual(['light.test1', 'light.test2'],
last_call.data.get('entity_id'))
self.assertEqual(95, last_call.data.get('brightness'))
def test_as_number_states(self):
zero_states = (STATE_OFF, STATE_CLOSED, STATE_UNLOCKED,
STATE_BELOW_HORIZON)
one_states = (STATE_ON, STATE_OPEN, STATE_LOCKED, STATE_ABOVE_HORIZON)
for _state in zero_states:
self.assertEqual(0, state.state_as_number(
ha.State('domain.test', _state, {})))
for _state in one_states:
self.assertEqual(1, state.state_as_number(
ha.State('domain.test', _state, {})))
def test_as_number_coercion(self):
for _state in ('0', '0.0'):
self.assertEqual(
0.0, float(state.state_as_number(
ha.State('domain.test', _state, {}))))
for _state in ('1', '1.0'):
self.assertEqual(
1.0, float(state.state_as_number(
ha.State('domain.test', _state, {}))))
def test_as_number_tries_to_keep_types(self):
result = state.state_as_number(ha.State('domain.test', '1', {}))
self.assertTrue(isinstance(result, int))
result = state.state_as_number(ha.State('domain.test', '1.0', {}))
self.assertTrue(isinstance(result, float))
def test_as_number_invalid_cases(self):
for _state in ('', 'foo', 'foo.bar', None, False, True, None,
object, object()):
self.assertRaises(ValueError,
state.state_as_number,
ha.State('domain.test', _state, {}))