Using the IzoT Server REST API

A RESTful Web API (also called a RESTful Web Service) is a Web API implemented using the HTTP protocol and REST principles. It is a collection of resources, with four defined aspects:

The following table shows how the HTTP methods are typically used to implement a Web API.

 
Resource GET PUT POST DELETE
Collection URI
such as http://eg.com/resources/
List the URIs and perhaps other details of the collection's members. Replace the entire collection with another collection. Create a new entry in the collection. The new entry's URI is assigned automatically and is usually returned by the operation. Delete the entire collection.
Element URI
such as http://eg.com/resources/item7
Retrieve a representation of the addressed member of the collection, expressed in an appropriate Internet media type. Replace the addressed member of the collection, or if it doesn't exist, create it. Not generally used. Treat the addressed member as a collection in its own right and create a new entry in it. Delete the addressed member of the collection.

 

The PUT and DELETE methods are idempotent methods. The GET method is a safe method (or nullipotent), meaning that calling it produces no side-effects.

 

Unlike SOAP-based Web services, there is no standard for RESTful Web APIs. This is because REST is an architectural style, unlike SOAP, which is a protocol. Even though REST is not a standard, a RESTful implementation such as the IzoT REST API can use standards like HTTP, URI, and XML.

 

The following sections describe the resources exposed by the IzoT REST API. By default, all operations (e.g. GET, PUT, DELETE, etc.) are only permitted when logged into an account with suitable privileges. All resources also support the OPTIONS operation which will return information on the requested resource.

 

Resources

 
Resource URI Supported Methods Comments
User /api/users/ GET Returns a list of users. Must be logged in. If logged in as an administrative user, all users will be returned, otherwise only the user that is logged in will be returned.
POST Adds a new user (must be logged in as an administrative user).
/api/users/{id}/ GET Returns the details of the specified user.
PUT
PATCH
Updates the details of the specified user (e.g. the 'email' field).
DELETE Deletes the specified user (must be logged in as an administrative user).
Device /api/devices/ GET Returns a list of all devices.
PUT
PATCH
Bulk updates the details of the specified list of devices. Only fields that are not marked as 'read-only' (see below) will be modified.
/api/devices/{id} GET Returns the details of the specified device.
PUT
PATCH
Updates the details of the specified device (e.g. the 'notes' field). Only fields that are not marked as 'read-only' (see below) will be modified.
DELETE Deletes the specified device. This should only be used on stale objects. If the device is a IzoT Network Server-based device and it is still active, it will be added back on the next update (but with a different ID).
/api/devices/{id}/wink/ PUT Winks (asynchronously) the specified device (if the device supports it).
/api/devices/{id}/poll/ PUT Polls (asynchronously) the specified device for updated information.
Datapoint /api/datapoints/ GET Returns a list of all datapoints.
PUT
PATCH
Bulk updates the details of the specified list of datapoints. Only fields that are not marked as 'read-only' (see below) will be modified.
/api/datapoints/{id} GET Returns the details of the specified datapoint.
PUT
PATCH
Updates the details of the specified datapoint (e.g. the ' value' or 'notes' fields). Only fields that are not marked as 'read-only' (see below) will be modified.
DELETE Deletes the specified datapoint. This should only be used on stale objects. If the datapoint is a IzoT Network Server-based datapoint and it is still active, it will be added back on the next update (but with a different ID).
/api/devices/{device_id}/datapoints/ GET Returns a list of only the datapoints associated with the specified device.

 

User Resource

 
Field Format Attributes Description
id integer key, unique, read-only The unique identifier for this user.
url URI read-only The URI for this user.
username string max_length = 30 The username of this user.
first_name string max_length = 30 The first name of this user.
last_name string max_length = 30 The last name of this user.
email string   The e-mail address of this user.
is_staff boolean read_only* Whether this user is an administrator.
(*) Only an administrator can change this value.
is_active      
password string   The password for the user. Only supplied with POST, not returned by GET.

 

Device Resource

 
Field Format Attributes Description
id integer key, unique, read-only The unique identifier for this device.
url URI read-only The URI for this device.
devid string max_length = 30, read-only, unique, hidden, searchable The IzoT Network Server ID for this device.
name string max_length = 30, read-only, searchable The name of this device, e.g. "Lamp".
brand string max_length = 30, read-only, searchable The brand of this device, e.g. "Echelon".
type string max_length = 30, read-only, searchable The type of this device, e.g. "dimmer".
categories string searchable Optional user-supplied comma-separated list of categories that can be filtered using the category parameter.
notes string searchable Optional user-supplied notes for the device.
active string max_length = 10, read-only, searchable The activity level of this device. One of: "false", " marginal", "pending", or " true".
datapoints URI link / collection read-only Either a link or a collection of URI/ID references to the datapoints belonging to this device, depending on the value of the 'depth' and 'ref_type' parameters (see below).
source string read-only, hidden The source (origin) of the device resource. This specifies the name of the IzoT Server collector used to collect and update information for this device. Typical examples include: "lonbridge", "localhost".
timestamp timestamp read-only The date and time that this device was created or last modified.
hidden boolean   Optional general-purpose flag to mark a device as hidden (default: "false").
Used by the dashboard web pages to selectively hide devices.

 

