diff --git a/CHANGES.rst b/CHANGES.rst
index 3452982..be1cf91 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -6,6 +6,7 @@ A list of changes between each release
 0.7.0.dev (development version)
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 - Fixed style errors for bumped pydocstring and pylint versions
+- Changed Blink.cameras dictionary to be case-insensitive (fixes `#35 <https://github.com/fronzbot/blinkpy/issues/35>`_)
 
 0.6.0 (2017-05-12)
 ^^^^^^^^^^^^^^^^^^
diff --git a/README.rst b/README.rst
index 2e02f9b..d3eb6f5 100644
--- a/README.rst
+++ b/README.rst
@@ -1,7 +1,6 @@
 blinkpy |Build Status| |Coverage Status|
 =============================================
 A Python library for the Blink Camera system
-Only compatible with Python 3+
 
 Disclaimer:
 ~~~~~~~~~~~~~~~
@@ -51,8 +50,8 @@ The cameras are of a BlinkCamera class, of which the following parameters can be
     blink = blinkpy.Blink(username='YOUR USER NAME', password='YOUR PASSWORD')
     blink.setup_system()
     
-    for name, camera in blink.cameras.items():
-        print(name)                  # Name of the camera
+    for camera in blink.cameras:
+        print(camera.name)           # Name of the camera
         print(camera.id)             # Integer id of the camera (assigned by Blink)
         print(camera.armed)          # Whether the device is armed/disarmed (ie. detecting motion)
         print(camera.clip)           # Link to last motion clip captured
@@ -62,7 +61,7 @@ The cameras are of a BlinkCamera class, of which the following parameters can be
         print(camera.battery_string) # Gives battery level as a string ("OK" or "Low").  Returns "Unknown" if value is... well, unknown 
         print(camera.notifications)  # Number of unread notifications (ie. motion alerts that haven't been viewed)
         print(camera.motion)         # Dictionary containing values for keys ['video', 'image', 'time']
-                                     #   which corresponds to last motion recorded, thumbnail of last motion, and timestamp of last motion
+                                     # which correspond to last motion recorded, thumbnail of last motion, and timestamp of last motion
 
 
 Class Descriptions
diff --git a/blinkpy.py b/blinkpy.py
index 12cdd67..2ce09da 100644
--- a/blinkpy.py
+++ b/blinkpy.py
@@ -16,6 +16,7 @@ import json
 import getpass
 from shutil import copyfileobj
 import requests
+from requests.structures import CaseInsensitiveDict
 import helpers.errors as ERROR
 from helpers.constants import (BLINK_URL, LOGIN_URL,
                                LOGIN_BACKUP_URL,
@@ -186,7 +187,7 @@ class Blink(object):
         self.region_id = None
         self._host = None
         self._events = []
-        self.cameras = {}
+        self.cameras = CaseInsensitiveDict({})
         self._idlookup = {}
         self.urls = None
 
diff --git a/helpers/__init__.py b/helpers/__init__.py
index 0a53750..e74901c 100644
--- a/helpers/__init__.py
+++ b/helpers/__init__.py
@@ -1,3 +1,3 @@
 """Init file for blinkpy helper functions."""
 from helpers import constants
-from helpers import errors
\ No newline at end of file
+from helpers import errors

Ignore case when accessing camera name
Currently the camera dictionary can be accessed with the camera name, but case matters.  We should ignore case sensitivity here to make it less annoying to access.
diff --git a/tests/test_blink_functions.py b/tests/test_blink_functions.py
index cb2ba8b..be4c49f 100644
--- a/tests/test_blink_functions.py
+++ b/tests/test_blink_functions.py
@@ -2,6 +2,7 @@
 
 import unittest
 from unittest import mock
+import random
 import blinkpy
 import tests.mock_responses as mresp
 
@@ -120,6 +121,26 @@ class TestBlinkFunctions(unittest.TestCase):
             camera.urls.home_url = "use_bad_response"
             self.assertEqual(camera.image_refresh(), None)
 
+    @mock.patch('blinkpy.blinkpy.requests.post',
+                side_effect=mresp.mocked_requests_post)
+    @mock.patch('blinkpy.blinkpy.requests.get',
+                side_effect=mresp.mocked_requests_get)
+    def test_camera_random_case(self, mock_get, mock_post):
+        """Checks for case of camera name."""
+        self.blink.setup_system()
+        for camera_name in self.blink.cameras:
+
+            rand_name = camera_name
+            # Make sure we never pass this test if rand_name = camera_name
+            while rand_name == camera_name:
+                rand_name = ''.join(
+                    random.choice(
+                        (str.upper, str.lower)
+                    )(x) for x in camera_name)
+
+            self.assertEqual(self.blink.cameras[camera_name].name,
+                             self.blink.cameras[rand_name].name)
+
     def test_camera_update(self):
         """Checks that the update function is doing the right thing."""
         self.test_urls = blinkpy.BlinkURLHandler('test')

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest>=2.9.2 pytest-cov>=2.3.1 pytest-timeout>=1.0.0 testtools
apt-get update apt-get install -y gcc
3.9
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
-e git+https://github.com/fronzbot/blinkpy.git@2a4b0d3f4b5974c5b57a8723fa5d2d57f441408e#egg=blinkpy
certifi==2025.1.31
charset-normalizer==3.4.1
coverage==7.8.0
exceptiongroup==1.2.2
idna==3.10
iniconfig==2.1.0
packaging==24.2
pluggy==1.5.0
pytest==8.3.5
pytest-cov==6.0.0
pytest-timeout==2.3.1
requests==2.32.3
testtools==2.7.2
tomli==2.2.1
urllib3==2.3.0

name: blinkpy
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - certifi==2025.1.31
      - charset-normalizer==3.4.1
      - coverage==7.8.0
      - exceptiongroup==1.2.2
      - idna==3.10
      - iniconfig==2.1.0
      - packaging==24.2
      - pluggy==1.5.0
      - pytest==8.3.5
      - pytest-cov==6.0.0
      - pytest-timeout==2.3.1
      - requests==2.32.3
      - testtools==2.7.2
      - tomli==2.2.1
      - urllib3==2.3.0
prefix: /opt/conda/envs/blinkpy

tests/test_blink_functions.py::TestBlinkFunctions::test_camera_random_case
tests/test_blink_functions.py::TestBlinkFunctions::test_camera_thumbs tests/test_blink_functions.py::TestBlinkFunctions::test_camera_update tests/test_blink_functions.py::TestBlinkFunctions::test_image_to_file tests/test_blink_functions.py::TestBlinkFunctions::test_image_with_bad_data tests/test_blink_functions.py::TestBlinkFunctions::test_last_motion tests/test_blink_functions.py::TestBlinkFunctions::test_set_motion_detect tests/test_blink_functions.py::TestBlinkFunctions::test_take_new_picture
README.rst blinkpy.py helpers/__init__.py CHANGES.rst
README.rst blinkpy.py helpers/__init__.py CHANGES.rst