From 2d932f89fcf64813e3f48ce66dc1adec0cf9a619 Mon Sep 17 00:00:00 2001 From: Dan Smith Date: Wed, 17 Feb 2016 15:58:31 -0800 Subject: [PATCH] Add sensor_class to binary_sensor This adds a 'sensor_class' property and attribute, which should be either None or one of several defined SENSOR_CLASSES to indicate contextual information about what the sensor is measuring. --- .../components/binary_sensor/__init__.py | 22 ++++++++++++ .../binary_sensor/test_binary_sensor.py | 36 +++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 tests/components/binary_sensor/test_binary_sensor.py diff --git a/homeassistant/components/binary_sensor/__init__.py b/homeassistant/components/binary_sensor/__init__.py index ccfd57aff8c..86889cd18df 100644 --- a/homeassistant/components/binary_sensor/__init__.py +++ b/homeassistant/components/binary_sensor/__init__.py @@ -17,6 +17,17 @@ DOMAIN = 'binary_sensor' SCAN_INTERVAL = 30 ENTITY_ID_FORMAT = DOMAIN + '.{}' +SENSOR_CLASSES = [ + None, # Generic on/off + 'opening', # Door, window, etc + 'motion', # Motion sensor + 'gas', # CO, CO2, etc + 'smoke', # Smoke detector + 'moisture', # Specifically a wetness sensor + 'light', # Lightness threshold + 'power', # Power, over-current, etc + 'safety', # Generic on=unsafe, off=safe + ] def setup(hass, config): @@ -47,3 +58,14 @@ class BinarySensorDevice(Entity): def friendly_state(self): """ Returns the friendly state of the binary sensor. """ return None + + @property + def sensor_class(self): + """ Returns the class of this sensor, from SENSOR_CASSES. """ + return None + + @property + def device_state_attributes(self): + return { + 'sensor_class': self.sensor_class, + } diff --git a/tests/components/binary_sensor/test_binary_sensor.py b/tests/components/binary_sensor/test_binary_sensor.py new file mode 100644 index 00000000000..9c3f7f99e0f --- /dev/null +++ b/tests/components/binary_sensor/test_binary_sensor.py @@ -0,0 +1,36 @@ +""" +tests.components.binary_sensor.test_binary_sensor +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Test the binary_sensor base class +""" +import unittest +from unittest import mock + +from homeassistant.components import binary_sensor +from homeassistant.const import STATE_ON, STATE_OFF + + +class TestBinarySensor(unittest.TestCase): + def test_state(self): + sensor = binary_sensor.BinarySensorDevice() + self.assertEqual(STATE_OFF, sensor.state) + with mock.patch('homeassistant.components.binary_sensor.' + 'BinarySensorDevice.is_on', + new=False): + self.assertEqual(STATE_OFF, + binary_sensor.BinarySensorDevice().state) + with mock.patch('homeassistant.components.binary_sensor.' + 'BinarySensorDevice.is_on', + new=True): + self.assertEqual(STATE_ON, + binary_sensor.BinarySensorDevice().state) + + def test_attributes(self): + sensor = binary_sensor.BinarySensorDevice() + self.assertEqual({'sensor_class': None}, + sensor.device_state_attributes) + with mock.patch('homeassistant.components.binary_sensor.' + 'BinarySensorDevice.sensor_class', + new='motion'): + self.assertEqual({'sensor_class': 'motion'}, + sensor.device_state_attributes)