Fix: state_as_number always return float

This commit is contained in:
Paulus Schoutsen 2016-02-13 00:08:32 -08:00
parent e9fa1f1f83
commit 1571b33e4a
5 changed files with 14 additions and 29 deletions

View file

@ -309,7 +309,7 @@ class State(object):
"Format should be <domain>.<object_id>").format(entity_id)) "Format should be <domain>.<object_id>").format(entity_id))
self.entity_id = entity_id.lower() self.entity_id = entity_id.lower()
self.state = state self.state = str(state)
self.attributes = MappingProxyType(attributes or {}) self.attributes = MappingProxyType(attributes or {})
self.last_updated = dt_util.strip_microseconds( self.last_updated = dt_util.strip_microseconds(
last_updated or dt_util.utcnow()) last_updated or dt_util.utcnow())

View file

@ -109,16 +109,5 @@ def state_as_number(state):
elif state.state in (STATE_OFF, STATE_UNLOCKED, STATE_UNKNOWN, elif state.state in (STATE_OFF, STATE_UNLOCKED, STATE_UNKNOWN,
STATE_BELOW_HORIZON, STATE_CLOSED): STATE_BELOW_HORIZON, STATE_CLOSED):
return 0 return 0
else:
try:
# This distinction is probably not important,
# but in case something downstream cares about
# int vs. float, try to be helpful here.
if '.' in state.state:
return float(state.state)
else:
return int(state.state)
except (ValueError, TypeError):
pass
raise ValueError('State is not a number') return float(state.state)

View file

@ -89,6 +89,7 @@ class TestGraphite(unittest.TestCase):
'bat': 'NaN', 'bat': 'NaN',
} }
expected = [ expected = [
'ha.entity.state 0.000000 12345',
'ha.entity.foo 1.000000 12345', 'ha.entity.foo 1.000000 12345',
'ha.entity.bar 2.000000 12345', 'ha.entity.bar 2.000000 12345',
'ha.entity.baz 1.000000 12345', 'ha.entity.baz 1.000000 12345',

View file

@ -7,6 +7,7 @@ Tests statsd feeder.
import unittest import unittest
from unittest import mock from unittest import mock
import homeassistant.core as ha
import homeassistant.components.statsd as statsd import homeassistant.components.statsd as statsd
from homeassistant.const import STATE_ON, STATE_OFF, EVENT_STATE_CHANGED from homeassistant.const import STATE_ON, STATE_OFF, EVENT_STATE_CHANGED
@ -78,6 +79,6 @@ class TestStatsd(unittest.TestCase):
mock_gauge.return_value.send.reset_mock() mock_gauge.return_value.send.reset_mock()
for invalid in ('foo', '', object): for invalid in ('foo', '', object):
state = mock.MagicMock(state=invalid) handler_method(mock.MagicMock(data={
handler_method(mock.MagicMock(data={'new_state': state})) 'new_state': ha.State('domain.test', invalid, {})}))
self.assertFalse(mock_gauge.return_value.send.called) self.assertFalse(mock_gauge.return_value.send.called)

View file

@ -165,24 +165,18 @@ class TestStateHelpers(unittest.TestCase):
ha.State('domain.test', _state, {}))) ha.State('domain.test', _state, {})))
def test_as_number_coercion(self): def test_as_number_coercion(self):
for _state in ('0', '0.0'): for _state in ('0', '0.0', 0, 0.0):
self.assertEqual( self.assertEqual(
0.0, float(state.state_as_number( 0.0, state.state_as_number(
ha.State('domain.test', _state, {})))) ha.State('domain.test', _state, {})))
for _state in ('1', '1.0'): for _state in ('1', '1.0', 1, 1.0):
self.assertEqual( self.assertEqual(
1.0, float(state.state_as_number( 1.0, state.state_as_number(
ha.State('domain.test', _state, {})))) 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): def test_as_number_invalid_cases(self):
for _state in ('', 'foo', 'foo.bar', None, False, True, None, for _state in ('', 'foo', 'foo.bar', None, False, True, object,
object, object()): object()):
self.assertRaises(ValueError, self.assertRaises(ValueError,
state.state_as_number, state.state_as_number,
ha.State('domain.test', _state, {})) ha.State('domain.test', _state, {}))