Automation
thingsboard-skill
Manage ThingsBoard devices, dashboards, telemetry
---
name: thingsboard
description: Manage ThingsBoard devices, dashboards, telemetry, and users via the ThingsBoard REST API.
homepage: https://thingsboard.io
metadata: {"clawdbot":{"emoji":"📊","requires":{"bins":["jq","curl"],"env":["TB_URL","TB_USERNAME","TB_PASSWORD"]}}}
---
# ThingsBoard Skill
Manage ThingsBoard IoT platform resources including devices, dashboards, telemetry data, and users.
## Setup
1. Configure your ThingsBoard server in `credentials.json`:
```json
[
{
"name": "Server Thingsboard",
"url": "http://localhost:8080",
"account": [
{
"sysadmin": {
"email": "[email protected]",
"password": "sysadmin"
}
},
{
"tenant": {
"email": "[email protected]",
"password": "tenant"
}
}
]
}
]
```
2. Set environment variables:
```bash
export TB_URL="http://localhost:8080"
export TB_USERNAME="[email protected]"
export TB_PASSWORD="tenant"
```
3. Get authentication token:
```bash
export TB_TOKEN=$(curl -s -X POST "$TB_URL/api/auth/login" \
-H "Content-Type: application/json" \
-d "{\"username\":\"$TB_USERNAME\",\"password\":\"$TB_PASSWORD\"}" | jq -r '.token')
```
## Usage
All commands use curl to interact with the ThingsBoard REST API.
### Authentication
**Login and get token:**
```bash
curl -s -X POST "$TB_URL/api/auth/login" \
-H "Content-Type: application/json" \
-d "{\"username\":\"$TB_USERNAME\",\"password\":\"$TB_PASSWORD\"}" | jq -r '.token'
```
**Refresh token (when expired):**
```bash
curl -s -X POST "$TB_URL/api/auth/token" \
-H "Content-Type: application/json" \
-d "{\"refreshToken\":\"$TB_REFRESH_TOKEN\"}" | jq -r '.token'
```
**Get current user info:**
```bash
curl -s "$TB_URL/api/auth/user" \
-H "X-Authorization: Bearer $TB_TOKEN" | jq
```
### Device Management
**List all tenant devices:**
```bash
curl -s "$TB_URL/api/tenant/devices?pageSize=100&page=0" \
-H "X-Authorization: Bearer $TB_TOKEN" | jq '.data[] | {name, id: .id.id, type}'
```
**Get device by ID:**
```bash
curl -s "$TB_URL/api/device/{deviceId}" \
-H "X-Authorization: Bearer $TB_TOKEN" | jq
```
**Get device credentials:**
```bash
curl -s "$TB_URL/api/device/{deviceId}/credentials" \
-H "X-Authorization: Bearer $TB_TOKEN" | jq
```
### Telemetry & Attributes
**Get telemetry keys:**
```bash
curl -s "$TB_URL/api/plugins/telemetry/DEVICE/{deviceId}/keys/timeseries" \
-H "X-Authorization: Bearer $TB_TOKEN" | jq
```
**Get latest telemetry:**
```bash
curl -s "$TB_URL/api/plugins/telemetry/DEVICE/{deviceId}/values/timeseries?keys=temperature,humidity" \
-H "X-Authorization: Bearer $TB_TOKEN" | jq
```
**Get timeseries data with time range:**
```bash
START_TS=$(($(date +%s)*1000 - 3600000)) # 1 hour ago
END_TS=$(($(date +%s)*1000)) # now
curl -s "$TB_URL/api/plugins/telemetry/DEVICE/{deviceId}/values/timeseries?keys=temperature&startTs=$START_TS&endTs=$END_TS&limit=100" \
-H "X-Authorization: Bearer $TB_TOKEN" | jq
```
**Get attribute keys:**
```bash
# Client scope
curl -s "$TB_URL/api/plugins/telemetry/DEVICE/{deviceId}/keys/attributes/CLIENT_SCOPE" \
-H "X-Authorization: Bearer $TB_TOKEN" | jq
# Shared scope
curl -s "$TB_URL/api/plugins/telemetry/DEVICE/{deviceId}/keys/attributes/SHARED_SCOPE" \
-H "X-Authorization: Bearer $TB_TOKEN" | jq
# Server scope
curl -s "$TB_URL/api/plugins/telemetry/DEVICE/{deviceId}/keys/attributes/SERVER_SCOPE" \
-H "X-Authorization: Bearer $TB_TOKEN" | jq
```
**Get attributes by scope:**
```bash
curl -s "$TB_URL/api/plugins/telemetry/DEVICE/{deviceId}/values/attributes/CLIENT_SCOPE?keys=attribute1,attribute2" \
-H "X-Authorization: Bearer $TB_TOKEN" | jq
```
**Save device attributes:**
```bash
curl -s -X POST "$TB_URL/api/plugins/telemetry/DEVICE/{deviceId}/attributes/SERVER_SCOPE" \
-H "X-Authorization: Bearer $TB_TOKEN" \
-H "Content-Type: application/json" \
-d '{"attribute1":"value1","attribute2":"value2"}' | jq
```
**Delete timeseries keys:**
```bash
curl -s -X DELETE "$TB_URL/api/plugins/telemetry/DEVICE/{deviceId}/timeseries/delete?keys=oldKey1,oldKey2&deleteAllDataForKeys=true" \
-H "X-Authorization: Bearer $TB_TOKEN"
```
### Dashboard Management
**List all dashboards:**
```bash
curl -s "$TB_URL/api/tenant/dashboards?pageSize=100&page=0" \
-H "X-Authorization: Bearer $TB_TOKEN" | jq '.data[] | {name, id: .id.id}'
```
**Get dashboard info:**
```bash
curl -s "$TB_URL/api/dashboard/{dashboardId}" \
-H "X-Authorization: Bearer $TB_TOKEN" | jq
```
**Make dashboard public:**
```bash
curl -s -X POST "$TB_URL/api/customer/public/dashboard/{dashboardId}" \
-H "X-Authorization: Bearer $TB_TOKEN" | jq
```
**Get public dashboard info (no auth required):**
```bash
curl -s "$TB_URL/api/dashboard/info/{publicDashboardId}" | jq
```
**Remove public access:**
```bash
curl -s -X DELETE "$TB_URL/api/customer/public/dashboard/{dashboardId}" \
-H "X-Authorization: Bearer $TB_TOKEN"
```
### User Management
**List tenant users:**
```bash
curl -s "$TB_URL/api/tenant/users?pageSize=100&page=0" \
-H "X-Authorization: Bearer $TB_TOKEN" | jq '.data[] | {email, firstName, lastName, id: .id.id}'
```
**List customers:**
```bash
curl -s "$TB_URL/api/customers?pageSize=100&page=0" \
-H "X-Authorization: Bearer $TB_TOKEN" | jq '.data[] | {title, id: .id.id}'
```
**Get customer users:**
```bash
curl -s "$TB_URL/api/customer/{customerId}/users?pageSize=100&page=0" \
-H "X-Authorization: Bearer $TB_TOKEN" | jq '.data[]'
```
### Assets
**List all assets:**
```bash
curl -s "$TB_URL/api/tenant/assets?pageSize=100&page=0" \
-H "X-Authorization: Bearer $TB_TOKEN" | jq '.data[] | {name, type, id: .id.id}'
```
**Get asset by ID:**
```bash
curl -s "$TB_URL/api/asset/{assetId}" \
-H "X-Authorization: Bearer $TB_TOKEN" | jq
```
## Notes
- **Authentication**: JWT tokens expire after a configured period (default: 2 hours). Re-authenticate when you receive 401 errors.
- **Device/Dashboard IDs**: Entity IDs are in the format `{entityType: "DEVICE", id: "uuid"}`. Use the `id` field for API calls.
- **Pagination**: Most list endpoints support `pageSize` and `page` parameters (default: 100 items per page, max: 1000).
- **Attribute Scopes**:
- `CLIENT_SCOPE`: Client-side attributes (set by devices)
- `SHARED_SCOPE`: Shared between server and devices
- `SERVER_SCOPE`: Server-side only (not visible to devices)
- **Timestamps**: Use milliseconds since epoch for `startTs` and `endTs` parameters.
- **Rate Limits**: Check your ThingsBoard server configuration for API rate limits.
- **HTTPS**: For production, use HTTPS URLs (e.g., `https://demo.thingsboard.io`).
## Examples
```bash
# Complete workflow: Login, list devices, get telemetry
export TB_URL="http://localhost:8080"
export TB_USERNAME="[email protected]"
export TB_PASSWORD="tenant"
# Get token
export TB_TOKEN=$(curl -s -X POST "$TB_URL/api/auth/login" \
-H "Content-Type: application/json" \
-d "{\"username\":\"$TB_USERNAME\",\"password\":\"$TB_PASSWORD\"}" | jq -r '.token')
# List all devices
curl -s "$TB_URL/api/tenant/devices?pageSize=10&page=0" \
-H "X-Authorization: Bearer $TB_TOKEN" | jq '.data[] | {name, type, id: .id.id}'
# Get first device ID
DEVICE_ID=$(curl -s "$TB_URL/api/tenant/devices?pageSize=1&page=0" \
-H "X-Authorization: Bearer $TB_TOKEN" | jq -r '.data[0].id.id')
# Get telemetry keys for device
curl -s "$TB_URL/api/plugins/telemetry/DEVICE/$DEVICE_ID/keys/timeseries" \
-H "X-Authorization: Bearer $TB_TOKEN" | jq
# Get latest telemetry values
curl -s "$TB_URL/api/plugins/telemetry/DEVICE/$DEVICE_ID/values/timeseries?keys=temperature,humidity" \
-H "X-Authorization: Bearer $TB_TOKEN" | jq
# Get historical data (last hour)
START_TS=$(($(date +%s)*1000 - 3600000))
END_TS=$(($(date +%s)*1000))
curl -s "$TB_URL/api/plugins/telemetry/DEVICE/$DEVICE_ID/values/timeseries?keys=temperature&startTs=$START_TS&endTs=$END_TS&limit=100" \
-H "X-Authorization: Bearer $TB_TOKEN" | jq
# List dashboards and make first one public
DASHBOARD_ID=$(curl -s "$TB_URL/api/tenant/dashboards?pageSize=1&page=0" \
-H "X-Authorization: Bearer $TB_TOKEN" | jq -r '.data[0].id.id')
curl -s -X POST "$TB_URL/api/customer/public/dashboard/$DASHBOARD_ID" \
-H "X-Authorization: Bearer $TB_TOKEN" | jq
```
automation
By
Comments
Sign in to leave a comment