Bir komut (RPC), cihazdan bir işi yapmasını ister ve tek yönlü değilse cihazın yanıtını bekler. Her komut bir durumu olan bir istek olarak saklanır; böylece komutu şimdi gönderip sonucu daha sonra okuyabilirsiniz. Komutların uygulamada kullanıcılar için nasıl çalıştığı Cihazlara komut gönderme sayfasında anlatılmıştır. Yollar https://<your host>/tenant/<tenantId> altındadır.
Geliştirme aşamasında: Bir ağ geçidinin arkasındaki cihazlara (ağ geçidinin alt cihazlarına) komut gönderme geliştirme aşamasındadır. Kendi kendine bağlanan cihazlara komut gönderin.
Yollar
| Yöntem | Yol | İzin | İşlevi |
|---|---|---|---|
| POST | /api/iot/devices/{deviceId}/rpc | iot_rpc.read ile komutun seviyesi | Komut gönder |
| GET | /api/iot/devices/{deviceId}/rpc | iot_rpc.read | Cihazın komut geçmişi |
| GET | /api/iot/rpc/{rpcId} | iot_rpc.read | Yanıtıyla birlikte tek bir komut |
| POST | /api/iot/rpc/{rpcId}/cancel | iot_rpc.read ile komutun seviyesi | Sıradaki veya gönderilmiş bir komutu iptal et |
| GET | /api/iot/devices/{deviceId}/rpc-commands | iot_rpc.send.basic | Bir pano kontrolünün bu cihaza gönderebileceği komutlar |
| GET | /api/iot/rpc-commands/{profileId} | iot_rpc.read | Bir profilin komut kataloğu (içe aktarma biçimi için ?format=export) |
| POST | /api/iot/rpc-commands/{profileId} | iot_rpc.commands.manage | Kataloğa komut ekle |
| PUT | /api/iot/rpc-commands/{profileId} | iot_rpc.commands.manage | Tüm kataloğu değiştir |
| PATCH, DELETE | /api/iot/rpc-commands/{profileId}/{commandId} | iot_rpc.commands.manage | Tek bir komutu değiştir veya kaldır |
Kim neyi gönderebilir
Bir profilin kataloğundaki her komutun bir seviyesi vardır. Seviye izni belirler:
| Seviye | İzin | Varsayılan rol | Bir API anahtarı buna sahip olabilir mi? |
|---|---|---|---|
| basic | iot_rpc.send.basic | Kullanıcı | Evet |
| privileged | iot_rpc.send.privileged | Yönetici | Evet |
| critical | iot_rpc.send.critical | Yönetici | Evet |
| raw (kataloda olmayan bir yöntem) | iot_rpc.send.raw | Sahip | Hayır |
Yani bir API anahtarı yalnızca cihaz profilinin kataloğunda bulunan yöntemleri gönderebilir.
Komut gönder
POST/tenant/{tenantId}/api/iot/devices/{deviceId}/rpc
Alanlar: method (zorunlu, namespace.verb, en fazla 64 karakter), params (herhangi bir JSON, en fazla 16 KiB), oneway, persistent, timeoutMs (1.000 ile 600.000 arası; varsayılan, kataloğun veya profilin değeri, yoksa 10.000), expiresInS (1 ile 604.800 arası, kalıcı komut için; varsayılan 86.400), wait, confirm, confirmText, source (api, console veya dashboard_control). Çift yönlü, kalıcı olmayan ve zaman aşımı en fazla 30 saniye olan bir komut sonuna kadar bekler ve 200 yanıtı verir; diğer her durumda 202 yanıtı verilir ve komut arka planda devam eder.
İstek gövdesi application/json
{
"method": "pump.start",
"params": {
"speed": 80
},
"timeoutMs": 15000
}
Örnek curl
curl -X POST 'https://<your-host>/tenant/{tenantId}/api/iot/devices/{deviceId}/rpc' \
-H 'Content-Type: application/json' \
-d '{"method":"pump.start","params":{"speed":80},"timeoutMs":15000}'
Yanıtlar
200OK
{
"rpc": {
"rpcId": "c0de…",
"deviceId": "6f1c…",
"method": "pump.start",
"status": "SUCCESSFUL",
"outcome": null,
"response": {
"ok": true
},
"error": null,
"tier": "privileged",
"highImpact": false,
"source": "api",
"createdAt": "2026-11-09T09:00:00.000Z",
"completedAt": "2026-11-09T09:00:01.200Z",
"…": "…"
}
}
202Accepted
{
"rpc": {
"rpcId": "c0de…",
"status": "QUEUED",
"…": "…"
}
}
403Forbidden
{
"message": "You are not permitted to perform this action",
"code": "FORBIDDEN"
}
409Conflict
{
"message": "The device is disabled or quarantined; it takes no commands.",
"code": "CONFLICT",
"details": {
"reason": "device_not_active"
}
}
429Too Many Requests
{
"message": "Too many commands to this device; try again in a minute.",
"code": "RATE_LIMIT_EXCEEDED",
"details": {
"reason": "device_rate_limited"
}
}
- Tek yönlü (
oneway: true): komut iletildiğinde başarılı sayılır; yanıt beklenmez. - Kalıcı (
persistent: true): cihaz çevrimdışıysa komut en fazlaexpiresInSsüresince onu bekler, sonraEXPIREDdurumuyla sona erer. - wait:
truebeklemeyi zorunlu kılar (komut 30 saniyede tamamlanamıyorsa “A synchronous call waits at most 30 s; use wait: false for a longer timeout.” mesajıyla reddedilir);falseher zaman hemen202yanıtı verir. - Yüksek etkili komutlar
"confirm": truegerektirir; katalogdaki komutta bir onay ifadesi varsa,confirmTextiçine o ifade yazılmalıdır. Bu olmadan şu mesaj döner: “This command needs confirm: true.” Bu komutlar gönderildiğinde ve sona erdiğinde denetim günlüğüne yazılır ve en fazla bir kez gönderilir.
Bu yolda bir idempotency anahtarı yoktur: her POST yeni bir komut oluşturur. Çağrınız ağda zaman aşımına uğrarsa, yeniden göndermeden önce cihazın geçmişini okuyun.
Durumlar
QUEUED → SENT → DELIVERED → SUCCESSFUL, ya da FAILED, TIMEOUT, EXPIRED, CANCELLED durumlarından biri.
| Durum | Anlamı |
|---|---|
SUCCESSFUL | Yanıt geldi veya tek yönlü bir komut iletildi |
FAILED | Cihaz reddetti veya komut gönderilemedi |
TIMEOUT | Zamanında yanıt gelmedi. Sonuç bilinmiyor: cihaz işlemi yapmış olabilir. outcome değeri unknown olur. |
EXPIRED | Son kullanma süresinden önce cihaza hiç ulaşmadı |
CANCELLED | Sıradayken veya gönderilmişken iptal edildi |
outcome ayrıntı verir: running (cihaz uzun süren bir komutu kabul etti), unknown (zaman aşımı) veya late (yanıt, sonlandıktan sonra geldi). Sonuçlar varsayılan olarak 90 gün saklanır.
Sonuçları okuma
Durum nihai olana kadar GET /api/iot/rpc/{rpcId} adresini sorgulayın; ya da rpc.completed ve rpc.failed webhook olaylarına abone olun ve bir olay geldiğinde yanıtı okuyun. Bkz. Webhook olay başvurusu.
Bir cihazın geçmişi, en yeniden en eskiye:
GET /api/iot/devices/{deviceId}/rpc?status=FAILED&limit=50
page olmadan geçmiş bir imleçle okunur: status, method, from, to (tarihler), limit (1 ile 100 arası, varsayılan 25) ve cursor. Yanıt { "requests": [...], "nextCursor": "…" } biçimindedir; nextCursor değeri null olana kadar onu cursor olarak geri gönderin. page (0’dan başlar) ile liste, olağan liste kurallarını izler: pageSize, search, sort (method, status, source, createdAt, completedAt), status ve source virgüllü liste olarak, createdFrom, createdTo; yanıt { "requests": [...], "total": n } biçimindedir. Gizli parametreler her yanıtta maskelenir.
İptal
POST /api/iot/rpc/{rpcId}/cancel, QUEUED veya SENT durumundaki bir komutu CANCELLED durumuna taşır ve { "rpc": {...} } yanıtı verir. Diğer durumlarda 409 döner: “Only a queued or sent request can be cancelled.” İptal etmek, göndermekle aynı seviye izni gerektirir. İptal bir webhook göndermez.
Sınırlar
| Sınır | Varsayılan |
|---|---|
| Cihaz başına komut | Dakikada 10 (429, Retry-After: 60) |
| Kuruluş başına komut | Dakikada 600 (429 “Too many requests for your plan. Please upgrade or try again later.”) |
| Parametreler | 16 KiB JSON |
| Saklanan yanıt | 64 KiB |
| Profil kataloğu başına komut | 200 |
Reddetmeler
| Durum | details.reason | Mesaj |
|---|---|---|
| 400 | bad_params | Parametreler komutla eşleşmiyor. |
| 400 | wait_too_long | A synchronous call waits at most 30 s; use wait: false for a longer timeout. |
| 400 | confirm_required, confirm_text_mismatch | This command needs confirm: true. / The typed confirmation does not match. |
| 400 | method_refused | Fabrika ayarlarına dönme, eşleştirme, Wi-Fi unutma ve bulut bağlantısını unutma komutları buluttan asla gönderilmez. |
| 400 | payload_too_large | İstek, cihazın kabul ettiğinden büyük. |
| 403 | rpc_method_reserved | Yöntem kendi modülüne aittir (örneğin uzaktan erişim) ve yalnızca o modül tarafından gönderilir; details.owner modülün adını verir. |
| 404 | Cihaz bulunamadı. | |
| 409 | rpc_not_supported_by_profile | Cihaz profili yalnızca RPC taşımayan Legacy konularını kullanır. |
| 409 | device_not_active | Cihaz devre dışı bırakılmış veya karantinaya alınmış. |
| 409 | not_cancellable | Yalnızca sıradaki veya gönderilmiş bir istek iptal edilebilir. |
| 429 | device_rate_limited | Bu cihaza çok fazla komut gönderildi; bir dakika sonra yeniden deneyin. |
Komut kataloğu
Bir katalog komutunun şu alanları vardır: method, label (en fazla 120), description, paramsSchema (en fazla 50 alan; her biri label ve text, textarea, number, boolean, select, multi-select ya da json türünde type ile, isteğe bağlı olarak required, min, max, step, options alanlarıyla), maskedParams (gizli alanlar hiçbir zaman geri gösterilmez), tier (basic, privileged, critical), highImpact, oneway, long, defaultTimeoutMs, persistentDefault, confirmText (yalnızca yüksek etkili komutlar için).
{
"method": "valve.set",
"label": "Set valve position",
"tier": "privileged",
"paramsSchema": { "position": { "label": "Position (%)", "type": "number", "min": 0, "max": 100, "required": true } }
}
GET ...?format=export, kimlikleri olmayan { "commands": [...] } döndürür; bu, bir kataloğu başka bir profile kopyalamak için PUT ile geri gönderilir.

