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

Siteler ve varlıklar API’si

Siteler ve varlıklardan oluşan ağacı oluşturun ve okuyun, varlıkları taşıyın, cihazları bunların üzerine yerleştirin ve varlıkları cihazlarla REST üzerinden ilişkilendirin – alanlar, sınırlar ve hatalar.

Bu rotalar Hermetry Twin varlık ağacını yönetir: siteler, binalar, katlar, odalar, hatlar, makineler ve kendi tanımladığınız türler; her cihazın nerede yerleştirildiği ve varlıklarla cihazlar arasındaki ilişkiler. Kavramlar Varlık hiyerarşisi başlığında yer alır. Yollar https://<your host>/tenant/<tenantId> altındadır.

Rotalar

YöntemYolİzinİşlev
GET/api/iot/assetsiot_asset.assets.readDüz sayfa, ağaç, Siteler ve Varlıklar tablosu veya özeti olarak listele
POST/api/iot/assetsiot_asset.assets.manageBir varlık oluştur
GET/api/iot/assets/{assetId}iot_asset.assets.readAtalarıyla ve sayılarıyla tek bir varlık
PATCH/api/iot/assets/{assetId}iot_asset.assets.manageBir varlığı değiştir
DELETE/api/iot/assets/{assetId}iot_asset.assets.manageBir varlığı sil
POST/api/iot/assets/{assetId}/moveiot_asset.assets.manageBaşka bir üst öğenin altına taşı
GET/api/iot/assets/{assetId}/devicesiot_asset.assets.readÜzerine (ve altına) yerleştirilmiş cihazlar
POST/api/iot/assets/{assetId}/devicesiot_asset.relations.manageÜzerine en fazla 100 cihaz yerleştir
GET/api/iot/devices/{deviceId}/placementiot_asset.assets.readBir cihazın nerede olduğu
PUT/api/iot/devices/{deviceId}/placementiot_asset.relations.manageBir cihazı yerleştir veya yerleşimini kaldır
GET/api/iot/relationsiot_asset.assets.readİlişkileri listele
POST/api/iot/relationsiot_asset.relations.manageBir ilişki oluştur
DELETE/api/iot/relations/{relationId}iot_asset.relations.manageBir ilişkiyi sil

Varsayılan roller: okuma bir Kullanıcı iznidir; varlıkları, yerleşimleri ve ilişkileri değiştirmek bir Yönetici iznidir. Her değişiklik denetim günlüğüne yazılır (değişen alan adları, asla değerleri).

Varlık

AlanKurallar
namezorunlu, 1 ila 255 karakter
kindzorunlu; harf, rakam ve _, 1 ila 24, büyük harfle saklanır. Önerilenler: SITE, BUILDING, FLOOR, ROOM, AREA, LINE, MACHINE, OTHER; diğer herhangi biri de kabul edilir
codeharfler, rakamlar, ., _, -; 1 ila 32; büyük harfle saklanır; canlı varlıklarınız arasında benzersiz. Belirtilmezse addan üretilir.
parentIdyalnızca oluşturmada; üst düzey bir varlık için null veya hiç yok. Sonradan move ile değiştirilir.
descriptionen fazla 1.000 karakter
lat, lng−90 ile 90, −180 ile 180
timezoneEurope/Istanbul gibi bir IANA adı
addressJsonen fazla 12 metin alanı
attributesen fazla 100 anahtar ve 16 KiB; anahtarlar bir harfle başlar, ardından harfler, rakamlar, ., _, - gelir (en fazla 64)
defaultDashboardIdvarlığın Panoyu aç düğmesinin açtığı bir pano

Yanıtlardaki salt okunur alanlar: iotAssetId, path (baştan itibaren kodlar, örneğin /IST/BLD-A/GF), depth, createdAt, updatedAt.

POST/tenant/{tenantId}/api/iot/assets

Bir varlık oluşturun. Tanınmayan alanlar reddedilir.

İstek gövdesi application/json

{
    "name": "Compressor room",
    "kind": "ROOM",
    "code": "CR1",
    "parentId": "e5f6…",
    "timezone": "Europe/Istanbul",
    "attributes": {
        "area_m2": 42
    }
}

Örnek curl

curl -X POST 'https://<your-host>/tenant/{tenantId}/api/iot/assets' \
  -H 'Content-Type: application/json' \
  -d '{"name":"Compressor room","kind":"ROOM","code":"CR1","parentId":"e5f6…","timezone":"Europe/Istanbul","attributes":{"area_m2":42}}'

Yanıtlar

201Oluşturuldu
{
    "asset": {
        "iotAssetId": "77aa…",
        "parentId": "e5f6…",
        "path": "/IST/BLD-A/GF/CR1",
        "depth": 4,
        "code": "CR1",
        "name": "Compressor room",
        "kind": "ROOM",
        "timezone": "Europe/Istanbul",
        "attributes": {
            "area_m2": 42
        },
        "…": "…"
    }
}
409Çakışma
{
    "message": "Another asset already uses this code.",
    "code": "CONFLICT",
    "details": {
        "reason": "code_taken"
    }
}

PATCH, parentId dışında aynı alanları alır. Yeni bir code, altındaki her varlığın yollarını aynı adımda yeniden yazar.

GET /api/iot/assets/{assetId}, ancestors (önce kök, her biri id, code, name, kind ile), effectiveTimezone (kendisininki, yoksa en yakın atasınınki), childCount ve deviceCount ekler.

Liste ve ağaç

view ile GET /api/iot/assets:

