Nodeflux Central
Events

Events

Telusuri arsip event hasil deteksi AI per kategori analitik (FRA, MPAA, MVAA, CE, LPR, PPE, General) dengan filter atribut, infinite scroll, panel detail, ekspor asinkron, Smart Search, dan feed WebSocket untuk integrator.

Pengenalan

Setiap kali analitik AI Visionaire melihat sesuatu yang diperintahkan untuk diperhatikan (wajah, plat kendaraan, orang melewati garis batas, pekerja tanpa helm), sistem mencatat satu event: gambar tangkapan, atribut hasil analisis, kamera sumber, dan waktu kejadian. Ibaratnya buku jurnal jaga yang ditulis otomatis.

Halaman Event History (/event-history) adalah tempat menelusuri seluruh event yang tersimpan, dikelompokkan ke dalam tujuh kategori analitik (FRA, MPAA, MVAA, CE, LPR, PPE, General Events) dengan kolom dan filter masing-masing. Dari sini Anda dapat menyaring event berdasarkan kamera, waktu, dan atribut deteksi; membuka panel detail beserta rekaman playback; melompat ke Face Search atau Plate Search; mengekspor ke PDF atau Excel; dan (bila diaktifkan) mencari dengan kalimat bahasa alami lewat Smart Search.

Bagi integrator, data yang sama tersedia melalui REST API: GET /api/event-history/{category} dengan cursor-based pagination dan filter multidimensi, GET /api/events/pipeline/{event_id} untuk detail satu event, serta dua channel WebSocket (/api/event_channel untuk semua deteksi mentah dan /api/alert_channel untuk event yang lolos Alert Rule).

