Skip to main content

A Blink camera Python Library.

Project description

blinkpy Build Status Coverage Status PyPi Version Codestyle

A Python library for the Blink Camera system (Python 3.9+)

Like the library? Consider buying me a cup of coffee!

Buy me a Coffee!

BREAKING CHANGE WARNING: As of 0.22.0 the library uses asyncio which will break any user scripts used prior to this version. Please see the updated examples below and the blinkapp.py or blinksync.py examples in the blinkapp/ directory for examples on how to migrate.

Disclaimer: Published under the MIT license - See LICENSE file for more details.

“Blink Wire-Free HS Home Monitoring & Alert Systems” is a trademark owned by Immedia Inc., see www.blinkforhome.com for more information. I am in no way affiliated with Blink, nor Immedia Inc.

Original protocol hacking by MattTW : https://github.com/MattTW/BlinkMonitorProtocol

API calls faster than 60 seconds is not recommended as it can overwhelm Blink’s servers. Please use this module responsibly.

Installation

pip install blinkpy

Installing Development Version

To install the current development version, perform the following steps. Note that the following will create a blinkpy directory in your home area:

$ cd ~
$ git clone https://github.com/fronzbot/blinkpy.git
$ cd blinkpy
$ pip install .

If you’d like to contribute to this library, please read the contributing instructions.

Purpose

This library was built with the intention of allowing easy communication with Blink camera systems, specifically to support the Blink component in homeassistant.

Quick Start

The simplest way to use this package from a terminal is to call await Blink.start() which will prompt for your Blink username and password and then log you in. In addition, http requests are throttled internally via use of the Blink.refresh_rate variable, which can be set at initialization and defaults to 30 seconds.

import asyncio
from aiohttp import ClientSession
from blinkpy.blinkpy import Blink

async def start():
    blink = Blink(session=ClientSession())
    await blink.start()
    return blink

blink = asyncio.run(start())

This flow will prompt you for your username and password. Once entered, if you likely will need to send a 2FA key to the blink servers (this pin is sent to your email address). When you receive this pin, enter at the prompt and the Blink library will proceed with setup.

Supplying credentials from file

Other use cases may involved loading credentials from a file. This file must be json formatted and contain a minimum of username and password. A built in function in the blinkpy.helpers.util module can aid in loading this file. Note, if no_prompt is desired, a similar flow can be followed as above.

import asyncio
from aiohttp import ClientSession
from blinkpy.blinkpy import Blink
from blinkpy.auth import Auth
from blinkpy.helpers.util import json_load

async def start():
    blink = Blink()
    auth = Auth(await json_load("<File Location>"))
    blink.auth = auth
    await blink.start()
    return blink

blink = asyncio.run(start())

Saving credentials

This library also allows you to save your credentials to use in future sessions. Saved information includes authentication tokens as well as unique ids which should allow for a more streamlined experience and limits the frequency of login requests. This data can be saved as follows (it can then be loaded by following the instructions above for supplying credentials from a file):

await blink.save("<File location>")

Getting cameras

Cameras are instantiated as individual BlinkCamera classes within a BlinkSyncModule instance. All of your sync modules are stored within the Blink.sync dictionary and can be accessed using the name of the sync module as the key (this is the name of your sync module in the Blink App).

The below code will display cameras and their available attributes:

for name, camera in blink.cameras.items():
  print(name)                   # Name of the camera
  print(camera.attributes)      # Print available attributes of camera

The most recent images and videos can be accessed as a bytes-object via internal variables. These can be updated with calls to Blink.refresh() but will only make a request if motion has been detected or other changes have been found. This can be overridden with the force flag, but this should be used for debugging only since it overrides the internal request throttling.

camera = blink.cameras['SOME CAMERA NAME']
await blink.refresh(force=True)  # force a cache update USE WITH CAUTION
camera.image_from_cache  # bytes-like image object (jpg)
camera.video_from_cache  # bytes-like video object (mp4)

