"""The test for the bayesian sensor platform.""" import unittest from homeassistant.setup import setup_component from homeassistant.components.bayesian import binary_sensor as bayesian from tests.common import get_test_home_assistant class TestBayesianBinarySensor(unittest.TestCase): """Test the threshold sensor.""" def setup_method(self, method): """Set up things to be run when tests are started.""" self.hass = get_test_home_assistant() def teardown_method(self, method): """Stop everything that was started.""" self.hass.stop() def test_sensor_numeric_state(self): """Test sensor on numeric state platform observations.""" config = { 'binary_sensor': { 'platform': 'bayesian', 'name': 'Test_Binary', 'observations': [{ 'platform': 'numeric_state', 'entity_id': 'sensor.test_monitored', 'below': 10, 'above': 5, 'prob_given_true': 0.6 }, { 'platform': 'numeric_state', 'entity_id': 'sensor.test_monitored1', 'below': 7, 'above': 5, 'prob_given_true': 0.9, 'prob_given_false': 0.1 }], 'prior': 0.2, } } assert setup_component(self.hass, 'binary_sensor', config) self.hass.states.set('sensor.test_monitored', 4) self.hass.block_till_done() state = self.hass.states.get('binary_sensor.test_binary') assert [] == state.attributes.get('observations') assert 0.2 == state.attributes.get('probability') assert state.state == 'off' self.hass.states.set('sensor.test_monitored', 6) self.hass.block_till_done() self.hass.states.set('sensor.test_monitored', 4) self.hass.block_till_done() self.hass.states.set('sensor.test_monitored', 6) self.hass.states.set('sensor.test_monitored1', 6) self.hass.block_till_done() state = self.hass.states.get('binary_sensor.test_binary') assert [{ 'prob_false': 0.4, 'prob_true': 0.6 }, { 'prob_false': 0.1, 'prob_true': 0.9 }] == state.attributes.get('observations') assert round(abs(0.77-state.attributes.get('probability')), 7) == 0 assert state.state == 'on' self.hass.states.set('sensor.test_monitored', 6) self.hass.states.set('sensor.test_monitored1', 0) self.hass.block_till_done() self.hass.states.set('sensor.test_monitored', 4) self.hass.block_till_done() state = self.hass.states.get('binary_sensor.test_binary') assert 0.2 == state.attributes.get('probability') assert state.state == 'off' self.hass.states.set('sensor.test_monitored', 15) self.hass.block_till_done() state = self.hass.states.get('binary_sensor.test_binary') assert state.state == 'off' def test_sensor_state(self): """Test sensor on state platform observations.""" config = { 'binary_sensor': { 'name': 'Test_Binary', 'platform': 'bayesian', 'observations': [{ 'platform': 'state', 'entity_id': 'sensor.test_monitored', 'to_state': 'off', 'prob_given_true': 0.8, 'prob_given_false': 0.4 }], 'prior': 0.2, 'probability_threshold': 0.32, } } assert setup_component(self.hass, 'binary_sensor', config) self.hass.states.set('sensor.test_monitored', 'on') state = self.hass.states.get('binary_sensor.test_binary') assert [] == state.attributes.get('observations') assert 0.2 == state.attributes.get('probability') assert state.state == 'off' self.hass.states.set('sensor.test_monitored', 'off') self.hass.block_till_done() self.hass.states.set('sensor.test_monitored', 'on') self.hass.block_till_done() self.hass.states.set('sensor.test_monitored', 'off') self.hass.block_till_done() state = self.hass.states.get('binary_sensor.test_binary') assert [{ 'prob_true': 0.8, 'prob_false': 0.4 }] == state.attributes.get('observations') assert round(abs(0.33-state.attributes.get('probability')), 7) == 0 assert state.state == 'on' self.hass.states.set('sensor.test_monitored', 'off') self.hass.block_till_done() self.hass.states.set('sensor.test_monitored', 'on') self.hass.block_till_done() state = self.hass.states.get('binary_sensor.test_binary') assert round(abs(0.2-state.attributes.get('probability')), 7) == 0 assert state.state == 'off' def test_threshold(self): """Test sensor on probabilty threshold limits.""" config = { 'binary_sensor': { 'name': 'Test_Binary', 'platform': 'bayesian', 'observations': [{ 'platform': 'state', 'entity_id': 'sensor.test_monitored', 'to_state': 'on', 'prob_given_true': 1.0, }], 'prior': 0.5, 'probability_threshold': 1.0, } } assert setup_component(self.hass, 'binary_sensor', config) self.hass.states.set('sensor.test_monitored', 'on') self.hass.block_till_done() state = self.hass.states.get('binary_sensor.test_binary') assert round(abs(1.0-state.attributes.get('probability')), 7) == 0 assert state.state == 'on' def test_multiple_observations(self): """Test sensor with multiple observations of same entity.""" config = { 'binary_sensor': { 'name': 'Test_Binary', 'platform': 'bayesian', 'observations': [{ 'platform': 'state', 'entity_id': 'sensor.test_monitored', 'to_state': 'blue', 'prob_given_true': 0.8, 'prob_given_false': 0.4 }, { 'platform': 'state', 'entity_id': 'sensor.test_monitored', 'to_state': 'red', 'prob_given_true': 0.2, 'prob_given_false': 0.4 }], 'prior': 0.2, 'probability_threshold': 0.32, } } assert setup_component(self.hass, 'binary_sensor', config) self.hass.states.set('sensor.test_monitored', 'off') state = self.hass.states.get('binary_sensor.test_binary') assert [] == state.attributes.get('observations') assert 0.2 == state.attributes.get('probability') assert state.state == 'off' self.hass.states.set('sensor.test_monitored', 'blue') self.hass.block_till_done() self.hass.states.set('sensor.test_monitored', 'off') self.hass.block_till_done() self.hass.states.set('sensor.test_monitored', 'blue') self.hass.block_till_done() state = self.hass.states.get('binary_sensor.test_binary') assert [{ 'prob_true': 0.8, 'prob_false': 0.4 }] == state.attributes.get('observations') assert round(abs(0.33-state.attributes.get('probability')), 7) == 0 assert state.state == 'on' self.hass.states.set('sensor.test_monitored', 'blue') self.hass.block_till_done() self.hass.states.set('sensor.test_monitored', 'red') self.hass.block_till_done() state = self.hass.states.get('binary_sensor.test_binary') assert round(abs(0.11-state.attributes.get('probability')), 7) == 0 assert state.state == 'off' def test_probability_updates(self): """Test probability update function.""" prob_true = [0.3, 0.6, 0.8] prob_false = [0.7, 0.4, 0.2] prior = 0.5 for pt, pf in zip(prob_true, prob_false): prior = bayesian.update_probability(prior, pt, pf) assert round(abs(0.720000-prior), 7) == 0 prob_true = [0.8, 0.3, 0.9] prob_false = [0.6, 0.4, 0.2] prior = 0.7 for pt, pf in zip(prob_true, prob_false): prior = bayesian.update_probability(prior, pt, pf) assert round(abs(0.9130434782608695-prior), 7) == 0