Ein Befehl (auch RPC genannt) veranlasst ein Gerät, etwas zu tun: neu starten, einen Ausgang schalten, einen Test ausführen. Jeder Befehl wird als Anfrage gespeichert, und Sie können ihn verfolgen, bis das Gerät antwortet. Befehle werden nur über TLS-Sitzungen gesendet (sofern das Profil einen Befehl im Klartext nicht erlaubt), niemals über die Flows, die Telemetrie verarbeiten, und jeder Befehl wird anhand der Berechtigungen des Absenders geprüft.
Der Befehlskatalog
Jedes Geräteprofil hat einen Reiter Commands: „Die Befehle, die Bediener an die Geräte dieses Profils senden dürfen; jede Stufe benötigt eine eigene Berechtigung.“ Zum Bearbeiten wird die Berechtigung zum Verwalten von Befehlen (Administratoren) benötigt.
Wählen Sie Add command und füllen Sie aus:
| Feld | Bedeutung |
|---|---|
| Method | Der Name im Protokoll, namespace.verb, zum Beispiel sys.info. Buchstaben, Ziffern, _ und .. |
| Label, Description | Was Bediener sehen. |
| Tier | Basic, Privileged oder Critical: wer ihn senden darf (siehe unten). |
| High impact (asks for a confirmation) | Der Absender muss bestätigen; der Befehl wird höchstens einmal gesendet und protokolliert. |
| Typed confirmation phrase | Optional, nur bei hoher Auswirkung: Der Bediener gibt sie zum Senden ein (zum Beispiel REBOOT). |
| One-way (no answer) | Das Gerät antwortet nicht. |
| Long-running (the answer only says it started) | Das Gerät antwortet sofort und meldet das Ergebnis später. |
| Default timeout (ms) | 1.000 bis 600.000. Leer: die Default RPC timeout des Profils. |
| Persistent by default (delivered when the device comes back) | Befehl in die Warteschlange stellen, während das Gerät offline ist. |
| Parameters | Aufgebaut mit Fields (Name, Label, Typ Text, Number, Yes / no, Choice oder Any value (JSON), required, min, max, choices) oder als Advanced (JSON). Bis zu 50 Parameter. |
| Masked parameters | Parameternamen, deren Werte nie im Verlauf angezeigt werden. |
From a template beginnt das Formular mit einem Befehl, den die Plattform bereits sendet (etwa eine Board-Steuerung). Import ersetzt den gesamten Katalog durch einen Export ({"commands": [ … ]}); Export zeigt den Katalog als JSON. Ein Profil enthält bis zu 200 Befehle.
Stufen
| Stufe | Wer ihn senden darf (Standard) |
|---|---|
| Basic | Benutzer |
| Privileged | Administratoren |
| Critical | Administratoren |
| Raw (a method that is not in the catalog) | Eigentümer |
Hinweis
Einige Befehle werden nie gesendet, unabhängig davon, wer sie anfordert: Werksreset, Kopplung, Vergessen von WLAN und cloud.forget. Einige Methodenfamilien gehören zu einem Modul, und nur dieses Modul sendet sie (zum Beispiel tunnel.* für den Fernzugriff und esim.*). Profile, die nur das Themenschema Legacy compatible verwenden, enthalten keine Befehle: „RPC ist für Geräte im Schema Legacy compatible nicht verfügbar; verwenden Sie gemeinsame Attribute (Reiter Attributes), um Einstellungen zu senden.“
Einen Befehl senden
- Öffnen Sie das Gerät und den Reiter Commands.
- Wählen Sie unter Choose a command einen Befehl (oder Other method (raw), nur für Eigentümer) und füllen Sie dessen Parameters aus.
- Legen Sie bei Bedarf die Optionen fest:
| Option | Bedeutung | Standard |
|---|---|---|
| Do not wait for an answer (one-way) | Das Gerät antwortet nicht. | Aus (zweiseitig) |
| Answer timeout (seconds) | Wie lange auf die Antwort gewartet wird, 1 bis 600 Sekunden. | Der Standardwert des Befehls, sonst 10 Sekunden |
| Deliver when the device comes back (persistent) | Den Befehl in der Warteschlange behalten, während das Gerät offline ist. | Der Standardwert des Befehls |
| Give up after (minutes) | Wann ein wartender Befehl aufgegeben wird. | 24 Stunden; höchstens 7 Tage |
- Wählen Sie Send. Ein Befehl mit hoher Auswirkung fragt Send {method}? („Dieser Befehl wirkt sich auf das Gerät aus (es kann neu starten oder seine Sitzung verlieren).“) und, wenn er eine Phrase hat, Type {phrase} to confirm.
Ist das Gerät offline, warnt der Reiter: „Das Gerät ist offline: Ohne „persistent“ schlägt der Befehl sofort fehl.“
Dashboards, SCADA-Symbole, Regeln und Flows können ebenfalls Befehle senden. Eine Board-Steuerung sendet nur Befehle der Stufe Basic. Siehe Control cards.
Befehlszustände
| Zustand | Angezeigt als | Bedeutung |
|---|---|---|
QUEUED | Queued | Gespeichert, wartet auf das Gerät. |
SENT | Sent | An das Gerät gesendet. |
DELIVERED | Delivered | Das Gerät hat ihn empfangen. |
SUCCESSFUL | Successful | Das Gerät hat mit Erfolg geantwortet. |
FAILED | Failed | Das Gerät hat mit einem Fehler geantwortet. |
TIMEOUT | Timed out | Keine Antwort rechtzeitig. Das bedeutet „keine Antwort eingegangen“, nicht „er wurde nicht ausgeführt“. |
EXPIRED | Expired | Er ist abgelaufen, bevor er zugestellt werden konnte. |
CANCELLED | Cancelled | Jemand hat ihn abgebrochen. |
Ein langlaufender Befehl zeigt Running on the device, bis sein Ergebnis eintrifft; ein Befehl ohne Antwort zeigt No answer: the outcome is unknown; eine Antwort nach dem Ende zeigt Answered after the end.
Der Verlauf
Der History auf dem Reiter Commands listet Method, Status, Sent by (Console, API, A flow, Firmware update, An alarm action, A dashboard control), Created, Completed und Duration. Öffnen Sie einen Befehl, um seine Request, Response und Progress zu sehen, um Cancel command zu wählen, solange er in der Warteschlange steht oder gesendet ist, oder um Send again zu wählen. Geheime Parameter werden maskiert.
Standardgrenzwerte: 10 Befehle pro Gerät und Minute sowie 600 pro Organisation und Minute; Parameter bis 16 KiB JSON; eine Antwort bis 64 KiB. Der Verlauf wird 90 Tage aufbewahrt.
Auf dem Gerät
Das Gerät abonniert v1/rpc/req/+ und empfängt:
PUBLISH v1/rpc/req/42
{"method": "sys.ping", "params": {"host": "8.8.8.8", "count": 3}}
Bei einem zweiseitigen Befehl antwortet es mit derselben ID:
PUBLISH v1/rpc/res/42
{"ok": true, "result": {"sent": 3, "received": 3, "avg_ms": 18.2}}
Regeln für das Gerät:
- Ein Befehl kann zweimal eintreffen. Merken Sie sich mindestens die letzten 32 Anfrage-IDs für 10 Minuten und führen Sie dieselbe ID nie zweimal aus.
- Enthält die Anfrage
expirationTimeund ist diese Zeit verstrichen, führen Sie sie nicht aus; antworten Sie mit{"ok": false, "error": "expired"}. - Ist eine Anfrage größer, als das Gerät verarbeiten kann, führen Sie sie nicht aus; antworten Sie mit
{"ok": false, "error": "payload_too_large"}. - Befehle werden erst zugestellt, nachdem das Gerät
v1/rpc/req/+auf dieser Verbindung abonniert hat.
HTTP-Geräte warten auf Befehle mit GET /api/v1/rpc und antworten mit POST /api/v1/rpc/{id}. Siehe Device HTTP API.
Langlaufende Befehle
PUBLISH v1/rpc/res/43
{"ok": true, "accepted": true, "job_id": "43"}
PUBLISH v1/attributes
{"rpc_result": {"job_id": "43", "method": "sys.traceroute", "ok": true, "result": {...}, "ts": 1759572042000}}
Anfragen vom Gerät
Ein Gerät kann auch die Cloud anfragen: Veröffentlichen Sie an v1/rpc/up/req/{id} mit {"method": …, "params": …} und lesen Sie die Antwort auf v1/rpc/up/res/{id}. Ihre Flows empfangen diese Anfragen und beantworten sie.
LoRaWAN und Gateway-Kindgeräte
- LoRaWAN-Geräte erhalten Roh-Downlinks mit dem Befehl
lora.downlink. Siehe Sending downlinks. - Befehle an Geräte hinter einem Gateway sind in Entwicklung. Siehe Commands to devices behind a gateway.
Per API
POST/tenant/{tenantId}/api/iot/devices/{deviceId}/rpc
Einen Befehl an ein Gerät senden. Body-Felder: method (erforderlich), params, oneway, persistent, timeoutMs (1.000 bis 600.000), expiresInS (1 bis 604.800), wait, confirm, confirmText, source (console, api oder dashboard_control). params darf höchstens 16 KiB JSON umfassen. Ein zweiseitiger, nicht persistenter Aufruf mit einem Timeout von höchstens 30 Sekunden wartet auf das Ende und antwortet mit 200. Jeder andere Aufruf antwortet sofort mit 202. Ein Befehl mit hoher Auswirkung benötigt "confirm": true.
Request-Body application/json
{
"method": "sys.ping",
"params": {
"host": "8.8.8.8",
"count": 3
},
"timeoutMs": 10000
}
Beispiel curl
curl -X POST 'https://<your-host>/tenant/{tenantId}/api/iot/devices/{deviceId}/rpc' \
-H 'Content-Type: application/json' \
-d '{"method":"sys.ping","params":{"host":"8.8.8.8","count":3},"timeoutMs":10000}'
Antworten
200OK
{
"rpc": {
"rpcId": "…",
"deviceId": "…",
"method": "sys.ping",
"status": "SUCCESSFUL",
"outcome": null,
"response": {
"ok": true,
"result": {
"sent": 3,
"received": 3,
"avg_ms": 18.2
}
},
"tier": "basic",
"highImpact": false,
"source": "api",
"…": "…"
}
}
202Accepted
{
"rpc": {
"rpcId": "…",
"deviceId": "…",
"method": "sys.reboot",
"status": "QUEUED",
"…": "…"
}
}
400Bad Request
{
"message": "This command needs confirm: true.",
"code": "VALIDATION_ERROR",
"details": {
"reason": "confirm_required"
}
}
403Forbidden
Kein Antwort-Body.
404Not Found
{
"message": "Device not found.",
"code": "NOT_FOUND"
}
429Too Many Requests
Kein Antwort-Body.
Einen Befehl liest du mit GET /tenant/{tenantId}/api/iot/rpc/{rpcId}, und du brichst ihn mit POST …/rpc/{rpcId}/cancel ab (nur solange er QUEUED oder SENT ist; wird protokolliert). Das Feld outcome zeigt running, unknown oder late, wie oben beschrieben. Siehe Commands API.
Die Webhook-Ereignisse rpc.completed und rpc.failed informieren andere Systeme über das Ergebnis. Befehle mit hoher Auswirkung und Raw-Befehle werden bei ihrer Erstellung und bei ihrem Abschluss im Audit-Log erfasst.