Datapoint Resource

 
Field Format Attributes Description
id integer key, unique, read-only The unique identifier for this datapoint.
url URI read-only The URI for this datapoint.
name string max_length = 30, read-only, searchable The name of this datapoint. For IzoT Network Server-based datapoints, these names come from the XML class files. Examples include "state", "brightness", and "power".
value string searchable The current value of this datapoint. Depending on the device, some datapoints are read-only (e.g. the performance statistics on the CPU device). Writing a value to a read-only datapoint will only have a temporary effect. The value will be overwritten the next time the datapoint is automatically updated. Otherwise, writing to a datapoint will cause the value to be propagated to the device.
categories string searchable Optional user-supplied comma-separated list of categories that can be filtered using the category parameter.
notes string searchable Optional user-supplied notes for the datapoint.
read_only boolean read-only Whether the datapoint's value field is read-only.
device URI link read-only The URI reference to the device to which this datapoint belongs.
source string read-only, hidden The source (origin) of the datapoint resource. This specifies the name of the IzoT Server collector used to collect and update information for this datapoint. Typical examples include: "lonbridge", "localhost".
timestamp timestamp read-only The date and time that this datapoint was created or last modified.

 

Query Parameters

Each URL request can contain optional query parameters. Query parameters are added to the end of the URL, following a '?' character, and separated from other parameters with a '&' character. The following table describes the supported query parameters:

 
Query Parameter Applies To Description
format={data_format}
accept={media_types}
(all) Allows the default data format to be overridden. See Data Formats below for further details.
ref_type=(url | id) devices, datapoints The type of references for related objects. Default: url. See Depth & Reference Types below for further details.
depth={levels} devices The number of levels to expand dependent objects. Default: 0. See Depth & Reference Types below for further details.
search={search_text} (all) Filters a collection of resources by performing a case-insensitive partial match for {search_text} against string-based fields marked as 'searchable' above. Multiple parameters may be specified.
{field_name}={field_value} (all) Filters a collection of resources by performing a case-sensitive exact match for {field_value} against the specified {field_name}. Unlike 'search', {field_name} typically also works with 'hidden' fields. Multiple parameters may be specified.
ordering=[-]{field_name} (all) Controls the ordering of the returned list of resources to order them based on the specified {field_name} (default: 'id'). Specify '-' prefix to sort in descending order.
category={categories} devices, datapoints Filters a collection of resources by performing a case-insensitive search for {categories} against the 'categories' field. Comma separated category values will be OR-ed together. Multiple category queries can be specified and these will be AND-ed together. Prefixing a category with '-' will negate its effect. An empty category value will match a resource with no categories.
e.g. "category=a,b," will return all objects with categories 'a' OR 'b' OR with no category. "category=a&category=-b" will return all objects with category 'a' AND NOT 'b'
ids={id_list} devices, datapoints Filters a collection of resources to include only those specified by the comma-separated list of object IDs.
fields={field_list} (all) Controls the fields in the returned list of resources to include only those specified by the comma-separated list of field names.
after={timestamp}
before={timestamp}
devices, datapoints Filters a collection of resources to include only those objects modified after/before the specified {timestamp}.
Timestamps must use the RFC 3339 / ISO 8601 format: YYYY-MM-DDTHH:MM[:ss[.uuuuuu]][TZ], e.g. "2013-10-24T20:49:05.713295Z".
max_age={seconds}
min_age={seconds}
devices, datapoints Filters a collection of resources to include only those objects updated within the last {seconds} seconds, or those older than {seconds} seconds.

 

Data Formats

The following data formats (media types) are supported by the IzoT Server REST API:

 

By default, the data format used is specified (negotiated) by the client using the standard HTTP_ACCEPT header. This default may be overridden by including either a format suffix (filetype extension), an explicit format parameter, or an accept override parameter in the URI of the request, e.g.

The trailing slash before the format specifier is required (/api/devices/1.xml will not work).

 

If you are accessing the API from a Web browser (that requests the text/html media type by default), you will see the browsable API format which is a developer-friendly Web page allowing simple documentation, browsing and testing of the API.

 

Depth & Reference Types