viewYanıtParametreler
list (varsayılan){ assets, total, page, pageSize }, düz bir sayfaparentId (bir UUID veya root), subtreeOf, kind, search, includeDeleted, 1’den başlayan page, en fazla 200 olan pageSize (varsayılan 50)
treeİç içe ağaçrootId, depth (varsayılan 6, en fazla 12); en fazla 5.000 varlık
tableSiteler ve Varlıklar tablosunun bir sayfası: her varlık, konumu, alt öğeleri, cihazları ve aktif alarmlarıylasearch, kind, site (bir alt ağaç), parentId, alarmed=true, sort (name, kind, location, children, devices, alarms; :asc veya :desc ile), page, pageSize
summarySayılar ve her önem derecesine göre alarmlarıyla siteler

Alarm bilgileri yalnızca çağıranın alarmları okuma yetkisi varsa eklenir.

Taşıma

POST /api/iot/assets/{assetId}/move
{ "parentId": "c3d4…" }

null onu üst düzey bir varlık yapar. Altındaki her şey onunla birlikte taşınır. Bir varlığı kendi altına veya kendi alt öğelerinden birinin altına taşımak reddedilir: “Bir varlık kendi altına veya kendi alt öğelerinden birinin altına taşınamaz.” (400, cycle). Bir yol en fazla 1.024 karakter olabilir (too_deep).

Silme

Alt varlıkları olan bir varlık reddedilir: “Bu varlığın hâlâ alt varlıkları var: önce onları taşıyın veya silin.” (409, has_children). Başka bir modül varlığı hâlâ kullandığını bildirirse, silme, o modülü adıyla anan 409 ile reddedilir. Bir varlığı silmek, cihaz yerleşimlerini ve ilişkilerini sonlandırır; cihazların kendisi kalır.

Cihazları yerleştir

POST /api/iot/assets/{assetId}/devices
{ "deviceIds": ["6f1c…", "8b2d…"] }

Her cihazın en fazla bir yeri vardır: buraya yerleştirmek, cihazı bulunduğu yerden taşır. Taşınanları listeleyen yanıt { "changes": [...] }‘dir. Bir seferde bir cihaz:

PUT /api/iot/devices/{deviceId}/placement
{ "iotAssetId": "77aa…" }      // or null to remove the placement

Hem .../placement için GET hem de PUT yanıtı { "placement": { "iotAssetId": "77aa…", "path": [ { "iotAssetId": "…", "code": "IST", "name": "Istanbul plant", "kind": "SITE" }, … ] } } biçimindedir, kök önce gelir. Yeri olmayan bir cihazın iotAssetId: null değeri vardır.

GET /api/iot/assets/{assetId}/devices, varsayılan olarak varlık üzerine yerleştirilmiş cihazları ve altındakileri listeler (yalnızca varlığın kendisi için recursive=false): search, online=true|false, sort=name|connection:asc|desc, 1’den başlayan page, en fazla 200 olan pageSize. Yanıt { items, total, page, pageSize }‘dir.

İlişkiler

Bir ilişki, her biri ASSET veya DEVICE olan iki ucu, bir türle bağlar: CONTAINS, MANAGES, FEEDS, MONITORS veya kendi türleriniz (harf, rakam, _, en fazla 32, büyük harfle saklanır).

POST/tenant/{tenantId}/api/iot/relations

Bir ilişki oluşturun. additionalInfo en fazla 20 anahtar ve 4 KiB tutar.

İstek gövdesi application/json

{
    "fromType": "DEVICE",
    "fromId": "8b2d…",
    "toType": "DEVICE",
    "toId": "6f1c…",
    "type": "FEEDS",
    "additionalInfo": {
        "line": "DN150"
    }
}

Örnek curl

curl -X POST 'https://<your-host>/tenant/{tenantId}/api/iot/relations' \
  -H 'Content-Type: application/json' \
  -d '{"fromType":"DEVICE","fromId":"8b2d…","toType":"DEVICE","toId":"6f1c…","type":"FEEDS","additionalInfo":{"line":"DN150"}}'

Yanıtlar

201Oluşturuldu
{
    "relation": {
        "relationId": "…",
        "fromType": "DEVICE",
        "fromId": "8b2d…",
        "toType": "DEVICE",
        "toId": "6f1c…",
        "type": "FEEDS",
        "…": "…"
    }
}
409Çakışma
{
    "message": "This relation already exists.",
    "code": "CONFLICT",
    "details": {
        "reason": "relation_exists"
    }
}

Kurallar:

  • Bir varlıktan bir cihaza CONTAINS, cihazın yerleşimidir (yerleşim rotalarını kullanın). Diğer biçimlerdeki CONTAINS reddedilir (placement_shape); bir varlığın başka bir varlığın içinde olması ise bir ilişkiyle değil, taşınmasıyla belirlenir (parentage_is_move).
  • Bir ilişkinin iki farklı ucu olmalıdır (self_relation).
  • Eksik bir uç 404 döner (end_not_found).

GET /api/iot/relations?entityType=ASSET&entityId={assetId}, bir ucun ilişkilerini iki yönde listeler; ya da fromType, fromId, toType, toId, type ile filtreleyin. limit 1 ila 500 (varsayılan 200). Yanıt { "relations": [...] }‘dir.

Seçici için cihaz ara

GET /api/iot/devices/search?q=pump&limit=20&near=iot_asset:{assetId}, { "devices": [{ "id", "name", "code", "hint" }] } yanıtını verir: ada göre en fazla 20 cihaz; verilen cihazın veya varlığın cihazları önce gelir, hint her birinin nerede yerleştirildiğini belirtir. Hem iot_asset.assets.read hem de iot_device.devices.read gerektirir.