Nodeflux Central
Live Events

Live Events

Feed event real-time dari kamera yang terdeteksi sistem — pengenalan wajah, plat nomor, orang terdeteksi, dan lainnya. Diperbarui secara langsung melalui WebSocket.

Pengenalan

Halaman Live Events (/events) menampilkan feed event yang baru saja terdeteksi oleh sistem analitik video secara langsung. Setiap kali kamera mendeteksi sesuatu — wajah yang dikenali, plat nomor kendaraan, orang yang melewati garis virtual, atau kendaraan yang terhitung — event baru muncul di halaman ini tanpa perlu me-refresh browser.

Perbedaan Live Events dan Event History

AspekLive Events (/events)Event History (/event-history)
DataEvent baru masuk secara real-timeArsip historis dengan rentang tanggal
KoneksiWebSocket persistenREST API biasa
PaginationStreaming berkelanjutanCursor-based pagination
Filter waktuTidak relevan (selalu "sekarang")Wajib: dari–sampai
Penggunaan utamaMonitoring langsung oleh operatorInvestigasi & pelaporan
ExportTidak tersediaTersedia (PDF / Excel)

Untuk menelusuri event dari hari-hari sebelumnya, gunakan menu Event History. Halaman ini khusus untuk monitoring secara langsung.


Alur Data Event

Diagram berikut menggambarkan bagaimana data mengalir dari kamera fisik hingga muncul di feed Live Events Anda:

