From 4c33a9d732b67f8f1a4fc388fe87441f70ae6d02 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 25 Feb 2020 16:34:31 -1000 Subject: [PATCH] Add model to august device_info (#32187) * Add model to august device_info * Address review comments from PR#32125 * Fix test name --- .../components/august/binary_sensor.py | 6 ++++ homeassistant/components/august/camera.py | 5 ++- homeassistant/components/august/lock.py | 3 ++ homeassistant/components/august/manifest.json | 4 +-- homeassistant/components/august/sensor.py | 35 ++++++++++--------- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- tests/components/august/test_binary_sensor.py | 15 ++++++++ tests/components/august/test_lock.py | 15 ++++++++ 9 files changed, 65 insertions(+), 22 deletions(-) diff --git a/homeassistant/components/august/binary_sensor.py b/homeassistant/components/august/binary_sensor.py index b5b65863eac..4cec054cf7d 100644 --- a/homeassistant/components/august/binary_sensor.py +++ b/homeassistant/components/august/binary_sensor.py @@ -104,6 +104,7 @@ class AugustDoorBinarySensor(BinarySensorDevice): self._state = None self._available = False self._firmware_version = None + self._model = None @property def available(self): @@ -139,6 +140,7 @@ class AugustDoorBinarySensor(BinarySensorDevice): if detail is not None: lock_door_state = detail.door_state self._firmware_version = detail.firmware_version + self._model = detail.model self._available = lock_door_state != LockDoorStatus.UNKNOWN self._state = lock_door_state == LockDoorStatus.OPEN @@ -156,6 +158,7 @@ class AugustDoorBinarySensor(BinarySensorDevice): "name": self._door.device_name, "manufacturer": DEFAULT_NAME, "sw_version": self._firmware_version, + "model": self._model, } @@ -170,6 +173,7 @@ class AugustDoorbellBinarySensor(BinarySensorDevice): self._state = None self._available = False self._firmware_version = None + self._model = None @property def available(self): @@ -210,6 +214,7 @@ class AugustDoorbellBinarySensor(BinarySensorDevice): self._state = None if detail is not None: self._firmware_version = detail.firmware_version + self._model = detail.model self._state = await async_state_provider(self._data, detail) @property @@ -228,4 +233,5 @@ class AugustDoorbellBinarySensor(BinarySensorDevice): "name": self._doorbell.device_name, "manufacturer": "August", "sw_version": self._firmware_version, + "model": self._model, } diff --git a/homeassistant/components/august/camera.py b/homeassistant/components/august/camera.py index ad31cb4ddc6..4e0ef65c82d 100644 --- a/homeassistant/components/august/camera.py +++ b/homeassistant/components/august/camera.py @@ -34,6 +34,7 @@ class AugustCamera(Camera): self._image_url = None self._image_content = None self._firmware_version = None + self._model = None @property def name(self): @@ -58,7 +59,7 @@ class AugustCamera(Camera): @property def model(self): """Return the camera model.""" - return "Doorbell" + return self._model async def async_camera_image(self): """Return bytes of camera image.""" @@ -85,6 +86,7 @@ class AugustCamera(Camera): return None self._firmware_version = self._doorbell_detail.firmware_version + self._model = self._doorbell_detail.model def _camera_image(self): """Return bytes of camera image via http get.""" @@ -104,4 +106,5 @@ class AugustCamera(Camera): "name": self._doorbell.device_name + " Camera", "manufacturer": DEFAULT_NAME, "sw_version": self._firmware_version, + "model": self._model, } diff --git a/homeassistant/components/august/lock.py b/homeassistant/components/august/lock.py index 2db1fe5eede..d339dae8063 100644 --- a/homeassistant/components/august/lock.py +++ b/homeassistant/components/august/lock.py @@ -40,6 +40,7 @@ class AugustLock(LockDevice): self._changed_by = None self._available = False self._firmware_version = None + self._model = None async def async_lock(self, **kwargs): """Lock the device.""" @@ -89,6 +90,7 @@ class AugustLock(LockDevice): if self._lock_detail is not None: self._firmware_version = self._lock_detail.firmware_version + self._model = self._lock_detail.model self._update_lock_status_from_detail() @@ -135,6 +137,7 @@ class AugustLock(LockDevice): "name": self._lock.device_name, "manufacturer": DEFAULT_NAME, "sw_version": self._firmware_version, + "model": self._model, } @property diff --git a/homeassistant/components/august/manifest.json b/homeassistant/components/august/manifest.json index 0523ed178aa..523cb5a361f 100644 --- a/homeassistant/components/august/manifest.json +++ b/homeassistant/components/august/manifest.json @@ -3,7 +3,7 @@ "name": "August", "documentation": "https://www.home-assistant.io/integrations/august", "requirements": [ - "py-august==0.17.0" + "py-august==0.21.0" ], "dependencies": [ "configurator" @@ -12,4 +12,4 @@ "@bdraco" ], "config_flow": true -} \ No newline at end of file +} diff --git a/homeassistant/components/august/sensor.py b/homeassistant/components/august/sensor.py index f1bfd0ad8b4..8b54c42352a 100644 --- a/homeassistant/components/august/sensor.py +++ b/homeassistant/components/august/sensor.py @@ -7,12 +7,16 @@ from homeassistant.helpers.entity import Entity from .const import DATA_AUGUST, DEFAULT_NAME, DOMAIN +BATTERY_LEVEL_FULL = "Full" +BATTERY_LEVEL_MEDIUM = "Medium" +BATTERY_LEVEL_LOW = "Low" + _LOGGER = logging.getLogger(__name__) SCAN_INTERVAL = timedelta(seconds=5) -async def _async_retrieve_device_battery_state(detail): +def _retrieve_device_battery_state(detail): """Get the latest state of the sensor.""" if detail is None: return None @@ -20,7 +24,7 @@ async def _async_retrieve_device_battery_state(detail): return detail.battery_level -async def _async_retrieve_linked_keypad_battery_state(detail): +def _retrieve_linked_keypad_battery_state(detail): """Get the latest state of the sensor.""" if detail is None: return None @@ -30,13 +34,11 @@ async def _async_retrieve_linked_keypad_battery_state(detail): battery_level = detail.keypad.battery_level - _LOGGER.debug("keypad battery level: %s %s", battery_level, battery_level.lower()) - - if battery_level.lower() == "full": + if battery_level == BATTERY_LEVEL_FULL: return 100 - if battery_level.lower() == "medium": + if battery_level == BATTERY_LEVEL_MEDIUM: return 60 - if battery_level.lower() == "low": + if battery_level == BATTERY_LEVEL_LOW: return 10 return 0 @@ -45,11 +47,11 @@ async def _async_retrieve_linked_keypad_battery_state(detail): SENSOR_TYPES_BATTERY = { "device_battery": { "name": "Battery", - "async_state_provider": _async_retrieve_device_battery_state, + "state_provider": _retrieve_device_battery_state, }, "linked_keypad_battery": { "name": "Keypad Battery", - "async_state_provider": _async_retrieve_linked_keypad_battery_state, + "state_provider": _retrieve_linked_keypad_battery_state, }, } @@ -71,11 +73,9 @@ async def async_setup_entry(hass, config_entry, async_add_entities): for sensor_type in SENSOR_TYPES_BATTERY: for device in batteries[sensor_type]: - async_state_provider = SENSOR_TYPES_BATTERY[sensor_type][ - "async_state_provider" - ] + state_provider = SENSOR_TYPES_BATTERY[sensor_type]["state_provider"] detail = await data.async_get_device_detail(device) - state = await async_state_provider(detail) + state = state_provider(detail) sensor_name = SENSOR_TYPES_BATTERY[sensor_type]["name"] if state is None: _LOGGER.debug( @@ -103,6 +103,7 @@ class AugustBatterySensor(Entity): self._state = None self._available = False self._firmware_version = None + self._model = None @property def available(self): @@ -133,14 +134,13 @@ class AugustBatterySensor(Entity): async def async_update(self): """Get the latest state of the sensor.""" - async_state_provider = SENSOR_TYPES_BATTERY[self._sensor_type][ - "async_state_provider" - ] + state_provider = SENSOR_TYPES_BATTERY[self._sensor_type]["state_provider"] detail = await self._data.async_get_device_detail(self._device) - self._state = await async_state_provider(detail) + self._state = state_provider(detail) self._available = self._state is not None if detail is not None: self._firmware_version = detail.firmware_version + self._model = detail.model @property def unique_id(self) -> str: @@ -155,4 +155,5 @@ class AugustBatterySensor(Entity): "name": self._device.device_name, "manufacturer": DEFAULT_NAME, "sw_version": self._firmware_version, + "model": self._model, } diff --git a/requirements_all.txt b/requirements_all.txt index 7495fca8588..9889faf292a 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1076,7 +1076,7 @@ pushover_complete==1.1.1 pwmled==1.5.0 # homeassistant.components.august -py-august==0.17.0 +py-august==0.21.0 # homeassistant.components.canary py-canary==0.5.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 2b531deeca8..0522a3a8ea4 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -391,7 +391,7 @@ pure-python-adb==0.2.2.dev0 pushbullet.py==0.11.0 # homeassistant.components.august -py-august==0.17.0 +py-august==0.21.0 # homeassistant.components.canary py-canary==0.5.0 diff --git a/tests/components/august/test_binary_sensor.py b/tests/components/august/test_binary_sensor.py index 260f86120f3..f64b2de7918 100644 --- a/tests/components/august/test_binary_sensor.py +++ b/tests/components/august/test_binary_sensor.py @@ -88,3 +88,18 @@ async def test_create_doorbell_offline(hass): assert binary_sensor_tmt100_name_online.state == STATE_OFF binary_sensor_tmt100_name_ding = hass.states.get("binary_sensor.tmt100_name_ding") assert binary_sensor_tmt100_name_ding.state == STATE_UNAVAILABLE + + +async def test_doorbell_device_registry(hass): + """Test creation of a lock with doorsense and bridge ands up in the registry.""" + doorbell_one = await _mock_doorbell_from_fixture(hass, "get_doorbell.offline.json") + doorbell_details = [doorbell_one] + await _create_august_with_devices(hass, doorbell_details) + + device_registry = await hass.helpers.device_registry.async_get_registry() + + reg_device = device_registry.async_get_device( + identifiers={("august", "tmt100")}, connections=set() + ) + assert "hydra1" == reg_device.model + assert "3.1.0-HYDRC75+201909251139" == reg_device.sw_version diff --git a/tests/components/august/test_lock.py b/tests/components/august/test_lock.py index 104c93855be..a7027842b57 100644 --- a/tests/components/august/test_lock.py +++ b/tests/components/august/test_lock.py @@ -17,6 +17,21 @@ from tests.components.august.mocks import ( ) +async def test_lock_device_registry(hass): + """Test creation of a lock with doorsense and bridge ands up in the registry.""" + lock_one = await _mock_doorsense_enabled_august_lock_detail(hass) + lock_details = [lock_one] + await _create_august_with_devices(hass, lock_details) + + device_registry = await hass.helpers.device_registry.async_get_registry() + + reg_device = device_registry.async_get_device( + identifiers={("august", "online_with_doorsense")}, connections=set() + ) + assert "AUG-MD01" == reg_device.model + assert "undefined-4.3.0-1.8.14" == reg_device.sw_version + + async def test_one_lock_operation(hass): """Test creation of a lock with doorsense and bridge.""" lock_one = await _mock_doorsense_enabled_august_lock_detail(hass)