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öntem | Yol | İzin | İşlev |
|---|---|---|---|
| GET | /api/iot/assets | iot_asset.assets.read | Düz sayfa, ağaç, Siteler ve Varlıklar tablosu veya özeti olarak listele |
| POST | /api/iot/assets | iot_asset.assets.manage | Bir varlık oluştur |
| GET | /api/iot/assets/{assetId} | iot_asset.assets.read | Atalarıyla ve sayılarıyla tek bir varlık |
| PATCH | /api/iot/assets/{assetId} | iot_asset.assets.manage | Bir varlığı değiştir |
| DELETE | /api/iot/assets/{assetId} | iot_asset.assets.manage | Bir varlığı sil |
| POST | /api/iot/assets/{assetId}/move | iot_asset.assets.manage | Başka bir üst öğenin altına taşı |
| GET | /api/iot/assets/{assetId}/devices | iot_asset.assets.read | Üzerine (ve altına) yerleştirilmiş cihazlar |
| POST | /api/iot/assets/{assetId}/devices | iot_asset.relations.manage | Üzerine en fazla 100 cihaz yerleştir |
| GET | /api/iot/devices/{deviceId}/placement | iot_asset.assets.read | Bir cihazın nerede olduğu |
| PUT | /api/iot/devices/{deviceId}/placement | iot_asset.relations.manage | Bir cihazı yerleştir veya yerleşimini kaldır |
| GET | /api/iot/relations | iot_asset.assets.read | İlişkileri listele |
| POST | /api/iot/relations | iot_asset.relations.manage | Bir ilişki oluştur |
| DELETE | /api/iot/relations/{relationId} | iot_asset.relations.manage | Bir 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
| Alan | Kurallar |
|---|---|
name | zorunlu, 1 ila 255 karakter |
kind | zorunlu; 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 |
code | harfler, rakamlar, ., _, -; 1 ila 32; büyük harfle saklanır; canlı varlıklarınız arasında benzersiz. Belirtilmezse addan üretilir. |
parentId | yalnızca oluşturmada; üst düzey bir varlık için null veya hiç yok. Sonradan move ile değiştirilir. |
description | en fazla 1.000 karakter |
lat, lng | −90 ile 90, −180 ile 180 |
timezone | Europe/Istanbul gibi bir IANA adı |
addressJson | en fazla 12 metin alanı |
attributes | en fazla 100 anahtar ve 16 KiB; anahtarlar bir harfle başlar, ardından harfler, rakamlar, ., _, - gelir (en fazla 64) |
defaultDashboardId | varlığı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:
view | Yanıt | Parametreler |
|---|---|---|
list (varsayılan) | { assets, total, page, pageSize }, düz bir sayfa | parentId (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 |
table | Siteler ve Varlıklar tablosunun bir sayfası: her varlık, konumu, alt öğeleri, cihazları ve aktif alarmlarıyla | search, kind, site (bir alt ağaç), parentId, alarmed=true, sort (name, kind, location, children, devices, alarms; :asc veya :desc ile), page, pageSize |
summary | Sayı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çimlerdekiCONTAINSreddedilir (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ç
404dö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.

