From c4c052a0eccb6ef72b81b1870faa8b51b0c624a6 Mon Sep 17 00:00:00 2001 From: Yonsm Date: Sat, 7 Apr 2018 14:52:10 +0800 Subject: [PATCH 1/7] Support binary_sensor and device_tracker for HomeKit --- homeassistant/components/homekit/__init__.py | 5 ++ homeassistant/components/homekit/const.py | 23 ++++++++ .../components/homekit/type_sensors.py | 57 ++++++++++++++++++- 3 files changed, 83 insertions(+), 2 deletions(-) mode change 100644 => 100755 homeassistant/components/homekit/type_sensors.py diff --git a/homeassistant/components/homekit/__init__.py b/homeassistant/components/homekit/__init__.py index 8a38c01026ef1f..06258bcc97a04c 100644 --- a/homeassistant/components/homekit/__init__.py +++ b/homeassistant/components/homekit/__init__.py @@ -92,6 +92,11 @@ def get_accessory(hass, state, aid, config): return TYPES['HumiditySensor'](hass, state.entity_id, state.name, aid=aid) + elif state.domain == 'binary_sensor' or state.domain == 'device_tracker': + _LOGGER.debug('Add "%s" as "%s"', state.entity_id, 'BinarySensor') + return TYPES['BinarySensor'](hass, state.entity_id, + state.name, aid=aid) + elif state.domain == 'cover': # Only add covers that support set_cover_position features = state.attributes.get(ATTR_SUPPORTED_FEATURES, 0) diff --git a/homeassistant/components/homekit/const.py b/homeassistant/components/homekit/const.py index 18d02a89e18d0e..7136852c409ebb 100644 --- a/homeassistant/components/homekit/const.py +++ b/homeassistant/components/homekit/const.py @@ -35,11 +35,18 @@ # #### Services #### SERV_ACCESSORY_INFO = 'AccessoryInformation' +SERV_CARBON_DIOXIDE_SENSOR = 'CarbonDioxideSensor' +SERV_CARBON_MONOXIDE_SENSOR = 'CarbonMonoxideSensor' +SERV_CONTACT_SENSOR = 'ContactSensor' SERV_HUMIDITY_SENSOR = 'HumiditySensor' # CurrentRelativeHumidity | StatusActive, StatusFault, StatusTampered, # StatusLowBattery, Name +SERV_LEAK_SENSOR = 'LeakSensor' SERV_LIGHTBULB = 'Lightbulb' # On | Brightness, Hue, Saturation, Name +SERV_MOTION_SENSOR = 'MotionSensor' +SERV_OCCUPANCY_SENSOR = 'OccupancySensor' SERV_SECURITY_SYSTEM = 'SecuritySystem' +SERV_SMOKE_SENSOR = 'SmokeSensor' SERV_SWITCH = 'Switch' SERV_TEMPERATURE_SENSOR = 'TemperatureSensor' SERV_THERMOSTAT = 'Thermostat' @@ -48,7 +55,10 @@ # #### Characteristics #### CHAR_BRIGHTNESS = 'Brightness' # Int | [0, 100] +CHAR_CARBON_DIOXIDE_DETECTED = 'CarbonDioxideDetected' +CHAR_CARBON_MONOXIDE_DETECTED = 'CarbonMonoxideDetected' CHAR_COLOR_TEMPERATURE = 'ColorTemperature' +CHAR_CONTACT_SENSOR_STATE = 'ContactSensorState' CHAR_COOLING_THRESHOLD_TEMPERATURE = 'CoolingThresholdTemperature' CHAR_CURRENT_HEATING_COOLING = 'CurrentHeatingCoolingState' CHAR_CURRENT_POSITION = 'CurrentPosition' @@ -57,13 +67,17 @@ CHAR_CURRENT_TEMPERATURE = 'CurrentTemperature' CHAR_HEATING_THRESHOLD_TEMPERATURE = 'HeatingThresholdTemperature' CHAR_HUE = 'Hue' # arcdegress | [0, 360] +CHAR_LEAK_DETECTED = 'LeakDetected' CHAR_MANUFACTURER = 'Manufacturer' CHAR_MODEL = 'Model' +CHAR_MOTION_DETECTED = 'MotionDetected' CHAR_NAME = 'Name' +CHAR_OCCUPANCY_DETECTED = 'OccupancyDetected' CHAR_ON = 'On' # boolean CHAR_POSITION_STATE = 'PositionState' CHAR_SATURATION = 'Saturation' # percent CHAR_SERIAL_NUMBER = 'SerialNumber' +CHAR_SMOKE_DETECTED = 'SmokeDetected' CHAR_TARGET_HEATING_COOLING = 'TargetHeatingCoolingState' CHAR_TARGET_POSITION = 'TargetPosition' CHAR_TARGET_SECURITY_STATE = 'SecuritySystemTargetState' @@ -72,3 +86,12 @@ # #### Properties #### PROP_CELSIUS = {'minValue': -273, 'maxValue': 999} + +# #### Device Class #### +DEVICE_CLASS_CO2 = 'co2' +DEVICE_CLASS_GAS = 'gas' +DEVICE_CLASS_MOISTURE = 'moisture' +DEVICE_CLASS_MOTION = 'motion' +DEVICE_CLASS_OCCUPANCY = 'occupancy' +DEVICE_CLASS_OPENING = 'opening' +DEVICE_CLASS_SMOKE = 'smoke' diff --git a/homeassistant/components/homekit/type_sensors.py b/homeassistant/components/homekit/type_sensors.py old mode 100644 new mode 100755 index 393962eac21ba2..b25eb784d6bde4 --- a/homeassistant/components/homekit/type_sensors.py +++ b/homeassistant/components/homekit/type_sensors.py @@ -2,19 +2,40 @@ import logging from homeassistant.const import ( - ATTR_UNIT_OF_MEASUREMENT, TEMP_CELSIUS) + ATTR_UNIT_OF_MEASUREMENT, TEMP_CELSIUS, + ATTR_DEVICE_CLASS, STATE_ON, STATE_HOME) from . import TYPES from .accessories import HomeAccessory, add_preload_service from .const import ( CATEGORY_SENSOR, SERV_HUMIDITY_SENSOR, SERV_TEMPERATURE_SENSOR, - CHAR_CURRENT_HUMIDITY, CHAR_CURRENT_TEMPERATURE, PROP_CELSIUS) + CHAR_CURRENT_HUMIDITY, CHAR_CURRENT_TEMPERATURE, PROP_CELSIUS, + DEVICE_CLASS_CO2, SERV_CARBON_DIOXIDE_SENSOR, CHAR_CARBON_DIOXIDE_DETECTED, + DEVICE_CLASS_GAS, SERV_CARBON_MONOXIDE_SENSOR, + CHAR_CARBON_MONOXIDE_DETECTED, + DEVICE_CLASS_MOISTURE, SERV_LEAK_SENSOR, CHAR_LEAK_DETECTED, + DEVICE_CLASS_MOTION, SERV_MOTION_SENSOR, CHAR_MOTION_DETECTED, + DEVICE_CLASS_OCCUPANCY, SERV_OCCUPANCY_SENSOR, CHAR_OCCUPANCY_DETECTED, + DEVICE_CLASS_OPENING, SERV_CONTACT_SENSOR, CHAR_CONTACT_SENSOR_STATE, + DEVICE_CLASS_SMOKE, SERV_SMOKE_SENSOR, CHAR_SMOKE_DETECTED) from .util import convert_to_float, temperature_to_homekit _LOGGER = logging.getLogger(__name__) +BINARY_SENSOR_SERVICE_MAP = { + DEVICE_CLASS_CO2: (SERV_CARBON_DIOXIDE_SENSOR, + CHAR_CARBON_DIOXIDE_DETECTED), + DEVICE_CLASS_GAS: (SERV_CARBON_MONOXIDE_SENSOR, + CHAR_CARBON_MONOXIDE_DETECTED), + DEVICE_CLASS_MOISTURE: (SERV_LEAK_SENSOR, CHAR_LEAK_DETECTED), + DEVICE_CLASS_MOTION: (SERV_MOTION_SENSOR, CHAR_MOTION_DETECTED), + DEVICE_CLASS_OCCUPANCY: (SERV_OCCUPANCY_SENSOR, CHAR_OCCUPANCY_DETECTED), + DEVICE_CLASS_OPENING: (SERV_CONTACT_SENSOR, CHAR_CONTACT_SENSOR_STATE), + DEVICE_CLASS_SMOKE: (SERV_SMOKE_SENSOR, CHAR_SMOKE_DETECTED)} + + @TYPES.register('TemperatureSensor') class TemperatureSensor(HomeAccessory): """Generate a TemperatureSensor accessory for a temperature sensor. @@ -75,3 +96,35 @@ def update_state(self, entity_id=None, old_state=None, new_state=None): self.char_humidity.set_value(humidity) _LOGGER.debug('%s: Percent set to %d%%', self.entity_id, humidity) + + +@TYPES.register('BinarySensor') +class BinarySensor(HomeAccessory): + """Generate a BinarySensor accessory as binary sensor.""" + + def __init__(self, hass, entity_id, name, **kwargs): + """Initialize a BinarySensor accessory object.""" + super().__init__(name, entity_id, CATEGORY_SENSOR, **kwargs) + + self.hass = hass + self.entity_id = entity_id + + device_class = hass.states.get(entity_id).attributes \ + .get(ATTR_DEVICE_CLASS) + service_char = BINARY_SENSOR_SERVICE_MAP[device_class] \ + if device_class in BINARY_SENSOR_SERVICE_MAP \ + else BINARY_SENSOR_SERVICE_MAP[DEVICE_CLASS_OCCUPANCY] + + service = add_preload_service(self, service_char[0]) + self.char_detected = service.get_characteristic(service_char[1]) + self.char_detected.value = 0 + + def update_state(self, entity_id=None, old_state=None, new_state=None): + """Update accessory after state change.""" + if new_state is None: + return + + state = new_state.state + detected = (state == STATE_ON) or (state == STATE_HOME) + self.char_detected.set_value(detected) + _LOGGER.debug('%s: Set to %d', self.entity_id, detected) From 46154a1daeae88636f767166d564eebb7bfd5eba Mon Sep 17 00:00:00 2001 From: Yonsm Date: Sat, 7 Apr 2018 16:57:48 +0800 Subject: [PATCH 2/7] Add test for get_accessory and binary sensor Passed: tox -e py36 -- tests/components/homekit/test_type_sensors.py -x tox -e py36 -- tests/components/homekit/test_get_accessories.py -x --- .../homekit/test_get_accessories.py | 15 ++++++- tests/components/homekit/test_type_sensors.py | 40 ++++++++++++++++++- 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/tests/components/homekit/test_get_accessories.py b/tests/components/homekit/test_get_accessories.py index e29ed85b5fce05..e323431ac3f76f 100644 --- a/tests/components/homekit/test_get_accessories.py +++ b/tests/components/homekit/test_get_accessories.py @@ -9,7 +9,7 @@ from homeassistant.components.homekit import get_accessory, TYPES from homeassistant.const import ( ATTR_CODE, ATTR_UNIT_OF_MEASUREMENT, ATTR_SUPPORTED_FEATURES, - TEMP_CELSIUS, TEMP_FAHRENHEIT) + TEMP_CELSIUS, TEMP_FAHRENHEIT, ATTR_DEVICE_CLASS) _LOGGER = logging.getLogger(__name__) @@ -63,6 +63,19 @@ def test_sensor_humidity(self): {ATTR_UNIT_OF_MEASUREMENT: '%'}) get_accessory(None, state, 2, {}) + def test_binary_sensor(self): + """Test binary sensor with opening class.""" + with patch.dict(TYPES, {'BinarySensor': self.mock_type}): + state = State('binary_sensor.opening', 'on', + {ATTR_DEVICE_CLASS: 'opening'}) + get_accessory(None, state, 2, {}) + + def test_device_tracker(self): + """Test binary sensor with opening class.""" + with patch.dict(TYPES, {'BinarySensor': self.mock_type}): + state = State('device_tracker.someone', 'not_home', {}) + get_accessory(None, state, 2, {}) + def test_cover_set_position(self): """Test cover with support for set_cover_position.""" with patch.dict(TYPES, {'WindowCovering': self.mock_type}): diff --git a/tests/components/homekit/test_type_sensors.py b/tests/components/homekit/test_type_sensors.py index c04c250613dd64..3e78ce0fdf9375 100644 --- a/tests/components/homekit/test_type_sensors.py +++ b/tests/components/homekit/test_type_sensors.py @@ -3,9 +3,9 @@ from homeassistant.components.homekit.const import PROP_CELSIUS from homeassistant.components.homekit.type_sensors import ( - TemperatureSensor, HumiditySensor) + TemperatureSensor, HumiditySensor, BinarySensor) from homeassistant.const import ( - ATTR_UNIT_OF_MEASUREMENT, STATE_UNKNOWN, TEMP_CELSIUS, TEMP_FAHRENHEIT) + ATTR_UNIT_OF_MEASUREMENT, ATTR_DEVICE_CLASS, STATE_UNKNOWN, STATE_ON, STATE_OFF, STATE_HOME, STATE_NOT_HOME, TEMP_CELSIUS, TEMP_FAHRENHEIT) from tests.common import get_test_home_assistant @@ -68,3 +68,39 @@ def test_humidity(self): self.hass.states.set(entity_id, '20', {ATTR_UNIT_OF_MEASUREMENT: "%"}) self.hass.block_till_done() self.assertEqual(acc.char_humidity.value, 20) + + def test_binary(self): + """Test if accessory is updated after state change.""" + entity_id = 'binary_sensor.opening' + + self.hass.states.set(entity_id, STATE_UNKNOWN, + {ATTR_DEVICE_CLASS: "opening"}) + self.hass.block_till_done() # Ensure state.attributes + + acc = BinarySensor(self.hass, entity_id, 'Window Opening', aid=2) + acc.run() + + self.assertEqual(acc.aid, 2) + self.assertEqual(acc.category, 10) # Sensor + + self.assertEqual(acc.char_detected.value, 0) + + self.hass.states.set(entity_id, STATE_ON, + {ATTR_DEVICE_CLASS: "opening"}) + self.hass.block_till_done() + self.assertEqual(acc.char_detected.value, 1) + + self.hass.states.set(entity_id, STATE_OFF, + {ATTR_DEVICE_CLASS: "opening"}) + self.hass.block_till_done() + self.assertEqual(acc.char_detected.value, 0) + + self.hass.states.set(entity_id, STATE_HOME, + {ATTR_DEVICE_CLASS: "opening"}) + self.hass.block_till_done() + self.assertEqual(acc.char_detected.value, 1) + + self.hass.states.set(entity_id, STATE_NOT_HOME, + {ATTR_DEVICE_CLASS: "opening"}) + self.hass.block_till_done() + self.assertEqual(acc.char_detected.value, 0) From 63066d284ca6326cbf38d6e0aab20bf9e30237f1 Mon Sep 17 00:00:00 2001 From: Yonsm Date: Sat, 7 Apr 2018 17:05:25 +0800 Subject: [PATCH 3/7] Wrap line to 79 chars --- tests/components/homekit/test_type_sensors.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/components/homekit/test_type_sensors.py b/tests/components/homekit/test_type_sensors.py index 3e78ce0fdf9375..11d2f16bdf703e 100644 --- a/tests/components/homekit/test_type_sensors.py +++ b/tests/components/homekit/test_type_sensors.py @@ -5,7 +5,8 @@ from homeassistant.components.homekit.type_sensors import ( TemperatureSensor, HumiditySensor, BinarySensor) from homeassistant.const import ( - ATTR_UNIT_OF_MEASUREMENT, ATTR_DEVICE_CLASS, STATE_UNKNOWN, STATE_ON, STATE_OFF, STATE_HOME, STATE_NOT_HOME, TEMP_CELSIUS, TEMP_FAHRENHEIT) + ATTR_UNIT_OF_MEASUREMENT, ATTR_DEVICE_CLASS, STATE_UNKNOWN, STATE_ON, + STATE_OFF, STATE_HOME, STATE_NOT_HOME, TEMP_CELSIUS, TEMP_FAHRENHEIT) from tests.common import get_test_home_assistant From 5389eac2508631d09bc606fe08da86e1696ec042 Mon Sep 17 00:00:00 2001 From: Yonsm Date: Sat, 7 Apr 2018 19:59:41 +0800 Subject: [PATCH 4/7] Test service.display_name and char_detected.display_name MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Passed: tox -e py36 -- tests/components/homekit/test_type_sensors.py -x 2. And remove ‘# Ensure state.attributes’ comment --- tests/components/homekit/test_type_sensors.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tests/components/homekit/test_type_sensors.py b/tests/components/homekit/test_type_sensors.py index 11d2f16bdf703e..478035ae792048 100644 --- a/tests/components/homekit/test_type_sensors.py +++ b/tests/components/homekit/test_type_sensors.py @@ -1,7 +1,8 @@ """Test different accessory types: Sensors.""" import unittest -from homeassistant.components.homekit.const import PROP_CELSIUS +from homeassistant.components.homekit.const import (PROP_CELSIUS, + SERV_CONTACT_SENSOR, CHAR_CONTACT_SENSOR_STATE) from homeassistant.components.homekit.type_sensors import ( TemperatureSensor, HumiditySensor, BinarySensor) from homeassistant.const import ( @@ -76,11 +77,16 @@ def test_binary(self): self.hass.states.set(entity_id, STATE_UNKNOWN, {ATTR_DEVICE_CLASS: "opening"}) - self.hass.block_till_done() # Ensure state.attributes + self.hass.block_till_done() acc = BinarySensor(self.hass, entity_id, 'Window Opening', aid=2) acc.run() + self.assertEqual(acc.get_service(SERV_CONTACT_SENSOR).display_name, + SERV_CONTACT_SENSOR) + self.assertEqual(acc.char_detected.display_name, + CHAR_CONTACT_SENSOR_STATE) + self.assertEqual(acc.aid, 2) self.assertEqual(acc.category, 10) # Sensor From d403288187784c7d2f8541e9fa129f3ca5719772 Mon Sep 17 00:00:00 2001 From: Yonsm Date: Sat, 7 Apr 2018 21:23:11 +0800 Subject: [PATCH 5/7] Fix continuation line under-indented for visual indent --- tests/components/homekit/test_type_sensors.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/components/homekit/test_type_sensors.py b/tests/components/homekit/test_type_sensors.py index 478035ae792048..f3df604ea1a4d8 100644 --- a/tests/components/homekit/test_type_sensors.py +++ b/tests/components/homekit/test_type_sensors.py @@ -1,8 +1,8 @@ """Test different accessory types: Sensors.""" import unittest -from homeassistant.components.homekit.const import (PROP_CELSIUS, - SERV_CONTACT_SENSOR, CHAR_CONTACT_SENSOR_STATE) +from homeassistant.components.homekit.const import ( + PROP_CELSIUS, SERV_CONTACT_SENSOR, CHAR_CONTACT_SENSOR_STATE) from homeassistant.components.homekit.type_sensors import ( TemperatureSensor, HumiditySensor, BinarySensor) from homeassistant.const import ( From 388337316d4186a7affcac9c96ccc9093ef3ebae Mon Sep 17 00:00:00 2001 From: Yonsm Date: Mon, 9 Apr 2018 14:07:09 +0800 Subject: [PATCH 6/7] Refine testcase for type_sensors.py with more coverage PASSED: tox -e py36 -- tests/components/homekit/test_type_sensors.py PASSED: script/lint (in my submit) --- tests/components/homekit/test_type_sensors.py | 85 ++++++++++--------- 1 file changed, 43 insertions(+), 42 deletions(-) diff --git a/tests/components/homekit/test_type_sensors.py b/tests/components/homekit/test_type_sensors.py index f3df604ea1a4d8..aabae5a58588b6 100644 --- a/tests/components/homekit/test_type_sensors.py +++ b/tests/components/homekit/test_type_sensors.py @@ -1,10 +1,9 @@ """Test different accessory types: Sensors.""" import unittest -from homeassistant.components.homekit.const import ( - PROP_CELSIUS, SERV_CONTACT_SENSOR, CHAR_CONTACT_SENSOR_STATE) +from homeassistant.components.homekit.const import PROP_CELSIUS from homeassistant.components.homekit.type_sensors import ( - TemperatureSensor, HumiditySensor, BinarySensor) + TemperatureSensor, HumiditySensor, BinarySensor, BINARY_SENSOR_SERVICE_MAP) from homeassistant.const import ( ATTR_UNIT_OF_MEASUREMENT, ATTR_DEVICE_CLASS, STATE_UNKNOWN, STATE_ON, STATE_OFF, STATE_HOME, STATE_NOT_HOME, TEMP_CELSIUS, TEMP_FAHRENHEIT) @@ -71,43 +70,45 @@ def test_humidity(self): self.hass.block_till_done() self.assertEqual(acc.char_humidity.value, 20) - def test_binary(self): + def test_binary_device_classes(self): """Test if accessory is updated after state change.""" - entity_id = 'binary_sensor.opening' - - self.hass.states.set(entity_id, STATE_UNKNOWN, - {ATTR_DEVICE_CLASS: "opening"}) - self.hass.block_till_done() - - acc = BinarySensor(self.hass, entity_id, 'Window Opening', aid=2) - acc.run() - - self.assertEqual(acc.get_service(SERV_CONTACT_SENSOR).display_name, - SERV_CONTACT_SENSOR) - self.assertEqual(acc.char_detected.display_name, - CHAR_CONTACT_SENSOR_STATE) - - self.assertEqual(acc.aid, 2) - self.assertEqual(acc.category, 10) # Sensor - - self.assertEqual(acc.char_detected.value, 0) - - self.hass.states.set(entity_id, STATE_ON, - {ATTR_DEVICE_CLASS: "opening"}) - self.hass.block_till_done() - self.assertEqual(acc.char_detected.value, 1) - - self.hass.states.set(entity_id, STATE_OFF, - {ATTR_DEVICE_CLASS: "opening"}) - self.hass.block_till_done() - self.assertEqual(acc.char_detected.value, 0) - - self.hass.states.set(entity_id, STATE_HOME, - {ATTR_DEVICE_CLASS: "opening"}) - self.hass.block_till_done() - self.assertEqual(acc.char_detected.value, 1) - - self.hass.states.set(entity_id, STATE_NOT_HOME, - {ATTR_DEVICE_CLASS: "opening"}) - self.hass.block_till_done() - self.assertEqual(acc.char_detected.value, 0) + entity_id = 'binary_sensor.demo' + + for device_class, (service, char) in BINARY_SENSOR_SERVICE_MAP.items(): + print(device_class) + self.hass.states.set(entity_id, STATE_OFF, + {ATTR_DEVICE_CLASS: device_class}) + self.hass.block_till_done() + + acc = BinarySensor(self.hass, entity_id, 'Binary Sensor', aid=2) + acc.run() + self.assertEqual(acc.get_service(service).display_name, service) + self.assertEqual(acc.char_detected.display_name, char) + + self.assertEqual(acc.aid, 2) + self.assertEqual(acc.category, 10) # Sensor + + self.assertEqual(acc.char_detected.value, 0) + + self.hass.states.set(entity_id, STATE_ON, + {ATTR_DEVICE_CLASS: device_class}) + self.hass.block_till_done() + self.assertEqual(acc.char_detected.value, 1) + + self.hass.states.set(entity_id, STATE_OFF, + {ATTR_DEVICE_CLASS: device_class}) + self.hass.block_till_done() + self.assertEqual(acc.char_detected.value, 0) + + self.hass.states.set(entity_id, STATE_HOME, + {ATTR_DEVICE_CLASS: device_class}) + self.hass.block_till_done() + self.assertEqual(acc.char_detected.value, 1) + + self.hass.states.set(entity_id, STATE_NOT_HOME, + {ATTR_DEVICE_CLASS: device_class}) + self.hass.block_till_done() + self.assertEqual(acc.char_detected.value, 0) + + self.hass.states.remove(entity_id) + self.hass.block_till_done() From 25088c5a13adce81b31cb3f3eb64e173d2d0bd8b Mon Sep 17 00:00:00 2001 From: cdce8p <30130371+cdce8p@users.noreply.github.com> Date: Mon, 9 Apr 2018 11:46:13 +0200 Subject: [PATCH 7/7] Split test to improve speed --- tests/components/homekit/test_type_sensors.py | 69 +++++++++++-------- 1 file changed, 39 insertions(+), 30 deletions(-) diff --git a/tests/components/homekit/test_type_sensors.py b/tests/components/homekit/test_type_sensors.py index aabae5a58588b6..a6e178bb226ce9 100644 --- a/tests/components/homekit/test_type_sensors.py +++ b/tests/components/homekit/test_type_sensors.py @@ -70,45 +70,54 @@ def test_humidity(self): self.hass.block_till_done() self.assertEqual(acc.char_humidity.value, 20) - def test_binary_device_classes(self): + def test_binary(self): """Test if accessory is updated after state change.""" - entity_id = 'binary_sensor.demo' + entity_id = 'binary_sensor.opening' - for device_class, (service, char) in BINARY_SENSOR_SERVICE_MAP.items(): - print(device_class) - self.hass.states.set(entity_id, STATE_OFF, - {ATTR_DEVICE_CLASS: device_class}) - self.hass.block_till_done() + self.hass.states.set(entity_id, STATE_UNKNOWN, + {ATTR_DEVICE_CLASS: "opening"}) + self.hass.block_till_done() - acc = BinarySensor(self.hass, entity_id, 'Binary Sensor', aid=2) - acc.run() - self.assertEqual(acc.get_service(service).display_name, service) - self.assertEqual(acc.char_detected.display_name, char) + acc = BinarySensor(self.hass, entity_id, 'Window Opening', aid=2) + acc.run() - self.assertEqual(acc.aid, 2) - self.assertEqual(acc.category, 10) # Sensor + self.assertEqual(acc.aid, 2) + self.assertEqual(acc.category, 10) # Sensor - self.assertEqual(acc.char_detected.value, 0) + self.assertEqual(acc.char_detected.value, 0) - self.hass.states.set(entity_id, STATE_ON, - {ATTR_DEVICE_CLASS: device_class}) - self.hass.block_till_done() - self.assertEqual(acc.char_detected.value, 1) + self.hass.states.set(entity_id, STATE_ON, + {ATTR_DEVICE_CLASS: "opening"}) + self.hass.block_till_done() + self.assertEqual(acc.char_detected.value, 1) - self.hass.states.set(entity_id, STATE_OFF, - {ATTR_DEVICE_CLASS: device_class}) - self.hass.block_till_done() - self.assertEqual(acc.char_detected.value, 0) + self.hass.states.set(entity_id, STATE_OFF, + {ATTR_DEVICE_CLASS: "opening"}) + self.hass.block_till_done() + self.assertEqual(acc.char_detected.value, 0) - self.hass.states.set(entity_id, STATE_HOME, - {ATTR_DEVICE_CLASS: device_class}) - self.hass.block_till_done() - self.assertEqual(acc.char_detected.value, 1) + self.hass.states.set(entity_id, STATE_HOME, + {ATTR_DEVICE_CLASS: "opening"}) + self.hass.block_till_done() + self.assertEqual(acc.char_detected.value, 1) + + self.hass.states.set(entity_id, STATE_NOT_HOME, + {ATTR_DEVICE_CLASS: "opening"}) + self.hass.block_till_done() + self.assertEqual(acc.char_detected.value, 0) + + self.hass.states.remove(entity_id) + self.hass.block_till_done() - self.hass.states.set(entity_id, STATE_NOT_HOME, + def test_binary_device_classes(self): + """Test if services and characteristics are assigned correctly.""" + entity_id = 'binary_sensor.demo' + + for device_class, (service, char) in BINARY_SENSOR_SERVICE_MAP.items(): + self.hass.states.set(entity_id, STATE_OFF, {ATTR_DEVICE_CLASS: device_class}) self.hass.block_till_done() - self.assertEqual(acc.char_detected.value, 0) - self.hass.states.remove(entity_id) - self.hass.block_till_done() + acc = BinarySensor(self.hass, entity_id, 'Binary Sensor', aid=2) + self.assertEqual(acc.get_service(service).display_name, service) + self.assertEqual(acc.char_detected.display_name, char)