From 4f00aac7a2b0b1662bd1fa74b1fc2c6d96df72e6 Mon Sep 17 00:00:00 2001 From: Kevin Fronczak Date: Tue, 9 Jun 2020 15:25:57 +0000 Subject: [PATCH] Fixed missing camera init from owl, cleaned up camera a bit --- blinkpy/camera.py | 47 +++++++++++++++++++-------------------- blinkpy/sync_module.py | 4 ++-- tests/test_blinkpy.py | 12 +++++++--- tests/test_sync_module.py | 21 +++++++++++++++-- 4 files changed, 53 insertions(+), 31 deletions(-) diff --git a/blinkpy/camera.py b/blinkpy/camera.py index 627abe7..4f75c11 100644 --- a/blinkpy/camera.py +++ b/blinkpy/camera.py @@ -112,18 +112,24 @@ class BlinkCamera: def update(self, config, force_cache=False, **kwargs): """Update camera info.""" - # force = kwargs.pop('force', False) - self.name = config["name"] - self.camera_id = str(config["id"]) - self.network_id = str(config["network_id"]) - self.serial = config["serial"] - self.motion_enabled = config["enabled"] - self.battery_voltage = config["battery_voltage"] - self.battery_state = config["battery_state"] - self.temperature = config["temperature"] - self.wifi_strength = config["wifi_strength"] + self.extract_config_info(config) + self.get_sensor_info() + self.update_images(config, force_cache=force_cache) - # Retrieve calibrated temperature from special endpoint + def extract_config_info(self, config): + """Extract info from config.""" + self.name = config.get("name", "unknown") + self.camera_id = str(config.get("id", "unknown")) + self.network_id = str(config.get("network_id", "unknown")) + self.serial = config.get("serial", None) + self.motion_enabled = config.get("enabled", "unknown") + self.battery_voltage = config.get("battery_voltage", None) + self.battery_state = config.get("battery_state", None) + self.temperature = config.get("temperature", None) + self.wifi_strength = config.get("wifi_strength", None) + + def get_sensor_info(self): + """Retrieve calibrated temperatue from special endpoint.""" resp = api.request_camera_sensors( self.sync.blink, self.network_id, self.camera_id ) @@ -133,13 +139,11 @@ class BlinkCamera: self.temperature_calibrated = self.temperature _LOGGER.warning("Could not retrieve calibrated temperature.") - self.update_images(config, force_cache=force_cache) - def update_images(self, config, force_cache=False): """Update images for camera.""" new_thumbnail = None thumb_addr = None - if config["thumbnail"]: + if config.get("thumbnail", False): thumb_addr = config["thumbnail"] else: _LOGGER.warning( @@ -155,10 +159,12 @@ class BlinkCamera: self.motion_detected = False clip_addr = None - if self.name in self.sync.last_record: + try: clip_addr = self.sync.last_record[self.name]["clip"] self.last_record = self.sync.last_record[self.name]["time"] self.clip = f"{self.sync.urls.base_url}{clip_addr}" + except KeyError: + pass # If the thumbnail or clip have changed, update the cache update_cached_image = False @@ -220,15 +226,8 @@ class BlinkCamera: class BlinkCameraMini(BlinkCamera): """Define a class for a Blink Mini camera.""" - def update(self, config, force_cache=False, **kwargs): - """Update a blink mini camera.""" - self.name = config.get("name", "unknown") - self.camera_id = str(config.get("id", "")) - self.network_id = str(config.get("network_id", "")) - self.serial = config.get("serial", f"{self.network_id}-{self.camera_id}") - self.motion_enabled = config.get("enabled", False) - - self.update_images(config, force_cache=force_cache) + def get_sensor_info(self): + """Get sensor info for blink mini camera.""" def get_liveview(self): """Get liveview link.""" diff --git a/blinkpy/sync_module.py b/blinkpy/sync_module.py index b33748c..d2a0906 100644 --- a/blinkpy/sync_module.py +++ b/blinkpy/sync_module.py @@ -219,7 +219,7 @@ class BlinkOwl(BlinkSyncModule): def __init__(self, blink, name, network_id, response): """Initialize a sync-less object.""" - cameras = [{network_id: {"name": name, "id": response["id"]}}] + cameras = [{"name": name, "id": response["id"]}] super().__init__(blink, name, network_id, cameras) self.sync_id = response["id"] self.serial = response["serial"] @@ -242,7 +242,7 @@ class BlinkOwl(BlinkSyncModule): def update_cameras(self, camera_type=BlinkCameraMini): """Update sync-less cameras.""" - super().update_cameras(camera_type=BlinkCameraMini) + return super().update_cameras(camera_type=BlinkCameraMini) def get_camera_info(self, camera_id): """Retrieve camera information.""" diff --git a/tests/test_blinkpy.py b/tests/test_blinkpy.py index c726655..bd93720 100644 --- a/tests/test_blinkpy.py +++ b/tests/test_blinkpy.py @@ -196,8 +196,10 @@ class TestBlinkSetup(unittest.TestCase): self.assertEqual(combined["bar"], "foo") @mock.patch("blinkpy.api.request_homescreen") - def test_initialize_blink_minis(self, mock_home): + @mock.patch("blinkpy.blinkpy.BlinkOwl.start") + def test_initialize_blink_minis(self, mock_start, mock_home): """Test blink mini initialization.""" + mock_start.return_value = True mock_home.return_value = { "owls": [ { @@ -208,7 +210,7 @@ class TestBlinkSetup(unittest.TestCase): "onboarded": True, "status": "online", "thumbnail": "/foo/bar", - "serial": "", + "serial": "1234", }, { "enabled": True, @@ -218,7 +220,7 @@ class TestBlinkSetup(unittest.TestCase): "onboarded": True, "status": "online", "thumbnail": "/foo/bar", - "serial": "", + "serial": "abcd", }, ] } @@ -226,6 +228,10 @@ class TestBlinkSetup(unittest.TestCase): self.blink.setup_owls() self.assertEqual(self.blink.sync["foo"].__class__, BlinkOwl) self.assertEqual(self.blink.sync["bar"].__class__, BlinkOwl) + self.assertEqual(self.blink.sync["foo"].arm, False) + self.assertEqual(self.blink.sync["bar"].arm, True) + self.assertEqual(self.blink.sync["foo"].name, "foo") + self.assertEqual(self.blink.sync["bar"].name, "bar") class MockSync: diff --git a/tests/test_sync_module.py b/tests/test_sync_module.py index baf2bb1..211cdb4 100644 --- a/tests/test_sync_module.py +++ b/tests/test_sync_module.py @@ -4,8 +4,8 @@ from unittest import mock from blinkpy.blinkpy import Blink from blinkpy.helpers.util import BlinkURLHandler -from blinkpy.sync_module import BlinkSyncModule -from blinkpy.camera import BlinkCamera +from blinkpy.sync_module import BlinkSyncModule, BlinkOwl +from blinkpy.camera import BlinkCamera, BlinkCameraMini @mock.patch("blinkpy.auth.Auth.query") @@ -275,3 +275,20 @@ class TestBlinkSyncModule(unittest.TestCase): """Test sync attributes.""" self.assertEqual(self.blink.sync["test"].attributes["name"], "test") self.assertEqual(self.blink.sync["test"].attributes["network_id"], "1234") + + def test_owl_start(self, mock_resp): + """Test owl camera instantiation.""" + response = { + "name": "foo", + "id": 2, + "serial": "foobar123", + "enabled": True, + "network_id": 1, + "thumbnail": "/foo/bar", + } + self.blink.last_refresh = None + self.blink.homescreen = {"owls": [response]} + owl = BlinkOwl(self.blink, "foo", 1234, response) + self.assertTrue(owl.start()) + self.assertTrue("foo" in owl.cameras) + self.assertEqual(owl.cameras["foo"].__class__, BlinkCameraMini)