Component Resource

A component is a container for a group of streams and events that share the same location. A component represents a real-world physical or abstract device. The component definition is used by GroveStreams so that it can store, organize, map, dashboard and monitor devices.

Defining a Component
A component definition  describes an external device that uploads information into GroveStreams.   GroveStreams needs to know certain attributes about the device such as what data type a stream interval will be so that it can properly store and display the interval data.

A component are defined by JSON. Assembling JSON by hand can be tedious so the GroveStreams website has a component definition view that makes it easy to define and validate your components.

Component UID:
Every component (and any other GroveStreams entity) has a uid (universal identifier) assigned to it. This identifier is unique throughout the GroveStreams store and cannot be changed. Components are mostly identified and requested by their uids.

Component ID:
Components can optionally have an external unique ID. The ID could be a MAC address or a device serial number or any other string that is unique within your organization. You can use this ID to retrieve components from GroveStreams. The ID attribute comes in handy for devices that self register. For example, a zigbee device that enters a mesh network can use its MAC address as a
GroveStreams component ID to look-up whether it is already registered with GroveStreams or not.

Component Templates
Use a component template to quickly create a component manually or automatically when a new device becomes available. The GroveStreams API provides the capability for a device to determine if it is already registered. If it is not registered it will create a new component from a template and return its definition all in one API call (see component PUT and GET commands below or feed PUT command). Components can also be automatically created from templates during feed PUT calls. See Feed PUT.

Streams
A stream definition describes data points. The order of a component's streams is preserved during a PUT and POST and is significant as a device can upload a component's feed using the feed order in the JSON array to determine which component stream it belongs to. This avoids the device having to know a stream uid or id.

See the stream resource for more information about streams.


Mobility
A component can be marked as fixed or mobile and it can contain longitude,  latitude or elevation random or interval streams. These streams can track a component's location over time. GroveStreams will plot a components current location on maps.

Reconciling
Component definitions can change after stream data exists. Existing data may need to be transformed when this occurs.

Stream data is stored according to the definition of the component stream. For example, if the stream is defined as DOUBLE data type then the values are stored as
DOUBLEs. If that stream is later defined as INTEGER then all existing intervals within the store need to be changed to INTEGER types. During the saving of a component, GroveStreams will detect changes that require modifications to stored data and create a Reconcile Job. The Reconcile Job will run asynchronously and can be monitored and cancelled from the GroveStreams API or from the GroveStreams web user interface.

GroveStreams will throw an error if a reconcile isn't possible. Sometimes GroveStreams cannot detect if an interval conversion is possible or not since it depends on the actual value of each interval. Each interval that cannot be converted will be changed to a Gap interval for interval streams or removed for random streams during a reconcile.

Component stream reconciling is performed across servers (each stream is a task) and is relatively fast but its not fast enough for the system to hold a lock on a stream and prevent data from being downloaded or uploaded during a reconcile. GroveStreams is designed to allow stream feeds to be uploaded or downloaded during a stream reconcile as long as the data is appended to the start or end of the stream.

There is a very short window of time (usually under a second) at the end of the Reconcile Job when GroveStreams will lock the stream. Any stream requests during this short period of time may return a REQUEST_VALIDATION_FAILURE. If this occurs the user or device should retry the request.

Changes that will create a Reconcile Job (if stream intervals exists in the store):
  • Component time zone id change
  • Stream data type change
  • Stream base cycle change
  • Stream rollup_calendar change
  • Stream derivation change
  • Stream time_filter change
Deleting a component
When a component is deleted, all stream data is also deleted. Any item referencing a component, or its streams , will no longer reference them (dashboards, derived streams, ...).

For a list of time zone ids see:
Time zone ids

GET component



Returns a list of component resources. Components can also be referenced by a component_folder folder. Use the component_folder resource to add or remove a component from a folder. Resource Information
Rate Limited?
Yes
session, oauth and org tokens compatible?
Yes
api_key token token compatible?
Yes


Resource URL

http://grovestreams.com/api/component

Parameters

There are three possible sets of parameters. The first two sets return a list of components.
 
start
required
Set this to a zero-based offset into the list.
limit
required
Set this to the maximum number of components to return.
sort
required
This is only required if not querying by bounding box. Set to "name". "name" is the only sorting attribute supported to date.
dir
required
This is only required if not querying by bounding box. Set to "ASC" or "DESC", for ascending and descending.

Bounding Box parameters (start and limit are required, sort and dir are ignored if these parameters are used).
startLng
optional
Starting longitude - inclusive
endLng
optional Ending longitude - inclusive
startLat
optional Starting latitude - inclusive
endLat
optional Ending latitude - inclusive

If the id parameter is used all other parameters are ignored.
id
optional
The id of an existing component to return. Returns the full component definition.

If the detailAmount parameter is used all other parameters are ignored.
detailAmount
optional
If set to 'forQuickView' then the component definition is returned along with the last several intervals (default: 10) for each stream.
numIntvls
optional
If detailAmount is set to 'forQuickView' then numIntvls can be used to indicate how many intervals or samples for each stream to return.

Example Requests

Bounding Box Example:

/component?start=0&limit=1000&startLng=-95.16983032226562&endLng=-91.56356811523438&startLat=44.51315545869885&endLat=45.739734958168505
 
Response Body
{
  "message": "",
  "success": true,
  "component": [
    {
      "uid": "cd826b54-93db-4c84-9601-56c8637ba57b",
      "location": {
        "longitude": -94.25644,
        "latitude": 45.196342
      },
      "name": "Cabin Component"
    }
  ]
}


Sorted List Example:

/component
/ ?start=0&limit=1000&sort=name&dir=ASC

Response Body
{
  "message": "",
  "success": true,
  "totalCount": 2,
  "component": [
    {
      "uid": "3eee4898-6142-4d72-957f-7957d8d47fb5",
      "creationDate": 1301925777161,
      "description": "Computer Resources",
      "name": "My Computer",
      "disposition": "FIXED",
      "timeZoneId": ""
    },
    {
      "uid": "cd826b54-93db-4c84-9601-56c8637ba57b",
      "creationDate": 1301925783701,
      "description": "",
      "name": "Cabin",
      "disposition": "FIXED",
      "timeZoneId": ""
    }
  ]
}


