Skip to main content
A push sends one command to one device. Every writable device type takes the same body, and every push creates an action you can track.

Send a command

Post to the device’s route: POST /battery/{deviceId}, POST /ev-charger/{deviceId}, or POST /hvac/{deviceId}.
Solar inverters and vehicles are read-only. They have no push route, so a POST to them returns 405 METHOD_NOT_ALLOWED.

Request body

The commands, parameters, and bounds a device accepts are listed in its commands map. See Capabilities.

Commands by device type

A given device may support a subset. A command, parameter, or unit the device doesn’t list returns 422 DEVICE_NOT_CAPABLE, with the offending value and what the device supports in details.

Quantities

Every numeric parameter is a Quantity: a value and a unit.
Valid units are percent, kw, watts, kwh, amps, volts, hours, minutes, celsius, and fahrenheit. Each parameter accepts the unit declared in the device’s commands map. A value outside the declared bounds returns 422 PARAMETER_OUT_OF_RANGE.

When it runs

Each command lists the execution types it supports in its execution array. An unsupported one returns 422 DEVICE_NOT_CAPABLE with requestedExecution and supportedExecution in details. Time format, time zones, and limits are covered in Scheduling.

The response

A push returns 202 Accepted with the new action. Track it at links.self.
Pushes that run now return acknowledged. Pushes with a start return scheduled, with start and end echoed as UTC timestamps. An immediate push may also carry warnings, such as no vehicle plugged in. The command is still accepted. If the manufacturer refuses an immediate command straight away, the push returns that error instead of 202. The action is still recorded as failed, and a push.failed is sent.

Action states

States move scheduled → acknowledged → completed or failed. Immediate pushes start at acknowledged. completed, failed, and cancelled are final. A windowed action is completed while its window is still running. Its endedAt is set when the window closes.

Check an action

In production, use webhooks instead of polling.

List actions

GET /actions returns actions across all your devices, newest first.
The response is data: { items, pagination }, with the same item shape as GET /actions/{actionId}.

Next steps

Conflicts

What happens when a device already has an active action.

Scheduling

Run commands later or inside a time window.

Webhooks

Get notified when an action completes or fails.

Capabilities

Find out what a device accepts before you push.