========================
Carson Living Python API
========================
.. image:: https://badge.fury.io/py/carson-living.svg
:target: https://badge.fury.io/py/carson-living
.. image:: https://travis-ci.org/rado0x54/python-carson-living.svg?branch=master
:target: https://travis-ci.org/rado0x54/python-carson-living
.. image:: https://coveralls.io/repos/github/rado0x54/python-carson-living/badge.svg?branch=master
:target: https://coveralls.io/github/rado0x54/python-carson-living?branch=master
.. image:: https://img.shields.io/badge/License-Apache%202.0-blue.svg
:target: https://opensource.org/licenses/Apache-2.0
.. image:: https://img.shields.io/pypi/pyversions/carson-living.svg
:target: https://pypi.python.org/pypi/carson-living
Python Carson Living is a library written in Python that exposes the carson.live devices as Python objects.
Disclaimer
----------
Please use this library at your own risk and make sure that you do not violate the
`Terms of Service of Carson <https://www.carson.live/terms>`_.
Getting started
---------------
Installation
~~~~~~~~~~~~~
Carson Living Python should work against **Python 2.x >= 2.7** and **Python 3.x >= 3.5**.
.. code-block::
# Installing from PyPi
$ pip install carson_living
# Installing latest development
$ pip install \
git+https://github.com/rado0x54/python-carson-living@master
Initialize a Carson API object
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code-block:: python
# Initializing an API object
carson = Carson("account@email.com", 'your password')
print(carson.user)
# >> Martin
print(carson.token)
# >> ey...
You are also able to pass a valid JWT token during initialization which would prevent a login action as long as the token is valid:
.. code-block:: python
# Initializing an API object with a valid token
carson = Carson("account@email.com", 'your password', 'ey....')
print(carson.token)
# >> Martin
Since Carson Living uses JWT token with very long validity, it is recommended to save the active token via
``carson.token``, whenever one needs to reinitialize the API later on. The API library is robust to handle expired
JWT tokens (and 401 handling), so no need to check before.
Carson entities
~~~~~~~~~~~~~~~
The library currently supports the following entities and actions.
- User (``carson.user``): read
- Building (``carson.buildings``): read
- Doors (``building.doors``): read, open
- Cameras (``building.cameras``): read, images, video
Door entities
~~~~~~~~~~~~~
Doors can be "buzzed" open via ``door.open()``
.. code-block:: python
# Open all Unit Doors of Main Building
for door in carson.first_building.doors:
if door.is_unit_door:
print('Opening Unit Door {}'.format(door.name))
door.open()
Camera entities
~~~~~~~~~~~~~~~
Eagle Eye cameras can produce live images and videos but also allow access to passed recordings (see API). The API can download the image and video directly into a provided file object
or just pass a generated url with an eagle_eye auth key ``A=c000....``. Please note, that the url can only be accessed as long as the ``auth_key`` is valid. Therefore it may make sense to
force the eagle eye api to refresh the auth key before generating a image or video url.
- Directly save a live image:
.. code-block:: python
for camera in building.cameras:
with open('image_{}.jpeg'.format(camera.entity_id), 'wb') as file:
camera.get_image(file)
- Directly save a live video of 10s:
.. code-block:: python
for camera in building.cameras:
with open('video_{}.flv'.format(camera.entity_id), 'wb') as file:
camera.get_video(file, timedelta(seconds=10))
- Directly download a image from a timestamp:
.. code-block:: python
three_hours_ago = datetime.utcnow() - timedelta(hours=3)
# download all images from 3 hours ago
for camera in building.cameras:
with open('image_{}.jpeg'.format(camera.entity_id), 'wb') as file:
camera.get_image(file, three_hours_ago)
- Directly download a recorded video from a timestamp:
.. code-block:: python
three_days_ago = datetime.utcnow() - timedelta(days=3)
# download all videos from 3 days ago
for cam in building.cameras:
with open('video_{}.flv'.format(cam.entity_id), 'wb') as file:
cam.get_video(file, timedelta(seconds=5), three_days_ago)
- The Carson API is also able to produce authenticated URLs that can be handled externally.
Please not, that the ``auth_key`` has a limited lifetime. Therefore it makes sense to update
the ``auth_key`` manually before retrieving predefined URLs. Note, the Eagle Eye API in Carson
is associated with a building, so it is sufficient to update it once for all cameras in the same
building. The function signature of the the ``_url`` function is identical to the previous ones
(minus the file object).
.. code-block:: python
# Update Session Auth Key of Eagle Eye once in a while if using
# generated authenticated URLs.
# Note, this is not needed for get_image() or get_video()
building.eagleeye_api.update_session_auth_key()
for cam in building.cameras:
img_url = cam.get_image_url(three_days_ago)
print(img_url)
# >> https://cXXX.eagleeyenetworks.com/asset/prev/image.jpeg?id=c0×tamp=20200122211442.575&asset_class=pre&A=c000~...
response = requests.get(img_url)
with open('image_{}_with_url.jpeg'.format(cam.entity_id), 'wb') as file:
file.write(response.content)
# do only 1 cam.
break
Use ``cam.get_video_url()`` the same way.
CLI Tool
~~~~~~~~
Checkout ``./scripts/carsoncli.py`` for further API implementation examples.
Development Notes
-----------------
Code Documentation
~~~~~~~~~~~~~~~~~~
The code follow the `Google Python Styleguide <https://google.github.io/styleguide/pyguide.html>`_ for docstring.
Git Branching Strategy
~~~~~~~~~~~~~~~~~~~~~~
This project uses `gitflow <https://nvie.com/posts/a-successful-git-branching-model/>`_ as a git branching model.
Open Items
~~~~~~~~~~
The following is not supported by the API yet and remains TODO.
- Expose visitor functionality (``/visitors``)
- Expose thread / messaging functionality (``/threads``)
- Expose delivery functionality (``/deliveries``)
- Expose dashboard functionality (``/dashboard``)
- Expose service functionality (``/service``)
- Integrate Twilio (``twilio/access-token/``)
- Expand and extract EagleEye API (into separate project?).
Credits && Thanks
-----------------
* A lot of the project setup and the API object design was inspired / launched off https://github.com/tchellomello/python-ring-doorbell. Saved me a lot of headaches with tox, setuptools and Travis!.
Raw data
{
"_id": null,
"home_page": "https://github.com/justanz/python-carson-living-testing",
"name": "c-l-testing",
"maintainer": "",
"docs_url": null,
"requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
"maintainer_email": "",
"keywords": "",
"author": "Martin Riedel",
"author_email": "web@riedel-it.de",
"download_url": "https://files.pythonhosted.org/packages/cb/b0/1e8b1d99fca0bbd671f505dff9248572583db28b5fcdcd850671e1ec3df3/c_l_testing-2.1.3.tar.gz",
"platform": null,
"description": "========================\nCarson Living Python API\n========================\n\n.. image:: https://badge.fury.io/py/carson-living.svg\n :target: https://badge.fury.io/py/carson-living\n\n.. image:: https://travis-ci.org/rado0x54/python-carson-living.svg?branch=master\n :target: https://travis-ci.org/rado0x54/python-carson-living\n\n.. image:: https://coveralls.io/repos/github/rado0x54/python-carson-living/badge.svg?branch=master\n :target: https://coveralls.io/github/rado0x54/python-carson-living?branch=master\n\n.. image:: https://img.shields.io/badge/License-Apache%202.0-blue.svg\n :target: https://opensource.org/licenses/Apache-2.0\n\n.. image:: https://img.shields.io/pypi/pyversions/carson-living.svg\n :target: https://pypi.python.org/pypi/carson-living\n\nPython Carson Living is a library written in Python that exposes the carson.live devices as Python objects.\n\nDisclaimer\n----------\nPlease use this library at your own risk and make sure that you do not violate the\n`Terms of Service of Carson <https://www.carson.live/terms>`_.\n\nGetting started\n---------------\nInstallation\n~~~~~~~~~~~~~\n\nCarson Living Python should work against **Python 2.x >= 2.7** and **Python 3.x >= 3.5**.\n\n.. code-block::\n\n # Installing from PyPi\n $ pip install carson_living\n\n # Installing latest development\n $ pip install \\\n git+https://github.com/rado0x54/python-carson-living@master\n\nInitialize a Carson API object\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. code-block:: python\n\n # Initializing an API object\n carson = Carson(\"account@email.com\", 'your password')\n print(carson.user)\n # >> Martin\n print(carson.token)\n # >> ey...\n\nYou are also able to pass a valid JWT token during initialization which would prevent a login action as long as the token is valid:\n\n.. code-block:: python\n\n # Initializing an API object with a valid token\n carson = Carson(\"account@email.com\", 'your password', 'ey....')\n print(carson.token)\n # >> Martin\n\nSince Carson Living uses JWT token with very long validity, it is recommended to save the active token via\n``carson.token``, whenever one needs to reinitialize the API later on. The API library is robust to handle expired\nJWT tokens (and 401 handling), so no need to check before.\n\nCarson entities\n~~~~~~~~~~~~~~~\nThe library currently supports the following entities and actions.\n\n- User (``carson.user``): read\n- Building (``carson.buildings``): read\n- Doors (``building.doors``): read, open\n- Cameras (``building.cameras``): read, images, video\n\nDoor entities\n~~~~~~~~~~~~~\nDoors can be \"buzzed\" open via ``door.open()``\n\n.. code-block:: python\n\n # Open all Unit Doors of Main Building\n for door in carson.first_building.doors:\n if door.is_unit_door:\n print('Opening Unit Door {}'.format(door.name))\n door.open()\n\nCamera entities\n~~~~~~~~~~~~~~~\nEagle Eye cameras can produce live images and videos but also allow access to passed recordings (see API). The API can download the image and video directly into a provided file object\nor just pass a generated url with an eagle_eye auth key ``A=c000....``. Please note, that the url can only be accessed as long as the ``auth_key`` is valid. Therefore it may make sense to\nforce the eagle eye api to refresh the auth key before generating a image or video url.\n\n- Directly save a live image:\n\n.. code-block:: python\n\n for camera in building.cameras:\n with open('image_{}.jpeg'.format(camera.entity_id), 'wb') as file:\n camera.get_image(file)\n\n- Directly save a live video of 10s:\n\n.. code-block:: python\n\n for camera in building.cameras:\n with open('video_{}.flv'.format(camera.entity_id), 'wb') as file:\n camera.get_video(file, timedelta(seconds=10))\n\n- Directly download a image from a timestamp:\n\n.. code-block:: python\n\n three_hours_ago = datetime.utcnow() - timedelta(hours=3)\n # download all images from 3 hours ago\n for camera in building.cameras:\n with open('image_{}.jpeg'.format(camera.entity_id), 'wb') as file:\n camera.get_image(file, three_hours_ago)\n\n- Directly download a recorded video from a timestamp:\n\n.. code-block:: python\n\n three_days_ago = datetime.utcnow() - timedelta(days=3)\n # download all videos from 3 days ago\n for cam in building.cameras:\n with open('video_{}.flv'.format(cam.entity_id), 'wb') as file:\n cam.get_video(file, timedelta(seconds=5), three_days_ago)\n\n- The Carson API is also able to produce authenticated URLs that can be handled externally.\n Please not, that the ``auth_key`` has a limited lifetime. Therefore it makes sense to update\n the ``auth_key`` manually before retrieving predefined URLs. Note, the Eagle Eye API in Carson\n is associated with a building, so it is sufficient to update it once for all cameras in the same\n building. The function signature of the the ``_url`` function is identical to the previous ones\n (minus the file object).\n\n.. code-block:: python\n\n # Update Session Auth Key of Eagle Eye once in a while if using\n # generated authenticated URLs.\n # Note, this is not needed for get_image() or get_video()\n building.eagleeye_api.update_session_auth_key()\n for cam in building.cameras:\n img_url = cam.get_image_url(three_days_ago)\n print(img_url)\n # >> https://cXXX.eagleeyenetworks.com/asset/prev/image.jpeg?id=c0×tamp=20200122211442.575&asset_class=pre&A=c000~...\n response = requests.get(img_url)\n with open('image_{}_with_url.jpeg'.format(cam.entity_id), 'wb') as file:\n file.write(response.content)\n # do only 1 cam.\n break\n\nUse ``cam.get_video_url()`` the same way.\n\nCLI Tool\n~~~~~~~~\nCheckout ``./scripts/carsoncli.py`` for further API implementation examples.\n\nDevelopment Notes\n-----------------\n\nCode Documentation\n~~~~~~~~~~~~~~~~~~\nThe code follow the `Google Python Styleguide <https://google.github.io/styleguide/pyguide.html>`_ for docstring.\n\nGit Branching Strategy\n~~~~~~~~~~~~~~~~~~~~~~\nThis project uses `gitflow <https://nvie.com/posts/a-successful-git-branching-model/>`_ as a git branching model.\n\nOpen Items\n~~~~~~~~~~\nThe following is not supported by the API yet and remains TODO.\n\n- Expose visitor functionality (``/visitors``)\n- Expose thread / messaging functionality (``/threads``)\n- Expose delivery functionality (``/deliveries``)\n- Expose dashboard functionality (``/dashboard``)\n- Expose service functionality (``/service``)\n- Integrate Twilio (``twilio/access-token/``)\n- Expand and extract EagleEye API (into separate project?).\n\n\nCredits && Thanks\n-----------------\n\n* A lot of the project setup and the API object design was inspired / launched off https://github.com/tchellomello/python-ring-doorbell. Saved me a lot of headaches with tox, setuptools and Travis!.\n",
"bugtrack_url": null,
"license": "Apache License 2.0",
"summary": "A Python library to communicate with Carson Living Residences (https://www.carson.live/)",
"version": "2.1.3",
"project_urls": {
"Homepage": "https://github.com/justanz/python-carson-living-testing"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "9a24c9f679391553b8aa51419b05c1059ec998e41a51cf48dbe7b03836b92291",
"md5": "38314169a013441c2d09a87b6a421b10",
"sha256": "abeefcf9f8d73bf52ef2ef00cbc8586054be3e2000b9ccbfb6bef65717263160"
},
"downloads": -1,
"filename": "c_l_testing-2.1.3-py3-none-any.whl",
"has_sig": false,
"md5_digest": "38314169a013441c2d09a87b6a421b10",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
"size": 23119,
"upload_time": "2023-08-27T14:41:41",
"upload_time_iso_8601": "2023-08-27T14:41:41.866469Z",
"url": "https://files.pythonhosted.org/packages/9a/24/c9f679391553b8aa51419b05c1059ec998e41a51cf48dbe7b03836b92291/c_l_testing-2.1.3-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "cbb01e8b1d99fca0bbd671f505dff9248572583db28b5fcdcd850671e1ec3df3",
"md5": "1dd1d0524eddcd04661f7af75659966f",
"sha256": "747395f8289a0924432bc65218649a807f6539e44ae9443cf74c19c76d241a12"
},
"downloads": -1,
"filename": "c_l_testing-2.1.3.tar.gz",
"has_sig": false,
"md5_digest": "1dd1d0524eddcd04661f7af75659966f",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
"size": 24636,
"upload_time": "2023-08-27T14:41:43",
"upload_time_iso_8601": "2023-08-27T14:41:43.754426Z",
"url": "https://files.pythonhosted.org/packages/cb/b0/1e8b1d99fca0bbd671f505dff9248572583db28b5fcdcd850671e1ec3df3/c_l_testing-2.1.3.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-08-27 14:41:43",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "justanz",
"github_project": "python-carson-living-testing",
"travis_ci": true,
"coveralls": true,
"github_actions": false,
"requirements": [],
"tox": true,
"lcname": "c-l-testing"
}