Fix mFi sensors in uninitialized state (#3246)

If mFi sensors are identified but not fully assigned they can
have no tag value, and mficlient throws a ValueError to signal this.
This patch handles that case by considering such devices to always
be STATE_OFF.
This commit is contained in:
Dan Smith 2016-09-06 18:04:20 -07:00 committed by Paulus Schoutsen
parent 9d4ccb1f49
commit f55095df83
2 changed files with 25 additions and 4 deletions

View file

@ -91,7 +91,13 @@ class MfiSensor(Entity):
@property
def state(self):
"""Return the state of the sensor."""
if self._port.model == 'Input Digital':
try:
tag = self._port.tag
except ValueError:
tag = None
if tag is None:
return STATE_OFF
elif self._port.model == 'Input Digital':
return self._port.value > 0 and STATE_ON or STATE_OFF
else:
digits = DIGITS.get(self._port.tag, 0)
@ -100,13 +106,18 @@ class MfiSensor(Entity):
@property
def unit_of_measurement(self):
"""Return the unit of measurement of this entity, if any."""
if self._port.tag == 'temperature':
try:
tag = self._port.tag
except ValueError:
return 'State'
if tag == 'temperature':
return TEMP_CELSIUS
elif self._port.tag == 'active_pwr':
elif tag == 'active_pwr':
return 'Watts'
elif self._port.model == 'Input Digital':
return 'State'
return self._port.tag
return tag
def update(self):
"""Get the latest data."""

View file

@ -147,6 +147,11 @@ class TestMfiSensor(unittest.TestCase):
self.port.tag = 'balloons'
self.assertEqual('balloons', self.sensor.unit_of_measurement)
def test_uom_uninitialized(self):
"""Test that the UOM defaults if not initialized."""
type(self.port).tag = mock.PropertyMock(side_effect=ValueError)
self.assertEqual('State', self.sensor.unit_of_measurement)
def test_state_digital(self):
"""Test the digital input."""
self.port.model = 'Input Digital'
@ -166,6 +171,11 @@ class TestMfiSensor(unittest.TestCase):
with mock.patch.dict(mfi.DIGITS, {}):
self.assertEqual(1.0, self.sensor.state)
def test_state_uninitialized(self):
"""Test the state of uninitialized sensors."""
type(self.port).tag = mock.PropertyMock(side_effect=ValueError)
self.assertEqual(mfi.STATE_OFF, self.sensor.state)
def test_update(self):
"""Test the update."""
self.sensor.update()