Welcome to the Gravity Connect API documentation for Device Partners (typically Device OEMs). This developer guide outlines the API endpoints and integration capabilities that Device Partners need to implement to connect their distributed energy resource (DER) devices with a virtual power plant (VPP) platform or a DERMS solution. The Device Partner endpoints work in combination with the VPP's Gravity Connect endpoints to support device enrollment and real-time control.
After building the endpoints described in this guide, Device Partners can add their products to the VPP's customers' programs. Utilities will use the VPP's platform and suite of device integrations to access real-time data and control smart devices as part of VPPs, demand response programs, and/or DER management programs.
This documentation is open-source, and we encourage all DERMS and VPP platforms to use this standard. Integrations built to the Gravity Connect API standard are not limited to use with one VPP platform.
Gravity Connect is an open API specification developed by Virtual Peaker to simplify and accelerate the integration of distributed energy resource (DER) devices into utility demand response (DR) and DER management programs.
Gravity Connect offers several key benefits to Device Partners:
Gravity Connect simplifies and streamlines the process of integrating DER devices into utility programs by handling the complexity behind a standardized and interoperable API. By partnering with VPPs using a Gravity Connect integration, your devices can access a large ecosystem of utility customers and programs quickly and easily.
If you're an OEM, utility, DERMS provider, or technology provider interested in learning more about integrating with Gravity Connect, our team is here to help.
To get started and discuss your use case, please reach out to our Gravity Connect support team at gravity-connect@virtual-peaker.com.
This list tracks noteworthy changes to the API specification.
unsubscribe from Device publishing as VP method of unenrollment. And, updated diagrams and and minor typo fixes.Energy Interval endpoint.baseUrl to correct vpBaseUrl in VP Endpoints of Postman Collection.USA as a value).invalidDevices was listed under the request body for Update group details, but it was meant to be under the response. Fixed this.The remainder of this guide describes the Device Partner endpoints, which are half of the integration. Meanwhile, the VPP API guide outlines the API endpoints hosted by the VPP for receiving data from the Device Partner's devices. The endpoints support standard integration operations, including publishing device signals, command statuses, and device enrollment events. In combination with the Device Partner endpoints, they allow a two-way flow of information that enables utilities to control and manage devices.
This data enables essential capabilities like:
Having a standardized set of endpoints for data intake simplifies integration significantly compared to custom development. Device Partners simply publish data in the documented format to stream it to the VPP's platform.
Learn more about the data flows in the Integration Overview.
A new Device Partner typically integrates with a VPP's Gravity Connect API following this process:
To use Postman to interact with endpoints, download the Postman Collection. After file opens hit Mac(command + s) or Windows(control + s) to save the file and download it to your computer.
Import near the top right of the left side panel menu.Upload Files and select the Postman Collection you downloaded earlier.Gravity Connect API with two main folders inside called VP Endpoints and Device Partner Endpoints.The collection uses Postman’s built in authentication handling to authenticate the request. Below are the steps to configure and request a new token, which will then be automatically included in subsequent requests.
VP Endpoints folder.Type to OAuth2.0 and Add auth dat to to Request Headers.Token Name to what you want it to be called.Grant Type to Client Credentials.Client ID and Client Secret you created within your application.Access Token URL to the auth endpoint for your application.Client Authentication to Send as Basic header.Get New Access Token button.We haven’t used the Postman collection for these endpoints yet, but we expect that using the Authorization Code flow will work something like:
OAuth Onboarding folder.Type to OAuth2.0 and Add auth dat to to Request Headers.Token Name to what you want it to be called.Grant Type to Authorization Code.Client ID and Client Secret you created within your application.Access Token URL and Auth URL to your urls.Callback URL to the VPP’s URL.Client Authentication to Send as Basic header.Get New Access Token button.Attached to the VPP endpoints is a script that will automatically create an HMAC and set it as a variable that is then used to make the request. These scripts expect that you’ve properly set the PROGRAM_PUBLISH_KEY, PROGRAM_PUBLISH_SECRET, DEVICE_PUBLISH_SECRET.
To do this:
VariablesCURRENT_VALUEGravity Connect uses the following authentication models:
Requests from the VPP to the Device Partner's endpoints
clientId: A program-specific ID.clientSecret: A program-specific secret.Requests from the Device Partner to the VPP's endpoints
PROGRAM_PUBLISH_KEY: The unique identifier for a utility program, provided when a program is set up.PROGRAM_PUBLISH_SECRET: The secret key used to generate HMAC signatures when publishing program-level data, provided when a program is set up.DEVICE_PUBLISH_SECRET: The secret key used to generate HMAC signatures when publishing device-level data, provided when each device is enrolled.Each device will be added to a program using one of the following flows. After a device is added, the VPP will call the /subscription endpoint on the Device Partner's API to enable device data publishing and share the DEVICE_PUBLISH_SECRET.
The flows most suitable for device owners to enroll devices are:
The flows most suitable for installers or program managers to enroll devices are:
Pairing codes are used in some enrollment flows to link device enrollments to homeowner enrollments to ensure accurate device association. The format is:
A1)12345)5)Example: A1123455
The device partner can validate the pairing code to provide immediate feedback. The VPP's API can perform the same validation upon receipt of a pairing code.
In this flow, a device owner fills out an enrollment form hosted by the VPP, then logs in to their Device Partner account to grant the VPP permission to access and control their devices.
The OAuth device discovery flow works as follows:
The VPP creates a unique client_id for each utility program. This ID is passed in the OAuth link to associate devices with the correct program.
When a customer onboards via the OAuth flow, we will direct them to a URL in the format below with:
client_id of the program the user is onboarding tohttps://example.com/oauth2/authorize?access_type=offline&response_type=code&redirect_uri=https%3A%2F%2Fgravity.example.com%2Foauth2%2Fcallback&client_id={}&state={}&scope={}
In this flow, a device owner fills out an enrollment form hosted by the VPP, which then presents them with a pairing code. The device owner then informs the Device Partner of their pairing code, which the Device Partner sends to the VPP with information about the device owner's devices. The VPP uses the pairing code to match the devices to the correct enrollment form data.
The pairing code device discovery flow works as follows:
DEVICE_PUBLISH_SECRET.Each utility program is assigned a different pairing code prefix that Device Partners can use to identify or confirm which program a device owner is joining.
Device Partner Driven Enrollment is a flow that can be used when the Device Partner has enough information about both the devices and the site to form a complete record in the VPP platform. This includes data such as the device UID, the service address, and the device owner's contact information.
The Device Partner can use this flow to proactively enroll devices through the Device Partner's app/website, pre-enroll a device purchased directly from the Device Partner, and bulk enroll devices that are transferred to the VPP.
DEVICE_PUBLISH_SECRET for each.This flow has been deprecated. The Device Partner Driven Enrollment flow is recommended for programs where the device owner is not involved in the enrollment process, such as direct install programs.
The utility commissioned pairing code flow works as follows:
DEVICE_PUBLISH_SECRET.After a device has been enrolled, the Device Partner will begin publishing data to the VPP's endpoints. The VPP API guide describes the endpoints that accept device telemetry and configuration updates (referred to as signals and settings), command status updates, and device enrollment updates. These endpoints are authenticated using the DEVICE_PUBLISH_SECRET or PROGRAM_PUBLISH_SECRET (depending on the endpoint) to create an HMAC.
The required data fields vary based on the device type, such as:
Each device type has a set of mandatory data fields that must be implemented, plus optional data fields that can be provided to improve reporting. See Device Type Specifications for the specifications for each device type.
Before finalizing an integration, the VPP will work with each Device Partner to verify that all required data points for a given device type are implemented correctly according to the specifications.
Having accurate and complete data publishing as per the documentation is critical for properly managing each device type within utility programs and optimizing distributed energy initiatives. The required fields for each device type integration must be confirmed before final approval.
When a utility sends a command using the VPP's platform, the VPP sends a command to the Device Partner targeting a specific device or a group (if group management is supported). See Device Type Specifications for the commands for each device type.
As not all device models support all commands, while building the integration, the Device Partner must inform the VPP of which models support which commands. The types of commands accepted must be consistent per device type + kind. For example, if the Acme Corporation is a device partner who sets up a hot water heater (kind = HWH) with a model name of ACME1000 (type = ACME1000), all ACME devices of kind HWH and type ACME1000 must support the same set of commands, but this set can be different than the command set supported by model ACME1001.
Throughout the duration of a command, devices continue to send data to the VPP. Commands also publish their status. For group commands, an individual device may need to report that it opted out (separate from the status of the command status), which it reports via the device command status endpoint.
The VPP can cancel any command that has been sent to a Device Partner using the cancel endpoint. The VPP may cancel active commands at any point during their duration. The Device Partner should immediately return devices to normal operating modes when a cancellation command is received.
Commands are sent from the VPP to the Device Partner at most 60 seconds before the start time, regardless of the VPP interface supporting program managers scheduling events hours or days in advance. The Device Partner must be able to accept both individual and group commands simultaneously for a given device.
The active operating mode of a device must align with the requested command mode if the device is participating in an event. For example, a water heater cannot report it is in 'NORMAL' mode if it is actively participating in a demand response event that calls for a ‘SHED’ (but it can if it has opted out of the event). The current mode should be updated accordingly as commands begin and end. Throughout each event, enrolled devices continue publishing telemetry data to the VPP's platform through the standard publishing endpoints.
Individual devices report opt-outs via the VPP endpoint publish device command status endpoint. For group commands, individual devices report opt-out status, as needed, via the Device Partner endpoint command opt-out.
Properly syncing modes and command statuses is crucial for accurate measurement and verification of demand response performance. The Device Partner integration must maintain consistency between the active command, device mode, and device command status.
For demand response events targeting individual devices, opt-out status should be reported using the VPP endpoint publish device command status endpoint endpoint.
This allows the Device Partner to share the specific UID of the device that has opted out. The payload should include the UID along with a status of "OPT_OUT" and relevant timestamp.
For group commands, the group-level Device Partner endpoint command opt-out should be used, and not the individual device opt-out endpoint. The group command status should be updated to "OPT_OUT" to indicate a specific or set of specific devices in the group has opted out.
The Device Partner API needs to implement both individual and group opt-out flows:
Properly reporting opt-out status at both the individual device and group level allows the VPP to update event logs and measurement & verification accordingly.
If a device is unenrolled from a VPP program via the Device Partner's app or portal, the device partner notifies the VPP via the publish device enrollment endpoint. The payload should include the device UID and a status of "unenrolled". The VPP will remove the device from the program and no longer collect data or call events on the device.
If a program manager unenrolls a device via the VPP platform, the VPP will call the Device Partner endpoint to unsubscribe from the device's data. The Device Partner should interpret the unsubscription as an unenrollment.
Definitions for SIGNAL_KEY, SIGNAL_VALUE, SETTING_KEY, and VP_COMMAND_OBJECT all depend on the type of device (DEVICE_TYPE_ENUM) interfacing with the Gravity Connect API. This section will outline those values per device type.
NOTE: VP_COMMAND_OBJECT is only a portion of what is sent during an event. For the full payload, please see the Send Command endpoint.
{
mode: 'STANDBY'
}
{
mode: 'CHARGE',
action: 'POWER',
power: 4000
}
{
mode: 'CHARGE',
action: 'FASTEST'
}
{
mode: 'DISCHARGE',
action: 'POWER',
power: 4000
}
{
mode: 'DISCHARGE',
action: 'SITE_DEMAND',
targetSiteDemand: 400
}
{
mode: 'DISCHARGE',
action: 'SITE_DEMAND',
targetSiteDemand: 400,
maxPower: 10000
}
SELF_CONSUMPTIONBACKUPCHARGEDISCHARGESTANDBYOFFLINEONLINECONNECTEDDISCONNECTED{
mode: 'SHED'
}
{
mode: 'LOAD_UP'
}
{
mode: 'CRITICAL'
}
{
mode: 'EMERGENCY'
}
{
mode: 'RUN_NORMAL'
}
Where energy is an integer for Wh and suggestedEfficiencyLevel is an integer between 1 (representing low efficiency/fast heat up) and 9 (for high efficiency/slow heat up), or 10 for vacation mode.
{
mode: 'ADVANCED_LOAD_UP',
energy: 1000
suggestedEfficiencyLevel: 1
}
Where suggestedEfficiencyLevel is an integer between 1 (representing low efficiency/fast heat up) and 9 (for high efficiency/slow heat up), or 10 for vacation mode.
{
mode: 'EFFICIENCY',
suggestedEfficiencyLevel: 1
}
Percentage ranges from 0-100
{
mode: 'DUTY_CYCLE',
percentage: 60
}
NORMALSHEDCRITICALEMERGENCYLOAD_UPADVANCED_LOAD_UPERRORCYCLINGPRICE_STREAMVARIABLEOFFLINEONLINEIDLE_NORMALRUNNING_NORMALRUNNING_CURTAILEDRUNNING_HEIGHTENEDIDLE_CURTAILEDSGD_ERROR_CONDITIONIDLE_HEIGHTENEDCYCLING_ONCYCLING_OFFVARIABLE_FOLLOWINGVARIABLE_NOT_FOLLOWINGIDLE_OPTED_OUTIDLE_PRICE_STREAMRUNNING_OPTED_OUTRUNNING_PRICE_STREAMIDLE_PRICE_STREAMAs described in the following specification, all temperatures are sent and received in units of Fahrenheit for consistency. However, these temperatures can be displayed in Celsius to users in appropriate locales.
{
mode: 'HEAT',
temperature: -2.0
}
HEATCOOLAUTOFAN_ONLYOFFLINEONLINEONOFFAUTOFASTSLOWOFFONHIGHMEDIUMLOWOFFONFAN ONLYHEATINGHEATING STAGE 2NONEThis puts the EV Charger in an idle state.
{
mode: 'STANDBY'
}
Limit the charging power to the set power limit, in units or Watts.
{
mode: 'DISPATCH',
action: 'LIMIT_POWER',
power: 1000
}
{
mode: 'DISPATCH',
action: 'PERCENT',
limitPercent: 100
}
OFFLINEONLINEINUSEAVAILABLENEEDS_SERVICE045000450004500{
mode: 'CHARGE',
action: 'POWER',
power: 4000
}
{
mode: 'CHARGE',
action: 'FASTEST'
}
{
mode: 'DISCHARGE',
action: 'POWER',
power: 4000
}
{
mode: 'DISCHARGE',
action: 'SITE_DEMAND',
targetSiteDemand: 400
}
{
mode: 'DISCHARGE',
action: 'SITE_DEMAND',
targetSiteDemand: 400,
maxPower: 10000
}
SELF_CONSUMPTIONBACKUPCHARGEDISCHARGESTANDBYOFFLINEONLINEUNREACHABLEAVAILABLEINUSEMost of the device partner's endpoints will utilize the device_partner_api_auth authentications. The only exception is the OAuth Device Discovery endpoint which uses device_partner_user_auth.
For information on how to authenticate when publishing data to the VPP, please see the Authentication section for those endpoints.
The Energy Interval endpoint collects energy interval data from devices, except low-voltage thermostats that do not record power data. Unlike other device telemetry, which is published to the VPP, energy intervals are polled by the VPP.
This data is more accurate than energy data that a VPP platform can compute from power data.
Providers typically use this data for:
start and end use the same format as specified elsewhere for Gravity connect (as they are in the sample URL above)start is inclusive, end is exclusiveduration = duration of each interval, in secondstime represents the start of the interval, such the value should represent the energy consumed between time and time + durationvalue has units of watt-hours (Wh) and is signed:Commands are sent in the 60 seconds before the start time and will not exceed a 24 hour duration. Commands with a start time in the past should still be considered valid so long as the current time is within the duration.
An "enrolled" device has been approved to participate in a VPP program. Subscription refers to whether the VPP is choosing to receive data for that device. When modifying the subscription of a device, the VPP can choose to register or unregister the device.
PROGRAM_PUBLISH_KEY and PROGRAM_PUBLISH_SECRET to use when publishing data?The VPP will provide a unique PROGRAM_PUBLISH_KEY and PROGRAM_PUBLISH_SECRET for new programs. The Device Partner should associate new devices with the program so that it can use the correct program credentials.
Telemetry data in the lists of "signals" and "settings" should be published between every 5 and every 15 minutes. This data should contain 5 minute intervals for continuous signals. Categorical signals and settings that change infrequently can be updated only on change.
The signal and setting lists are constantly evolving. Please contact the Gravity Connect team with suggestions for updating the specification.
Please see the Error Handling section in the VPP API documentation.
Device command status is for a specific device. Command status is used for groups of devices.
For individual device commands, use only the device command status endpoint.
For group commands, the command status reflects the state of the command at a scheduling engine level. For example, OPT_OUT would not apply and a status of FAILED means there was an issue scheduling the command as a whole. If a particular device's status does not reflect the greater command status (e.g., an individual device fails or opts out), report that difference via the device command status. Device command status that is the same as the current command status does not need to be reported.
/subscription control Command Status and Device Command Status publishing to the VPP?No, this endpoint only controls the sending of signals and settings. In the case that an unsubscribed device is targeted by a command (which is not an expected situation), the response data should not be reported to the VPP.
| DEVICE_UID required | string The unique identifier for the target device within the partner's platform |
{- "uid": "string",
- "kind": "HWH",
- "name": "string",
- "type": "string",
- "serialNumber": "string",
- "isSubscribed": true
}There may be cases where a particular signal or setting can be modified by Virtual Peaker. If this is supported, this endpoint is to be used.
| DEVICE_UID required | string The unique identifier for the target device within the partner's platform |
| SIGNAL_OR_SETTING required | string Enum: "signal" "setting" Whether the data type is a signal or a setting |
| DATA_KEY required | string The signal/setting type being read, varies based on device type, see documentation |
| key required | string |
required | string or number |
| time required | string <date-time> For more see, RFC 3339, section 5.6. As an example, '2017-07-21T17:32:28Z'. The timezone is always zero UTC offset. |
{- "key": "string",
- "value": "string",
- "time": "2019-08-24T14:15:22Z"
}{- "message": "string"
}| DEVICE_UID required | string The unique identifier for the target device within the partner's platform |
| SIGNAL_OR_SETTING required | string Enum: "signal" "setting" Whether the data type is a signal or a setting |
| DATA_KEY required | string The signal/setting type being read, varies based on device type, see documentation |
{- "key": "string",
- "value": "string",
- "time": "2019-08-24T14:15:22Z"
}This endpoint is used to enable or disable the publishing of device data (signals and settings) to Virtual Peaker.
| state required | string Enum: "register" "unregister" |
| uid required | string The unique identifier for the target device within the partner's platform |
| secret | string DEVICE_PUBLISH_SECRET; Passed when a device is subscribed to data, used to create an HMAC when the Device Partner publishes device data to Virtual Peaker |
{- "state": "register",
- "uid": "some-device-uid",
- "secret": "some-device-secret"
}{- "message": "string"
}| targeting required | string Enum: "group" "device" |
| uid required | string Group or device uid |
| kind | string (DeviceKindEnum) Enum: "HWH" "TSTAT" "BATTERY" "EVSE" "V2G" "STORAGE-HVAC" |
| startTime required | string <date-time> For more see, RFC 3339, section 5.6. As an example, '2017-07-21T17:32:28Z'. The timezone is always zero UTC offset. A startTime in the past should still be considered valid if startTime + duration is still in the future |
| duration required | integer Length of event in seconds. The value should be greater than 0. If a device partner imposes a maximum event duration, frequently it is either 8 or 24 hours. |
| command | object Varies by device kind, see documentation for VP_COMMAND_OBJECT |
{- "targeting": "group",
- "uid": "string",
- "kind": "HWH",
- "startTime": "2019-08-24T14:15:22Z",
- "duration": 0,
- "command": { }
}{- "refId": "string"
}| COMMAND_REFERENCE_ID required | string The id of the command being read |
{- "state": "PENDING",
- "description": "string",
- "time": "2019-08-24T14:15:22Z",
- "refId": "string"
}| COMMAND_REFERENCE_ID required | string The id of the command being cancelled |
{- "state": "PENDING",
- "description": "string",
- "time": "2019-08-24T14:15:22Z",
- "refId": "string"
}| DEVICE_UID required | string The unique identifier for the target device within the partner's platform |
| start required | string <date-time> For more see, RFC 3339, section 5.6. As an example, '2017-07-21T17:32:28Z'. The timezone is always zero UTC offset. A startTime in the past should still be considered valid if startTime + duration is still in the future |
| duration required | integer Length of event in seconds. The value should be greater than 0. If a device partner imposes a maximum event duration, frequently it is either 8 or 24 hours. |
[- {
- "value": 0,
- "time": "2019-08-24T14:15:22Z",
- "duration": 0,
- "state": "string",
- "postalCode": "string",
- "country": "string"
}
]The OAuth device discovery flow works as follows:
This ID is passed in the OAuth link to associate devices with the correct program.
{- "userId": "string",
- "accountNumber": "string",
- "name": "string",
- "email": "string",
- "deviceUids": [
- "string"
], - "serviceAddress": {
- "streetAddress": "string",
- "streetAddress2": "string",
- "city": "string",
- "state": "string",
- "postalCode": "string",
- "country": "string"
}
}The pairing code device discovery flow works as follows:
DEVICE_PUBLISH_SECRET.The user experience is driven through the Device Partner's web or mobile app after receiving the pairing code. This links together the Virtual Peaker and Device Partner platforms.
If a new device is added to Virtual Peaker via the Virtual Peaker's publish device enrollment endpoint. Virtual Peaker will use this endpoint to discover the user associated with the device.
| DEVICE_UID required | string The unique identifier for the target device within the partner's platform |
{- "userId": "string",
- "accountNumber": "string",
- "name": "string",
- "email": "string",
- "deviceUids": [
- "string"
], - "serviceAddress": {
- "streetAddress": "string",
- "streetAddress2": "string",
- "city": "string",
- "state": "string",
- "postalCode": "string",
- "country": "string"
}
}The utility commissioned pairing code flow could work as follows:
DEVICE_PUBLISH_SECRET.In this flow, the utility directs the installation. The pairing code links the user signup, Device Partner platform, and Virtual Peaker after install. The flow described above can have slight variations depending on the use case.
If a new device is added to Virtual Peaker via the Virtual Peaker's publish device enrollment endpoint. Virtual Peaker will use this endpoint to discover the user associated with the device.
| DEVICE_UID required | string The unique identifier for the target device within the partner's platform |
{- "userId": "string",
- "accountNumber": "string",
- "name": "string",
- "email": "string",
- "deviceUids": [
- "string"
], - "serviceAddress": {
- "streetAddress": "string",
- "streetAddress2": "string",
- "city": "string",
- "state": "string",
- "postalCode": "string",
- "country": "string"
}
}In the use case where the device partner needs a list of houses to physically install devices, Virtual Peaker will publish the list of houses and corresponding pairing codes via this endpoint. Virtual Peaker will publish to this endpoint nightly with a list of all houses/devices to be installed (the same house will be published each night until it is installed). When the device is installed, the device partner will then use the publish device enrollment status.
Array of objects Included if the device partner needs more details on which device (and how many) need installed. If not included, it's assumed the device partner can infer this information based on the program. | |
| pairingCode required | string The current format is:
|
required | object (ServiceAddress) |
[- {
- "devices": [
- {
- "kind": "HWH",
- "type": "string"
}
], - "pairingCode": "A1012344",
- "serviceAddress": {
- "streetAddress": "string",
- "streetAddress2": "string",
- "city": "string",
- "state": "string",
- "postalCode": "string",
- "country": "string"
}
}
]{- "message": "string"
}Virtual Peaker supports managing groups of devices, in addition to individual device control. Grouping enables utilities to target clusters of devices together in demand response events.While device telemetry and configuration data is still reported on a per-device level, groups allow a single command to be broadcast to multiple enrolled devices simultaneously. To utilize grouping, the Device Partner integration must support both individual and group commands concurrently. The same device could receive an individual command, while also belonging to a group receiving a separate directive. Group commands have additional considerations:
When not specified, all other workflows behave identically between individual and grouped devices - enrollment, data publishing, cancellations, etc.
| deviceUids | Array of strings Array of device uids for the Device Partner to assign to the newly created group. Can be an empty array |
| name | string Human readable name of group |
{- "deviceUids": [
- "string"
], - "name": "string"
}{- "uid": "string",
- "invalidDevices": [
- "string"
]
}Update group details, if deviceUids is passed, it will overwrite the current list of devices.
| GROUP_ID required | string The id of the device being targeted |
| deviceUids | Array of strings Updated array of deviceUids which will overwrite the existing array (as opposed to adding and removing a list of deviceUids) |
| name | string Human readable name of group |
{- "deviceUids": [
- "string"
], - "name": "string"
}{- "uid": "string",
- "deviceUids": [
- "string"
], - "name": "string",
- "invalidDevices": [
- "string"
]
}Deletes a group and returns the list of devices that were within the group when deleted
| GROUP_ID required | string The id of the device being targeted |
{- "uid": "string",
- "deviceUids": [
- "string"
], - "name": "string"
}| GROUP_ID required | string The id of the device being targeted |
| deviceUids required | Array of strings Array of device uids for the Device Partner to assign to or remove from the group |
| action required | string Enum: "add" "remove" |
{- "deviceUids": [
- "string"
], - "action": "add"
}{- "uid": "string",
- "deviceUids": [
- "string"
], - "name": "string",
- "invalidDevices": [
- "string"
]
}To communicate that particular devices within a group have opted out. For non-group command this is achieved via canceling the entire command.
| COMMAND_REFERENCE_ID required | string The id of the command |
| deviceUids required | Array of strings Array of device uids for the Device Partner to opt out of the command |
{- "deviceUids": [
- "string"
]
}{- "message": "string"
}