Query by Id example:

/component?id=MAX_123
 


GET component/{componentUid}



Returns a component with the specified uid.
Resource Information
Rate Limited?
Yes
session, oauth and org tokens compatible?
Yes
api_key token compatible?
Yes


Resource URL

http://grovestreams.com/api/component/{componentUid}

Parameters

forQuickView optional
Returns enough information for component quick view. If this parameter is used then all others are ignored.
forPicker optional
Returns enough information for a component selection picker.

Example Requests

/component/3851c1e5-5c58-490a-825c-8590632434b1

Response Body
{
  "message": "",
  "success": true,
  "component": {
    "id": "MAC_123",
    "uid": "900d6a66-fed5-4a48-a251-b0477661da50",
    "creationDate": 0,
    "stream": [
      {
        "streamType" : "intvl_stream",
        "baseCycle": {
          "cycle_range": [
           
          ],
          "referenceDate": "2011-01-01T00:00:00",
          "uid": "6ff373a2-8efb-4ea7-9ec7-2d770bb980b2",
          "intvlSizeType": "SECOND",
          "description": "cycle description",
          "numSizeTypesPerIntvl": 1,
          "name": "Seconds",
          "estimatedIntervalSize": 1000,
          "timeZoneId": ""
        },
        "uid": "b01585b2-dca7-4c3e-9683-b980ce72d8c4",
        "startDate": 0,
        "rollup_calendar": {
          "uid": "11b0a967-a445-43b5-9af8-4f2a1bddd8c5",
          "name": "Years, Quarters, Months, Days, Hour, FiveMin"
        },
        "constraints": {
          "min": 1,
          "minMaxHandlerType": "ADJUST_TO_GAP",
          "max": 1.7976931348623157E308,
          "rollupPercentSetToGap": 100,
          "time_filter": {
            "uid": "",
            "name": ""
          }
        },
        "devicePermType": "GET",
        "endDate": 0,
        "gap_filling": {
          "maxGapsToFill": 0,
          "gapFillType": "NONE"
        },
        "delete_profile": {
          "uid": "",
          "name": ""
        },
        "id": "",
        "unit": {
          "uid": "2f1f8839-ec0d-4dfc-9564-e04bf01ca05b",
          "symbol": " nm",
          "numberFormat": "0,000.00",
          "name": "Brightness",
          "booleanStyle": "ON_OFF",
          "symbolLocation": "AFTER"
        },
        "comp_event": [
         {
            "expression": "value == 0",
            "enabled": true,
            "cycle": {
              "uid": "",
              "name": ""
            },
            "updateLatency": 0,
"eventType": "VALUE",
            "functionType": "NONE",
            "name": "No Light",
            "start_trigger_action_pkg": {
              "uid": "5d10bcf8-5897-3a55-9f2c-741bde35edee",
              "name": "All Users"
            }
          }

        ],
        "rollupMethod": "AVG",
        "completedDate": 0,
        "streamDerivationType": "NONE",
        "description": "",
        "name": "light",
        "valueType": "FLOAT",
        "visuals": {
          "defaultChartType": "COL_CHART",
          "hasAxisMinMax": false,
          "chartAxisMax": 200,
          "offset": 0,
          "multiplier": 1,
          "chartAxisMin": -200
        },
        "timeZoneId": "UTC"
      },
      {
        "streamType" : "intvl_stream",
        "baseCycle": {
          "cycle_range": [
           
          ],
          "referenceDate": "2011-01-01T00:00:00",
          "uid": "6ff373a2-8efb-4ea7-9ec7-2d770bb980b2",
          "intvlSizeType": "SECOND",
          "description": "cycle description",
          "numSizeTypesPerIntvl": 1,
          "name": "Seconds",
          "estimatedIntervalSize": 1000,
          "timeZoneId": ""
        },
        "uid": "036d9dde-b410-43dc-8a4d-785940528c9f",
        "startDate": 0,
        "rollup_calendar": {
          "uid": "11b0a967-a445-43b5-9af8-4f2a1bddd8c5",
          "name": "Years, Quarters, Months, Days, Hour, FiveMin"
        },
        "constraints": {
          "min": 1,
          "minMaxHandlerType": "ADJUST_TO_GAP",
          "max": 1.7976931348623157E308,
          "rollupPercentSetToGap": 100,
          "time_filter": {
            "uid": "",
            "name": ""
          }
        },
        "devicePermType": "GET",
        "endDate": 0,
        "gap_filling": {
          "maxGapsToFill": 0,
          "gapFillType": "NONE"
        },
        "delete_profile": {
          "uid": "",
          "name": ""
        },
        "id": "",
        "unit": {
          "uid": "8efe14fa-8d0f-4d66-8633-520cadfb7080",
          "symbol": "C",
          "numberFormat": "0,000.00",
          "name": "Celsius",
          "booleanStyle": "ON_OFF",
          "symbolLocation": "AFTER"
        },
        "comp_event": [
         {
            "expression": "value < 0",
            "enabled": true,
            "cycle": {
              "uid": "",
              "name": ""
            },
            "updateLatency": 0,
"eventType": "VALUE",
            "functionType": "NONE",
            "name": "Temperature is below freezing",
            "start_trigger_action_pkg": {
              "uid": "5d10bcf8-5897-3a55-9f2c-741bde35edee",
              "name": "All Users"
            }
          }

        ],
        "rollupMethod": "AVG",
        "completedDate": 0,
        "streamDerivationType": "NONE",
        "description": "",
        "name": "temperature",
        "valueType": "FLOAT",
        "visuals": {
          "defaultChartType": "COL_CHART",
          "hasAxisMinMax": false,
          "chartAxisMax": 200,
          "offset": 0,
          "multiplier": 1,
          "chartAxisMin": -200
        },
        "timeZoneId": "UTC"
      },
      {
        "streamType" : "intvl_stream",
        "baseCycle": {
          "cycle_range": [
           
          ],
          "referenceDate": "2011-01-01T00:00:00",
          "uid": "6ff373a2-8efb-4ea7-9ec7-2d770bb980b2",
          "intvlSizeType": "SECOND",
          "description": "cycle description",
          "numSizeTypesPerIntvl": 1,
          "name": "Seconds",
          "estimatedIntervalSize": 1000,
          "timeZoneId": ""
        },
        "uid": "78fa2d43-816d-41d0-a379-300bd6e936ca",
        "startDate": 0,
        "rollup_calendar": {
          "uid": "",
          "name": ""
        },
        "constraints": {
          "min": 1,
          "minMaxHandlerType": "ADJUST_TO_GAP",
          "max": 1.7976931348623157E308,
          "rollupPercentSetToGap": 100,
          "time_filter": {
            "uid": "",
            "name": ""
          }
        },
        "devicePermType": "GET",
        "endDate": 0,
        "gap_filling": {
          "maxGapsToFill": 0,
          "gapFillType": "NONE"
        },
        "delete_profile": {
          "uid": "",
          "name": ""
        },
        "id": "",
        "unit": {
          "uid": "3b160a5e-73d2-46c6-ac5e-a1dbf0430687",
          "symbol": "",
          "numberFormat": "0,000.00",
          "name": "No Symbol",
          "booleanStyle": "ON_OFF",
          "symbolLocation": "AFTER"
        },       
        "comp_event": [

        ],
        "rollupMethod": "AVG",
        "completedDate": 0,
        "streamDerivationType": "NONE",
        "description": "",
        "name": "low_battery",
        "valueType": "BOOLEAN",
        "visuals": {
          "defaultChartType": "COL_CHART",
          "hasAxisMinMax": false,
          "chartAxisMax": 200,
          "offset": 0,
          "multiplier": 1,
          "chartAxisMin": -200
        },
        "timeZoneId": "UTC"
      }
    ],
    "location": {
      "postalCode": "20024-3210",
      "hasAltitude": false,
      "description": "",
      "altitude": 0,
      "street": "300 E Street SW",
      "stateOrProvince": "DC",
      "longitude": -94.15644,
      "latitude": 47.196342,
      "country": "United States",
      "city": "Washington"
    },
    "description": "",
    "name": "light and humidity sensor",
    "ownerUser": {
      "uid": "89ec79e6-4d0b-4abd-9172-2296f4703812",
      "name": "Fred Flintstone"
    },
"compTmpl": {
      "uid": "d73a6e9b-2300-3dfd-8386-01cc945e60cf",
      "name": "Template 1"
    },
    "disposition": "FIXED",
    "timeZoneId": "US/Eastern"
  }
}


