thingsboard-skill

Data & Analytics
v0.1.0
Benign

Manage ThingsBoard devices, dashboards, telemetry.

61.6K downloads1.6K installsby @hoangnv170752

Setup & Installation

Install command

clawhub install hoangnv170752/thingsboard-skill

If the CLI is not installed:

Install command

npx clawhub@latest install hoangnv170752/thingsboard-skill

Or install with OpenClaw CLI:

Install command

openclaw skills install hoangnv170752/thingsboard-skill

or paste the repo link into your assistant's chat

Install command

https://github.com/openclaw/skills/tree/main/skills/hoangnv170752/thingsboard-skill

What This Skill Does

Manages ThingsBoard IoT platform resources through its REST API. Covers devices, telemetry data, dashboards, assets, and user accounts. Authentication is handled via JWT tokens with automatic refresh support.

Provides direct CLI access to ThingsBoard's full REST API without requiring the web UI, enabling automation and scripting of IoT data workflows.

When to Use It

  • Query latest sensor readings from IoT devices
  • List and inspect all registered tenant devices
  • Pull historical telemetry data for a specific time range
  • Make a dashboard publicly accessible without credentials
  • Audit tenant users and customer accounts
View original SKILL.md file
# 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": "sysadmin@thingsboard.org",
             "password": "sysadmin"
           }
         },
         {
           "tenant": {
             "email": "tenant@thingsboard.org",
             "password": "tenant"
           }
         }
       ]
     }
   ]
   ```

2. Set environment variables:
   ```bash
   export TB_URL="http://localhost:8080"
   export TB_USERNAME="tenant@thingsboard.org"
   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="tenant@thingsboard.org"
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
```

Example Workflow

Here's how your AI assistant might use this skill in practice.

INPUT

User asks: Query latest sensor readings from IoT devices

AGENT
  1. 1Query latest sensor readings from IoT devices
  2. 2List and inspect all registered tenant devices
  3. 3Pull historical telemetry data for a specific time range
  4. 4Make a dashboard publicly accessible without credentials
  5. 5Audit tenant users and customer accounts
OUTPUT
Manage ThingsBoard devices, dashboards, telemetry.

Share this skill

Security Audits

VirusTotalBenign
OpenClawBenign
View full report

These signals reflect official OpenClaw status values. A Suspicious status means the skill should be used with extra caution.

Details

LanguageMarkdown
Last updatedFeb 25, 2026