Nodeflux Central
Crowd Estimation

API Reference — Crowd Estimation

Endpoint REST API untuk membuat, mengelola, dan memantau pipeline Crowd Estimation (NFV4-CE).

Semua endpoint pada halaman ini menggunakan basis URL dari variabel VISIONAIRE_API_URL yang dikonfigurasi pada instalasi Visionaire (default: http://localhost:4004). Tidak ada autentikasi tambahan yang diperlukan selain akses jaringan ke host tersebut — pastikan port sudah dapat dijangkau dari klien Anda.


Manajemen Pipeline

Endpoint untuk membuat, memantau, dan menghapus pipeline Crowd Estimation. Setiap pipeline diidentifikasi oleh kombinasi node_num, stream_id, dan analytic_id (NFV4-CE).

Buat Pipeline

POST /pipeline/{node_num}/{stream_id}/NFV4-CE

Membuat pipeline Crowd Estimation baru pada stream yang telah terdaftar.

curl -X POST http://localhost:4004/pipeline/0/crowd-area-1/NFV4-CE \
  -H "Content-Type: application/json" \
  -d '{
    "areas": {
      "Plaza Utama": [
        {"x": 0.1, "y": 0.1},
        {"x": 0.9, "y": 0.1},
        {"x": 0.9, "y": 0.9},
        {"x": 0.1, "y": 0.9}
      ]
    },
    "interval": 10
  }'

Update Konfigurasi Pipeline

PATCH /pipeline/{node_num}/{stream_id}/NFV4-CE/config

Memperbarui parameter pipeline yang sedang berjalan tanpa perlu me-restart. Hanya field yang disertakan dalam body yang akan diubah.

curl -X PATCH http://localhost:4004/pipeline/0/crowd-area-1/NFV4-CE/config \
  -H "Content-Type: application/json" \
  -d '{
    "interval": 30
  }'

Status Pipeline

GET /pipeline/{node_num}/{stream_id}/NFV4-CE

Mengembalikan status dan konfigurasi pipeline yang sedang berjalan.

curl http://localhost:4004/pipeline/0/crowd-area-1/NFV4-CE

Hapus Pipeline

DELETE /pipeline/{node_num}/{stream_id}/NFV4-CE

Menghentikan dan menghapus pipeline.

curl -X DELETE http://localhost:4004/pipeline/0/crowd-area-1/NFV4-CE

Parameter Konfigurasi

Body Request

Parameter yang dapat dikirim saat membuat (POST) atau memperbarui (PATCH) pipeline:

ParameterTipeDefaultWajibKeterangan
areasobjectYaROI polygon per area. Key adalah nama area (string), value adalah array titik {x, y} dalam koordinat relatif (0.0–1.0).
intervalinteger10TidakInterval dalam detik antara setiap event dump. Rentang valid: 1–99999.

Format Areas

Setiap entry dalam object areas merepresentasikan satu ROI polygon:

{
  "areas": {
    "<nama-area>": [
      {"x": <float>, "y": <float>},
      {"x": <float>, "y": <float>},
      ...
    ]
  }
}
  • Key (<nama-area>): string deskriptif yang akan muncul di field area pada setiap event — misalnya "Pintu Masuk Utara" atau "Area Panggung".
  • Value: array minimal 3 titik {x, y} yang membentuk polygon tertutup. Koordinat menggunakan nilai relatif (0.0–1.0) terhadap dimensi frame, sehingga ROI tetap proporsional meski resolusi stream berubah.

Contoh dengan beberapa ROI:

{
  "areas": {
    "Pintu Masuk": [
      {"x": 0.0, "y": 0.0},
      {"x": 0.4, "y": 0.0},
      {"x": 0.4, "y": 1.0},
      {"x": 0.0, "y": 1.0}
    ],
    "Area Tengah": [
      {"x": 0.4, "y": 0.0},
      {"x": 1.0, "y": 0.0},
      {"x": 1.0, "y": 1.0},
      {"x": 0.4, "y": 1.0}
    ]
  },
  "interval": 30
}