The blinkpy api also allows for saving images and videos to a file and snapping a new picture from the camera remotely:

camera = blink.cameras['SOME CAMERA NAME']
await camera.snap_picture()       # Take a new picture with the camera
await blink.refresh()             # Get new information from server
await camera.image_to_file('/local/path/for/image.jpg')
await camera.video_to_file('/local/path/for/video.mp4')

Download videos

You can also use this library to download all videos from the server. In order to do this, you must specify a path. You may also specifiy a how far back in time to go to retrieve videos via the since= variable (a simple string such as "2017/09/21" is sufficient), as well as how many pages to traverse via the stop= variable. Note that by default, the library will search the first ten pages which is sufficient in most use cases. Additionally, you can specify one or more cameras via the camera= property. This can be a single string indicating the name of the camera, or a list of camera names. By default, it is set to the string 'all' to grab videos from all cameras. If you are downloading many items, setting the delay parameter is advised in order to throttle sequential calls to the API. By default this is set to 1 but can be any integer representing the number of seconds to delay between calls.

Example usage, which downloads all videos recorded since July 4th, 2018 at 9:34am to the /home/blink directory with a 2s delay between calls:

await blink.download_videos('/home/blink', since='2018/07/04 09:34', delay=2)

Sync Module Local Storage

API steps

  1. Request the local storage manifest be created by the sync module.

    • POST {base_url}/api/v1/accounts/{account_id}/networks/{network_id}/sync_modules/{sync_id}/local_storage/manifest/request

    • Returns an ID that is used to get the manifest.

  2. Retrieve the local storage manifest.

    • GET {base_url}/api/v1/accounts/{account_id}/networks/{network_id}/sync_modules/{sync_id}/local_storage/manifest/request/{manifest_request_id}

    • Returns full manifest.

    • Extract the manifest ID from the response.

  3. Find a clip ID in the clips list from the manifest to retrieve, and request an upload.

    • POST {base_url}/api/v1/accounts/{account_id}/networks/{network_id}/sync_modules/{sync_id}/local_storage/manifest/{manifest_id}/clip/request/{clip_id}

    • When the response is returned, the upload has finished.

  4. Download the clip using the same clip ID.

    • GET {base_url}/api/v1/accounts/{account_id}/networks/{network_id}/sync_modules/{sync_id}/local_storage/manifest/{manifest_id}/clip/request/{clip_id}

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

blinkpy-0.23.0.tar.gz (52.6 kB view details)

Uploaded Source

Built Distribution

blinkpy-0.23.0-py3-none-any.whl (30.9 kB view details)

Uploaded Python 3

File details

Details for the file blinkpy-0.23.0.tar.gz.

File metadata

  • Download URL: blinkpy-0.23.0.tar.gz
  • Upload date:
  • Size: 52.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.11.9

File hashes

Hashes for blinkpy-0.23.0.tar.gz
Algorithm Hash digest
SHA256 62d9267bef36eca8ab9d08e37f12849664d63de23c4926a8ea6a127ede7b2114
MD5 60f641249ab1f28b019a49056228e58e
BLAKE2b-256 2983b9e35a7aa266fce95905c51b85e9e4fc0ae9ef10283ef7764de4bea805d0

See more details on using hashes here.

File details

Details for the file blinkpy-0.23.0-py3-none-any.whl.

File metadata

  • Download URL: blinkpy-0.23.0-py3-none-any.whl
  • Upload date:
  • Size: 30.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.11.9

File hashes

Hashes for blinkpy-0.23.0-py3-none-any.whl
Algorithm Hash digest
SHA256 3ed24a861b6af27fcc930c0a67b34458ded4b7bb6704408d31f77dade3440b1b
MD5 fafa1e0bd33e925f9a8ac7a0a6a4003a
BLAKE2b-256 1a61753898ab9b6109b7fb2770bec2436373c6e372b2bb295d9b7e1cc4f3acf1

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page