GET component/{componentUid}/location



Returns a component's current location.
Resource Information
Rate Limited? Yes
session, oauth and org tokens compatible?
Yes
api_key token compatible
Yes


Resource URL

http://grovestreams.com/api/component/{componentUid}/location

Parameters

time
optional
The location of the component at the given time. The component's current location will be returned if the time parameter is not included.

Example Requests

Get the component's current location.

/component/9f53ea01-070d-401e-a708-25726a249d2d/location

Response Body {
  "message": "",
  "success": true,
  "location": {
      "postalCode": "20024-3210",
      "hasAltitude": false,
      "description": "",
      "altitude": 0,
      "street": "300 E Street SW",
      "stateOrProvince": "DC",
      "longitude": -94.15644,
      "latitude": 47.196342,
      "country": "United States",
      "city": "Washington"
    }
}


GET component/new



Returns a default component with a unique UID. Does not persist the new component in the store. It's the callers responsibility to PUT the new component and register it.
Resource Information
Rate Limited? Yes
session, oauth and org tokens compatible?
Yes
api_key token compatible
Yes


Resource URL

http://grovestreams.com/api/component/new

Parameters

templateUid optional
Uses the component template with the uid that matches templateUid to create a new component. Does not persist the component.
templateId optional
Uses a component template with an id that matches templateId to create a new component. Does not persist the component.

Example Requests

/component/new

Response Body
{
  "message": "",
  "success": true,
  "component": {
    "uid": "9f53ea01-070d-401e-a708-25726a249d2d",
    "stream": [
     
    ],
    "location": {
      "postalCode": "",
      "hasAltitude": false,
      "description": "",
      "altitude": 0,
      "street": "",
      "stateOrProvince": "",
      "longitude": 0,
      "latitude": 0,
      "country": "",
      "city": ""
    },
    "ownerUser": {
      "uid": "",
      "name": ""
    },
,     "compTmpl": {
      "uid": "",
      "name": ""
    },
    "version": 0,
    "id": "",
    "creationDate": 1316462069063,
    "description": "",
    "name": "",
    "disposition": "FIXED",
    "timeZoneId": ""
  }
}




PUT component



Inserts a new component.

The uid of the component can be blank. If it is blank a uid will be created on the server and the response body will contain the new uid.

This method can also create a new component based on a component template. Send with an empty entity body or a body with component defaults that are applied after the component is created from the template. See the parameters below.
Resource Information
Rate Limited? Yes
session, oauth and org tokens compatible?
Yes
api_key token compatible
Yes


Resource URL

http://grovestreams.com/api/component

Parameters

These three parameters allow a component to be created from a component template.

parentFolderUid optional
The UID of the component content repository folder to place this new component into. The component will be placed into the root folder if this parameter is missing.
deviceId optional
The value to set the new component's ID to when it is being created from a component template (requires either templateUid or templateId parameter to be passed in the call). If a component with an ID that matches deviceId exists, it will be returned with this call without applying any template or default values.
templateUid
optional
templateUid is the uid of the component template to create the component from. The deviceId parameter can optionally be passed in. A JSON body containing component defautls can optionally be included.
templateId
optional
The id of the component template to create the component from. The deviceId parameter can optionally be passed in. A JSON body containing component defautls can optionally be included.

Example Requests

 This example demondstrates creating a component based on a template while applying component defaults. If a deviceId is passed on the URL and a componentId is included in the JSON defaults, the URL deviceId will be used.:

/component?templateId=template1


Request Body

{
  "component":
    {
      "defaults": {
        "location": {
          "stateOrProvince": "NJ"
        },
        "name": "smart plug",
        "folderPath" : "/home/kitchen"
      },
      "componentId": "MAC4563454"
    }
  }
}


This example demonstrates creating a component:

/component


