From 01306bb62378dd9f586237c0485a1fe30fb73198 Mon Sep 17 00:00:00 2001 From: jslavin-clearblade <116581763+jslavin-clearblade@users.noreply.github.com> Date: Wed, 28 Jun 2023 13:50:38 -0400 Subject: [PATCH] Update README.md Jon, I improved the grammar and readability of this document. Can you please approve/merge it if there are no semantic changes? Thanks, Jeff --- README.md | 219 +++++++++++++++++++++++++++--------------------------- 1 file changed, 109 insertions(+), 110 deletions(-) diff --git a/README.md b/README.md index dd7c3a3..1fd82e7 100644 --- a/README.md +++ b/README.md @@ -3,57 +3,57 @@ ClearBlade-Python-SDK A Python SDK for interacting with the ClearBlade Platform. -Both Python 2 and 3 are supported, but all examples written here are in Python 2. +Python 2 and 3 are supported, but all examples written here are in Python 2. ## Installation ### To install: 1. Run `pip install clearblade`. If you get a permissions error, run `sudo -H pip install clearblade`. -2. If on Mac, you may need to update your SSL libraries. - If your connections are failing, try: `sudo pip install ndg-httpsclient pyasn1 --upgrade --ignore-installed six` +2. If you are on Mac, you may need to update your SSL libraries. + If your connections are failing, try: `sudo pip install ndg-httpsclient pyasn1 --upgrade --ignore-installed six`. ### To install from source: -1. Clone or download this repo on to your machine. +1. Clone or download this repo onto your machine. 2. Run `python setup.py install`. - This may require additional priviledges. + This may require additional privileges. If it complains, run again with `sudo -H`. -3. If on Mac, you may need to update your SSL libraries. - If your connections are failing, try: `sudo pip install ndg-httpsclient pyasn1 --upgrade --ignore-installed six` +3. If you are on Mac, you may need to update your SSL libraries. + If your connections are failing, try: `sudo pip install ndg-httpsclient pyasn1 --upgrade --ignore-installed six`. ### To install for development (of the SDK): -1. Clone or download this repo on to your machine. +1. Clone or download this repo onto your machine. 2. Run `python setup.py develop`. This creates a folder called ClearBlade.egg-info in your current directory. You will now be allowed to import the SDK _in the current directory_, and any changes you make to the SDK code will automatically be updated in the egg. ## Usage 1. [Introduction](#introduction) -1. [Systems](#systems) -1. [Users](#users) -1. [Devices](#devices) -1. [Data Collections](#data-collections) -1. [MQTT Messaging](#mqtt-messaging) -1. [Code Services](#code-services) -1. [Queries](#queries) -1. [Developers](#developer-usage) -1. [Advanced](#advanced-usage) +2. [Systems](#systems) +3. [Users](#users) +4. [Devices](#devices) +5. [Data collections](#data-collections) +6. [MQTT messaging](#mqtt-messaging) +7. [Code services](#code-services) +8. [Queries](#queries) +9. [Developers](#developer-usage) +10. [Advanced](#advanced-usage) --- ### Introduction The intended entry point for the SDK is the ClearBladeCore module. -The beginning of your python file should always include a line like the following: +The beginning of your Python file should always include a line like the following: ```python from clearblade.ClearBladeCore import System, Query, Developer ``` -System, Query, and Developer are the only three classes you should ever need to import directly into your project, however Query and Developer are only used in special situations. -To register a developer, you will also need to import the `registerDev` function from ClearBladeCore. +System, Query, and Developer are the only three classes you need to import directly into your project. However, Query and Developer are only used in special situations. +To register a developer, you must also import the `registerDev` function from ClearBladeCore. By default, we enable verbose console output. -If you want your script to be quiet, you can disable the logs with by importing the `cbLogs` module and setting the `DEBUG` and `MQTT_DEBUG` flags to `False`. -Note that errors will always be printed, even if the debug flags are set to false. +If you want your script to be quiet, you can disable the logs by importing the `cbLogs` module and setting the `DEBUG` and `MQTT_DEBUG` flags to `False`. +Errors will always be printed, even if the debug flags are set to false. ```python from clearblade.ClearBladeCore import cbLogs @@ -64,23 +64,23 @@ cbLogs.MQTT_DEBUG = False ``` --- ### Systems -On the ClearBlade platform, you develop IoT solutions through **Systems**. +On the ClearBlade Platform, you develop IoT solutions through **systems**. Systems are identified by their SystemKey and SystemSecret. These are the only two parameters needed to work with your system. By default, we assume your system lives on our public domain: "https​://platform.clearblade.com". If your system lives elsewhere, you can pass the url as the optional third parameter named `url`. -Also by default, we automatically log out any users you authenticate when your script exits. -We wrote it this way to reduce the number of user tokens being produced from running a script repeatedly. -However, we realize that there are legitimate use cases of wanting to keep users logged in. +Also, by default, we automatically log out any users you authenticate when your script exits. +We wrote it this way to reduce the number of user tokens produced from running a script repeatedly. +However, we realize there are legitimate use cases of wanting to keep users logged in. You can turn off this functionality by passing the boolean `False` as the optional fourth parameter named `safe`. > Definition: `System(systemKey, systemSecret, url="https://platform.clearblade.com", safe=True)` > Returns: System object. #### Examples -A regular system on the ClearBlade platform. +A regular system on the ClearBlade Platform. ```python from clearblade.ClearBladeCore import System @@ -118,11 +118,11 @@ mySystem = System(SystemKey, SystemSecret, url, safe=False) ``` --- ### Users -Within your System, you may have **User** accounts that can perform actions. +You may have **user** accounts within your system that can perform actions. Users can be authenticated in two ways: -1. With their credentials, i.e. email and password. -2. Without credentials, i.e. anonymously. +1. With their credentials, i.e., email and password. +2. Without credentials, i.e., anonymously. > Definition: `System.User(email, password)` > Returns: Regular User object. @@ -131,23 +131,23 @@ Users can be authenticated in two ways: > Returns: Anonymous User object. -Previously authenticated Users can also connected to your System without being re-authenticated as long as they provide a valid authToken: +Previously authenticated users can also connect to your system without being re-authenticated as long as they provide a valid authToken: > Definition: `System.User(email, authToken="")` -> Returns: Regular User object. +> Returns: Regular user object. -Service Users (Users that were created with authTokens that are indefinitely valid) can connect to your System as follows: +Service users (Users that were created with authTokens that are indefinitely valid) can connect to your system as follows: > Definition: `System.ServiceUser()` -> Returns: Service User object. +> Returns: Service user object. If you allow users to register new user accounts, we have a method for that too. -You need to first authenticate as a user that has the permissions to do so using one of the functions defined above. +You need to authenticate as a user with permission to use one of the functions defined above. Then you can register a new user with their email and password. -Note that this authenticated user may also be a device or developer. +This authenticated user may also be a device or developer. -> Defininition: `System.registerUser(authenticatedUser, email, password)` +> Definition: `System.registerUser(authenticatedUser, email, password)` > Returns: Regular User object. #### Examples @@ -198,16 +198,16 @@ SystemSecret = "9ABBD2970BA6ABFE6E8AEB8B14F" mySystem = System(SystemKey, SystemSecret) -# Service User +# Service user email = "rob@clearblade.com" token = "yIaddmF42rzKsswf1T7NFNCh9ayg2QQECHRRnbmQfPSdfdaTnw4oWQXmRtv6YoO6oFyfgqq" -# Auth as Service User +# Auth as service user service_user = mySystem.ServiceUser(email, token) ``` --- ### Devices -Another common entity that may interact with your system is a **Device**. +Another common entity that may interact with your system is a **device**. Similar to users, devices must be authenticated before you can use them. To authenticate a device, you need its _active key_. @@ -215,19 +215,18 @@ To authenticate a device, you need its _active key_. > Returns: Device object. -Previously authenticated Devices can also connected to your System without being re-authenticated as long as they provide a valid authToken: +Previously authenticated devices can also connected to your system without being re-authenticated as long as they provide a valid authToken: > Definition: `System.Device(name, authToken="")` > Returns: Device object. Want to get a list of all the devices an authenticated entity (user, device, or developer) can view? -Simple. -We even have a way to query those devices with the optional second parameter called `query`. +You can query those devices with the optional second parameter called `query`. For more information on this functionality, see [Queries](#queries). > Definition: `System.getDevices(authenticatedUser, query=None)` -> Returns: List of devices. Each device is a dictionary of their attributes. +> Returns: Device list. Each device is a dictionary of its attributes. Only interested in a single device's information? If an authenticated user has permission to read its attributes and knows its name, we can do that. @@ -235,7 +234,7 @@ If an authenticated user has permission to read its attributes and knows its nam > Definition: `System.getDevice(authenticatedUser, name)` > Returns: A dictionary of the requested device's attributes. -Once you authorize a device through the `System.Device` module, you can update its attributes by passing a json blob or a dictionary to the `update` function. +Once you authorize a device through the `System.Device` module, you can update its attributes by passing a JSON blob or a dictionary to the `update` function. > Definition: `Device.update(info)` > Returns: Nothing. @@ -260,9 +259,9 @@ ble = mySystem.Device(name, activeKey) ble.update({"state": "ON"}) ``` --- -### Data Collections -Every system has an internal database with tables called **Collections**. -You need to be an authenticated user to access them, and you must identify them by either their _name_ or their _id_. +### Data collections +Every system has an internal database with tables called **collections**. +You need to be an authenticated user to access them. You must identify them by their _name_ or _id_. > Definition: `System.Collection(authenticatedUser, collectionID="", collectionName="")` > Returns: Collection object. @@ -277,18 +276,18 @@ This function has three optional parameters you can add: > Definition: `Collection.getItems(query=None, pagesize=100, pagenum=1, url="")` > Returns: List of rows that match your query. Each row is a dictionary of its column values. -Once you fetch items, they get stored to a collection attribute called `items`. -We also store some information about your last request with that collection object to make multipage data parsing a little easier. -We have a function to fetch the next page and the previous page of the last request you made, which update the collection's `items` attribute. +Once you fetch items, they get stored in a collection attribute called `items`. +We also store information about your last request with that collection object to simplify multipage data parsing. +We have a function to fetch your last request's next and previous pages, which updates the collection's `items` attribute. > Definition: `Collection.getNextPage()` -> Returns: List of rows from the next page of your last request. +> Returns: List rows from your last request's next page. > Definition: `Collection.getPrevPage()` > Returns: List of rows from the previous page of your last request. #### Examples -Iterate through first page of a collection. +Iterate through the collection's first page. ```python from clearblade.ClearBladeCore import System @@ -311,17 +310,17 @@ for row in rows: print row ``` --- -### MQTT Messaging -Every system has a **Messaging** client you can use to communicate between authenticated entities (devices, users, edges, developers, platforms, so on) using the MQTT protocol. -To become an MQTT client, all you need is an authenticated entity (user, device, or developer). +### MQTT messaging +Every system has a **messaging** client you can use to communicate between authenticated entities (devices, users, edges, developers, platforms, and so on) using the MQTT protocol. +To become an MQTT client, you only need an authenticated entity (user, device, or developer). If your MQTT broker uses a different port from the default (1883), you can set it with the optional second parameter `port`. -The default keep-alive time is 30 seconds, but you can change that with the optional third parameter `keepalive`. +The default keep-alive time is 30 seconds, but you can change that with the optional third parameter, `keepalive`. If your broker lives at a different url than your system, you can specify that with the optional fourth parameter `url`. -Lastly, you can specify the client_id your script will connect to the broker with using the optional fifth parameter `client_id`. +You can specify the client_id your script will connect to the broker using the optional fifth parameter `client_id`. If you don't specify a client_id, the SDK will use a random hex string. > Definition: `System.Messaging(user, port=1883, keepalive=30, url="", client_id="")` -> Returns: MQTT Messaging object. +> Returns: MQTT messaging object. There are a slew of callback functions you may assign. Typically, you want to set these callbacks before you connect to the broker. @@ -344,30 +343,30 @@ These are both simple functions that take no parameters. > Definition: `Messaging.disconnect()` > Returns: Nothing. -You can subscribe to as many topics as you like, and subsequently unsubscribe from them, using the following two commands. +You can subscribe to as many topics as you like and unsubscribe from them using the following two commands. > Definition: `Messaging.subscribe(topic)` > Returns: Nothing. > Definition: `Messaging.unsubscribe(topic)` > Returns: Nothing. -Lastly, publishing takes the topic to publish to, and the message to publish as arguments. The type of message can be string or bytes. +Publishing takes the topic to publish to and the message to publish as arguments. The type of message can be string or bytes. > Definition: `Messaging.publish(topic, message)` -> Returns: Returns a MQTTMessageInfo which expose the following attributes and methods: +> Returns: Returns an MQTTMessageInfo, which exposes the following attributes and methods: -1. **rc**, the result of the publishing. It could be MQTT_ERR_SUCCESS to indicate success, MQTT_ERR_NO_CONN if the client is not currently connected, or MQTT_ERR_QUEUE_SIZE when max_queued_messages_set is used to indicate that message is neither queued nor sent. +1. **rc**, the result of the publishing. It could be MQTT_ERR_SUCCESS to indicate success, MQTT_ERR_NO_CONN if the client is not currently connected, or MQTT_ERR_QUEUE_SIZE when max_queued_messages_set is used to indicate that message is neither queued nor sent. -2. **mid** is the message ID for the publish request. The mid value can be used to track the publish request by checking against the mid argument in the on_publish() callback if it is defined. wait_for_publish may be easier depending on your use-case. +2. **mid** is the message ID for the publish request. The mid value can be used to track the publish request by checking against the mid argument in the on_publish() callback if it is defined. wait_for_publish may be easier depending on your use-case. -3. **wait_for_publish()** will block until the message is published. It will raise ValueError if the message is not queued (rc == MQTT_ERR_QUEUE_SIZE), or a RuntimeError if there was an error when publishing, most likely due to the client not being connected. +3. **wait_for_publish()** will block until the message is published. It will raise ValueError if the message is not queued (rc == MQTT_ERR_QUEUE_SIZE), or a RuntimeError if there was an error when publishing, most likely due to the client not being connected. -4. **is_published()** returns True if the message has been published. It will raise ValueError if the message is not queued (rc == MQTT_ERR_QUEUE_SIZE), or a RuntimeError if there was an error when publishing, most likely due to the client not being connected. +4. **is_published()** returns True if the message has been published. It will raise ValueError if the message is not queued (rc == MQTT_ERR_QUEUE_SIZE), or a RuntimeError if there was an error when publishing, most likely due to the client not being connected. -A ValueError will be raised if topic is None, has zero length or is invalid (contains a wildcard), if qos is not one of 0, 1 or 2, or if the length of the payload is greater than 268435455 bytes. +A ValueError will be raised if the topic is None, has zero length, is invalid (contains a wildcard), QoS is not one of 0, 1, or 2, or the payload length is greater than 268435455 bytes. #### Examples -Subscribe to topic and print incoming messages. +Subscribe to the topic and print incoming messages. ```python from clearblade.ClearBladeCore import System @@ -436,16 +435,16 @@ for i in range(20): mqtt.disconnect() ``` --- -### Code Services -Within your system, you may have **Code Services**. -These are javascript methods that are run on the ClearBlade Platform rather than locally. +### Code services +Within your system, you may have **code services**. +These JavaScript methods run on the ClearBlade Platform rather than locally. To use a code service, all you need is its name. > Definition: `System.Service(name)` -> Returns: Code Service object. +> Returns: Code service object. Once you have a code object, you can execute it manually as an authenticated entity (user, device, or developer). -If you want to pass the service parameters, you can pass them as a dictionary to the optional second parameter `params`. +If you want to pass the service parameters, you can pass them as a dictionary to the optional second parameter, `params`. > Definition: `Service.execute(authenticatedUser, params={}` > Returns: Response from code service. @@ -476,15 +475,15 @@ code.execute(aaron, params) ``` --- ### Queries -When you fetch data from collections or devices from the device table, you can get more specific results with a **Query**. -Note: you must import this module from clearblade.ClearBladeCore, seperately from the System module. +When you fetch data from collections or devices from the device table, you can get more specific results with a **query**. +Note: you must import this module from clearblade.ClearBladeCore, separately from the system module. > Definition: `Query()` > Returns: Query object. -Query objects are built through several function calls to gradually narrow your search down. -Each operator function takes the column name you're limiting as its first parameter, and the value you want to limit by as its second. -The operator functions don't return anything, they change the query object itself. +Query objects are built through several function calls to narrow your search gradually. +Each operator function takes the column name you're limiting as its first parameter and the value you want to limit by as its second. +The operator functions don't return anything, and they change the query object itself. Applying multiple filters to the same query object is logically ANDing them together. The `matches` operator matches a regular expression. @@ -497,7 +496,7 @@ The `matches` operator matches a regular expression. * `Query.matches(column, value)` If you want to logically OR two queries together, you can pass one to the `Or` function. -Note that once you OR two queries together, you cannot add any more operators through the previous functions. +You cannot add more operators through the previous functions once you OR two queries together. However, you may OR as many queries together as you'd like. > Definition: `Query.Or(query)` @@ -564,18 +563,18 @@ devices = mySystem.getDevices(jim, q.Or(q2)) for device in devices: print device ``` -## Developer Usage +## Developer usage Developer usage is not fully implemented yet and is currently restricted to the following classes: 1. [Devices](#devices-1) -**Developers** have a less restricted access to your system's components. -However, developer functionality is not object oriented. -Additionally, since a developer may have multiple systems, most functions will require you to pass in a [System](#systems) object. +**Developers** have less restricted access to your system's components. +However, developer functionality is not object-oriented. +Additionally, since a developer may have multiple systems, most functions require you to pass in a [System](#systems) object. -If you're not already a developer, you can register yourself from the SDK. +You can register yourself from the SDK if you're not a developer. You need the typical credentials: first name, last name, organization, email, and password. -You will have to import this function directly from `clearblade.ClearBladeCore`. +You must import this function directly from `clearblade.ClearBladeCore`. By default, we assume you're registering on our public domain: "https​://platform.clearblade.com". If you're registering elsewhere, you can pass the url as the optional sixth parameter named `url`. @@ -583,14 +582,14 @@ If you're registering elsewhere, you can pass the url as the optional sixth para > Definition: `registerDev(fname, lname, org, email, password, url="https://platform.clearblade.com")` > Returns: Developer object. -If you're already a registered developer with the platform, you can log in with your email and password. +You can log in with your email and password if you're already a registered developer with the Platform. Like the registration function, if you're logging into an account on a different domain than the default, you can pass it in as the optional third parameter named `url`. > Definition: `Developer(email, password, url="https://platform.clearblade.com")` > Returns: Developer object. -When you create your developer object you will be automatically authenticated. -You may then log out and authenticate yourself again as many times as you like with the aptly named functions below. +When you create your developer object, you will be automatically authenticated. +You can log out and authenticate yourself again as often as possible with the aptly named functions below. > Definition: `Developer.logout()` > Returns: Nothing. @@ -625,28 +624,28 @@ bigboi = Developer("antwan.a.patton@outkast.com", "th3w@yY0uM0v3") ``` --- ### Collections -First you are able to get a list of all current collections within a system. +First, you can get a list of all current collections within a system. > Definition: `Developer.getAllCollections(system)` > Returns: List of collections. Each collection is a dictionary containing the collection name and collectionID. -As a developer, you get full management access to any collection within a system. To create a cloud collection, you need to specify the system it's going to live in, and the name of the new collection you are creating. +As a developer, you get full management access to any collection within a system. To create a cloud collection, specify the system it will live in and your new collection name. > Definition: `Developer.newCollection(system, name)` -> Returns: A Collection object of the newly created Collection +> Returns: A collection object of the newly created collection -You can also add columns to any Collection. Note: the Collection object you supply should be initialized with a `collectionID` (rather than `collectionName`) in order to add columns. The Collection object returned from `Developer.newCollection` is initialized this way for you for ease of use. +You can also add columns to any collection. The collection object you supply should be initialized with a `collectionID` (rather than `collectionName`) to add columns. The collection object returned from `Developer.newCollection` is initialized this way for you for ease of use. > Definition: `Developer.addColumnToCollection(system, collectionObject, columnName, columnType)` > Returns: Nothing -Finally, you are able to set the CRUD permissions for a collection via a specific role name. Note: like `addColumnToCollection` you will need to use a Collection object initialized with a `collectionID` +Finally, you can set the CRUD permissions for a collection via a specific role name. Like `addColumnToCollection`, you will need to use a collection object initialized with a `collectionID`. > Definition: `Developer.setPermissionsForCollection(system, collectionObject, Permissions.READ + Permissions.UPDATE, roleName)` > Returns: Nothing #### Examples -Creating a new Collection and adding a custom column. +Creating a new collection and adding a custom column. ```python from clearblade.ClearBladeCore import System, Developer @@ -667,7 +666,7 @@ toolsCollection = steve.newCollection(mySystem, "Tools") steve.addColumnToCollection(mySystem, toolsCollection, "last_location", "string") ``` -Updating CRUD permissions for a Collection on a specific role. +Updating CRUD permissions for a collection on a specific role. ```python from clearblade.ClearBladeCore import System, Developer, Collections, Permissions @@ -681,10 +680,10 @@ mySystem = System(SystemKey, SystemSecret) # Log in as Steve steve = Developer("steve@clearblade.com", "r0s@_p@rks") -# Create a Collection object from an existing collection with an id of 8a94dda70bb4c2c59b8298d686f401 +# Create a collection object from an existing collection with an id of 8a94dda70bb4c2c59b8298d686f401 collectionObj = mySystem.Collection(steve, collectionID="8a94dda70bb4c2c59b8298d686f401") -# Give the Authenticated role Read and Delete permissions to this collection +# Give the authenticated role read and delete permissions to this collection michael.setPermissionsForCollection(mySystem, collectionObj, Permissions.READ + Permissions.DELETE, "Authenticated") ``` @@ -692,28 +691,28 @@ michael.setPermissionsForCollection(mySystem, collectionObj, Permissions.READ + ### Devices As a developer, you get full CRUD access to the device table. -To create a device, you need to specify the system it's going to live in, and the name of the device you're creating. -There are many other optional parameters that you may set if you please, but all have default values if you're feeling lazy. -Note: you should keep enabled set to True and allow at least one type of authentication if you want to interact with the device through the non-developer endpoints. +To create a device, specify the system it will live in and the device name you're creating. +There are many other optional parameters you may set, but all have default values. +You should keep enabled set to true and allow at least one type of authentication if you want to interact with the device through the non-developer endpoints. > Definition: `Developer.newDevice(system, name, enabled=True, type="", state="", active_key="", allow_certificate_auth=False, allow_key_auth=True, certificate="", description="", keys="")` > Returns: Dictionary of the new device's attributes. -You can get a full list of devices in your system's device table and [query](#queries) it if you'd like. -If you have a specific device you want information about, you can ask for that device by name. +You can get a full list of devices in your system's device table and [query](#queries) it. +You can ask for that device by name if you have a specific device you want information about. > Definition: `Developer.getDevices(system, query=None)` -> Returns: List of devices. Each device is a dictionary of their attributes. +> Returns: Device list. Each device is a dictionary of its attributes. > Definition: `Developer.getDevice(system, name)` > Returns: Dictionary of the requested device's attributes. -Updating a device takes the system object, name of the device, and a dictionary of the updates you are making. +Updating a device takes the system object, device name, and dictionary of the updates you are making. > Definition: `Developer.updateDevice(system, name, updates)` > Returns: Dictionary of the updated device's attributes. -Deleting a device is as simple as passing in the system object where it lives and the name of the device. +Deleting a device is as simple as passing in the system object where it lives and the device name. > Definition: `Developer.deleteDevice(system, name)` > Returns: Nothing. @@ -733,7 +732,7 @@ mySystem = System(SystemKey, SystemSecret) # Log in as Steve steve = Developer("steve@clearblade.com", "r0s@_p@rks") -# Create new device named Elevators +# Create new a device named Elevators steve.newDevice(mySystem, "Elevators") # Update device description @@ -761,10 +760,10 @@ if tdb["description"] != "(In a Cadillac)": devKev.deleteDevice(mySystem, "TwoDopeBoyz") ``` --- -## Advanced Usage +## Advanced usage -### SSL Verification -If you need to disable SSL verification (likely in the case of a self-signed SSL certificate), you simply need to initialize a System like you normally would, and include a `sslVerify=True` parameter. +### SSL verification +If you need to disable SSL verification (likely in the case of a self-signed SSL certificate), initialize a system, and include a `sslVerify=True` parameter. #### Examples ```python @@ -778,4 +777,4 @@ url = "https://customer.clearblade.com" mySystem = System(SystemKey, SystemSecret, url, sslVerify=False) ``` -**Note** This option should only be enabled when using a ClearBlade Platform instance with a self-signed SSL certificate. If your instance is using a valid SSL certificate signed with a known CA, you should **not** enable this. +**Note** This option should only be enabled when using a ClearBlade Platform instance with a self-signed SSL certificate. If your instance uses a valid SSL certificate signed with a known CA, you should **not** enable this.