From 69a56084e5bc316e93386b56551736e13a2c9745 Mon Sep 17 00:00:00 2001 From: jsetton Date: Tue, 12 Feb 2019 10:28:58 -0500 Subject: [PATCH 1/3] Add device model name property --- ring_doorbell/chime.py | 10 +++++++++- ring_doorbell/const.py | 16 ++++++++++++++++ ring_doorbell/doorbot.py | 23 +++++++++++++++++++---- ring_doorbell/generic.py | 5 +++++ ring_doorbell/stickup_cam.py | 22 ++++++++++++++++++++++ tests/test_ring.py | 5 +++++ 6 files changed, 76 insertions(+), 5 deletions(-) diff --git a/ring_doorbell/chime.py b/ring_doorbell/chime.py index beea3cb6..876956e3 100644 --- a/ring_doorbell/chime.py +++ b/ring_doorbell/chime.py @@ -7,7 +7,7 @@ from ring_doorbell.const import ( API_URI, CHIMES_ENDPOINT, CHIME_VOL_MIN, CHIME_VOL_MAX, LINKED_CHIMES_ENDPOINT, MSG_VOL_OUTBOUND, TESTSOUND_CHIME_ENDPOINT, - CHIME_TEST_SOUND_KINDS, KIND_DING) + CHIME_TEST_SOUND_KINDS, KIND_DING, CHIME_KINDS, CHIME_PRO_KINDS) _LOGGER = logging.getLogger(__name__) @@ -21,6 +21,14 @@ def family(self): return 'chimes' @property + def model(self): + """Return Ring device model name.""" + if self.kind in CHIME_KINDS: + return 'Chime' + elif self.kind in CHIME_PRO_KINDS: + return 'Chime Pro' + return None + def battery_life(self): """Return battery life.""" return int(self._health_attrs.get('battery_percentage')) diff --git a/ring_doorbell/const.py b/ring_doorbell/const.py index ccbba380..dc613a01 100644 --- a/ring_doorbell/const.py +++ b/ring_doorbell/const.py @@ -69,6 +69,22 @@ SIREN_DURATION_MIN = 0 SIREN_DURATION_MAX = 120 +# device model kinds +CHIME_KINDS = ['chime'] +CHIME_PRO_KINDS = ['chime_pro'] + +DOORBELL_KINDS = ['doorbot', 'doorbell', 'doorbell_v3'] +DOORBELL_2_KINDS = ['doorbell_v4', 'doorbell_v5'] +DOORBELL_PRO_KINDS = ['lpd_v1', 'lpd_v2'] +DOORBELL_ELITE_KINDS = ['jbox_v1'] + +FLOODLIGHT_CAM_KINDS = ['hp_cam_v1'] +SPOTLIGHT_CAM_BATTERY_KINDS = ['stickup_cam_v4'] +SPOTLIGHT_CAM_WIRED_KINDS = ['hp_cam_v2'] +STICKUP_CAM_KINDS = ['stickup_cam', 'stickup_cam_v3'] +STICKUP_CAM_BATTERY_KINDS = ['stickup_cam_lunar'] +STICKUP_CAM_WIRED_KINDS = ['stickup_cam_elite'] + # error strings MSG_BOOLEAN_REQUIRED = "Boolean value is required." MSG_EXISTING_TYPE = "Integer value where {0}.".format(DOORBELL_EXISTING_TYPE) diff --git a/ring_doorbell/doorbot.py b/ring_doorbell/doorbot.py index 0c868d03..fcca3852 100644 --- a/ring_doorbell/doorbot.py +++ b/ring_doorbell/doorbot.py @@ -13,10 +13,12 @@ from ring_doorbell.utils import _save_cache from ring_doorbell.const import ( API_URI, DOORBELLS_ENDPOINT, DOORBELL_VOL_MIN, DOORBELL_VOL_MAX, - DOORBELL_EXISTING_TYPE, DINGS_ENDPOINT, FILE_EXISTS, - LIVE_STREAMING_ENDPOINT, MSG_BOOLEAN_REQUIRED, MSG_EXISTING_TYPE, - MSG_VOL_OUTBOUND, SNAPSHOT_ENDPOINT, SNAPSHOT_TIMESTAMP_ENDPOINT, - URL_DOORBELL_HISTORY, URL_RECORDING) + DOORBELL_EXISTING_TYPE, DINGS_ENDPOINT, DOORBELL_KINDS, + DOORBELL_2_KINDS, DOORBELL_PRO_KINDS, DOORBELL_ELITE_KINDS, + FILE_EXISTS, LIVE_STREAMING_ENDPOINT, MSG_BOOLEAN_REQUIRED, + MSG_EXISTING_TYPE, MSG_VOL_OUTBOUND, SNAPSHOT_ENDPOINT, + SNAPSHOT_TIMESTAMP_ENDPOINT, URL_DOORBELL_HISTORY, + URL_RECORDING) _LOGGER = logging.getLogger(__name__) @@ -29,6 +31,19 @@ def family(self): """Return Ring device family type.""" return 'doorbots' + @property + def model(self): + """Return Ring device model name.""" + if self.kind in DOORBELL_KINDS: + return 'Doorbell' + elif self.kind in DOORBELL_2_KINDS: + return 'Doorbell 2' + elif self.kind in DOORBELL_PRO_KINDS: + return 'Doorbell Pro' + elif self.kind in DOORBELL_ELITE_KINDS: + return 'Doorbell Elite' + return None + @property def battery_life(self): """Return battery life.""" diff --git a/ring_doorbell/generic.py b/ring_doorbell/generic.py index 8596784b..a3cb21c1 100644 --- a/ring_doorbell/generic.py +++ b/ring_doorbell/generic.py @@ -40,6 +40,11 @@ def family(self): """Return Ring device family type.""" return None + @property + def model(self): + """Return Ring device model name.""" + return None + def update(self): """Refresh attributes.""" self._get_attrs() diff --git a/ring_doorbell/stickup_cam.py b/ring_doorbell/stickup_cam.py index 967b7093..f0708c1f 100644 --- a/ring_doorbell/stickup_cam.py +++ b/ring_doorbell/stickup_cam.py @@ -6,6 +6,9 @@ from ring_doorbell import RingDoorBell from ring_doorbell.const import ( API_URI, LIGHTS_ENDPOINT, MSG_ALLOWED_VALUES, MSG_VOL_OUTBOUND, + FLOODLIGHT_CAM_KINDS, SPOTLIGHT_CAM_BATTERY_KINDS, + SPOTLIGHT_CAM_WIRED_KINDS, STICKUP_CAM_KINDS, + STICKUP_CAM_BATTERY_KINDS, STICKUP_CAM_WIRED_KINDS, SIREN_DURATION_MIN, SIREN_DURATION_MAX, SIREN_ENDPOINT) _LOGGER = logging.getLogger(__name__) @@ -19,6 +22,25 @@ def family(self): """Return Ring device family type.""" return 'stickup_cams' + @property + def model(self): + """Return Ring device model name.""" + if self.kind in FLOODLIGHT_CAM_KINDS: + return 'Floodlight Cam' + elif self.kind in SPOTLIGHT_CAM_BATTERY_KINDS: + return 'Spotlight Cam {}'.format( + self._attrs.get('ring_cam_setup_flow', 'battery').title()) + elif self.kind in SPOTLIGHT_CAM_WIRED_KINDS: + return 'Spotlight Cam {}'.format( + self._attrs.get('ring_cam_setup_flow', 'wired').title()) + elif self.kind in STICKUP_CAM_KINDS: + return 'Stick Up Cam' + elif self.kind in STICKUP_CAM_BATTERY_KINDS: + return 'Stick Up Cam Battery' + elif self.kind in STICKUP_CAM_WIRED_KINDS: + return 'Stick Up Cam Wired' + return None + @property def lights(self): """Return lights status.""" diff --git a/tests/test_ring.py b/tests/test_ring.py index 4aa0132e..92e553be 100644 --- a/tests/test_ring.py +++ b/tests/test_ring.py @@ -46,6 +46,7 @@ def test_chime_attributes(self, mock): self.assertNotEqual(99999, dev.account_id) self.assertEqual('abcdef123', dev.id) self.assertEqual('chime', dev.kind) + self.assertEqual('Chime', dev.model) self.assertIsNotNone(dev.latitude) self.assertEqual('America/New_York', dev.timezone) self.assertEqual(2, dev.volume) @@ -71,6 +72,7 @@ def test_doorbell_attributes(self, mock): self.assertEqual(987652, dev.account_id) self.assertEqual('123 Main St', dev.address) self.assertEqual('lpd_v1', dev.kind) + self.assertEqual('Doorbell Pro', dev.model) self.assertEqual(-70.12345, dev.longitude) self.assertEqual('America/New_York', dev.timezone) self.assertEqual(1, dev.volume) @@ -109,6 +111,7 @@ def test_shared_doorbell_attributes(self, mock): self.assertEqual(51, dev.battery_life) self.assertEqual('123 Second St', dev.address) self.assertEqual('lpd_v1', dev.kind) + self.assertEqual('Doorbell Pro', dev.model) self.assertEqual(-70.12345, dev.longitude) self.assertEqual('America/New_York', dev.timezone) self.assertEqual(5, dev.volume) @@ -146,6 +149,8 @@ def test_stickup_cam_attributes(self, mock): data = self.ring_persistent for dev in data.stickup_cams: + self.assertEqual('hp_cam_v1', dev.kind) + self.assertEqual('Floodlight Cam', dev.model) self.assertEqual('off', dev.lights) self.assertEqual(0, dev.siren) From 813ae5f93f91c8219917a01bf340223bb905cb70 Mon Sep 17 00:00:00 2001 From: jsetton Date: Tue, 12 Feb 2019 10:37:25 -0500 Subject: [PATCH 2/3] Add device has capability method --- ring_doorbell/chime.py | 8 +++++--- ring_doorbell/doorbot.py | 9 +++++++++ ring_doorbell/generic.py | 4 ++++ ring_doorbell/stickup_cam.py | 18 ++++++++++++++++++ tests/test_ring.py | 8 ++++++++ 5 files changed, 44 insertions(+), 3 deletions(-) diff --git a/ring_doorbell/chime.py b/ring_doorbell/chime.py index 876956e3..c2794e6d 100644 --- a/ring_doorbell/chime.py +++ b/ring_doorbell/chime.py @@ -29,9 +29,11 @@ def model(self): return 'Chime Pro' return None - def battery_life(self): - """Return battery life.""" - return int(self._health_attrs.get('battery_percentage')) + def has_capability(self, capability): + """Return if device has specific capability.""" + if capability == 'volume': + return True + return False @property def volume(self): diff --git a/ring_doorbell/doorbot.py b/ring_doorbell/doorbot.py index fcca3852..129a90ac 100644 --- a/ring_doorbell/doorbot.py +++ b/ring_doorbell/doorbot.py @@ -44,6 +44,15 @@ def model(self): return 'Doorbell Elite' return None + def has_capability(self, capability): + """Return if device has specific capability.""" + if capability == 'battery': + return self.kind in (DOORBELL_KINDS + + DOORBELL_2_KINDS) + elif capability == 'volume': + return True + return False + @property def battery_life(self): """Return battery life.""" diff --git a/ring_doorbell/generic.py b/ring_doorbell/generic.py index a3cb21c1..71771504 100644 --- a/ring_doorbell/generic.py +++ b/ring_doorbell/generic.py @@ -45,6 +45,10 @@ def model(self): """Return Ring device model name.""" return None + def has_capability(self, capability): + """Return if device has specific capability.""" + return False + def update(self): """Refresh attributes.""" self._get_attrs() diff --git a/ring_doorbell/stickup_cam.py b/ring_doorbell/stickup_cam.py index f0708c1f..d9bf34db 100644 --- a/ring_doorbell/stickup_cam.py +++ b/ring_doorbell/stickup_cam.py @@ -41,6 +41,24 @@ def model(self): return 'Stick Up Cam Wired' return None + def has_capability(self, capability): + """Return if device has specific capability.""" + if capability == 'battery': + return self.kind in (SPOTLIGHT_CAM_BATTERY_KINDS + + STICKUP_CAM_KINDS + + STICKUP_CAM_BATTERY_KINDS) + elif capability == 'light': + return self.kind in (FLOODLIGHT_CAM_KINDS + + SPOTLIGHT_CAM_BATTERY_KINDS + + SPOTLIGHT_CAM_WIRED_KINDS) + elif capability == 'siren': + return self.kind in (FLOODLIGHT_CAM_KINDS + + SPOTLIGHT_CAM_BATTERY_KINDS + + SPOTLIGHT_CAM_WIRED_KINDS + + STICKUP_CAM_BATTERY_KINDS + + STICKUP_CAM_WIRED_KINDS) + return False + @property def lights(self): """Return lights status.""" diff --git a/tests/test_ring.py b/tests/test_ring.py index 92e553be..f8912e11 100644 --- a/tests/test_ring.py +++ b/tests/test_ring.py @@ -47,6 +47,8 @@ def test_chime_attributes(self, mock): self.assertEqual('abcdef123', dev.id) self.assertEqual('chime', dev.kind) self.assertEqual('Chime', dev.model) + self.assertEqual(False, dev.has_capability('battery')) + self.assertEqual(True, dev.has_capability('volume')) self.assertIsNotNone(dev.latitude) self.assertEqual('America/New_York', dev.timezone) self.assertEqual(2, dev.volume) @@ -73,6 +75,8 @@ def test_doorbell_attributes(self, mock): self.assertEqual('123 Main St', dev.address) self.assertEqual('lpd_v1', dev.kind) self.assertEqual('Doorbell Pro', dev.model) + self.assertEqual(False, dev.has_capability('battery')) + self.assertEqual(True, dev.has_capability('volume')) self.assertEqual(-70.12345, dev.longitude) self.assertEqual('America/New_York', dev.timezone) self.assertEqual(1, dev.volume) @@ -112,6 +116,8 @@ def test_shared_doorbell_attributes(self, mock): self.assertEqual('123 Second St', dev.address) self.assertEqual('lpd_v1', dev.kind) self.assertEqual('Doorbell Pro', dev.model) + self.assertEqual(False, dev.has_capability('battery')) + self.assertEqual(True, dev.has_capability('volume')) self.assertEqual(-70.12345, dev.longitude) self.assertEqual('America/New_York', dev.timezone) self.assertEqual(5, dev.volume) @@ -151,6 +157,8 @@ def test_stickup_cam_attributes(self, mock): for dev in data.stickup_cams: self.assertEqual('hp_cam_v1', dev.kind) self.assertEqual('Floodlight Cam', dev.model) + self.assertEqual(False, dev.has_capability('battery')) + self.assertEqual(True, dev.has_capability('light')) self.assertEqual('off', dev.lights) self.assertEqual(0, dev.siren) From cf2456e9df290009c621aebfcc4d0b29e377e46a Mon Sep 17 00:00:00 2001 From: jsetton Date: Tue, 19 Feb 2019 22:17:44 -0500 Subject: [PATCH 3/3] Fixed unecessary debug fail message on every query --- ring_doorbell/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ring_doorbell/__init__.py b/ring_doorbell/__init__.py index 99bb9251..7f3ca998 100644 --- a/ring_doorbell/__init__.py +++ b/ring_doorbell/__init__.py @@ -216,7 +216,7 @@ def query(self, response = req.json() break - if self.debug: + if self.debug and response is None: _LOGGER.debug("%s", MSG_GENERIC_FAIL) return response