Request Body
{
  "component": {
    "id": "MAC_1234",
    "uid": "fd1e1906-1049-4aaf-8e58-2630b607bf07",
    "creationDate": 0,
    "stream": [
      {
        "streamType" : "intvl_stream",
        "baseCycle": {
          "uid": "6ff373a2-8efb-4ea7-9ec7-2d770bb980b2"
        },
        "uid": "c62c4098-3a84-4088-a3dd-b0dc3514cbf5"
        "rollup_calendar": {
          "uid": "11b0a967-a445-43b5-9af8-4f2a1bddd8c5"
        },
        "constraints": {
          "min": 1,
          "minMaxHandlerType": "ADJUST_TO_GAP",
          "max": 1.7976931348623157E308,
          "rollupPercentSetToGap": 100,
          "time_filter": {
            "uid": ""
          }
        },
        "devicePermType": "GET",
        "gap_filling": {
          "maxGapsToFill": 100,
          "gapFillType": "PREVIOUS_VAL"
        },
        "delete_profile": {
          "uid": ""
        },
        "id": "",
        "unit": {
          "uid": "2f1f8839-ec0d-4dfc-9564-e04bf01ca05b"
        },
        "rollupMethod": "AVG",
        "streamDerivationType": "NONE",
        "description": "",
        "name": "light",
        "valueType": "FLOAT",
        "visuals": {
          "defaultChartType": "COL_CHART",
          "hasAxisMinMax": false,
          "chartAxisMax": 200,
          "offset": 0,
          "multiplier": 1,
          "chartAxisMin": -200
        }
      },
      {
        "streamType" : "intvl_stream",
        "baseCycle": {
          "uid": "6ff373a2-8efb-4ea7-9ec7-2d770bb980b2""
        },
        "uid": "20747785-068f-4fc2-beb1-82835a46b245"
        "rollup_calendar": {
          "uid": "11b0a967-a445-43b5-9af8-4f2a1bddd8c5"
        },
        "constraints": {
          "min": 1,
          "minMaxHandlerType": "ADJUST_TO_GAP",
          "max": 1.7976931348623157E308,
          "rollupPercentSetToGap": 100,
          "time_filter": {
            "uid": ""
          }
        },
        "devicePermType": "GET",
        "gap_filling": {
          "maxGapsToFill": 50,
          "gapFillType": "AVG"
        },
        "delete_profile": {
          "uid": ""
        },
        "id": "",
        "unit": {
          "uid": "8efe14fa-8d0f-4d66-8633-520cadfb7080"
        },
        "comp_event": [
 
        ],
        "rollupMethod": "AVG",
        "streamDerivationType": "NONE",
        "description": "",
        "name": "temperature",
        "valueType": "FLOAT",
        "visuals": {
          "defaultChartType": "COL_CHART",
          "hasAxisMinMax": false,
          "chartAxisMax": 200,
          "offset": 0,
          "multiplier": 1,
          "chartAxisMin": -200
        }
      },
      {
        "streamType" : "intvl_stream",
        "baseCycle": {
          "uid": "6ff373a2-8efb-4ea7-9ec7-2d770bb980b2"
        },
        "uid": "c1475a99-ec85-4b08-9cde-1b3270e470a9",
        "rollup_calendar": {
          "uid": "11b0a967-a445-43b5-9af8-4f2a1bddd8c5"
        },
        "constraints": {
          "min": 1,
          "minMaxHandlerType": "ADJUST_TO_GAP",
          "max": 1.7976931348623157E308,
          "rollupPercentSetToGap": 100,
          "time_filter": {
            "uid": ""
          }
        },
        "devicePermType": "GET",
        "gap_filling": {
          "maxGapsToFill": 3,
          "gapFillType": "MAX"
        },
        "delete_profile": {
          "uid": ""
        },
        "id": "",
        "unit": {
          "uid": "dd47299c-5649-46e4-aa10-28febbc5cd1a"
        },
        "rollupMethod": "AVG",
        "streamDerivationType": "NONE",
        "description": "",
        "name": "current",
        "valueType": "FLOAT",
        "visuals": {
          "defaultChartType": "COL_CHART",
          "hasAxisMinMax": false,
          "chartAxisMax": 200,
          "offset": 0,
          "multiplier": 1,
          "chartAxisMin": -200
        }
      },
      {
        "streamType" : "intvl_stream",
        "baseCycle": {
          "uid": "6ff373a2-8efb-4ea7-9ec7-2d770bb980b2"
        },
        "uid": "688f2f6b-db43-44f8-8b4d-7e01d6bb517f",
        "rollup_calendar": {
          "uid": "11b0a967-a445-43b5-9af8-4f2a1bddd8c5"
        },
        "intvl_expression": {
          "expression": "(current * 120 / (3600 * 1000)) * costPerKwh",
          "dependent": [
            {
              "dependentUid": "c1475a99-ec85-4b08-9cde-1b3270e470a9",
              "dependentName": "",
              "streamIntvlOffset": 0,
              "cycleName": "",
              "componentName": "",
              "cycleUid": "6ff373a2-8efb-4ea7-9ec7-2d770bb980b2",
              "dependentType": "stream",
              "functionType": "NONE",
              "name": "current",
              "componentUid": "fd1e1906-1049-4aaf-8e58-2630b607bf07",
              "time_filter": [
               
              ]
            },
            {
              "dependentUid": "9b73dd8d-3c28-493b-9295-a5d78321cd2a",
              "dependentName": "",
              "streamIntvlOffset": 0,
              "cycleName": "",
              "componentName": "",
              "cycleUid": "",
              "dependentType": "stream",
              "functionType": "NONE",
              "name": "costPerKwh",
              "componentUid": "fd1e1906-1049-4aaf-8e58-2630b607bf07",
              "time_filter": [
               
              ]
            }
          ],
          "effectiveDate": 1316391359973
        },
        "constraints": {
          "min": 1,
          "minMaxHandlerType": "ADJUST_TO_GAP",
          "max": 1.7976931348623157E308,
          "rollupPercentSetToGap": 100,
          "time_filter": {
            "uid": ""
          }
        },
        "devicePermType": "GET"
        "gap_filling": {
          "maxGapsToFill": 0,
          "gapFillType": "NONE"
        },
        "delete_profile": {
          "uid": ""
        },
        "id": "",
        "unit": {
          "uid": "ec7d4c63-2caf-4d84-8fc3-e4bec3a2ede1"
        },
        "rollupMethod": "AVG",
        "streamDerivationType": "FROM_EXPRESSION",
        "description": "",
        "name": "cost",
        "valueType": "FLOAT",
        "visuals": {
          "defaultChartType": "COL_CHART",
          "hasAxisMinMax": false,
          "chartAxisMax": 200,
          "offset": 0,
          "multiplier": 1,
          "chartAxisMin": -200
        }
      },
      {
        "streamType" : "intvl_stream",
        "baseCycle": {
          "uid": "6ff373a2-8efb-4ea7-9ec7-2d770bb980b2"
        },
        "uid": "362973e4-0350-4d66-bbd1-8ff46c47ca46",
        "rollup_calendar": {
          "uid": "11b0a967-a445-43b5-9af8-4f2a1bddd8c5"
        },
        "intvl_expression": {
          "expression": "(if(isNull(currentMinus0), 0, currentMinus0) + if(isNull(currentMinus1), 0, currentMinus1) + if(isNull(currentMinus2), 0, currentMinus2))/3",
          "dependent": [
            {
              "dependentUid": "c1475a99-ec85-4b08-9cde-1b3270e470a9",
              "dependentName": "",
              "streamIntvlOffset": 0,
              "cycleName": "",
              "componentName": "",
              "cycleUid": "6ff373a2-8efb-4ea7-9ec7-2d770bb980b2",
              "dependentType": "stream",
              "functionType": "NONE",
              "name": "currentMinus0",
              "componentUid": "fd1e1906-1049-4aaf-8e58-2630b607bf07",
              "time_filter": [
               
              ]
            },
            {
              "dependentUid": "c1475a99-ec85-4b08-9cde-1b3270e470a9",
              "dependentName": "",
              "streamIntvlOffset": -1,
              "cycleName": "",
              "componentName": "",
              "cycleUid": "6ff373a2-8efb-4ea7-9ec7-2d770bb980b2",
              "dependentType": "stream",
              "functionType": "NONE",
              "name": "currentMinus1",
              "componentUid": "fd1e1906-1049-4aaf-8e58-2630b607bf07",
              "time_filter": [
               
              ]
            },
            {
              "dependentUid": "c1475a99-ec85-4b08-9cde-1b3270e470a9",
              "dependentName": "",
              "streamIntvlOffset": -2,
              "cycleName": "",
              "componentName": "",
              "cycleUid": "6ff373a2-8efb-4ea7-9ec7-2d770bb980b2",
              "dependentType": "stream",
              "functionType": "NONE",
              "name": "currentMinus2",
              "componentUid": "fd1e1906-1049-4aaf-8e58-2630b607bf07",
              "time_filter": [
               
              ]
            }
          ],
          "effectiveDate": 1316391300973,
        },
        "constraints": {
          "min": 1,
          "minMaxHandlerType": "ADJUST_TO_GAP",
          "max": 1.7976931348623157E308,
          "rollupPercentSetToGap": 100,
          "time_filter": {
            "uid": ""
          }
        },
        "devicePermType": "GET",
        "gap_filling": {
          "maxGapsToFill": 0,
          "gapFillType": "NONE"
        },
        "delete_profile": {
          "uid": ""
        },
        "id": "",
        "unit": {
          "uid": "dd47299c-5649-46e4-aa10-28febbc5cd1a"
        },
        "comp_event": [

        ],
        "rollupMethod": "AVG",
        "streamDerivationType": "FROM_EXPRESSION",
        "description": "",
        "name": "current - Rolling 3pt Avg",
        "valueType": "FLOAT",
        "visuals": {
          "defaultChartType": "COL_CHART",
          "hasAxisMinMax": false,
          "chartAxisMax": 200,
          "offset": 0,
          "multiplier": 1,
          "chartAxisMin": -200
        }
      },
      {
        "streamType" : "intvl_stream",
        "baseCycle": {
          "uid": "6ff373a2-8efb-4ea7-9ec7-2d770bb980b2"
        },
        "uid": "9dbfbc11-50f6-4991-a83c-fd4daded6595",
        "rollup_calendar": {
          "uid": "11b0a967-a445-43b5-9af8-4f2a1bddd8c5"
        },
        "intvl_expression": {
          "expression": "cost / sqFeet",
          "dependent": [
            {
              "dependentUid": "688f2f6b-db43-44f8-8b4d-7e01d6bb517f",
              "dependentName": "",
              "streamIntvlOffset": 0,
              "cycleName": "",
              "componentName": "",
              "cycleUid": "6ff373a2-8efb-4ea7-9ec7-2d770bb980b2",
              "dependentType": "stream",
              "functionType": "NONE",
              "name": "cost",
              "componentUid": "fd1e1906-1049-4aaf-8e58-2630b607bf07",
              "time_filter": [
               
              ]
            },
            {
              "dependentUid": "2e473282-cf8e-451b-9476-d8f430ed5a33",
              "dependentName": "",
              "streamIntvlOffset": 0,
              "cycleName": "",
              "componentName": "",
              "cycleUid": "",
              "dependentType": "stream",
              "functionType": "NONE",
              "name": "sqFeet",
              "componentUid": "fd1e1906-1049-4aaf-8e58-2630b607bf07",
              "time_filter": [
               
              ]
            }
          ],
          "effectiveDate": 1316391300973
        },
        "constraints": {
          "min": 1,
          "minMaxHandlerType": "ADJUST_TO_GAP",
          "max": 1.7976931348623157E308,
          "rollupPercentSetToGap": 100,
          "time_filter": {
            "uid": ""
          }
        },
        "devicePermType": "GET",
        "gap_filling": {
          "maxGapsToFill": 0,
          "gapFillType": "NONE"
        },
        "delete_profile": {
          "uid": ""
        },
        "id": "",
        "unit": {
          "uid": "ec7d4c63-2caf-4d84-8fc3-e4bec3a2ede1"
        },
        "rollupMethod": "AVG",
        "streamDerivationType": "FROM_EXPRESSION",
        "description": "",
        "name": "cost per sq feet",
        "valueType": "FLOAT",
        "visuals": {
          "defaultChartType": "COL_CHART",
          "hasAxisMinMax": false,
          "chartAxisMax": 200,
          "offset": 0,
          "multiplier": 1,
          "chartAxisMin": -200
        }
      },
      {
        "streamType" : "intvl_stream",
        "baseCycle": {
          "uid": "6ff373a2-8efb-4ea7-9ec7-2d770bb980b2"
        },
        "uid": "90c5b3c4-ce8a-4169-ba45-57ef1b0019f1",
        "rollup_calendar": {
          "uid": ""
        },
        "constraints": {
          "min": 1,
          "minMaxHandlerType": "ADJUST_TO_GAP",
          "max": 1.7976931348623157E308,
          "rollupPercentSetToGap": 100,
          "time_filter": {
            "uid": ""
          }
        },
        "devicePermType": "SET",
        "gap_filling": {
          "maxGapsToFill": 0,
          "gapFillType": "NONE"
        },
        "delete_profile": {
          "uid": ""
        },
        "id": "",
        "unit": {
          "uid": "3b160a5e-73d2-46c6-ac5e-a1dbf0430687"
        },
        "rollupMethod": "AVG",
        "streamDerivationType": "NONE",
        "description": "",
        "name": "power_on",
        "valueType": "BOOLEAN",
        "visuals": {
          "defaultChartType": "COL_CHART",
          "hasAxisMinMax": false,
          "chartAxisMax": 200,
          "offset": 0,
          "multiplier": 1,
          "chartAxisMin": -200
        }
      }
    ],
    "location": {
      "postalCode": "",
      "hasAltitude": false,
      "description": "Cabin Refridgerator",
      "altitude": 0,
      "street": "",
      "stateOrProvince": "",
      "longitude": -94.25591776794431,
      "latitude": 47.262320232064745,
      "country": "",
      "city": ""
    },
    "description": "Smart Plug that measures light, temp, current. Cost and rolling 3pt Avg are derived.",
    "name": "smartplug",
    "ownerUser": {
      "uid": "89ec79e6-4d0b-4abd-9172-2296f4703812"
    },
    "disposition": "FIXED",
    "timeZoneId": "US/Central"
  }
}