Stream RTSP Hasil deteksi(JSON payload) Broadcast real-time WebSocket persisten(wss://) 📷 Kamera IP / NVR Visionaire(engine analitik) Raisa Gateway(backend API) WebSocket/api/event_channel Lenz Dashboard(/events)

Setiap event yang masuk ke Raisa Gateway langsung diteruskan ke semua klien WebSocket yang sedang terhubung, termasuk Lenz Dashboard dan integrasi eksternal Anda.


Cara Menggunakan

Buka halaman Live Events

Klik menu Events di sidebar kiri Lenz Dashboard. Koneksi WebSocket akan terbentuk secara otomatis ketika halaman dimuat. Anda akan melihat indikator status koneksi di bagian atas halaman.

Pastikan sesi Anda masih aktif. Jika status koneksi menunjukkan error, coba refresh halaman untuk memulai ulang koneksi WebSocket.

Pilih kategori analitik

Gunakan tab kategori untuk memfilter jenis event yang ditampilkan:

KategoriKodeDeskripsi
Face Recognition AnalyticsfraPengenalan wajah: dikenal / tidak dikenal
Multi-Person Attribute AnalyticsmpaaDeteksi orang dengan atribut (gender, warna pakaian, dll.)
Multi-Vehicle Attribute AnalyticsmvaaDeteksi kendaraan dengan atribut (merek, warna, dll.)
Crowd EstimationceEstimasi jumlah keramaian di area
License Plate RecognitionlprPengenalan plat nomor kendaraan
PPE DetectionppeDeteksi alat pelindung diri (helm, rompi, kacamata)

Gunakan filter untuk mempersempit tampilan

Panel filter di sisi kiri memungkinkan Anda mempersempit event yang ditampilkan berdasarkan:

  • Stream: Pilih satu atau beberapa kamera/stream tertentu
  • Rentang waktu: Batasi event berdasarkan waktu deteksi
  • Atribut spesifik: Bergantung pada kategori yang dipilih — misalnya status (dikenal/tidak dikenal) untuk FRA, atau tipe kendaraan untuk MVAA

Filter aktif berlaku baik untuk event baru yang masuk via WebSocket maupun data historis awal yang dimuat saat halaman pertama dibuka.

Klik event untuk melihat detail

Klik salah satu kartu event untuk membuka modal detail. Di dalamnya Anda dapat melihat:

  • Gambar utama — tangkapan gambar dari kamera saat deteksi terjadi
  • Gambar sekunder — gambar referensi (misalnya foto wajah terdaftar untuk FRA)
  • Atribut deteksi — semua atribut yang dianalisis (gender, usia, warna pakaian, nomor plat, dll.)
  • Informasi stream — nama kamera, lokasi, dan waktu deteksi tepat
  • Aksi follow-up — untuk event FRA, Anda dapat menandai tindak lanjut (cocok / tidak cocok / kadaluarsa / lainnya)

Fitur Utama

Real-time via WebSocket

Event muncul otomatis tanpa refresh. Koneksi WebSocket dikelola oleh Web Worker di background dengan reconnect otomatis jika koneksi terputus (maks 10 percobaan, interval 5 detik).

Filter Multi-Dimensi

Filter berdasarkan kategori analitik, stream, rentang waktu, dan atribut spesifik per kategori. Filter aktif tersinkronisasi ke URL sehingga Anda dapat membagikan tampilan yang sudah difilter.

Modal Detail Event

Klik event mana pun untuk melihat gambar resolusi penuh, semua atribut hasil analitik, informasi kamera, dan tab Playback untuk memutar rekaman video di sekitar waktu kejadian (jika tersedia).

Follow-up Action (FRA)

Untuk event pengenalan wajah, operator dapat menandai status tindak lanjut: cocok, tidak cocok, kadaluarsa, atau lainnya. Status ini tersimpan dan dapat dilacak di menu Event Follow-up.


WebSocket Protocol

Bagian ini ditujukan untuk integrator yang ingin subscribe langsung ke feed event real-time dari luar Lenz Dashboard — misalnya untuk membangun sistem notifikasi, dashboard monitoring eksternal, atau alur otomasi.

Endpoint WebSocket

wss://{BASE_URL}/api/event_channel

Ganti {BASE_URL} dengan hostname atau IP server Raisa Gateway Anda (tanpa protokol http:// atau https://).

Parameter Query

ParameterTipeWajibDeskripsi
node_numintegerTidakNomor node (default: 0)
stream_idsstringTidakID stream yang ingin dimonitor, pisahkan dengan koma untuk multiple
analytic_idstringTidakID analitik untuk difilter, pisahkan dengan koma untuk multiple
disable_base64_imagebooleanTidakSet true untuk menonaktifkan gambar base64 (hemat bandwidth, gunakan URL gambar)
logicstringTidakFilter berdasarkan logic type tertentu
instancestringTidakID instance untuk arsitektur federation
authorizationstringTidak*Bearer token (alternatif dari header HTTP)
is_aggregatedbooleanTidakSet true untuk menerima event dari semua instance dalam mode federation

Parameter authorization di query string hanya digunakan pada channel alert (/api/alert_channel). Untuk event_channel biasa, gunakan header Authorization: Bearer {token} saat handshake WebSocket.

Otentikasi

Sertakan Bearer Token pada saat handshake WebSocket melalui header HTTP:

// Browser API tidak mendukung custom header secara langsung.
// Gunakan token di query string untuk channel yang mendukungnya,
// atau gunakan Subprotocol header sebagai workaround.

// Cara yang digunakan Lenz: token sudah valid dari sesi login
const wsProtocol = location.protocol === 'https:' ? 'wss' : 'ws';
const baseUrl = location.host; // misalnya: lenz.contoh.com

const url = new URL(`${wsProtocol}://${baseUrl}/api/event_channel`);
url.searchParams.set('stream_ids', 'eb7022a64d9173a6,c1105b1c6e6b4f3a');
url.searchParams.set('analytic_id', 'NFV4-FR,NFV4-LPR');
url.searchParams.set('disable_base64_image', 'true');

const ws = new WebSocket(url.toString());

ws.onopen = () => {
  console.log('Terhubung ke event channel');
};

ws.onmessage = (event) => {
  const data = JSON.parse(event.data);
  console.log('Event baru:', data);
};

ws.onclose = (event) => {
  console.log('Koneksi tertutup:', event.code, event.reason);
};

ws.onerror = (error) => {
  console.error('WebSocket error:', error);
};
import WebSocket from 'ws';

// Dapatkan token terlebih dahulu melalui login
const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...';

const params = new URLSearchParams({
  stream_ids: 'eb7022a64d9173a6,c1105b1c6e6b4f3a',
  analytic_id: 'NFV4-FR,NFV4-LPR',
  disable_base64_image: 'true',
});

const ws = new WebSocket(
  `wss://raisa.contoh.com/api/event_channel?${params.toString()}`,
  {
    headers: {
      Authorization: `Bearer ${token}`,
    },
  }
);

ws.on('open', () => {
  console.log('Terhubung ke event channel');
});

ws.on('message', (data) => {
  const event = JSON.parse(data.toString());
  handleEvent(event);
});

ws.on('close', (code, reason) => {
  console.log(`Koneksi tertutup: ${code} ${reason}`);
  // Implementasikan reconnect dengan exponential backoff
  setTimeout(() => reconnect(), 5000);
});

ws.on('error', (error) => {
  console.error('WebSocket error:', error.message);
});

function handleEvent(event) {
  // Proses event berdasarkan analytic_id
  switch (true) {
    case event.analytic_id.includes('FR'):
      console.log(`[FRA] ${event.stream_id} - Status: ${event.pipeline_data?.status}`);
      break;
    case event.analytic_id.includes('LPR'):
      console.log(`[LPR] ${event.stream_id} - Plat: ${event.pipeline_data?.plate_number}`);
      break;
    default:
      console.log(`[${event.analytic_id}] ${event.stream_id}`);
  }
}
# cURL tidak mendukung WebSocket secara native.
# Gunakan websocat (https://github.com/vi/websocat) sebagai alternatif:

TOKEN="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."

websocat \
  -H "Authorization: Bearer ${TOKEN}" \
  "wss://raisa.contoh.com/api/event_channel?stream_ids=eb7022a64d9173a6&disable_base64_image=true"

Reconnect Otomatis

Lenz Dashboard mengimplementasikan reconnect otomatis dengan konfigurasi berikut. Sebaiknya Anda menerapkan logika yang sama di integrasi Anda:

ParameterNilai
reconnectInterval5.000 ms (5 detik)
maxReconnectAttempts10 kali percobaan
heartbeatInterval30.000 ms (30 detik)

API Reference

GET /api/event-history/{category}

Mengambil daftar event historis dengan cursor-based pagination. Gunakan endpoint ini untuk memuat data awal saat halaman dibuka atau untuk melakukan query historis.

Path Parameter:

ParameterNilai yang ValidDeskripsi
categoryfra, mpaa, mvaa, ce, lpr, ppeKategori analitik

Query Parameters:

ParameterTipeDeskripsi
limitintegerJumlah event per halaman (default: 20)
cursorstringCursor untuk halaman berikutnya (dari respons sebelumnya)
include_totalbooleanSertakan total count dalam respons
sortstringFormat: field:direction — contoh: event_time:desc
timezonestringTimezone untuk tampilan waktu (contoh: Asia/Jakarta)
filter[timestamp_from]stringISO 8601 — batas awal waktu event
filter[timestamp_to]stringISO 8601 — batas akhir waktu event
filter[stream_ids]stringID stream, pisahkan koma untuk multiple
filter[analytic_ids]stringID analitik, pisahkan koma untuk multiple
filter[status]stringStatus deteksi (misal: known,unknown untuk FRA)
instancestringID instance untuk federation

Contoh Request:

Ambil 20 event FRA terbaru
curl "https://raisa.contoh.com/api/event-history/fra?limit=20&sort=event_time:desc&timezone=Asia/Jakarta" \
  -H "Authorization: Bearer ${TOKEN}"

Respons:

Respons GET /api/event-history/{category}
{
  "ok": true,
  "data": {
    "analytics_type": "fra",
    "events": [ /* array EventV2 */ ],
    "pagination": {
      "limit": 20,
      "has_next": true,
      "has_prev": false,
      "next_cursor": "eyJpZCI6IjE2MzQ1NiJ9",
      "total": 1240
    }
  }
}

GET /api/event-history/{category}/{event_id}

Mengambil detail satu event berdasarkan ID.

Ambil detail event tertentu
curl "https://raisa.contoh.com/api/event-history/fra/evt-abc123" \
  -H "Authorization: Bearer ${TOKEN}"

GET /api/event-history/{category}/filters

Mengambil opsi filter yang tersedia untuk kategori tertentu (stream, analitik, dll.).

Query ParameterDeskripsi
logic_typeFilter opsi berdasarkan logic type tertentu
instanceID instance untuk federation

Format Event Payload

WebSocket Event Payload

Setiap pesan yang diterima dari WebSocket memiliki struktur berikut:

WebSocket Event Payload
{
  "analytic_id": "NFV4-FR",
  "stream_id": "eb7022a64d9173a6",
  "node_num": 0,
  "label": "UNKNOWN",
  "location": "Lobby Utama",
  "primary_image_url": "https://raisa.contoh.com/images/primary/abc123.jpg",
  "secondary_image_url": "https://raisa.contoh.com/images/secondary/abc123.jpg",
  "primary_image": null,
  "secondary_image": null,
  "result": "UNKNOWN",
  "timestamp": "2026-04-30T08:23:45+07:00",
  "status": "UNKNOWN",
  "logic": "face_recognition",
  "instance": null,
  "alert_type_id": null,
  "alert_history_id": null,
  "pipeline_data": {
    "face_id": "118747588341006337",
    "similarity": 0.4893847107887268,
    "status": "UNKNOWN",
    "confidence_detection": 0.9988495111465454,
    "variation": "13219648471735459236"
  }
}

Deskripsi Field Utama:

FieldTipeDeskripsi
analytic_idstringID analitik engine (contoh: NFV4-FR, NFV4-LPR, NFV4-PC)
stream_idstringID stream/kamera sumber event
node_numintegerNomor node Visionaire yang memproses event
labelstringLabel hasil deteksi (contoh: UNKNOWN, motorcycle, person)
locationstringNama lokasi/kamera seperti yang dikonfigurasi
primary_image_urlstringURL gambar hasil tangkapan kamera
secondary_image_urlstringURL gambar referensi (wajah terdaftar untuk FRA, plat untuk LPR)
primary_imagestring | nullGambar base64 (hanya jika disable_base64_image=false)
resultstringTeks hasil analitik (bisa berupa nama orang, plat, dll.)
timestampstringWaktu deteksi dalam format ISO 8601
statusstringStatus hasil (contoh: KNOWN, UNKNOWN)
logicstringLogic type yang digunakan (counting, dwelling, density, dll.)
instancestring | nullID instance Raisa jika dalam mode federation
pipeline_dataobjectData spesifik per analitik (lihat di bawah)

pipeline_data per Kategori

pipeline_data untuk Face Recognition Analytics
{
  "face_id": "118747588341006337",
  "similarity": 0.9234,
  "status": "KNOWN",
  "confidence_detection": 0.9988,
  "variation": "13219648471735459236"
}
FieldDeskripsi
face_idID wajah yang terdeteksi dalam database
similarityNilai kemiripan 0–1 (1 = identik)
statusKNOWN atau UNKNOWN
confidence_detectionTingkat keyakinan deteksi wajah
pipeline_data untuk License Plate Recognition
{
  "plate_number": "B 1234 XYZ",
  "label": "car",
  "confidence": 0.9251,
  "area_name": "Gerbang Masuk",
  "bounding_box": {
    "top": 0.409,
    "left": 0.284,
    "width": 0.247,
    "height": 0.198
  }
}
FieldDeskripsi
plate_numberNomor plat yang terbaca
labelJenis kendaraan (car, motorcycle, truck, dll.)
confidenceTingkat keyakinan pembacaan plat
area_nameNama area/garis yang memicu event
pipeline_data untuk People/Vehicle Analytics
{
  "area_name": "Area 1",
  "label": "person",
  "confidence": 0.9998,
  "count": 3
}
FieldDeskripsi
area_nameNama area atau garis virtual yang dikonfigurasi
labelJenis objek yang terdeteksi
confidenceTingkat keyakinan deteksi
countJumlah objek (untuk mode counting)

Tips & Troubleshooting


API Reference

Dokumentasi lengkap endpoint REST untuk mengambil event historis dan WebSocket channel untuk feed real-time tersedia di halaman terpisah.


Selanjutnya

On this page