By default (depth=0), when retrieving resources (either a list of resources, or a specific instance), dependent (child) resource(s) are returned only by reference as a URI that must be separately retrieved to obtain the details of the dependent object(s), if any. The IzoT REST API also provides for two additional levels of automatic expansion of dependent resources. At depth=1, dependent resource(s) are expanded one level deep by returning URI(s) that point directly to the dependent resource(s). At depth=2, dependent resource(s) are fully expanded inline and returned as part of the data for the parent resource. e.g.,

http://izot/api/devices/5/?depth=0
        
{
    "id": 5,
    "url": "http://izot/api/devices/5/",
    "name": "Lamp",
    "brand": "Echelon",
    "type": "dimmer",
    "notes": "",
    "active": "true",
    "datapoints": "http://izot/api/devices/5/datapoints/",
    "source": "lonbridge",
    "timestamp": "2013-08-12T18:04:47.120Z"
}
http://izot/api/devices/5/?depth=1
        
{
    "id": 5,
    "url": "http://izot/api/devices/5/",
    "name": "Lamp",
    "brand": "Echelon",
    "type": "dimmer",
    "notes": "",
    "active": "true",
    "datapoints": [
        "http://izot/api/datapoints/1/",
        "http://izot/api/datapoints/2/"
    ],
    "source": "lonbridge",
    "timestamp": "2013-08-12T18:04:47.120Z"
}
http://izot/api/devices/5/?depth=2
        
{
    "id": 5,
    "url": "http://izot/api/devices/5/",
    "name": "Lamp",
    "brand": "Echelon",
    "type": "dimmer",
    "notes": "",
    "active": "true",
    "datapoints": [
        {
            "id": 1,
            "url": "http://izot/api/datapoints/1/",
            "name": "energy_lo",
            "value": "4051",
            "notes": "",
            "device": "http://izot/api/devices/5/",
            "source": "lonbridge",
            "timestamp": "2013-08-12T18:26:51.390Z"
        },
        {
            "id": 2,
            "url": "http://izot/api/datapoints/2/",
            "name": "state",
            "value": "off",
            "notes": "",
            "device": "http://izot/api/devices/5/",
            "source": "lonbridge",
            "timestamp": "2013-08-12T18:04:48.823Z"
        }
    ],
    "source": "lonbridge",
    "timestamp": "2013-08-12T18:04:47.120Z"
}

This expansion does not occur for parent resources (e.g. a Datapoint's device field is never expanded in this way).

Additionally, instead of returning a URI for related resources (ref_type=url), an ID can be returned instead (ref_type=id). This applies to all related references (not just child references), but this is only used when depth=1 for list-type nested resources. e.g.,

http://izot/api/datapoints/1/?ref_type=url
        
{
    "id": 1,
    "url": "http://izot/api/datapoints/1/",
    "name": "energy_lo",
    "value": "4052",
    "notes": "",
    "device": "http://izot/api/devices/5/",
    "source": "lonbridge",
    "timestamp": "2013-08-12T18:31:52.586Z"
}
http://izot/api/datapoints/1/?ref_type=id
        
{
    "id": 1,
    "url": "http://garyb-pi/api/datapoints/1/",
    "name": "energy_lo",
    "value": "4052",
    "notes": "",
    "device": 5,
    "source": "lonbridge",
    "timestamp": "2013-08-12T18:31:52.586Z"
}
http://izot/api/devices/5/?depth=1&ref_type=id
{
    "id": 5,
    "url": "http://izot/api/devices/5/",
    "name": "Lamp",
    "brand": "Echelon",
    "type": "dimmer",
    "notes": "",
    "active": "true",
    "datapoints": [
        "1",
        "2"
    ],
    "source": "lonbridge",
    "timestamp": "2013-08-12T18:04:47.120Z"
}
http://izot/api/devices/5/?depth=2&ref_type=id
{
    "id": 5,
    "url": "http://izot/api/devices/5/",
    "name": "Lamp",
    "brand": "Echelon",
    "type": "dimmer",
    "notes": "",
    "active": "true",
    "datapoints": [
        {
            "id": 1,
            "url": "http://izot/api/datapoints/1/",
            "name": "energy_lo",
            "value": "4051",
            "notes": "",
            "device": "5",
            "source": "lonbridge",
            "timestamp": "2013-08-12T18:26:51.390Z"
        },
        {
            "id": 2,
            "url": "http://izot/api/datapoints/2/",
            "name": "state",
            "value": "off",
            "notes": "",
            "device": "5",
            "source": "lonbridge",
            "timestamp": "2013-08-12T18:04:48.823Z"
        }
    ],
    "source": "lonbridge",
    "timestamp": "2013-08-12T18:04:47.120Z"
}