Setiap event diidentifikasi oleh Event ID (event_id), pengenal yang dibuat engine analitik saat deteksi terjadi, misalnya 1780473522-a6d87102. UI menampilkan bagian uniknya saja (#A6D87102) di badge Event ID pada panel detail, lengkap dengan tombol salin. Nilai ini dipakai di tiga tempat: filter Event ID di panel Filter, deep link /event-history?open_event=<event_id>, dan endpoint GET /api/events/pipeline/{event_id}. Jangan tertukar dengan field id pada respons API, yang merupakan nomor baris di database.

Satu halaman, dua alamat

Menu sidebar Investigation → Event History membuka /event-history. Alamat /events menampilkan halaman yang sama persis; alamat ini dipakai sebagai halaman tujuan Smart Search dan oleh deep link dari ekstensi atau notifikasi. Tampilan Event History lama (tabel yang dikelompokkan per tanggal dengan paginasi klasik) sudah tidak ada; semua kemampuannya kini ada di halaman ini.


Alur Data Event

Diagram berikut menunjukkan dua jalur data yang relevan untuk halaman ini: REST untuk daftar dan detail event serta WebSocket untuk toast alert real-time.

RTSP Hasil deteksi persist query (cursor) alert match(broadcast) Kamera IP / NVR Visionaire(engine analitik) Backend API Event DB REST/api/event-history/{category}/api/events/pipeline/{event_id} WebSocket/api/alert_channel Lenz Dashboard

Dalam bahasa sehari-hari: kamera mengirim video mentah ke Visionaire yang menganalisisnya. Setiap temuan dikirim ke backend API, yang menyimpannya ke database per kategori dan sekaligus memeriksa apakah temuan itu memenuhi Alert Rule yang aktif. Halaman Event History mengambil catatan dari database melalui REST setiap kali Anda membuka halaman, mengganti filter, atau menggulir ke bawah.

Apabila sebuah event memenuhi kondisi Alert Rule, sistem juga mendorongnya melalui WebSocket /api/alert_channel. Lenz menerima pesan itu langsung dan menampilkan toast notifikasi di pojok layar, bahkan ketika Anda sedang membuka halaman lain. Jalur ini terpisah dari REST dan tidak menunggu halaman di-refresh.


Cara Menggunakan

Melihat Daftar Event

Gunakan tampilan ini ketika Anda perlu memeriksa apa yang terjadi di satu kamera atau satu kategori analitik pada rentang waktu tertentu, misalnya saat menindaklanjuti laporan insiden atau melakukan audit harian.

Buka halaman Event History

Klik ikon Event History di grup Investigation pada sidebar kiri (tanda 1 pada gambar), atau buka /event-history langsung. Halaman ini memerlukan hak baca pada resource events.

Halaman terbuka dengan kategori Face Recognition (FRA), Rentang Tanggal hari ini (00:00–23:59 zona waktu browser Anda), urutan Waktu Event (↓), dan mode tabel. Panel Filter menempati sisi kiri; tombol Hide Filters (tanda 2) menyembunyikannya agar tabel lebih lebar, dan berubah menjadi Show Filters untuk memunculkannya kembali.

Halaman Event History: (1) ikon Event History di grup Investigation pada sidebar membuka /event-history, (2) tombol Hide Filters menyembunyikan panel Filter di kiri. Tampilan awal: kategori Face Recognition (FRA), rentang hari ini, mode tabel.
Halaman Event History: (1) ikon Event History di grup Investigation pada sidebar membuka /event-history, (2) tombol Hide Filters menyembunyikan panel Filter di kiri. Tampilan awal: kategori Face Recognition (FRA), rentang hari ini, mode tabel.

Kenali toolbar

Toolbar Event History: (1) Hide Filters / Show Filters, (2) Hasil: jumlah event yang sudah dimuat / total, (3) Urutkan, (4) export, (5) pengalih tampilan tabel atau grid.
Toolbar Event History: (1) Hide Filters / Show Filters, (2) Hasil: jumlah event yang sudah dimuat / total, (3) Urutkan, (4) export, (5) pengalih tampilan tabel atau grid.

Baris toolbar di atas daftar terdiri dari:

  1. Hide Filters / Show Filters: menyembunyikan atau memunculkan panel Filter.
  2. Hasil: jumlah event yang sudah dimuat dibanding total yang cocok dengan filter, misalnya 20 / 32.322. Angka pertama bertambah setiap kali Anda menggulir ke bawah.
  3. Urutkan: dropdown urutan; pilihannya mengikuti kategori aktif (mis. Waktu Event, Kata Kunci, Status, Tanggal Dibuat untuk FRA; Nomor Plat untuk LPR; Estimasi untuk CE), masing-masing menurun (↓) atau menaik (↑).
  4. export: membuka dialog Ekspor Event (lihat Mengekspor Event). Tombol ini nonaktif ketika daftar kosong.
  5. Pengalih tampilan: ikon daftar untuk mode tabel, ikon kartu untuk mode grid (lihat Tampilan Tabel dan Grid).

Di panel Filter, tombol Reset mengembalikan semua filter ke nilai awal (termasuk kategori kembali ke FRA dan rentang ke hari ini) dan Apply menerapkan pilihan Anda. Filter baru dikirim ke server hanya setelah Anda menekan Apply; mengganti urutan di toolbar berlaku langsung.

Pilih kategori analitik

Dropdown Kategori pada Filter Umum: Face Recognition (FRA), People Analytics (MPAA), Vehicle Analytics (MVAA), Crowd Estimation (CE), License Plate (LPR), Personal Protective Equipment (PPE), dan General Events.
Dropdown Kategori pada Filter Umum: Face Recognition (FRA), People Analytics (MPAA), Vehicle Analytics (MVAA), Crowd Estimation (CE), License Plate (LPR), Personal Protective Equipment (PPE), dan General Events.

Kategori dipilih dari dropdown Kategori di bagian Filter Umum panel Filter. Kategori menentukan tabel mana yang dibaca di server, kolom tabel, filter atribut, dan opsi pengurutan yang tersedia. Mengganti kategori mengosongkan filter atribut kategori sebelumnya, tetapi mempertahankan Rentang Tanggal, Instance, dan Event ID.

Label dropdownKodeAnalitik yang termasukKapan digunakan
Face Recognition (FRA)fraNFV4-FR, NFV4-FRA, varian NFV4H-*-FRMenyelidiki siapa yang muncul di kamera pada waktu tertentu; status KNOWN / UNKNOWN, kemiripan, atribut wajah dan pakaian
People Analytics (MPAA)mpaaNFV4-MPA, NFV4-MPAA, NFV4-PAA, NFV4-MPA2Memantau pergerakan orang: hitung masuk/keluar garis (counting), berapa lama berada di area (dwelling), kepadatan (density), beserta atribut demografi dan pakaian
Vehicle Analytics (MVAA)mvaaNFV4-MVA, NFV4-MVAA, NFV4-MVASMemantau lalu lintas kendaraan: tipe, merek, warna, kecepatan, kendaraan yang berlama-lama di area terlarang
Crowd Estimation (CE)ceNFV4-CEMemantau estimasi jumlah orang di suatu area per interval; apakah lokasi melebihi kapasitas aman
License Plate (LPR)lprNFV4-LPR, NFV4-LPR2, NFV4-LPR3Menelusuri kendaraan berdasarkan nomor plat, tipe plat, status pendaftaran, dan arah di gerbang
Personal Protective Equipment (PPE)ppeNFV4-PPEMemeriksa kepatuhan APD: pelindung kepala, warna helm, masker, pakaian pelindung, alas kaki, konteks kerja
General EventsgeneralSemua analitik di luar enam keluarga di atas (mis. NFV4D-PSMO, NFV4D-PPHO, NFV4D-FISO, NFV4D-PPFA, NFV4-XRAY)Melihat event dari analitik khusus yang tidak memiliki tabel sendiri; kolomnya hanya Tipe Analitik, Label, Confidence Score, dan Jumlah

Kategori yang dipilih tersimpan di URL sebagai ?category=lpr (kategori default fra tidak ditulis), sehingga tautan halaman dapat dibagikan.

Gunakan filter di panel kiri

Panel Filter: Filter Umum berisi (1) Kategori, (2) Tipe Analitik, (3) Rentang Tanggal, (4) Stream, (5) Event ID; di bawahnya (6) filter atribut khusus kategori (di sini Filter Pengenalan Wajah) dan bagian Pencarian; (7) tombol Reset dan Apply menempel di bawah panel.
Panel Filter: Filter Umum berisi (1) Kategori, (2) Tipe Analitik, (3) Rentang Tanggal, (4) Stream, (5) Event ID; di bawahnya (6) filter atribut khusus kategori (di sini Filter Pengenalan Wajah) dan bagian Pencarian; (7) tombol Reset dan Apply menempel di bawah panel.

Panel Filter terdiri dari tiga bagian yang dapat dilipat. Bagian Filter Umum berlaku untuk semua kategori:

  1. Kategori: dropdown kategori analitik (lihat langkah sebelumnya).
  2. Tipe Analitik: pilih satu atau beberapa ID analitik di dalam kategori. Daftar hanya menampilkan analitik yang lisensinya tersedia di deployment Anda; untuk General Events daftar diambil dari ID analitik yang benar-benar pernah menghasilkan event. Kosong berarti semua.
  3. Rentang Tanggal: tanggal dan jam awal serta akhir. Default hari ini; pencarian di server menggunakan zona waktu browser Anda.
  4. Stream: pilih satu atau beberapa kamera, dicari berdasarkan nama stream atau site. Daftar dibatasi ke stream yang menjalankan analitik dari kategori aktif, termasuk stream yang sudah dihapus tetapi masih memiliki riwayat event.
  5. Event ID: pencarian sebagian (substring) pada Event ID. Berguna ketika Anda menerima potongan ID dari notifikasi atau laporan.
  6. Filter per kategori: judul bagian mengikuti kategori aktif (Filter Pengenalan Wajah, Filter Analitik Orang, Filter Analitik Kendaraan, Filter Estimasi Keramaian, Filter Plat Nomor, Filter PPE, Filter Kejadian Umum). Pilihan checkbox dan chip warna diisi secara dinamis dari nilai yang pernah terdeteksi dan dari konfigurasi rules pipeline; bila belum ada data, muncul teks Tidak ada opsi tersedia.
  7. Reset dan Apply: menempel di bagian bawah panel.

Di mode Federation, field Instance muncul paling atas dengan placeholder Semua instance; lihat Federation Mode.

Bagian Pencarian muncul untuk tiga kategori dan melakukan pencocokan sebagian: Kata Kunci (FRA, mencari pada label/keyword hasil pengenalan), Merek (MVAA), dan Nomor Plat (LPR).

Filter atribut yang tersedia per kategori:

KategoriFilter atribut
FRAStatus, Jenis Kelamin, Masker, Kacamata, Usia, Ekspresi Wajah, Penutup Kepala, Warna Atasan, Warna Bawahan
MPAATipe Logika, Area, Arah, Dari Garis, Ke Garis, Jenis Kelamin, Usia, Masker, Kacamata, Penutup Kepala, Warna Atasan, Warna Bawahan, Tipe Tubuh, Ekspresi Wajah, Sarung Tangan, Pakaian Atas, Pakaian Bawah, Warna Alas Kaki, Barang Bawaan
MVAAArea, Arah, Tipe Logika (counting, dwelling, density, speed), Tipe Kendaraan, Merek, Warna, Vehicle Advance
CEArea
LPRTipe Kendaraan, Tipe Plat, Status, Arah
PPEArea, Arah, Tipe Logika, Dari Garis, Ke Garis, Kacamata Pengaman, Pelindung Wajah, Tali Pengaman, Pelindung Kepala, Warna Helm, Masker Wajah, Pakaian Pelindung, Warna Pakaian Pelindung, Jenis Alas Kaki, Konteks Kerja, Sarung Tangan
GeneralLabel

Setiap filter yang diterapkan tercermin di URL (?from=, ?to=, ?streams=, ?analytics=, ?status=, ?event_id=, ?keyword=, ?plate=, dan seterusnya) sehingga tampilan terfilter dapat disalin dan dibagikan ke rekan operator; siapa pun yang membuka tautan itu melihat hasil yang sama. Di sisi API, filter dikirim sebagai filter[<nama>] dan pencarian sebagai search[<nama>] ke GET /api/event-history/{category}.

Baca tabel dan gunakan tombol Cari

Mode tabel (default) menampilkan kolom Gambar (thumbnail), Waktu (tanggal dan jam), Lokasi (nama stream), kolom Instance di mode Federation, lalu kolom atribut sesuai kategori, misalnya Status, Identitas, Jenis Kelamin, Usia, Masker, Kacamata untuk FRA atau Nomor Plat, Nama Terdaftar, Tipe Kendaraan, Status untuk LPR. Atribut kategorikal (masker, kacamata, tipe kendaraan, dan sebagainya) tampil sebagai badge, warna tampil dengan titik warna, dan Tipe Logika diberi warna per logic (counting biru, dwelling oranye, density ungu, speed cyan). Pada event density yang mendeteksi banyak objek, kolom atribut menampilkan nilai objek pertama diikuti pil + N lagi.

Kolom Aksi di ujung kanan berisi tombol Cari (ikon teropong) ketika fitur investigasi aktif: pada FRA, tombol muncul untuk event yang memiliki face_id dan membuka Face Search (/face-search?id=<face_id>); pada LPR, tombol muncul untuk event yang memiliki nomor plat dan membuka Plate Search (/plate-search?id=<plat>). Tombol ini memerlukan toggle Face Investigation atau Plate Investigation di Preferensi → Fitur.

Klik di mana pun pada baris (selain tombol Cari) untuk membuka panel detail.


Tampilan Tabel dan Grid

Mode tabel cocok untuk membaca banyak atribut sekaligus; mode grid cocok untuk membandingkan gambar secara visual, misalnya memilah wajah atau plat dengan cepat. Klik ikon kartu pada pengalih tampilan di toolbar untuk beralih ke grid.

Mode grid: kartu persegi berisi gambar event dengan badge nama kamera di kiri atas dan badge status atau nilai utama (KNOWN/UNKNOWN, nomor plat, arah, tipe kendaraan) di kanan atas. Klik ikon kiri pada pengalih untuk kembali ke tabel.
Mode grid: kartu persegi berisi gambar event dengan badge nama kamera di kiri atas dan badge status atau nilai utama (KNOWN/UNKNOWN, nomor plat, arah, tipe kendaraan) di kanan atas. Klik ikon kiri pada pengalih untuk kembali ke tabel.

Setiap kartu grid berbentuk persegi dan menampilkan gambar event dengan badge nama kamera di kiri atas (ditambah badge instance di mode Federation) dan badge nilai utama di kanan atas: status KNOWN/UNKNOWN (FRA), nomor plat (LPR), arah masuk/keluar dan jenis kelamin (MPAA), atau tipe kendaraan dan arah (MVAA). Klik kartu untuk membuka panel detail.

Kedua mode memuat 20 event per permintaan dan menggunakan infinite scroll: gulir ke bawah dan halaman berikutnya dimuat otomatis menggunakan next_cursor dari respons sebelumnya, tanpa tombol halaman. Indikator di bagian bawah menampilkan Menampilkan X dari Y selama masih ada data, dan Semua N event dimuat ketika sudah habis. Mode tampilan yang dipilih tersimpan di browser dan dipakai lagi pada kunjungan berikutnya; di perangkat mobile, tampilan selalu grid.


Melihat Detail Event

Buka panel Detail Event

Klik baris tabel atau kartu grid. Panel Detail Event meluncur dari sisi kanan (di perangkat mobile, dari bawah). Header panel menempel di atas sehingga selalu terlihat: nama kamera, tanggal, jam, dan badge Event ID (tanda 1 pada gambar) dengan tombol salin ke clipboard.

Panel Detail Event terbuka dari sisi kanan: header menampilkan kamera, tanggal, waktu, dan (1) badge Event ID dengan tombol salin; tab Detail berisi (2) blok pengenalan (Tangkapan Kamera beserta hasil pengenalan), lalu Lokasi, Floorplan, Informasi Dasar, dan Atribut.
Panel Detail Event terbuka dari sisi kanan: header menampilkan kamera, tanggal, waktu, dan (1) badge Event ID dengan tombol salin; tab Detail berisi (2) blok pengenalan (Tangkapan Kamera beserta hasil pengenalan), lalu Lokasi, Floorplan, Informasi Dasar, dan Atribut.

Panel mengambil data lengkap event (termasuk gambar beresolusi penuh dan pipeline_data) dari GET /api/events/pipeline/{event_id}; di mode Federation permintaan diarahkan ke instance asal event.

Baca blok-blok di tab Detail

Isi tab Detail disusun dari atas ke bawah:

  • Blok pengenalan (tanda 2), khusus FRA dan LPR. Pada FRA: Tangkapan Kamera di kiri dan, bila wajah dikenali, Hasil Pengenalan Wajah di kanan beserta foto terdaftar, nama, dan persentase kemiripan; bila tidak dikenali, kartu Wajah Tidak Dikenali menampilkan Kecocokan Terdekat (Tidak Terdaftar) dengan ID Wajah, nilai kesamaan, dan deteksi. Pada LPR: Pengenalan Plat Nomor dengan tangkapan plat, nomor plat, keyakinan plat, dan kartu Kendaraan Terdaftar atau Kendaraan Tidak Terdaftar. Tombol Cari pada gambar membuka Face Search atau Plate Search seperti di tabel.
  • Cari penampilan serupa: tombol yang membawa gambar event ini ke halaman Person Re-ID (/person-reid?event_id=) untuk menemukan orang yang sama di kamera lain. Hanya tampil bila fitur Person Re-ID aktif dan Anda punya hak bacanya.
  • Lokasi: peta dengan penanda kamera (dapat diperbesar) bila koordinat stream terisi.
  • Floorplan: posisi kamera di denah bangunan, bila site kamera memiliki floorplan.
  • Informasi Dasar: Lokasi, Tanggal, Waktu, Confidence (bila pipeline melaporkan satu nilai keyakinan), dan Koordinat.
  • Atribut atau Objek Terdeteksi: seluruh atribut yang dianalisis pipeline (jenis kelamin, usia, warna pakaian, tipe kendaraan, dan seterusnya). Event density menampilkan satu kartu per objek terdeteksi beserta confidence masing-masing.

Dua angka pada blok pengenalan sering disalahartikan:

  • Kesamaan (similarity, FRA) adalah nilai 0 sampai 1 yang menunjukkan seberapa mirip wajah yang terdeteksi dengan foto referensi di database. Ini ukuran kedekatan fitur wajah secara matematis, bukan persentase keyakinan bahwa orangnya sama.
  • Confidence (confidence, confidence_detection) adalah nilai 0 sampai 1 yang menunjukkan seberapa yakin model bahwa objek yang terdeteksi memang objek yang dimaksud (misalnya benar wajah, bukan gambar wajah di poster). Ini tidak sama dengan kesamaan.

Putar ulang rekaman di tab Playback

Tangkapan layar tab Playback belum tersedia di dokumentasi ini karena tab tersebut hanya dirender ketika fitur Media Server aktif dan stream yang bersangkutan benar-benar punya rekaman NVR.

Tab Playback muncul di sebelah tab Detail hanya jika fitur Media Server aktif dan stream kamera tersebut memiliki rekaman NVR. Video dimulai 45 detik sebelum waktu event dan gambar event dipakai sebagai poster sampai frame pertama diputar. Di samping video ada daftar event lain dari kamera yang sama dalam rentang 5 menit sebelum dan sesudah, dengan event yang paling dekat disorot; klik salah satunya untuk melompat. Timeline di bawah menandai posisi event, segmen rekaman hari itu, dan thumbnail event; geser dengan drag atau scroll, dan gunakan Ctrl + scroll untuk zoom. Tombol Lihat Lengkap membuka halaman playback penuh untuk kamera tersebut.

Bagikan event dengan deep link

Tambahkan ?open_event=<event_id> ke URL halaman, misalnya /event-history?open_event=1780473522-a6d87102, dan panel detail event tersebut terbuka otomatis saat halaman dimuat; parameter dihapus dari URL setelah dibaca agar panel tidak terbuka lagi saat navigasi berikutnya. Salin Event ID dari badge di header panel untuk membuat tautan ini.


Mengekspor Event

Ekspor berguna untuk laporan insiden, bukti kepatuhan, atau analisis lanjutan di spreadsheet. Klik export di toolbar untuk membuka dialog Ekspor Event.

Dialog Ekspor Event: (1) Format Dokumen PDF atau Spreadsheet Excel, (2) Lingkup Ekspor Halaman Saat Ini atau Semua Event, (3) toggle Sertakan Gambar. Klik Mulai Ekspor; tugas berjalan di server dan hasilnya diunduh dari Pusat Tugas.
Dialog Ekspor Event: (1) Format Dokumen PDF atau Spreadsheet Excel, (2) Lingkup Ekspor Halaman Saat Ini atau Semua Event, (3) toggle Sertakan Gambar. Klik Mulai Ekspor; tugas berjalan di server dan hasilnya diunduh dari Pusat Tugas.

Prop

Type

Klik Mulai Ekspor. Ekspor tidak dibuat di browser, melainkan dijalankan sebagai job asinkron di server (POST /api/event-history/{category}/export). Toast Tugas ekspor ditambahkan. Lacak progres di Pusat Tugas. muncul dan ikon Pusat Tugas di footer aplikasi menampilkan jumlah tugas aktif. Buka Pusat Tugas untuk melihat status (Menunggu, Memproses, Selesai, Gagal) dan klik Unduh ketika selesai; tombol Batalkan menghentikan job yang masih berjalan.

Ekspor lebih dari 1.000 rekaman dibagi menjadi beberapa file (1.000 rekaman per file) dan dikirim sebagai arsip ZIP. Di mode Federation, satu job dibuat untuk setiap instance yang dipilih (atau semua instance bila tidak ada yang dipilih), masing-masing menghasilkan file sendiri karena setiap instance mengekspor datanya sendiri.


Smart Search memungkinkan Anda mencari event dengan kalimat bebas, misalnya "orang memakai jaket merah membawa tas", tanpa memilih kategori atau atribut satu per satu. Mode ini tampil sebagai pengalih Normal / Smart Search di bagian paling atas panel Filter dan hanya tersedia bila toggle Smart Search aktif di Preferensi → Fitur.

Tangkapan layar mode ini belum tersedia karena toggle Smart Search mati secara bawaan dan baru dapat dinyalakan setelah URL layanan embedding diisi di Preferensi → Fitur.

  1. Klik tab Smart Search. Panel berganti menjadi panel Smart Search.
  2. Ketik deskripsi pada Kata Pencarian dan atur Rentang Tanggal.
  3. Klik Apply (tanda 3). Hasil ditampilkan dengan Skor kemiripan, dalam mode daftar atau grid, dan dimuat bertahap saat Anda menggulir. Klik hasil untuk membuka panel Detail Event yang sama.

Mode dan kata pencarian tersimpan di URL (?mode=smart-search&q=...&ss_from=...&ss_to=...). Di sisi API, mode ini memanggil GET /api/smart-search; lihat halaman Search untuk cara kerja mesin pencarinya dan kuota ekstraksi di menu Smart Search Quota.


Federation Mode

Jika organisasi Anda menjalankan beberapa instance Lenz, halaman ini dapat menampilkan event dari semua instance sekaligus. Aktifkan lewat Preferensi → Fitur → Federation Mode.

  • Field Instance muncul paling atas di Filter Umum sebagai multi-select. Kosong (Semua instance) berarti agregasi seluruh instance; pilih satu atau beberapa instance untuk mempersempit. Mengganti pilihan instance mengosongkan filter Stream dan Tipe Analitik karena daftarnya berbeda per instance.
  • Tabel mendapat kolom Instance dan kartu grid mendapat badge instance, keduanya menampilkan nama instance beserta alamatnya.
  • Panel detail, gambar, tombol Cari, dan tautan Person Re-ID selalu diarahkan ke instance asal event.
  • Ekspor membuat satu job per instance (lihat catatan di Mengekspor Event).

Di sisi API, kirim instance=<id> untuk satu instance, instance=a,b untuk beberapa, atau is_aggregated=true tanpa instance untuk semua. Federation Module menggabungkan hasil fan-out, mengurutkannya ulang berdasarkan (event_time, event_id), dan membangun ulang next_cursor sehingga infinite scroll tetap konsisten.

GET /api/event-history/fra: agregasi semua instance
curl -X GET "${API_URL}/api/event-history/fra?is_aggregated=true&filter[timestamp_from]=2026-04-30T00:00:00%2B07:00&filter[timestamp_to]=2026-04-30T23:59:59%2B07:00&limit=20&include_total=true" \
  -H "X-Api-Key: <api-key>"

Toast Alert: Tidak Hanya di Halaman Ini

Penting untuk operator yang baru mengenal Lenz: toast notifikasi alert muncul di pojok kanan atas layar terlepas dari halaman mana yang sedang Anda buka, baik di Event History, Streams, Preferensi, maupun halaman lainnya. Anda tidak perlu berada di halaman Event History untuk menerima alert real-time.

Alert hanya muncul apabila event memenuhi minimal satu Alert Rule yang aktif. Jika Anda tidak melihat toast padahal kamera aktif mengirim event, pastikan Alert Rule sudah dikonfigurasi dan diaktifkan di menu Alert Rules. Alert yang sudah lewat dapat ditelusuri di halaman Alert History.


Fitur Utama

Tujuh Kategori Analitik

FRA, MPAA, MVAA, CE, LPR, PPE, dan General Events, masing-masing dengan kolom tabel, filter atribut, dan opsi pengurutan yang relevan secara otomatis.

Filter Multi-Dimensi

Kombinasikan Tipe Analitik, Rentang Tanggal, Stream, Event ID, dan atribut spesifik kategori; nilai pilihan diisi dinamis dari data yang pernah terdeteksi. Semua filter tercermin di URL.

Tabel dan Grid dengan Infinite Scroll

Beralih antara tabel kompak untuk membaca atribut dan grid visual untuk membandingkan gambar. Halaman berikutnya dimuat otomatis 20 event sekali gulir.

Panel Detail dan Playback

Header yang menempel dengan Event ID yang dapat disalin, blok pengenalan wajah atau plat, peta, floorplan, atribut lengkap, dan tab Playback dengan timeline rekaman NVR.

Lompat ke Investigasi

Tombol Cari membuka Face Search atau Plate Search dari satu event; tombol Cari penampilan serupa membawa gambar event ke Person Re-ID.

Ekspor Asinkron

PDF atau Excel, halaman saat ini atau semua event sesuai filter, dengan atau tanpa gambar. Job berjalan di server dan hasilnya diunduh dari Pusat Tugas.

Smart Search

Cari event dengan kalimat bahasa alami lintas kategori dan kamera; hasil diurutkan berdasarkan skor kemiripan.

Federation Aware

Tampilkan event dari semua instance sekaligus atau pilih beberapa instance; kolom Instance, panel detail, dan ekspor mengikuti instance asal event.

Feed WebSocket untuk Integrator

Berlangganan seluruh deteksi lewat /api/event_channel atau hanya event yang lolos Alert Rule lewat /api/alert_channel.


WebSocket Protocol untuk Integrator

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

WebSocket adalah koneksi jaringan yang tetap terbuka sehingga server dapat mendorong event begitu terjadi. Bayangkan perbedaan antara mengecek kotak surat setiap menit dengan tukang pos yang langsung mengetuk pintu saat ada paket: REST perlu di-poll berkala, WebSocket cukup dibuka sekali dan data mengalir masuk.

Sistem menyediakan dua channel WebSocket:

ChannelEndpointIsiOtentikasi
Event Channel/api/event_channelSemua event mentah dari Visionaire (setiap deteksi yang lewat pipeline)Tidak ada; endpoint publik yang dikecualikan dari integration lock
Alert Channel/api/alert_channelHanya event yang memenuhi minimal satu Alert Rule aktif, dibatasi ke stream yang boleh diakses penggunaQuery authorization=<access_token> (dipakai Lenz Dashboard) atau x-api-key=<key> (direkomendasikan untuk integrator)

Endpoint Event Channel

wss://{BASE_URL}/api/event_channel

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

Parameter Query

ParameterTipeWajibDeskripsi
stream_idsstringTidakID stream yang ingin dimonitor, pisahkan dengan koma untuk beberapa stream. Kosong berarti semua stream.
stream_idstringTidakBentuk tunggal dari stream_ids; dipertahankan untuk kompatibilitas.
analytic_idstringTidakID analitik yang ingin diterima, pisahkan dengan koma. Contoh: NFV4-FR,NFV4-LPR.
node_numintegerTidakNomor node Visionaire (default 0).
logicstringTidakHanya event dengan logic type tertentu (mis. counting).
disable_base64_imagebooleanTidaktrue untuk tidak menyertakan gambar base64 di payload; field primary_image_url / secondary_image_url tetap dikirim sehingga gambar dapat diambil terpisah. Sangat disarankan pada volume tinggi.
instancestringTidakHanya di mode Federation: ID instance sumber.
is_aggregatedbooleanTidakHanya di mode Federation: true untuk menerima event dari semua instance.

Otentikasi hanya diperlukan pada channel alert (/api/alert_channel), lewat query authorization=<access_token> atau x-api-key=<key>. event_channel bersifat publik dan mengabaikan kredensial apa pun yang dikirim. Kredensial dikirim sebagai query parameter, bukan header, karena browser tidak dapat mengatur header kustom saat WebSocket handshake. Detail mekanisme, masa berlaku token, dan contoh per jenis klien ada di Otentikasi: WebSocket.

Contoh Koneksi

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';

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

const ws = new WebSocket(
  `wss://api.contoh.com/api/event_channel?${params.toString()}`
);

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:

websocat \
  "wss://api.contoh.com/api/event_channel?stream_ids=eb7022a64d9173a6&disable_base64_image=true"

Reconnect Otomatis

Lenz Dashboard menjalankan koneksi alert_channel di dalam Web Worker dengan reconnect otomatis. Sebaiknya Anda menerapkan pola yang sama di integrasi Anda:

ParameterNilai
Jeda reconnectmin(1000 × 2^percobaan, 30000) + jitter milidetik; jitter acak hingga 1.000 ms untuk menghindari thundering herd
Batas percobaan10 kali; setelah itu koneksi dianggap terputus dan perlu dimulai ulang (Lenz memulai ulang saat halaman dimuat kembali)
HeartbeatPing setiap 30.000 ms (30 detik) untuk menjaga koneksi tetap hidup di balik proxy

Penghitung percobaan direset ke nol setiap kali koneksi berhasil dibuka.

Alert Channel (untuk Toast dan Sistem Eksternal)

Channel wss://{BASE_URL}/api/alert_channel hanya mengirim event yang sudah lolos minimal satu Alert Rule aktif, dan hanya dari stream yang boleh diakses oleh pengguna atau API key yang dipakai. Cocok jika Anda hanya ingin menerima event signifikan, bukan seluruh aliran deteksi.

Subscribe ke alert_channel (Node.js)
import WebSocket from 'ws';

const params = new URLSearchParams({
  'x-api-key': '<api-key>',
  disable_base64_image: 'false',
  is_aggregated: 'true', // ambil dari semua instance dalam Federation
});

const ws = new WebSocket(`wss://api.contoh.com/api/alert_channel?${params}`);

ws.on('message', (data) => {
  const event = JSON.parse(data.toString());
  // event.alert_type_id dan event.alertable_id terisi; alert_history_id TIDAK dikirim
  console.log(`Alert ${event.alert_type_id}: ${event.analytic_id} (${event.alertable_id})`);
});

Payload alert_channel sama dengan event_channel, ditambah dua field:

FieldTipeDeskripsi
alert_type_idnumberID Alert Type; gunakan untuk lookup warna, durasi, dan suara via /api/alert-type
alertable_idstringNilai yang sama dengan kolom alertable_id pada tabel alert history; gunakan untuk menautkan pesan ini ke record REST

Field alert_history_id tidak dikirim pada channel ini karena record alert history disimpan secara asinkron setelah pesan terkirim. Detail parameter, respons, dan cara menautkan pesan ke record REST ada di API Reference: Alert History.


Format Event Payload

WebSocket Event Payload

Setiap pesan yang diterima dari WebSocket memiliki struktur berikut. Operator tidak pernah melihat JSON ini secara langsung; bagian ini ditujukan untuk integrator yang mem-parsing data event secara programatik.

WebSocket Event Payload
{
  "event_id": "1780473522-a6d87102",
  "analytic_id": "NFV4-FR",
  "stream_id": "eb7022a64d9173a6",
  "node_num": 0,
  "label": "UNKNOWN",
  "location": "Lobby Utama",
  "primary_image_url": "/api/attachments?owner_type=primary&owner_id=1780473522-a6d87102",
  "secondary_image_url": "/api/attachments?owner_type=secondary&owner_id=1780473522-a6d87102",
  "primary_image": null,
  "secondary_image": null,
  "result": "UNKNOWN",
  "timestamp": "2026-04-30T08:23:45+07:00",
  "status": "UNKNOWN",
  "logic": "face_recognition",
  "pipeline_data": {
    "event_id": "1780473522-a6d87102",
    "face_id": "118747588341006337",
    "similarity": 0.4893847107887268,
    "status": "UNKNOWN",
    "confidence_detection": 0.9988495111465454,
    "variation": "13219648471735459236"
  }
}

Deskripsi Field Utama:

FieldTipeDeskripsi
event_idstringEvent ID dari engine analitik; kunci untuk deep link dan GET /api/events/pipeline/{event_id}
analytic_idstringID analitik engine (contoh: NFV4-FR, NFV4-LPR, NFV4-MPAA)
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 utama; dikirim juga saat disable_base64_image=true
secondary_image_urlstringURL gambar kedua (tangkapan kamera 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.)
instancestringHanya ada di mode Federation: ID instance asal event
alert_type_id, alertable_idnumber, stringHanya ada pada pesan yang cocok dengan Alert Rule (lihat Alert Channel)
pipeline_dataobjectData spesifik per analitik (lihat di bawah)

pipeline_data per Kategori

Field pipeline_data berisi detail analitik yang bervariasi per kategori. Sekali lagi, bagian ini untuk integrator; operator melihat atribut ini dalam bentuk label di panel detail, bukan sebagai JSON.

pipeline_data untuk Face Recognition Analytics
{
  "event_id": "1780473522-a6d87102",
  "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 sampai 1 (1 = identik)
statusKNOWN atau UNKNOWN
confidence_detectionTingkat keyakinan deteksi wajah (0 sampai 1), terlepas dari identitas
pipeline_data untuk License Plate Recognition
{
  "event_id": "1780473600-3f9b21c0",
  "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 (0 sampai 1)
area_nameNama area/garis yang memicu event
pipeline_data untuk Multi-Person Attribute Analytics
{
  "event_id": "1780473655-91ab0c77",
  "area_name": "Area Pintu Masuk",
  "label": "person",
  "confidence": 0.9998,
  "count": 3
}
FieldDeskripsi
area_nameNama area atau garis virtual yang dikonfigurasi
labelJenis objek yang terdeteksi (person)
confidenceTingkat keyakinan deteksi (0 sampai 1)
countJumlah orang (untuk mode counting)

Atribut tambahan seperti jenis kelamin, usia, dan warna pakaian dikembalikan sebagai field tingkat atas pada respons REST (gender, age, upper_color, dst.), bukan di dalam pipeline_data.

pipeline_data untuk Multi-Vehicle Attribute Analytics
{
  "event_id": "1780473701-c04d5e18",
  "area_name": "Gerbang Parkir",
  "label": "car",
  "confidence": 0.9875,
  "count": 1
}
FieldDeskripsi
area_nameNama area atau garis virtual yang dikonfigurasi
labelJenis kendaraan yang terdeteksi
confidenceTingkat keyakinan deteksi (0 sampai 1)
countJumlah kendaraan (untuk mode counting)

Atribut tambahan seperti merek, warna, tipe kendaraan, dan kecepatan dikembalikan sebagai field tingkat atas pada respons REST (brand, color, vehicle_type, speed_kmh), bukan di dalam pipeline_data.


Tips & Troubleshooting


Selanjutnya

On this page