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
| Aspek | Live Events (/events) | Event History (/event-history) |
|---|---|---|
| Data | Event baru masuk secara real-time | Arsip historis dengan rentang tanggal |
| Koneksi | WebSocket persisten | REST API biasa |
| Pagination | Streaming berkelanjutan | Cursor-based pagination |
| Filter waktu | Tidak relevan (selalu "sekarang") | Wajib: dari–sampai |
| Penggunaan utama | Monitoring langsung oleh operator | Investigasi & pelaporan |
| Export | Tidak tersedia | Tersedia (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:
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:
| Kategori | Kode | Deskripsi |
|---|---|---|
| Face Recognition Analytics | fra | Pengenalan wajah: dikenal / tidak dikenal |
| Multi-Person Attribute Analytics | mpaa | Deteksi orang dengan atribut (gender, warna pakaian, dll.) |
| Multi-Vehicle Attribute Analytics | mvaa | Deteksi kendaraan dengan atribut (merek, warna, dll.) |
| Crowd Estimation | ce | Estimasi jumlah keramaian di area |
| License Plate Recognition | lpr | Pengenalan plat nomor kendaraan |
| PPE Detection | ppe | Deteksi 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_channelGanti {BASE_URL} dengan hostname atau IP server Raisa Gateway Anda (tanpa protokol http:// atau https://).
Parameter Query
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
node_num | integer | Tidak | Nomor node (default: 0) |
stream_ids | string | Tidak | ID stream yang ingin dimonitor, pisahkan dengan koma untuk multiple |
analytic_id | string | Tidak | ID analitik untuk difilter, pisahkan dengan koma untuk multiple |
disable_base64_image | boolean | Tidak | Set true untuk menonaktifkan gambar base64 (hemat bandwidth, gunakan URL gambar) |
logic | string | Tidak | Filter berdasarkan logic type tertentu |
instance | string | Tidak | ID instance untuk arsitektur federation |
authorization | string | Tidak* | Bearer token (alternatif dari header HTTP) |
is_aggregated | boolean | Tidak | Set 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:
| Parameter | Nilai |
|---|---|
reconnectInterval | 5.000 ms (5 detik) |
maxReconnectAttempts | 10 kali percobaan |
heartbeatInterval | 30.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:
| Parameter | Nilai yang Valid | Deskripsi |
|---|---|---|
category | fra, mpaa, mvaa, ce, lpr, ppe | Kategori analitik |
Query Parameters:
| Parameter | Tipe | Deskripsi |
|---|---|---|
limit | integer | Jumlah event per halaman (default: 20) |
cursor | string | Cursor untuk halaman berikutnya (dari respons sebelumnya) |
include_total | boolean | Sertakan total count dalam respons |
sort | string | Format: field:direction — contoh: event_time:desc |
timezone | string | Timezone untuk tampilan waktu (contoh: Asia/Jakarta) |
filter[timestamp_from] | string | ISO 8601 — batas awal waktu event |
filter[timestamp_to] | string | ISO 8601 — batas akhir waktu event |
filter[stream_ids] | string | ID stream, pisahkan koma untuk multiple |
filter[analytic_ids] | string | ID analitik, pisahkan koma untuk multiple |
filter[status] | string | Status deteksi (misal: known,unknown untuk FRA) |
instance | string | ID instance untuk federation |
Contoh Request:
curl "https://raisa.contoh.com/api/event-history/fra?limit=20&sort=event_time:desc&timezone=Asia/Jakarta" \
-H "Authorization: Bearer ${TOKEN}"Respons:
{
"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.
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 Parameter | Deskripsi |
|---|---|
logic_type | Filter opsi berdasarkan logic type tertentu |
instance | ID instance untuk federation |
Format Event Payload
WebSocket Event Payload
Setiap pesan yang diterima dari WebSocket memiliki struktur berikut:
{
"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:
| Field | Tipe | Deskripsi |
|---|---|---|
analytic_id | string | ID analitik engine (contoh: NFV4-FR, NFV4-LPR, NFV4-PC) |
stream_id | string | ID stream/kamera sumber event |
node_num | integer | Nomor node Visionaire yang memproses event |
label | string | Label hasil deteksi (contoh: UNKNOWN, motorcycle, person) |
location | string | Nama lokasi/kamera seperti yang dikonfigurasi |
primary_image_url | string | URL gambar hasil tangkapan kamera |
secondary_image_url | string | URL gambar referensi (wajah terdaftar untuk FRA, plat untuk LPR) |
primary_image | string | null | Gambar base64 (hanya jika disable_base64_image=false) |
result | string | Teks hasil analitik (bisa berupa nama orang, plat, dll.) |
timestamp | string | Waktu deteksi dalam format ISO 8601 |
status | string | Status hasil (contoh: KNOWN, UNKNOWN) |
logic | string | Logic type yang digunakan (counting, dwelling, density, dll.) |
instance | string | null | ID instance Raisa jika dalam mode federation |
pipeline_data | object | Data spesifik per analitik (lihat di bawah) |
pipeline_data per Kategori
{
"face_id": "118747588341006337",
"similarity": 0.9234,
"status": "KNOWN",
"confidence_detection": 0.9988,
"variation": "13219648471735459236"
}| Field | Deskripsi |
|---|---|
face_id | ID wajah yang terdeteksi dalam database |
similarity | Nilai kemiripan 0–1 (1 = identik) |
status | KNOWN atau UNKNOWN |
confidence_detection | Tingkat keyakinan deteksi wajah |
{
"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
}
}| Field | Deskripsi |
|---|---|
plate_number | Nomor plat yang terbaca |
label | Jenis kendaraan (car, motorcycle, truck, dll.) |
confidence | Tingkat keyakinan pembacaan plat |
area_name | Nama area/garis yang memicu event |
{
"area_name": "Area 1",
"label": "person",
"confidence": 0.9998,
"count": 3
}| Field | Deskripsi |
|---|---|
area_name | Nama area atau garis virtual yang dikonfigurasi |
label | Jenis objek yang terdeteksi |
confidence | Tingkat keyakinan deteksi |
count | Jumlah 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
Event History
Telusuri arsip event historis dengan filter tanggal, export ke PDF/Excel, dan analisis mendalam.
Alert
Konfigurasi aturan alert otomatis yang mengirimkan notifikasi ketika kondisi tertentu terpenuhi.
Notification Channels
Sambungkan sistem alert ke email, webhook, atau channel lainnya untuk notifikasi eksternal.
Otentikasi
Panduan JWT, API Key, dan header federation untuk mengamankan koneksi WebSocket dan REST API.
API Reference — Assignment
Endpoint untuk mengelola Assignment analitik ke stream — template konfigurasi analitik, preset konfigurasi, dan drawing preset ROI.
API Reference — Events
Endpoint REST untuk mengambil event historis dan WebSocket channel untuk feed event real-time dari sistem analitik video.