Setiap ROI menghasilkan event terpisah pada setiap interval. Jika Anda mendefinisikan 3 ROI, setiap interval akan menerbitkan 3 event.


Format Event

Event dialirkan via WebSocket event channel. Setiap event berisi field pipeline_data dengan struktur berikut:

FieldTipeKeterangan
areastringNama ROI area sesuai yang didefinisikan dalam konfigurasi areas.
estimationintegerEstimasi rata-rata jumlah orang dalam ROI selama interval terakhir.
history_minintegerEstimasi minimum yang tercatat selama interval terakhir.
history_maxintegerEstimasi maksimum yang tercatat selama interval terakhir.
intervalintegerDurasi interval dalam detik (nilai konfigurasi saat pipeline dibuat).

Contoh Event

{
  "analytic_id": "NFV4-CE",
  "stream_id": "crowd-area-1",
  "node_num": 0,
  "timestamp": "2026-05-04T08:30:00Z",
  "pipeline_data": {
    "area": "Plaza Utama",
    "estimation": 23,
    "history_min": 18,
    "history_max": 31,
    "interval": 10
  }
}
{
  "analytic_id": "NFV4-CE",
  "stream_id": "crowd-area-1",
  "node_num": 0,
  "timestamp": "2026-05-04T20:15:00Z",
  "pipeline_data": {
    "area": "Plaza Utama",
    "estimation": 347,
    "history_min": 290,
    "history_max": 412,
    "interval": 30
  }
}

Subscribe Event Channel (WebSocket)

WS /event_channel/{node_num}/{stream_id}/NFV4-CE

Visionaire4 mendorong setiap event secara real-time melalui WebSocket. Setelah koneksi terbuka, server langsung mengirimkan event tanpa perlu handshake atau pesan subscribe. Tutup koneksi untuk berhenti menerima event.

Parameter Path

ParameterTipeKeterangan
node_numintegerNomor node tempat stream berjalan (0 = master).
stream_idstringID stream yang akan dipantau.
const ws = new WebSocket(
  'ws://localhost:4004/event_channel/0/crowd-area-1/NFV4-CE'
);

ws.onmessage = (msg) => {
  const event = JSON.parse(msg.data);
  const { area, estimation } = event.pipeline_data;
  console.log(`${area}: ${estimation} orang`);
};

ws.onerror = (err) => console.error('WebSocket error', err);
ws.onclose = () => console.log('Disconnected');
import asyncio
import json
import websockets

async def listen():
    url = "ws://localhost:4004/event_channel/0/crowd-area-1/NFV4-CE"
    async with websockets.connect(url) as ws:
        async for msg in ws:
            event = json.loads(msg)
            data = event["pipeline_data"]
            print(f"{data['area']}: {data['estimation']} orang")

asyncio.run(listen())
wscat -c ws://localhost:4004/event_channel/0/crowd-area-1/NFV4-CE

Endpoint Channel Lainnya

Untuk mendengarkan event yang lebih luas (lintas analitik atau lintas stream), gunakan endpoint berikut yang dijelaskan pada Developer Guide:

EndpointCakupan
WS /event_channel/Semua event dari seluruh node
WS /event_channel/{node_num}/Semua event dari satu node
WS /event_channel/{node_num}/{stream_id}Semua event dari satu stream (semua analitik)

Visualisasi (MJPEG)

GET /mjpeg/{node_num}/{stream_id}/NFV4-CE

Mengembalikan MJPEG stream dengan overlay visualisasi — titik kepadatan dan label estimasi per ROI ditampilkan langsung pada frame.

# Buka di browser atau media player
http://localhost:4004/mjpeg/0/crowd-area-1/NFV4-CE?fps=15&height=480

Anda juga dapat menanamnya langsung di halaman web:

<img src="http://localhost:4004/mjpeg/0/crowd-area-1/NFV4-CE?fps=10&height=360"
     alt="Crowd Estimation Preview" />
Query ParameterDefaultKeterangan
fps15Frame rate output MJPEG.
height480Tinggi frame output dalam piksel (lebar mengikuti aspek rasio).

Modul Terkait

On this page