PUT component/{componentUid}/reconcile_changes



Use this call to determine if the changes to a component entity will require a reconcile job to be created. This call will return a list of any reconcile changes the changes will require.
Resource Information
Rate Limited? Yes
session, oauth and org tokens compatible?
Yes
api_key token compatible
Yes


Resource URL

http://grovestreams.com/api/component/{componentUid}/reconcile_changes

Parameters

These three parameters allow a component to be created from a component template.

none

Example Requests

/component/9f53ea01-070d-401e-a708-25726a249d2d/reconcile_changes

Request Body
A component entity. See component PUT above.

Response Body
{
  "message": "",
  "change": [
    {
      "message": "Stream 'CPU Used' interval data type was changed from 'DOUBLE' to 'FLOAT'. Existing interval data will be preserved if the change is compatible. Noncompatible interval changes will result in gap (null value) intervals.",
      "item": {
        "uid": "d0ed52fb-1a9b-4dae-860d-79bb2bc60674",
        "name": "CPU Used",
        "type": "stream"
      }
    },
    {
      "message": "Stream 'Physical Total Memory - bytes' base cycle was changed from '10 Seconds' to 'Seconds'. This will require all existing interval data to be modified using the default rollup method as a guide.",
      "item": {
        "uid": "fb0cb1ab-dba6-437f-8674-5ade8d4a26f6",
        "name": "Physical Total Memory - bytes",
        "type": "stream"
      }
    }
  ],
  "success": true
}




