uses my_applications in developer portal to configure callbacks

full_example
Mark Cotton 2023-07-07 16:58:50 -05:00
parent 8e7cdaea77
commit 425a8e5c02
4 changed files with 206 additions and 203 deletions

View File

@ -52,14 +52,15 @@ class EagleEyev3():
"""
self.client_id = settings.client_id
self.client_secret = settings.client_secret
self.server_protocol = settings.server_protocol
self.server_host = settings.server_host
self.server_port = settings.server_port
self.server_path = settings.server_path
# Combine server_protocol, server_host, and server_port to make the redirect_uri
# Note: Please see the note in settings.py about trailing slashes and modify this line if needed
#self.redirect_uri = f"{settings.server_protocol}://{settings.server_host}:{settings.server_port}/login_callback"
self.redirect_uri = f"{settings.server_protocol}://{settings.server_host}:{settings.server_port}/"
self.redirect_uri = f"{self.server_protocol}://{self.server_host}:{self.server_port}/{self.server_path}"
def _save_access_token(self):

View File

@ -1,15 +1,14 @@
# Reach out to api_support@een.com in order to get a client_id, client_secret and to have your redirect_uri whitelisted
# Set up your application and get client id/secrete first
# https://developerv3.eagleeyenetworks.com/page/my-application
client_id = ""
client_secret = ""
# you will need to add approved redirect_uris in your application
# this examples assumes you've added http://127.0.0.1:3333/login_callback
# change the following variables if you did something different
# Note: do not use localhost for server_host, use 127.0.0.1 instead
server_protocol = "http"
server_host = "127.0.0.1" # Do not use 'localhost', use '127.0.0.1' instead
server_host = "127.0.0.1"
server_port = "3333"
# Note:
# This code is not anticipating a trailing slash at the end of the redirect_uri.
# When you submit your URLs to be whitelisted please do not include the trailing slash
# or you can modify the __init__.py file to append the slash on to the redirect_uri
server_path = "login_callback"

View File

@ -88,7 +88,7 @@
{
"data": {
"text/plain": [
"'Demo User - demo@een.com'"
"'Mark Cotton - mcotton@mcottondesign.com'"
]
},
"execution_count": 4,
@ -109,7 +109,7 @@
{
"data": {
"text/plain": [
"'eyJraWQiOiI2ODYxYjBjYS0wZjI2LTExZWQtODYxZC0wMjQyYWMxMjAwMDIiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJjYTBmNjFhYiIsImF1ZCI6InZtcy5hcGkiLCJpc3MiOiJ2bXMuYXV0aC52MSIsInZtc19hY2NvdW50IjoiMDAwMDExMDYiLCJleHAiOjE2ODYyNTAzMTUsImlhdCI6MTY4NTY0NTUxNiwianRpIjoiMjBiMjZjNzc1MGU4YjQ0YTIzZTdhZWVmYWE5ZjlhZTUiLCJjbGllbnRfaWQiOiJQUkVWSUVXLU1BUkstV0VCIiwidm1zX2NsdXN0ZXIiOiJjMDAwIn0.MTBcdMhHfDMM5__dTtKLcEmJESXEGwTvtTFOpeLwFdg55RvC93N-ay3QdHPfgWl7amQS7RZOb0S1BhEuHvbBJa42_AFzGhgbPX5LZP4ghp2CL6Arbf3ehovt59nd9ZzOBVVSopiBQP_YNT7ap_ojUMy43NSd_W0jZ_54Qz6pthmeKXkpYTyYYccZ4X8bzvyJ4MpMR-WGJsTkgVZ8Ln9UxOadTNWHfGWk2eVZ0ZQsB02qj07va2KTlOCrlFlGjW46_1lOXg8ImiJAfdyJRHI7_y0wF7N3dnpXJO5bix-uzgwiC3msrNmDjYnwlD7rvGssq8L-4gi_9UgO1CTVZPuPkw'"
"'eyJraWQiOiI2ODYxYjBjYS0wZjI2LTExZWQtODYxZC0wMjQyYWMxMjAwMDIiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJjYWZlZGVmMiIsImF1ZCI6InZtcy5hcGkiLCJpc3MiOiJ2bXMuYXV0aC52MSIsInZtc19hY2NvdW50IjoiMDAwMjgyMDEiLCJleHAiOjE2ODkzNzA1MTIsImlhdCI6MTY4ODc2NTcxMiwianRpIjoiYTM1Nzk3MmRmNzdiNTAwYTQ3NjBlNGY1MGYwNjNhMjUiLCJjbGllbnRfaWQiOiIzMmRhYzMzMDY0OWI0ODI3OWY5Y2FjYzJiNmY1N2FlNSIsInZtc19jbHVzdGVyIjoiYzAxMiJ9.EEmCaFqduOV5_cQ-VejeBXGbKLj1yHrxGkcMgqPUN1jYY0wR9bO7rkEwQh59Dj-1fr8pKsbrUr6DPDLfkaSIRlxpjdlsEBdzAmoZUpzPUfL9QzJu0C04OJU0gcBh7fwur7L2fMVthaZ6OKfThdM29qzRH5RR9gSAJGeNe08n4IvFVvuL80yvczgOiQwSzkg4PuHpbImDa44U7-qC8CrRvQ_TqsX6ziNzw-XmxZxXEwtZxkAOFDFaIsA8V4ezbQ_TSY6EElCnyyKLLI46-KIsGevx8dxa2NrhPFvC725dMhg-OPaCEF62sOlTrlHVBcv_e9MBk1VZLoDLStkSvU7Dxg'"
]
},
"execution_count": 5,
@ -148,77 +148,10 @@
{
"data": {
"text/plain": [
"[✅ [100544a0] - Amsterdam1,\n",
" ✅ [10102231] - Australia,\n",
" ✅ [100a0565] - Boat Launch PTZ (5MP),\n",
" ✅ [10031d80] - CF1 16th Floor Break Room (4MP),\n",
" ✅ [1003dc62] - CF1 16th Floor Elevator Lobby (2MP),\n",
" ✅ [100eb87d] - CF1 16th Floor Freight Elevator (2MP),\n",
" ✅ [10023191] - CF1 16th Floor Kitchen (4MP),\n",
" ✅ [10013585] - CF1 16th Floor Library (2MP),\n",
" ✅ [1009e1ac] - CF1 16th Floor Lobby Fisheye (10MP),\n",
" ✅ [100be266] - CF1 16th Floor Lockers (2MP),\n",
" ✅ [10079c0f] - CF1 16th Floor Mentor Area,\n",
" ✅ [1007a107] - CF1 16th Floor Metal Room (3MP),\n",
" ✅ [1003fdad] - CF1 16th Floor Network Closet (1MP),\n",
" ✅ [10061445] - CF1 Astro_Boy,\n",
" ✅ [100f881f] - CF1 Dedicated Desks,\n",
" ✅ [100b4012] - CF1 Green Room (2MP),\n",
" ✅ [100f7041] - CF1 Lobby Center (2MP),\n",
" ✅ [10004d85] - CF1 Lobby Fisheye (5MP),\n",
" ✅ [10005281] - CF1 Lobby Reception (4MP),\n",
" ✅ [10095a7f] - CF1 Lobby Right (2MP),\n",
" ✅ [1007ab35] - CF1 North Office (2MP),\n",
" ✅ [1007e158] - CF1 Open Work Space 1 (1MP),\n",
" ✅ [1009ead6] - CF1 Open Work Space 2 (2MP),\n",
" ✅ [100baf8b] - CF1 Open Work Space 3 (2MP),\n",
" ✅ [10079cc5] - CF1 Podcast Studio (1MP),\n",
" ✅ [1003a079] - CF1 Rear Exit (1MP),\n",
" ✅ [100530a8] - CF1 Thermal Station,\n",
" ✅ [10058b7a] - CF1 Thermal Station Color View,\n",
" ✅ [10099857] - CF2 1st Floor Closet (1MP),\n",
" ✅ [1004549e] - CF2 1st Floor Exit (1MP),\n",
" ✅ [10107a26] - CF2 1st Floor Hallway (1MP),\n",
" ✅ [1001870e] - CF2 1st Floor Network Closet 1 (1MP),\n",
" ✅ [10083f1d] - CF2 1st Floor Term Exit (1MP),\n",
" ✅ [10032e17] - CF2 BB8 Back,\n",
" ✅ [100916ba] - CF2 Beer Robot (1MP),\n",
" ✅ [1006c703] - CF2 Device Lab (1MP),\n",
" ✅ [10035428] - CF2 Elevator Lobby 1 (4MP),\n",
" ✅ [10002b34] - CF2 Elevator Lobby 2 (2MP),\n",
" ✅ [1002737c] - CF2 Entrance (Fisheye) (5MP),\n",
" ✅ [1000881c] - CF2 Freight Elevator (1MP),\n",
" ✅ [1000cdc9] - CF2 Game Room (1MP),\n",
" ✅ [10051ab9] - CF2 Johnny-Five Room (1MP),\n",
" ✅ [1002931e] - CF2 Main Entrance (1MP),\n",
" ✅ [100e25eb] - CF2 Mobility Room (1MP),\n",
" ✅ [10035320] - CF2 Network Closet (1MP),\n",
" ✅ [10058b99] - CF2 Network Closet 2 (1MP),\n",
" ✅ [100ab69f] - CF2 Retail,\n",
" ✅ [1008ed00] - CF2 Retail Entrance,\n",
" ✅ [100254d4] - CF2 Retail Inventory,\n",
" ✅ [10104a9a] - CF2 Robo Cop Room Side Door (4MP),\n",
" ✅ [100abbbf] - CF2 Shared Workspace (1MP),\n",
" ✅ [1004d2cc] - CF2 Stage (1MP),\n",
" ✅ [1002d41b] - CF2 Terminator Room (1MP),\n",
" ✅ [10102f00] - CF2 VR Lab (4MP),\n",
" ✅ [10057197] - CF2 VR Lab Entrance (1MP),\n",
" ✅ [10001523] - CF3 Entry Drive (2MP),\n",
" ✅ [100cd8e3] - CF3 Lobby Overhead (1MP),\n",
" ✅ [10099a4e] - CF4 1st Floor Elevator (1MP),\n",
" ✅ [1004de41] - Chidori Marine Service(Mt.Fuji),\n",
" ✅ [100e0d6e] - Display Station View,\n",
" ✅ [100d4c42] - EEN HQ Entrance LPR,\n",
" ✅ [100ca645] - HD-TVI Encoder (Channel 3),\n",
" ✅ [1009d55a] - Hikvision PTZ,\n",
" ✅ [1001cdde] - JB1 Bay2 (2MP),\n",
" ✅ [1005a220] - JB1 hallway (1MP),\n",
" ✅ [1001c44b] - JB1 Lobby (2MP),\n",
" ✅ [1006e5ac] - Lagos - Avigilon PTZ,\n",
" ✅ [100e0fa0] - Malaysia,\n",
" ✅ [1009f383] - Parking,\n",
" ✅ [1002cc03] - 店内,\n",
" ✅ [1006242c] - 桟橋側]"
"[✅ [1001423e] - ATM & Wine,\n",
" ✅ [100d8666] - Cash Register,\n",
" ✅ [10012735] - Fuel Dock,\n",
" ✅ [1002584c] - Safe]"
]
},
"execution_count": 7,
@ -233,24 +166,17 @@
{
"cell_type": "code",
"execution_count": 8,
"id": "ad33bf2a-ea36-4ec1-8335-8a44089f5f7e",
"id": "f4c6fe67",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[ [1001e8e4] - CF4 East Hall (1MP),\n",
" [10079be3] - CF4 North East Hall (1MP),\n",
" [10081317] - CF4 West Hall (1MP),\n",
" [1007e81e] - EE ST01 Thermal Camera (1MP),\n",
" [100ac28e] - HD-TVI Encoder,\n",
" [100e1e7d] - JB3 Customer Area (SD),\n",
" [10097da5] - JB3 Dough Machine (SD),\n",
" [100a5bc2] - JB3 Make Line (SD),\n",
" [1001c49e] - JB3 Prep Area Mixer (SD),\n",
" [1002129c] - SAM1 Showroom (1MP),\n",
" ❌ [100d6e2a] - zz_Example of Camera Offline,\n",
" [10106a81] - zz_Example of Camera turned off]"
"[ [10090759] - Benny Camera,\n",
" [1003e10b] - Driveway,\n",
" [100ba388] - Front Door,\n",
" [100b7b3b] - Max Camera,\n",
" [1009ae55] - Office]"
]
},
"execution_count": 8,
@ -262,46 +188,6 @@
"[i for i in een.cameras if not i.is_online()]"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "f4c6fe67",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[ [1001e8e4] - CF4 East Hall (1MP),\n",
" [10079be3] - CF4 North East Hall (1MP),\n",
" [10081317] - CF4 West Hall (1MP),\n",
" [1007e81e] - EE ST01 Thermal Camera (1MP),\n",
" [100ac28e] - HD-TVI Encoder,\n",
" [100e1e7d] - JB3 Customer Area (SD),\n",
" [10097da5] - JB3 Dough Machine (SD),\n",
" [100a5bc2] - JB3 Make Line (SD),\n",
" [1001c49e] - JB3 Prep Area Mixer (SD),\n",
" [1002129c] - SAM1 Showroom (1MP),\n",
" ❌ [100d6e2a] - zz_Example of Camera Offline,\n",
" [10106a81] - zz_Example of Camera turned off]"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"[i for i in een.cameras if not i.is_online()]"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "b0ec786b-ed07-4486-a4d7-a7483e5a02ce",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "8c140aaf-766f-4255-94ef-199d17cbc7a6",
@ -312,7 +198,7 @@
},
{
"cell_type": "code",
"execution_count": 10,
"execution_count": 9,
"id": "74e78ee1-33b8-4a88-9d23-cd6281603a5b",
"metadata": {},
"outputs": [
@ -320,7 +206,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
"2023-06-01T13:54:01.906-05:00 2023-06-01T07:54:01.906-05:00\n"
"2023-07-07T16:41:31.990-05:00 2023-07-07T10:41:31.990-05:00\n"
]
}
],
@ -335,47 +221,9 @@
"metadata": {
"scrolled": true
},
"outputs": [
{
"ename": "ConnectionError",
"evalue": "HTTPSConnectionPool(host='api.c000.eagleeyenetworks.com', port=443): Max retries exceeded with url: /api/v3.0/events?pageSize=100&include=data.een.deviceCloudStatusUpdate.v1&startTimestamp__gte=2023-05-31T08:03:00.602-05:00&endTimestamp__lte=2023-05-31T14:03:00.602-05:00&actor=camera%3A10031d80 (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x7f8db4097280>: Failed to establish a new connection: [Errno 111] Connection refused'))",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mConnectionRefusedError\u001b[0m Traceback (most recent call last)",
"File \u001b[0;32m~/.virtualenvs/cls/lib/python3.8/site-packages/urllib3/connection.py:158\u001b[0m, in \u001b[0;36mHTTPConnection._new_conn\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 157\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 158\u001b[0m conn \u001b[38;5;241m=\u001b[39m \u001b[43mconnection\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcreate_connection\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 159\u001b[0m \u001b[43m \u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_dns_host\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mport\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtimeout\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mextra_kw\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 161\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m SocketTimeout:\n",
"File \u001b[0;32m~/.virtualenvs/cls/lib/python3.8/site-packages/urllib3/util/connection.py:80\u001b[0m, in \u001b[0;36mcreate_connection\u001b[0;34m(address, timeout, source_address, socket_options)\u001b[0m\n\u001b[1;32m 79\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m err \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m---> 80\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m err\n\u001b[1;32m 82\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m socket\u001b[38;5;241m.\u001b[39merror(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mgetaddrinfo returns an empty list\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n",
"File \u001b[0;32m~/.virtualenvs/cls/lib/python3.8/site-packages/urllib3/util/connection.py:70\u001b[0m, in \u001b[0;36mcreate_connection\u001b[0;34m(address, timeout, source_address, socket_options)\u001b[0m\n\u001b[1;32m 69\u001b[0m sock\u001b[38;5;241m.\u001b[39mbind(source_address)\n\u001b[0;32m---> 70\u001b[0m \u001b[43msock\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconnect\u001b[49m\u001b[43m(\u001b[49m\u001b[43msa\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 71\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m sock\n",
"\u001b[0;31mConnectionRefusedError\u001b[0m: [Errno 111] Connection refused",
"\nDuring handling of the above exception, another exception occurred:\n",
"\u001b[0;31mNewConnectionError\u001b[0m Traceback (most recent call last)",
"File \u001b[0;32m~/.virtualenvs/cls/lib/python3.8/site-packages/urllib3/connectionpool.py:597\u001b[0m, in \u001b[0;36mHTTPConnectionPool.urlopen\u001b[0;34m(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)\u001b[0m\n\u001b[1;32m 596\u001b[0m \u001b[38;5;66;03m# Make the request on the httplib connection object.\u001b[39;00m\n\u001b[0;32m--> 597\u001b[0m httplib_response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_make_request\u001b[49m\u001b[43m(\u001b[49m\u001b[43mconn\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 598\u001b[0m \u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtimeout_obj\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 599\u001b[0m \u001b[43m \u001b[49m\u001b[43mbody\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mbody\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mheaders\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mheaders\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 600\u001b[0m \u001b[43m \u001b[49m\u001b[43mchunked\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mchunked\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 602\u001b[0m \u001b[38;5;66;03m# If we're going to release the connection in ``finally:``, then\u001b[39;00m\n\u001b[1;32m 603\u001b[0m \u001b[38;5;66;03m# the response doesn't need to know about the connection. Otherwise\u001b[39;00m\n\u001b[1;32m 604\u001b[0m \u001b[38;5;66;03m# it will also try to release it and we'll have a double-release\u001b[39;00m\n\u001b[1;32m 605\u001b[0m \u001b[38;5;66;03m# mess.\u001b[39;00m\n",
"File \u001b[0;32m~/.virtualenvs/cls/lib/python3.8/site-packages/urllib3/connectionpool.py:343\u001b[0m, in \u001b[0;36mHTTPConnectionPool._make_request\u001b[0;34m(self, conn, method, url, timeout, chunked, **httplib_request_kw)\u001b[0m\n\u001b[1;32m 342\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 343\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_validate_conn\u001b[49m\u001b[43m(\u001b[49m\u001b[43mconn\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 344\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m (SocketTimeout, BaseSSLError) \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 345\u001b[0m \u001b[38;5;66;03m# Py2 raises this as a BaseSSLError, Py3 raises it as socket timeout.\u001b[39;00m\n",
"File \u001b[0;32m~/.virtualenvs/cls/lib/python3.8/site-packages/urllib3/connectionpool.py:839\u001b[0m, in \u001b[0;36mHTTPSConnectionPool._validate_conn\u001b[0;34m(self, conn)\u001b[0m\n\u001b[1;32m 838\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mgetattr\u001b[39m(conn, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124msock\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m): \u001b[38;5;66;03m# AppEngine might not have `.sock`\u001b[39;00m\n\u001b[0;32m--> 839\u001b[0m \u001b[43mconn\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconnect\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 841\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m conn\u001b[38;5;241m.\u001b[39mis_verified:\n",
"File \u001b[0;32m~/.virtualenvs/cls/lib/python3.8/site-packages/urllib3/connection.py:301\u001b[0m, in \u001b[0;36mVerifiedHTTPSConnection.connect\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 299\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mconnect\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[1;32m 300\u001b[0m \u001b[38;5;66;03m# Add certificate verification\u001b[39;00m\n\u001b[0;32m--> 301\u001b[0m conn \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_new_conn\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 302\u001b[0m hostname \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhost\n",
"File \u001b[0;32m~/.virtualenvs/cls/lib/python3.8/site-packages/urllib3/connection.py:167\u001b[0m, in \u001b[0;36mHTTPConnection._new_conn\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 166\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m SocketError \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[0;32m--> 167\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m NewConnectionError(\n\u001b[1;32m 168\u001b[0m \u001b[38;5;28mself\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mFailed to establish a new connection: \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;241m%\u001b[39m e)\n\u001b[1;32m 170\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m conn\n",
"\u001b[0;31mNewConnectionError\u001b[0m: <urllib3.connection.VerifiedHTTPSConnection object at 0x7f8db4097280>: Failed to establish a new connection: [Errno 111] Connection refused",
"\nDuring handling of the above exception, another exception occurred:\n",
"\u001b[0;31mMaxRetryError\u001b[0m Traceback (most recent call last)",
"File \u001b[0;32m~/.virtualenvs/cls/lib/python3.8/site-packages/requests/adapters.py:486\u001b[0m, in \u001b[0;36mHTTPAdapter.send\u001b[0;34m(self, request, stream, timeout, verify, cert, proxies)\u001b[0m\n\u001b[1;32m 485\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 486\u001b[0m resp \u001b[38;5;241m=\u001b[39m \u001b[43mconn\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43murlopen\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 487\u001b[0m \u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 488\u001b[0m \u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 489\u001b[0m \u001b[43m \u001b[49m\u001b[43mbody\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbody\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 490\u001b[0m \u001b[43m \u001b[49m\u001b[43mheaders\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mheaders\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 491\u001b[0m \u001b[43m \u001b[49m\u001b[43mredirect\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 492\u001b[0m \u001b[43m \u001b[49m\u001b[43massert_same_host\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 493\u001b[0m \u001b[43m \u001b[49m\u001b[43mpreload_content\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 494\u001b[0m \u001b[43m \u001b[49m\u001b[43mdecode_content\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 495\u001b[0m \u001b[43m \u001b[49m\u001b[43mretries\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmax_retries\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 496\u001b[0m \u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtimeout\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 497\u001b[0m \u001b[43m \u001b[49m\u001b[43mchunked\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mchunked\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 498\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 500\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m (ProtocolError, \u001b[38;5;167;01mOSError\u001b[39;00m) \u001b[38;5;28;01mas\u001b[39;00m err:\n",
"File \u001b[0;32m~/.virtualenvs/cls/lib/python3.8/site-packages/urllib3/connectionpool.py:637\u001b[0m, in \u001b[0;36mHTTPConnectionPool.urlopen\u001b[0;34m(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)\u001b[0m\n\u001b[1;32m 635\u001b[0m e \u001b[38;5;241m=\u001b[39m ProtocolError(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mConnection aborted.\u001b[39m\u001b[38;5;124m'\u001b[39m, e)\n\u001b[0;32m--> 637\u001b[0m retries \u001b[38;5;241m=\u001b[39m \u001b[43mretries\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mincrement\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43merror\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43me\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m_pool\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 638\u001b[0m \u001b[43m \u001b[49m\u001b[43m_stacktrace\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msys\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mexc_info\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m2\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 639\u001b[0m retries\u001b[38;5;241m.\u001b[39msleep()\n",
"File \u001b[0;32m~/.virtualenvs/cls/lib/python3.8/site-packages/urllib3/util/retry.py:399\u001b[0m, in \u001b[0;36mRetry.increment\u001b[0;34m(self, method, url, response, error, _pool, _stacktrace)\u001b[0m\n\u001b[1;32m 398\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m new_retry\u001b[38;5;241m.\u001b[39mis_exhausted():\n\u001b[0;32m--> 399\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m MaxRetryError(_pool, url, error \u001b[38;5;129;01mor\u001b[39;00m ResponseError(cause))\n\u001b[1;32m 401\u001b[0m log\u001b[38;5;241m.\u001b[39mdebug(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mIncremented Retry for (url=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m): \u001b[39m\u001b[38;5;132;01m%r\u001b[39;00m\u001b[38;5;124m\"\u001b[39m, url, new_retry)\n",
"\u001b[0;31mMaxRetryError\u001b[0m: HTTPSConnectionPool(host='api.c000.eagleeyenetworks.com', port=443): Max retries exceeded with url: /api/v3.0/events?pageSize=100&include=data.een.deviceCloudStatusUpdate.v1&startTimestamp__gte=2023-05-31T08:03:00.602-05:00&endTimestamp__lte=2023-05-31T14:03:00.602-05:00&actor=camera%3A10031d80 (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x7f8db4097280>: Failed to establish a new connection: [Errno 111] Connection refused'))",
"\nDuring handling of the above exception, another exception occurred:\n",
"\u001b[0;31mConnectionError\u001b[0m Traceback (most recent call last)",
"Cell \u001b[0;32mIn[11], line 5\u001b[0m\n\u001b[1;32m 2\u001b[0m ts \u001b[38;5;241m=\u001b[39m een\u001b[38;5;241m.\u001b[39mtime_now()\n\u001b[1;32m 4\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m cam \u001b[38;5;129;01min\u001b[39;00m een\u001b[38;5;241m.\u001b[39mcameras:\n\u001b[0;32m----> 5\u001b[0m blah \u001b[38;5;241m=\u001b[39m \u001b[43mcam\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_list_of_events\u001b[49m\u001b[43m(\u001b[49m\u001b[43mend_timestamp\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43meen\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtime_before\u001b[49m\u001b[43m(\u001b[49m\u001b[43mts\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mts\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mhours\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m6\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mi\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m\\\u001b[49m\n\u001b[1;32m 6\u001b[0m \u001b[43m \u001b[49m\u001b[43mstart_timestamp\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43meen\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtime_before\u001b[49m\u001b[43m(\u001b[49m\u001b[43mts\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mts\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mhours\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m6\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mi\u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n",
"File \u001b[0;32m~/dev/een/EagleEyev3/EagleEyev3/__init__.py:496\u001b[0m, in \u001b[0;36mCamera.get_list_of_events\u001b[0;34m(self, start_timestamp, end_timestamp)\u001b[0m\n\u001b[1;32m 489\u001b[0m url \u001b[38;5;241m=\u001b[39m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mhttps://\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39muser_base_url\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m/api/v3.0/events?pageSize=100&include=data.een.deviceCloudStatusUpdate.v1&startTimestamp__gte=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mstart_timestamp\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m&endTimestamp__lte=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mend_timestamp\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m&actor=camera%3A\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mid\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 491\u001b[0m headers \u001b[38;5;241m=\u001b[39m { \n\u001b[1;32m 492\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mAuthorization\u001b[39m\u001b[38;5;124m\"\u001b[39m: \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mBearer \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39meen_instance\u001b[38;5;241m.\u001b[39maccess_token\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m, \n\u001b[1;32m 493\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mAccept\u001b[39m\u001b[38;5;124m\"\u001b[39m: \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mapplication/json\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 494\u001b[0m }\n\u001b[0;32m--> 496\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[43mrequests\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mheaders\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mheaders\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 497\u001b[0m response_json \u001b[38;5;241m=\u001b[39m response\u001b[38;5;241m.\u001b[39mjson()\n\u001b[1;32m 499\u001b[0m logging\u001b[38;5;241m.\u001b[39mdebug(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mresponse\u001b[38;5;241m.\u001b[39mstatus_code\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m returned from \u001b[39m\u001b[38;5;132;01m{\u001b[39;00murl\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m with \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mheaders\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n",
"File \u001b[0;32m~/.virtualenvs/cls/lib/python3.8/site-packages/requests/api.py:73\u001b[0m, in \u001b[0;36mget\u001b[0;34m(url, params, **kwargs)\u001b[0m\n\u001b[1;32m 62\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mget\u001b[39m(url, params\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 63\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124mr\u001b[39m\u001b[38;5;124;03m\"\"\"Sends a GET request.\u001b[39;00m\n\u001b[1;32m 64\u001b[0m \n\u001b[1;32m 65\u001b[0m \u001b[38;5;124;03m :param url: URL for the new :class:`Request` object.\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 70\u001b[0m \u001b[38;5;124;03m :rtype: requests.Response\u001b[39;00m\n\u001b[1;32m 71\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m---> 73\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mrequest\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mget\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparams\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mparams\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
"File \u001b[0;32m~/.virtualenvs/cls/lib/python3.8/site-packages/requests/api.py:59\u001b[0m, in \u001b[0;36mrequest\u001b[0;34m(method, url, **kwargs)\u001b[0m\n\u001b[1;32m 55\u001b[0m \u001b[38;5;66;03m# By using the 'with' statement we are sure the session is closed, thus we\u001b[39;00m\n\u001b[1;32m 56\u001b[0m \u001b[38;5;66;03m# avoid leaving sockets open which can trigger a ResourceWarning in some\u001b[39;00m\n\u001b[1;32m 57\u001b[0m \u001b[38;5;66;03m# cases, and look like a memory leak in others.\u001b[39;00m\n\u001b[1;32m 58\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m sessions\u001b[38;5;241m.\u001b[39mSession() \u001b[38;5;28;01mas\u001b[39;00m session:\n\u001b[0;32m---> 59\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43msession\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmethod\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
"File \u001b[0;32m~/.virtualenvs/cls/lib/python3.8/site-packages/requests/sessions.py:589\u001b[0m, in \u001b[0;36mSession.request\u001b[0;34m(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)\u001b[0m\n\u001b[1;32m 584\u001b[0m send_kwargs \u001b[38;5;241m=\u001b[39m {\n\u001b[1;32m 585\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtimeout\u001b[39m\u001b[38;5;124m\"\u001b[39m: timeout,\n\u001b[1;32m 586\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mallow_redirects\u001b[39m\u001b[38;5;124m\"\u001b[39m: allow_redirects,\n\u001b[1;32m 587\u001b[0m }\n\u001b[1;32m 588\u001b[0m send_kwargs\u001b[38;5;241m.\u001b[39mupdate(settings)\n\u001b[0;32m--> 589\u001b[0m resp \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msend\u001b[49m\u001b[43m(\u001b[49m\u001b[43mprep\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43msend_kwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 591\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m resp\n",
"File \u001b[0;32m~/.virtualenvs/cls/lib/python3.8/site-packages/requests/sessions.py:703\u001b[0m, in \u001b[0;36mSession.send\u001b[0;34m(self, request, **kwargs)\u001b[0m\n\u001b[1;32m 700\u001b[0m start \u001b[38;5;241m=\u001b[39m preferred_clock()\n\u001b[1;32m 702\u001b[0m \u001b[38;5;66;03m# Send the request\u001b[39;00m\n\u001b[0;32m--> 703\u001b[0m r \u001b[38;5;241m=\u001b[39m \u001b[43madapter\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msend\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 705\u001b[0m \u001b[38;5;66;03m# Total elapsed time of the request (approximately)\u001b[39;00m\n\u001b[1;32m 706\u001b[0m elapsed \u001b[38;5;241m=\u001b[39m preferred_clock() \u001b[38;5;241m-\u001b[39m start\n",
"File \u001b[0;32m~/.virtualenvs/cls/lib/python3.8/site-packages/requests/adapters.py:519\u001b[0m, in \u001b[0;36mHTTPAdapter.send\u001b[0;34m(self, request, stream, timeout, verify, cert, proxies)\u001b[0m\n\u001b[1;32m 515\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(e\u001b[38;5;241m.\u001b[39mreason, _SSLError):\n\u001b[1;32m 516\u001b[0m \u001b[38;5;66;03m# This branch is for urllib3 v1.22 and later.\u001b[39;00m\n\u001b[1;32m 517\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m SSLError(e, request\u001b[38;5;241m=\u001b[39mrequest)\n\u001b[0;32m--> 519\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mConnectionError\u001b[39;00m(e, request\u001b[38;5;241m=\u001b[39mrequest)\n\u001b[1;32m 521\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m ClosedPoolError \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 522\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mConnectionError\u001b[39;00m(e, request\u001b[38;5;241m=\u001b[39mrequest)\n",
"\u001b[0;31mConnectionError\u001b[0m: HTTPSConnectionPool(host='api.c000.eagleeyenetworks.com', port=443): Max retries exceeded with url: /api/v3.0/events?pageSize=100&include=data.een.deviceCloudStatusUpdate.v1&startTimestamp__gte=2023-05-31T08:03:00.602-05:00&endTimestamp__lte=2023-05-31T14:03:00.602-05:00&actor=camera%3A10031d80 (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x7f8db4097280>: Failed to establish a new connection: [Errno 111] Connection refused'))"
]
}
],
"outputs": [],
"source": [
"for i in range(0,20):\n",
"for i in range(0,4):\n",
" ts = een.time_now()\n",
"\n",
" for cam in een.cameras:\n",
@ -385,30 +233,185 @@
},
{
"cell_type": "code",
"execution_count": null,
"execution_count": 12,
"id": "13809cc7-9ec2-4e15-9495-e64feaecca6d",
"metadata": {},
"outputs": [],
"outputs": [
{
"data": {
"text/plain": [
"18"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(een.cameras[2].events['status'])"
]
},
{
"cell_type": "code",
"execution_count": null,
"execution_count": 13,
"id": "67d4f79b-2b43-4bdb-9068-28ac9d8d921c",
"metadata": {},
"outputs": [],
"outputs": [
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(een.cameras[0].events['motion'])"
]
},
{
"cell_type": "code",
"execution_count": null,
"execution_count": 14,
"id": "8be8d503-b46d-4ba7-884e-2c21c3987129",
"metadata": {},
"outputs": [],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ATM & Wine - 2023-07-07T18:49:29.664+00:00 - deviceOffline \n",
"ATM & Wine - 2023-07-07T18:48:51.444+00:00 - error \n",
"ATM & Wine - 2023-07-07T16:22:04.146+00:00 - online \n",
"ATM & Wine - 2023-07-07T16:21:41.960+00:00 - deviceOffline \n",
"ATM & Wine - 2023-07-07T16:18:16.383+00:00 - error \n",
"ATM & Wine - 2023-07-07T16:16:31.511+00:00 - deviceOffline \n",
"ATM & Wine - 2023-07-07T16:15:57.174+00:00 - error \n",
"ATM & Wine - 2023-07-07T15:44:21.759+00:00 - online \n",
"ATM & Wine - 2023-07-07T15:41:31.997+00:00 - online \n",
"ATM & Wine - 2023-07-07T12:46:47.672+00:00 - bridgeOffline \n",
"ATM & Wine - 2023-07-07T11:24:46.454+00:00 - online \n",
"ATM & Wine - 2023-07-07T11:22:37.461+00:00 - deviceOffline \n",
"ATM & Wine - 2023-07-07T11:21:59.127+00:00 - error \n",
"ATM & Wine - 2023-07-07T09:44:24.462+00:00 - online \n",
"ATM & Wine - 2023-07-07T09:41:33.395+00:00 - online \n",
"ATM & Wine - 2023-07-07T06:00:38.322+00:00 - deviceOffline \n",
"ATM & Wine - 2023-07-07T06:00:00.175+00:00 - error \n",
"ATM & Wine - 2023-07-07T04:07:20.003+00:00 - online \n",
"ATM & Wine - 2023-07-07T04:05:21.238+00:00 - deviceOffline \n",
"ATM & Wine - 2023-07-07T04:04:42.160+00:00 - error \n",
"ATM & Wine - 2023-07-07T03:44:26.904+00:00 - online \n",
"ATM & Wine - 2023-07-07T03:41:56.630+00:00 - online \n",
"ATM & Wine - 2023-07-07T01:48:05.792+00:00 - deviceOffline \n",
"ATM & Wine - 2023-07-07T01:47:35.155+00:00 - error \n",
"ATM & Wine - 2023-07-06T23:19:05.335+00:00 - online \n",
"ATM & Wine - 2023-07-06T23:16:58.926+00:00 - deviceOffline \n",
"ATM & Wine - 2023-07-06T23:16:28.421+00:00 - error \n",
"ATM & Wine - 2023-07-06T23:10:32.790+00:00 - deviceOffline \n",
"ATM & Wine - 2023-07-06T21:44:28.864+00:00 - online \n",
"ATM & Wine - 2023-07-06T21:41:57.860+00:00 - online \n",
"ATM & Wine - 2023-07-06T20:08:47.208+00:00 - deviceOffline \n",
"ATM & Wine - 2023-07-06T20:08:16.933+00:00 - error \n",
"ATM & Wine - 2023-07-06T20:03:05.801+00:00 - online \n",
"ATM & Wine - 2023-07-06T20:02:43.659+00:00 - deviceOffline \n",
"ATM & Wine - 2023-07-06T20:01:41.457+00:00 - error \n",
"ATM & Wine - 2023-07-06T19:59:57.405+00:00 - deviceOffline \n",
"ATM & Wine - 2023-07-06T19:59:24.184+00:00 - error \n",
"ATM & Wine - 2023-07-06T19:31:55.867+00:00 - online \n",
"ATM & Wine - 2023-07-06T19:29:46.708+00:00 - deviceOffline \n",
"ATM & Wine - 2023-07-06T19:29:16.013+00:00 - error \n",
"ATM & Wine - 2023-07-06T18:24:27.389+00:00 - online \n",
"ATM & Wine - 2023-07-06T18:22:22.328+00:00 - deviceOffline \n",
"ATM & Wine - 2023-07-06T18:21:52.102+00:00 - error \n",
"ATM & Wine - 2023-07-06T15:52:12.759+00:00 - online \n",
"ATM & Wine - 2023-07-06T15:50:09.509+00:00 - deviceOffline \n",
"ATM & Wine - 2023-07-06T15:49:39.152+00:00 - error \n",
"ATM & Wine - 2023-07-06T15:41:58.888+00:00 - online \n",
"ATM & Wine - 2023-07-06T15:11:05.317+00:00 - deviceOffline \n",
"ATM & Wine - 2023-07-06T15:10:35.056+00:00 - error \n",
"ATM & Wine - 2023-07-06T14:59:51.787+00:00 - online \n",
"ATM & Wine - 2023-07-06T14:58:55.970+00:00 - bridgeOffline \n",
"ATM & Wine - 2023-07-06T14:58:40.967+00:00 - deviceOffline \n",
"ATM & Wine - 2023-07-06T12:58:36.884+00:00 - online \n",
"ATM & Wine - 2023-07-06T12:56:38.478+00:00 - deviceOffline \n",
"ATM & Wine - 2023-07-06T12:56:07.792+00:00 - error \n",
"ATM & Wine - 2023-07-06T12:49:42.742+00:00 - online \n",
"ATM & Wine - 2023-07-06T12:47:32.312+00:00 - deviceOffline \n",
"ATM & Wine - 2023-07-06T12:47:01.925+00:00 - error \n",
"ATM & Wine - 2023-07-06T11:40:03.505+00:00 - online \n",
"ATM & Wine - 2023-07-06T11:38:03.703+00:00 - deviceOffline \n",
"ATM & Wine - 2023-07-06T11:37:23.038+00:00 - error \n",
"ATM & Wine - 2023-07-06T11:31:52.611+00:00 - online \n",
"ATM & Wine - 2023-07-06T11:29:42.541+00:00 - deviceOffline \n",
"ATM & Wine - 2023-07-06T11:29:08.199+00:00 - error \n",
"ATM & Wine - 2023-07-06T09:42:01.013+00:00 - online \n",
"ATM & Wine - 2023-07-06T09:38:38.302+00:00 - deviceOffline \n",
"ATM & Wine - 2023-07-06T09:38:07.937+00:00 - error \n",
"ATM & Wine - 2023-07-06T08:31:02.432+00:00 - online \n",
"ATM & Wine - 2023-07-06T08:28:53.086+00:00 - deviceOffline \n",
"ATM & Wine - 2023-07-06T08:28:22.667+00:00 - error \n",
"ATM & Wine - 2023-07-06T04:07:10.931+00:00 - online \n",
"ATM & Wine - 2023-07-06T04:05:11.397+00:00 - deviceOffline \n",
"ATM & Wine - 2023-07-06T04:04:38.124+00:00 - error \n",
"ATM & Wine - 2023-07-06T03:43:19.799+00:00 - online \n",
"ATM & Wine - 2023-07-06T02:15:51.335+00:00 - deviceOffline \n",
"ATM & Wine - 2023-07-06T02:15:19.584+00:00 - error \n",
"ATM & Wine - 2023-07-05T21:43:39.111+00:00 - online \n",
"ATM & Wine - 2023-07-05T18:35:23.024+00:00 - deviceOffline \n",
"ATM & Wine - 2023-07-05T18:34:44.881+00:00 - error \n",
"ATM & Wine - 2023-07-05T17:13:14.356+00:00 - online \n",
"ATM & Wine - 2023-07-05T17:11:09.341+00:00 - deviceOffline \n",
"ATM & Wine - 2023-07-05T17:10:29.222+00:00 - error \n",
"ATM & Wine - 2023-07-05T15:43:44.544+00:00 - online \n",
"ATM & Wine - 2023-07-05T15:33:04.629+00:00 - deviceOffline \n",
"ATM & Wine - 2023-07-05T15:32:34.148+00:00 - error \n",
"ATM & Wine - 2023-07-05T15:13:36.151+00:00 - online \n",
"ATM & Wine - 2023-07-05T15:11:33.954+00:00 - deviceOffline \n",
"ATM & Wine - 2023-07-05T15:10:54.632+00:00 - error \n",
"ATM & Wine - 2023-07-05T14:24:50.082+00:00 - online \n",
"ATM & Wine - 2023-07-05T14:22:50.393+00:00 - deviceOffline \n",
"ATM & Wine - 2023-07-05T14:22:12.040+00:00 - error \n",
"ATM & Wine - 2023-07-05T14:02:42.746+00:00 - online \n",
"ATM & Wine - 2023-07-05T14:00:34.085+00:00 - deviceOffline \n",
"ATM & Wine - 2023-07-05T13:59:55.709+00:00 - error \n",
"ATM & Wine - 2023-07-05T10:43:54.157+00:00 - online \n",
"ATM & Wine - 2023-07-05T10:41:56.025+00:00 - deviceOffline \n",
"ATM & Wine - 2023-07-05T10:41:23.556+00:00 - error \n",
"ATM & Wine - 2023-07-05T10:10:27.404+00:00 - online \n",
"ATM & Wine - 2023-07-05T10:08:19.943+00:00 - deviceOffline \n",
"ATM & Wine - 2023-07-05T10:07:50.455+00:00 - error \n",
"ATM & Wine - 2023-07-05T09:44:11.782+00:00 - online \n",
"Cash Register - 2023-07-07T20:02:49.237+00:00 - bridgeOffline \n",
"Cash Register - 2023-07-07T20:02:31.354+00:00 - deviceOffline \n",
"Cash Register - 2023-07-07T16:01:54.202+00:00 - online \n",
"Cash Register - 2023-07-07T16:01:52.891+00:00 - bridgeOffline \n",
"Cash Register - 2023-07-07T15:44:21.759+00:00 - online \n",
"Cash Register - 2023-07-07T15:41:31.997+00:00 - online \n",
"Cash Register - 2023-07-06T23:01:59.550+00:00 - bridgeOffline \n",
"Cash Register - 2023-07-06T21:44:28.864+00:00 - online \n",
"Cash Register - 2023-07-06T21:41:57.860+00:00 - online \n",
"Cash Register - 2023-07-06T14:58:55.385+00:00 - bridgeOffline \n",
"Cash Register - 2023-07-06T14:58:40.382+00:00 - deviceOffline \n",
"Cash Register - 2023-07-06T10:01:40.245+00:00 - online \n",
"Cash Register - 2023-07-06T10:01:39.158+00:00 - bridgeOffline \n",
"Cash Register - 2023-07-06T09:42:01.013+00:00 - online \n",
"Cash Register - 2023-07-05T20:06:43.349+00:00 - bridgeOffline \n",
"Cash Register - 2023-07-05T18:01:54.584+00:00 - online \n",
"Cash Register - 2023-07-05T18:01:53.582+00:00 - bridgeOffline \n",
"Cash Register - 2023-07-05T15:43:44.544+00:00 - online \n",
"Safe - 2023-07-06T14:58:55.537+00:00 - bridgeOffline \n",
"Safe - 2023-07-06T14:58:40.535+00:00 - deviceOffline \n",
"Safe - 2023-07-06T09:42:01.013+00:00 - online \n",
"Safe - 2023-07-06T07:27:05.695+00:00 - bridgeOffline \n",
"Safe - 2023-07-06T03:43:19.799+00:00 - online \n",
"Safe - 2023-07-06T02:05:12.252+00:00 - bridgeOffline \n",
"Safe - 2023-07-05T21:43:39.111+00:00 - online \n"
]
}
],
"source": [
"for cam in een.cameras:\n",
" for i in cam.events['status']:\n",
@ -422,6 +425,14 @@
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "d8a69185-54cc-4c74-9c9b-a807e601be83",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
@ -440,7 +451,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.10"
"version": "3.11.3"
}
},
"nbformat": 4,

View File

@ -9,32 +9,24 @@ app = Flask(__name__)
@app.route('/')
def index():
# This is getting the ?code= querystring value from the HTTP request.
code = request.args.get('code')
# this is here until api_support updates to use the /login_callback
if (code):
oauth_object = een.login_tokens(code)
return oauth_object
#return f"Hello {een.current_user['firstName']} {een.current_user['lastName']}"
base_url = "https://auth.eagleeyenetworks.com/oauth2/authorize"
path_url = f"?client_id={een.client_id}&response_type=code&scope=vms.all&redirect_uri={een.redirect_uri}"
request_auth_url = f"{base_url}{path_url}"
return "<a href='"+request_auth_url+"'>Login with Eagle Eye Networks</a>"
return f"<a href='{base_url}{path_url}'>Login with Eagle Eye Networks</a>"
# @app.route('/login_callback')
# def login_callback():
# # This is getting the ?code= querystring value from the HTTP request.
# code = request.args.get('code')
@app.route('/login_callback')
def login_callback():
# This is getting the ?code= querystring value from the HTTP request.
code = request.args.get('code')
# if (code):
# oauth_object = een.login_tokens(code)
# return f"Hello {een.current_user['firstName']} {een.current_user['lastName']}"
if (code):
# use the include code parameter to complete login process
oauth_object = een.login_tokens(code)
return f"Hello {een.current_user['firstName']} {een.current_user['lastName']}"