Remote Procedure Call (RPC)
Make request/reply calls from your app to devices. Unlike commands, RPC waits for the device to respond before returning.
Access via app.rpc.
API
call()
Send an RPC request to a device and wait for its response.
- JavaScript
- Python
await app.rpc.call(params)await app.rpc.call(params)| Parameter | Type | Description |
|---|---|---|
device_ident | string | The device identifier |
name | string | The RPC name (must match a listener on the device) |
data | any | The request payload |
timeout | number | (optional) Timeout in seconds. Default: 10 |
Returns the response from the device
Throws TimeoutError if the device doesn't respond within the timeout
- JavaScript
- Python
const response = await app.rpc.call({
device_ident: "sensor_01",
name: "get_status",
data: { include_logs: true },
timeout: 20,
});
console.log("Uptime:", response.data.uptime);
console.log("Firmware:", response.data.firmware);
response = await app.rpc.call({
"device_ident": "sensor_01",
"name": "get_status",
"data": {"include_logs": True},
"timeout": 20,
})
print("Uptime:", response["data"]["uptime"])
print("Firmware:", response["data"]["firmware"])
Response Format
The device responds using request.respond(data) or request.error(data) from the Device SDK RPC module. The response object contains:
| Field | Description |
|---|---|
status | "ok" for success, "error" for errors |
data | The response payload from the device |
Success response:
{
"status": "ok",
"data": {
"uptime": 86400,
"firmware": "1.2.0",
"temperature": 22.5
}
}
Error response (when the device calls request.error()):
{
"status": "error",
"data": {
"message": "Unknown service: analytics"
}
}
Error Handling
- JavaScript
- Python
try {
const response = await app.rpc.call({
device_ident: "sensor_01",
name: "get_status",
data: {},
timeout: 5,
});
if (response.status === "error") {
console.error("Device error:", response.data);
} else {
console.log("Success:", response.data);
}
} catch (err) {
// TimeoutError — device didn't respond in time
console.error("RPC timed out:", err.message);
}
try:
response = await app.rpc.call({
"device_ident": "sensor_01",
"name": "get_status",
"data": {},
"timeout": 5,
})
if response["status"] == "error":
print("Device error:", response["data"])
else:
print("Success:", response["data"])
except TimeoutError:
print("RPC timed out")