POST component



Used to update an existing component.
Resource Information
Rate Limited? Yes
session, oauth and org tokens compatible?
Yes
api_key token compatible
Yes


Resource URL

http://grovestreams.com/api/component

Parameters

none

Example Requests

/component

Request
Body
{
  "component": {
    "id": "MAC_1234",
    "uid": "fd1e1906-1049-4aaf-8e58-2630b607bf07",
    "creationDate": 0,
    "stream": [
      {
    "streamType" : "intvl_stream",
        "baseCycle": {
          "uid": "6ff373a2-8efb-4ea7-9ec7-2d770bb980b2"
        },
        "uid": "c62c4098-3a84-4088-a3dd-b0dc3514cbf5"
        "rollup_calendar": {
          "uid": "11b0a967-a445-43b5-9af8-4f2a1bddd8c5"
        },
        "constraints": {
          "min": 1,
          "minMaxHandlerType": "ADJUST_TO_GAP",
          "max": 1.7976931348623157E308,
          "rollupPercentSetToGap": 100,
          "time_filter": {
            "uid": ""
          }
        },
        "devicePermType": "GET",
        "gap_filling": {
          "maxGapsToFill": 100,
          "gapFillType": "PREVIOUS_VAL"
        },
        "delete_profile": {
          "uid": ""
        },
        "id": "",
        "unit": {
          "uid": "2f1f8839-ec0d-4dfc-9564-e04bf01ca05b"
        },
        "rollupMethod": "AVG",
        "streamDerivationType": "NONE",
        "description": "",
        "name": "light",
        "valueType": "FLOAT",
        "visuals": {
          "defaultChartType": "COL_CHART",
          "hasAxisMinMax": false,
          "chartAxisMax": 200,
          "offset": 0,
          "multiplier": 1,
          "chartAxisMin": -200
        }
      },
      {
    "streamType" : "intvl_stream",
        "baseCycle": {
          "uid": "6ff373a2-8efb-4ea7-9ec7-2d770bb980b2""
        },
        "uid": "20747785-068f-4fc2-beb1-82835a46b245"
        "rollup_calendar": {
          "uid": "11b0a967-a445-43b5-9af8-4f2a1bddd8c5"
        },
        "constraints": {
          "min": 1,
          "minMaxHandlerType": "ADJUST_TO_GAP",
          "max": 1.7976931348623157E308,
          "rollupPercentSetToGap": 100,
          "time_filter": {
            "uid": ""
          }
        },
        "devicePermType": "GET",
        "gap_filling": {
          "maxGapsToFill": 50,
          "gapFillType": "AVG"
        },
        "delete_profile": {
          "uid": ""
        },
        "id": "",
        "unit": {
          "uid": "8efe14fa-8d0f-4d66-8633-520cadfb7080"
        },
        "rollupMethod": "AVG",
        "streamDerivationType": "NONE",
        "description": "",
        "name": "temperature",
        "valueType": "FLOAT",
        "visuals": {
          "defaultChartType": "COL_CHART",
          "hasAxisMinMax": false,
          "chartAxisMax": 200,
          "offset": 0,
          "multiplier": 1,
          "chartAxisMin": -200
        }
      },
      {
    "streamType" : "intvl_stream",
        "baseCycle": {
          "uid": "6ff373a2-8efb-4ea7-9ec7-2d770bb980b2"
        },
        "uid": "c1475a99-ec85-4b08-9cde-1b3270e470a9",
        "rollup_calendar": {
          "uid": "11b0a967-a445-43b5-9af8-4f2a1bddd8c5"
        },
        "constraints": {
          "min": 1,
          "minMaxHandlerType": "ADJUST_TO_GAP",
          "max": 1.7976931348623157E308,
          "rollupPercentSetToGap": 100,
          "time_filter": {
            "uid": ""
          }
        },
        "devicePermType": "GET",
        "gap_filling": {
          "maxGapsToFill": 3,
          "gapFillType": "MAX"
        },
        "delete_profile": {
          "uid": ""
        },
        "id": "",
        "unit": {
          "uid": "dd47299c-5649-46e4-aa10-28febbc5cd1a"
        },
        "rollupMethod": "AVG",
        "streamDerivationType": "NONE",
        "description": "",
        "name": "current",
        "valueType": "FLOAT",
        "visuals": {
          "defaultChartType": "COL_CHART",
          "hasAxisMinMax": false,
          "chartAxisMax": 200,
          "offset": 0,
          "multiplier": 1,
          "chartAxisMin": -200
        }
      },
      {
    "streamType" : "intvl_stream",
        "baseCycle": {
          "uid": "6ff373a2-8efb-4ea7-9ec7-2d770bb980b2"
        },
        "uid": "688f2f6b-db43-44f8-8b4d-7e01d6bb517f",
        "rollup_calendar": {
          "uid": "11b0a967-a445-43b5-9af8-4f2a1bddd8c5"
        },
        "intvl_expression": {
          "expression": "(current * 120 / (3600 * 1000)) * costPerKwh",
          "dependent": [
            {
              "dependentUid": "c1475a99-ec85-4b08-9cde-1b3270e470a9",
              "dependentName": "",
              "streamIntvlOffset": 0,
              "cycleName": "",
              "componentName": "",
              "cycleUid": "6ff373a2-8efb-4ea7-9ec7-2d770bb980b2",
              "dependentType": "stream",
              "functionType": "NONE",
              "name": "current",
              "componentUid": "fd1e1906-1049-4aaf-8e58-2630b607bf07",
              "time_filter": [
               
              ]
            },
            {
              "dependentUid": "9b73dd8d-3c28-493b-9295-a5d78321cd2a",
              "dependentName": "",
              "streamIntvlOffset": 0,
              "cycleName": "",
              "componentName": "",
              "cycleUid": "",
              "dependentType": "stream",
              "functionType": "NONE",
              "name": "costPerKwh",
              "componentUid": "fd1e1906-1049-4aaf-8e58-2630b607bf07",
              "time_filter": [
               
              ]
            }
          ],
          "effectiveDate": 1316391359973
        },
        "constraints": {
          "min": 1,
          "minMaxHandlerType": "ADJUST_TO_GAP",
          "max": 1.7976931348623157E308,
          "rollupPercentSetToGap": 100,
          "time_filter": {
            "uid": ""
          }
        },
        "devicePermType": "GET"
        "gap_filling": {
          "maxGapsToFill": 0,
          "gapFillType": "NONE"
        },
        "delete_profile": {
          "uid": ""
        },
        "id": "",
        "unit": {
          "uid": "ec7d4c63-2caf-4d84-8fc3-e4bec3a2ede1"
        },
        "rollupMethod": "AVG",
        "streamDerivationType": "FROM_EXPRESSION",
        "description": "",
        "name": "cost",
        "valueType": "FLOAT",
        "visuals": {
          "defaultChartType": "COL_CHART",
          "hasAxisMinMax": false,
          "chartAxisMax": 200,
          "offset": 0,
          "multiplier": 1,
          "chartAxisMin": -200
        }
      },
      {
    "streamType" : "intvl_stream",
        "baseCycle": {
          "uid": "6ff373a2-8efb-4ea7-9ec7-2d770bb980b2"
        },
        "uid": "362973e4-0350-4d66-bbd1-8ff46c47ca46",
        "rollup_calendar": {
          "uid": "11b0a967-a445-43b5-9af8-4f2a1bddd8c5"
        },
        "intvl_expression": {
          "expression": "(if(isNull(currentMinus0), 0, currentMinus0) + if(isNull(currentMinus1), 0, currentMinus1) + if(isNull(currentMinus2), 0, currentMinus2))/3",
          "dependent": [
            {
              "dependentUid": "c1475a99-ec85-4b08-9cde-1b3270e470a9",
              "dependentName": "",
              "streamIntvlOffset": 0,
              "cycleName": "",
              "componentName": "",
              "cycleUid": "6ff373a2-8efb-4ea7-9ec7-2d770bb980b2",
              "dependentType": "stream",
              "functionType": "NONE",
              "name": "currentMinus0",
              "componentUid": "fd1e1906-1049-4aaf-8e58-2630b607bf07",
              "time_filter": [
               
              ]
            },
            {
              "dependentUid": "c1475a99-ec85-4b08-9cde-1b3270e470a9",
              "dependentName": "",
              "streamIntvlOffset": -1,
              "cycleName": "",
              "componentName": "",
              "cycleUid": "6ff373a2-8efb-4ea7-9ec7-2d770bb980b2",
              "dependentType": "stream",
              "functionType": "NONE",
              "name": "currentMinus1",
              "componentUid": "fd1e1906-1049-4aaf-8e58-2630b607bf07",
              "time_filter": [
               
              ]
            },
            {
              "dependentUid": "c1475a99-ec85-4b08-9cde-1b3270e470a9",
              "dependentName": "",
              "streamIntvlOffset": -2,
              "cycleName": "",
              "componentName": "",
              "cycleUid": "6ff373a2-8efb-4ea7-9ec7-2d770bb980b2",
              "dependentType": "stream",
              "functionType": "NONE",
              "name": "currentMinus2",
              "componentUid": "fd1e1906-1049-4aaf-8e58-2630b607bf07",
              "time_filter": [
               
              ]
            }
          ],
          "effectiveDate": 1316391300973,
        },
        "constraints": {
          "min": 1,
          "minMaxHandlerType": "ADJUST_TO_GAP",
          "max": 1.7976931348623157E308,
          "rollupPercentSetToGap": 100,
          "time_filter": {
            "uid": ""
          }
        },
        "devicePermType": "GET",
        "gap_filling": {
          "maxGapsToFill": 0,
          "gapFillType": "NONE"
        },
        "delete_profile": {
          "uid": ""
        },
        "id": "",
        "unit": {
          "uid": "dd47299c-5649-46e4-aa10-28febbc5cd1a"
        },
        "rollupMethod": "AVG",
        "streamDerivationType": "FROM_EXPRESSION",
        "description": "",
        "name": "current - Rolling 3pt Avg",
        "valueType": "FLOAT",
        "visuals": {
          "defaultChartType": "COL_CHART",
          "hasAxisMinMax": false,
          "chartAxisMax": 200,
          "offset": 0,
          "multiplier": 1,
          "chartAxisMin": -200
        }
      },
      {
    "streamType" : "intvl_stream",
        "baseCycle": {
          "uid": "6ff373a2-8efb-4ea7-9ec7-2d770bb980b2"
        },
        "uid": "9dbfbc11-50f6-4991-a83c-fd4daded6595",
        "rollup_calendar": {
          "uid": "11b0a967-a445-43b5-9af8-4f2a1bddd8c5"
        },
        "intvl_expression": {
          "expression": "cost / sqFeet",
          "dependent": [
            {
              "dependentUid": "688f2f6b-db43-44f8-8b4d-7e01d6bb517f",
              "dependentName": "",
              "streamIntvlOffset": 0,
              "cycleName": "",
              "componentName": "",
              "cycleUid": "6ff373a2-8efb-4ea7-9ec7-2d770bb980b2",
              "dependentType": "stream",
              "functionType": "NONE",
              "name": "cost",
              "componentUid": "fd1e1906-1049-4aaf-8e58-2630b607bf07",
              "time_filter": [
               
              ]
            },
            {
              "dependentUid": "2e473282-cf8e-451b-9476-d8f430ed5a33",
              "dependentName": "",
              "streamIntvlOffset": 0,
              "cycleName": "",
              "componentName": "",
              "cycleUid": "",
              "dependentType": "stream",
              "functionType": "NONE",
              "name": "sqFeet",
              "componentUid": "fd1e1906-1049-4aaf-8e58-2630b607bf07",
              "time_filter": [
               
              ]
            }
          ],
          "effectiveDate": 1316391300973
        },
        "constraints": {
          "min": 1,
          "minMaxHandlerType": "ADJUST_TO_GAP",
          "max": 1.7976931348623157E308,
          "rollupPercentSetToGap": 100,
          "time_filter": {
            "uid": ""
          }
        },
        "devicePermType": "GET",
        "gap_filling": {
          "maxGapsToFill": 0,
          "gapFillType": "NONE"
        },
        "delete_profile": {
          "uid": ""
        },
        "id": "",
        "unit": {
          "uid": "ec7d4c63-2caf-4d84-8fc3-e4bec3a2ede1"
        },
        "rollupMethod": "AVG",
        "streamDerivationType": "FROM_EXPRESSION",
        "description": "",
        "name": "cost per sq feet",
        "valueType": "FLOAT",
        "visuals": {
          "defaultChartType": "COL_CHART",
          "hasAxisMinMax": false,
          "chartAxisMax": 200,
          "offset": 0,
          "multiplier": 1,
          "chartAxisMin": -200
        }
      },
      {
    "streamType" : "intvl_stream",
        "baseCycle": {
          "uid": "6ff373a2-8efb-4ea7-9ec7-2d770bb980b2"
        },
        "uid": "90c5b3c4-ce8a-4169-ba45-57ef1b0019f1",
        "rollup_calendar": {
          "uid": ""
        },
        "constraints": {
          "min": 1,
          "minMaxHandlerType": "ADJUST_TO_GAP",
          "max": 1.7976931348623157E308,
          "rollupPercentSetToGap": 100,
          "time_filter": {
            "uid": ""
          }
        },
        "devicePermType": "SET",
        "gap_filling": {
          "maxGapsToFill": 0,
          "gapFillType": "NONE"
        },
        "delete_profile": {
          "uid": ""
        },
        "id": "",
        "unit": {
          "uid": "3b160a5e-73d2-46c6-ac5e-a1dbf0430687"
        },
        "rollupMethod": "AVG",
        "streamDerivationType": "NONE",
        "description": "",
        "name": "power_on",
        "valueType": "BOOLEAN",
        "visuals": {
          "defaultChartType": "COL_CHART",
          "hasAxisMinMax": false,
          "chartAxisMax": 200,
          "offset": 0,
          "multiplier": 1,
          "chartAxisMin": -200
        }
      }
    ],
    "location": {
      "postalCode": "",
      "hasAltitude": false,
      "description": "Cabin Refridgerator",
      "altitude": 0,
      "street": "",
      "stateOrProvince": "",
      "longitude": -94.25591776794431,
      "latitude": 47.262320232064745,
      "country": "",
      "city": ""
    },
    "description": "Smart Plug that measures light, temp, current. Cost and rolling 3pt Avg are derived.",
    "name": "smartplug",
    "ownerUser": {
      "uid": "89ec79e6-4d0b-4abd-9172-2296f4703812"
    },
    "disposition": "FIXED",
    "timeZoneId": "US/Central"
  }
}

DELETE component/{componentUid}



Deletes a component.
Resource Information
Rate Limited? Yes
session, oauth and org tokens compatible?
Yes
api_key token compatible
Yes


Resource URL

http://grovestreams.com/api/component/{componentUid}

Parameters

none

Example Requests

/component/d251a8f2-f7b9-4df7-886d-b24c7f4929d4

Response Body
{
    "message" : "Deleted component with uid 'd251a8f2-f7b9-4df7-886d-b24c7f4929d4 '",
    "success" : true
}