Yeni: Yapay zekâ güvenlik duvarı her modülü izliyor ve her olayı sade bir dille açıklıyor. Nasıl çalıştığını görün

Komutlar API’si

Cihazlara komut gönderin, sonuçlarını bekleyin veya sorgulayın, iptal edin ve bir profilin komut kataloğunu REST üzerinden yönetin – alanlar, durumlar, sınırlar ve hatalar.

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öntemYolİzinİşlevi
POST/api/iot/devices/{deviceId}/rpciot_rpc.read ile komutun seviyesiKomut gönder
GET/api/iot/devices/{deviceId}/rpciot_rpc.readCihazın komut geçmişi
GET/api/iot/rpc/{rpcId}iot_rpc.readYanıtıyla birlikte tek bir komut
POST/api/iot/rpc/{rpcId}/canceliot_rpc.read ile komutun seviyesiSıradaki veya gönderilmiş bir komutu iptal et
GET/api/iot/devices/{deviceId}/rpc-commandsiot_rpc.send.basicBir pano kontrolünün bu cihaza gönderebileceği komutlar
GET/api/iot/rpc-commands/{profileId}iot_rpc.readBir profilin komut kataloğu (içe aktarma biçimi için ?format=export)
POST/api/iot/rpc-commands/{profileId}iot_rpc.commands.manageKataloğa komut ekle
PUT/api/iot/rpc-commands/{profileId}iot_rpc.commands.manageTüm kataloğu değiştir
PATCH, DELETE/api/iot/rpc-commands/{profileId}/{commandId}iot_rpc.commands.manageTek 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İzinVarsayılan rolBir API anahtarı buna sahip olabilir mi?
basiciot_rpc.send.basicKullanıcıEvet
privilegediot_rpc.send.privilegedYöneticiEvet
criticaliot_rpc.send.criticalYöneticiEvet
raw (kataloda olmayan bir yöntem)iot_rpc.send.rawSahipHayı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 fazla expiresInS süresince onu bekler, sonra EXPIRED durumuyla sona erer.
  • wait: true beklemeyi 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); false her zaman hemen 202 yanıtı verir.
  • Yüksek etkili komutlar "confirm": true gerektirir; katalogdaki komutta bir onay ifadesi varsa, confirmText iç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.

DurumAnlamı
SUCCESSFULYanıt geldi veya tek yönlü bir komut iletildi
FAILEDCihaz reddetti veya komut gönderilemedi
TIMEOUTZamanında yanıt gelmedi. Sonuç bilinmiyor: cihaz işlemi yapmış olabilir. outcome değeri unknown olur.
EXPIREDSon kullanma süresinden önce cihaza hiç ulaşmadı
CANCELLEDSı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ırVarsayılan
Cihaz başına komutDakikada 10 (429, Retry-After: 60)
Kuruluş başına komutDakikada 600 (429 “Too many requests for your plan. Please upgrade or try again later.”)
Parametreler16 KiB JSON
Saklanan yanıt64 KiB
Profil kataloğu başına komut200

Reddetmeler

Durumdetails.reasonMesaj
400bad_paramsParametreler komutla eşleşmiyor.
400wait_too_longA synchronous call waits at most 30 s; use wait: false for a longer timeout.
400confirm_required, confirm_text_mismatchThis command needs confirm: true. / The typed confirmation does not match.
400method_refusedFabrika ayarlarına dönme, eşleştirme, Wi-Fi unutma ve bulut bağlantısını unutma komutları buluttan asla gönderilmez.
400payload_too_largeİstek, cihazın kabul ettiğinden büyük.
403rpc_method_reservedYö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.
404Cihaz bulunamadı.
409rpc_not_supported_by_profileCihaz profili yalnızca RPC taşımayan Legacy konularını kullanır.
409device_not_activeCihaz devre dışı bırakılmış veya karantinaya alınmış.
409not_cancellableYalnızca sıradaki veya gönderilmiş bir istek iptal edilebilir.
429device_rate_limitedBu 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.