Notification Channels
Konfigurasi tujuan pengiriman alert — Email, Webhook, Telegram, dan Discord — untuk sistem notifikasi Lenz Dashboard.
Pengenalan
Sebuah Alert Rule memutuskan kapan sesuatu penting. Notification Channel memutuskan ke mana kabarnya dikirim — ke grup Telegram tim jaga, ke inbox supervisor, atau ke sistem lain lewat webhook. Keduanya sengaja dipisah: channel dibuat sekali, lalu dipakai ulang oleh berapa pun rule.
Tanpa channel, alert tetap menyala sebagai toast di dashboard dan tetap tercatat di Alert History — yang hilang hanya kabar ke orang yang sedang tidak menatap layar.

Lenz mendukung empat tipe channel:
| Tipe | Deskripsi |
|---|---|
| Kirim alert via server SMTP ke satu atau beberapa alamat penerima | |
| Webhook | Kirim payload JSON ke HTTP endpoint kustom milik Anda |
| Telegram | Kirim pesan ke grup atau channel melalui Telegram Bot |
| Discord | Post pesan ke channel Discord via Discord Webhook |
Channel bersifat independen dari Alert Rule — Anda membuat channel sekali, lalu menghubungkannya ke banyak rule sesuai kebutuhan.
Untuk mengakses halaman ini, navigasi ke Konfigurasi → Notification Channels di sidebar Lenz. Diperlukan izin notifications.
Cara Menggunakan
Menambah Channel Baru
Wizard terdiri dari tiga langkah yang terbuka berurutan: Pilih Provider → Konfigurasi Koneksi → Template Kustom.
Pilih provider

Klik Tambah Channel di toolbar. Langkah pertama menampilkan empat kartu provider; pilihan ini menentukan field apa saja yang muncul di langkah berikutnya, jadi tidak dapat diubah dengan mudah setelah channel tersimpan.
Klik Lanjut.
Konfigurasi koneksi

Semua provider meminta dua hal yang sama: Nama Channel (maksimal 32 karakter, dipakai sebagai label di wizard Alert Rule) dan toggle Aktif. Sisanya berbeda per provider.
Webhook — satu-satunya provider yang seluruh konfigurasinya diisi di sini:
- Endpoint URL — alamat HTTP yang akan dipanggil. Wajib diisi.
- Method —
POST(bawaan) atauPUT. - Headers (opsional) — pasangan nama dan nilai header. Klik Tambah Header untuk menambah baris. Di sinilah Anda menaruh
Authorizationbila endpoint Anda terlindungi.
Telegram, Discord, dan Email — kredensialnya tidak diketik di sini, melainkan diambil dari Credential tersimpan (lihat bagian berikutnya). Email menambahkan satu bagian lagi, Komposisi Email:
- Alamat Pengirim — alamat yang muncul sebagai pengirim. Wajib diisi.
- Alamat Penerima — satu atau beberapa alamat, dipisahkan koma.
Klik Lanjut.
Sesuaikan template pesan
Langkah ketiga menentukan isi pesan. Editor menyediakan tab Edit dan Pratinjau, tombol Sisipkan Variabel untuk menaruh placeholder di posisi kursor, dan Reset ke default untuk kembali ke template bawaan provider.
Bentuk editornya mengikuti provider: Webhook dan Discord memakai editor JSON dengan tombol Format untuk merapikan struktur, sementara Telegram dan Email memakai editor teks dengan toolbar format (tebal, miring, tautan). Khusus Email ada field tambahan Template Subjek di atas editor, yang juga menerima placeholder.
Placeholder yang tersedia:
| Variabel | Isi | Contoh |
|---|---|---|
{{severity}} | Tipe Peringatan dari Alert Rule | CRITICAL |
{{stream_name}} | Nama stream atau kamera sumber | Gate A - Main Entrance |
{{label}} | Label event yang terdeteksi | Unauthorized Person |
{{timestamp}} | Waktu kejadian | 2026-04-30 08:15:22 |
{{alert_rule}} | Nama Alert Rule yang menyala | Wajah Tidak Dikenal di Lobi |
{{event_id}} | ID event pemicu | 1780473522-a6d87102 |
{{status}} | Status hasil pengenalan | UNKNOWN |
{{image_url}} | URL gambar event | https://…/event.jpg |
Daftar di atas selalu tersedia. Set variabel yang lebih lengkap per tipe event dapat diambil lewat GET /api/notification-channels/template-variables?event_type=alert_history; tombol Sisipkan Variabel mengisi daftarnya dari endpoint tersebut.
Klik Buat Channel.
Uji sebelum dipakai
Kartu channel punya tombol kirim di sebelah menu tiga titik yang mengirim satu pesan percobaan. Tombol ini hanya aktif ketika channel berstatus Aktif.
Kirim test sekali sebelum menghubungkan channel ke Alert Rule — jauh lebih mudah memperbaiki kredensial sekarang daripada mencari tahu mengapa alert semalam tidak sampai.
Hubungkan ke Alert Rule
Channel tidak mengirim apa pun dengan sendirinya. Buka Alert Rules, buat atau edit sebuah rule, dan pilih channel ini di langkah Notifikasi. Satu channel dapat dipakai oleh berapa pun rule, dan satu rule dapat mengirim ke beberapa channel sekaligus.
Credential untuk Telegram, Discord, dan Email

Token bot, URL webhook Discord, dan kredensial SMTP tidak disimpan pada channel, melainkan pada Credential tersendiri yang dapat dipakai ulang oleh beberapa channel. Pada langkah Konfigurasi Koneksi, pilih credential dari dropdown, atau klik tombol + di sebelahnya untuk membuat credential baru tanpa meninggalkan wizard. Ikon pensil di sebelahnya membuka credential terpilih untuk diubah.
Setiap tipe credential meminta field yang berbeda:
| Field | Keterangan |
|---|---|
| Nama | Label credential, contoh Bot Telegram SOC |
| Bot Token | Token dari BotFather, format 123456789:ABCdef... |
| Chat ID | ID grup atau channel tujuan, contoh -1001234567890 |
Mendapatkan Bot Token: buka @BotFather di Telegram, kirim /newbot, ikuti instruksinya, lalu salin token yang diberikan.
Mendapatkan Chat ID: tambahkan bot ke grup tujuan, kirim satu pesan apa pun di grup itu, lalu buka https://api.telegram.org/bot<TOKEN>/getUpdates di browser dan baca nilai chat.id. ID grup selalu diawali tanda minus.
Bot harus sudah menjadi anggota grup atau channel tujuan sebelum dapat mengirim pesan. Menyimpan credential yang valid saja tidak cukup.
| Field | Keterangan |
|---|---|
| Nama | Label credential, contoh Discord Ruang Kendali |
| Webhook URL | URL webhook channel Discord, format https://discord.com/api/webhooks/... |
Membuat Webhook URL: di Discord buka Server Settings → Integrations → Webhooks → New Webhook, pilih channel tujuan, lalu klik Copy Webhook URL.
| Field | Keterangan |
|---|---|
| Nama | Label credential, contoh SMTP Kantor Pusat |
| SMTP Host | Host server SMTP, contoh smtp.contoh.com |
| Port | Port SMTP, umumnya 587 (STARTTLS) atau 465 (SSL/TLS) |
| Username | Username akun SMTP |
| Password | Password akun SMTP |
| Gunakan TLS | Aktifkan sesuai konfigurasi server SMTP Anda |
Untuk Gmail, gunakan App Password, bukan password akun utama. Alamat pengirim dan penerima tidak disimpan di credential melainkan di channel, sehingga satu credential SMTP dapat melayani beberapa channel dengan penerima yang berbeda.
Memantau Pengiriman
Baris ringkasan di bagian atas halaman menjawab satu pertanyaan: apakah notifikasi benar-benar sampai?
- terkirim hari ini — jumlah notifikasi yang berhasil dikirim sejak tengah malam.
- pesan gagal — jumlah notifikasi yang sudah melewati batas percobaan ulang dan masuk ke Dead Letter Queue. Klik angkanya untuk membuka daftarnya dan mencoba ulang satu per satu. Angka yang terus bertambah hampir selalu berarti kredensial atau endpoint yang salah, bukan masalah sesaat.
- menunggu — notifikasi yang masih dalam antrean. Angka kecil yang naik-turun itu normal; angka besar yang tidak pernah turun berarti antrean tersendat.
Tombol Refresh memuat ulang ketiga angka. Tombol Lihat log membuka dialog Log Notifikasi berisi riwayat pengiriman terakhir dengan kolom Channel, Tipe Event, Status (Terkirim, Gagal, Menunggu, Dead), Durasi, dan Waktu, beserta kode status dan isi respons dari server tujuan — tempat pertama yang harus dilihat ketika sebuah channel berhenti bekerja.
Mengubah dan Menonaktifkan Channel

Menu tiga titik pada setiap kartu berisi tiga aksi:
- Edit — membuka kembali wizard dengan nilai tersimpan.
- Nonaktifkan — menghentikan pengiriman tanpa menghapus konfigurasi. Alert Rule yang memakai channel ini tetap menyala dan tetap tercatat di Alert History; hanya pengiriman ke channel ini yang berhenti. Pilih Aktifkan pada menu yang sama untuk menyalakannya lagi.
- Hapus — membuang channel. Rule yang memakainya tetap ada, tetapi kehilangan tujuan ini.
Untuk menghentikan notifikasi sementara — saat pemeliharaan, atau ketika satu kamera bermasalah dan membanjiri channel — gunakan Nonaktifkan, bukan Hapus. Kredensial dan template tetap tersimpan dan rule tidak perlu diedit.
Webhook Payload Format
Bagian ini khusus untuk integrator yang membangun sistem penerima webhook.
Format JSON Default
Ketika sebuah alert terpicu dan channel Webhook aktif, Lenz mengirimkan request HTTP ke endpoint URL Anda dengan body JSON sesuai template yang dikonfigurasi. Template default untuk Webhook adalah:
{
"severity": "{{severity}}",
"stream_name": "{{stream_name}}",
"label": "{{label}}",
"timestamp": "{{timestamp}}",
"alert_rule": "{{alert_rule}}"
}Contoh payload nyata yang akan diterima endpoint Anda:
{
"severity": "HIGH",
"stream_name": "Gate A - Main Entrance",
"label": "Unauthorized Person",
"timestamp": "2026-04-30 08:15:22",
"alert_rule": "Deteksi Orang Tidak Dikenal"
}HTTP Headers
Request webhook dikirimkan dengan header berikut:
| Header | Nilai |
|---|---|
Content-Type | application/json |
| Header kustom | Header tambahan yang Anda konfigurasi di form |
Saat ini Lenz tidak menambahkan signature header otomatis (seperti HMAC). Gunakan header kustom (misalnya Authorization: Bearer <token>) untuk memvalidasi keaslian request di sisi penerima.
Retry Policy
Sistem menggunakan mekanisme outbox queue dengan retry otomatis:
- Jika endpoint mengembalikan HTTP status non-2xx, sistem akan mencoba ulang pengiriman
- Retry dilakukan dengan jeda bertahap (exponential backoff)
- Setelah mencapai batas maksimum percobaan, notifikasi dipindahkan ke Dead Letter Queue
- Item di Dead Letter Queue dapat dilihat dan dicoba ulang secara manual dari halaman Notification Channels
Contoh Receiver Code
const express = require('express')
const app = express()
app.use(express.json())
const EXPECTED_TOKEN = process.env.WEBHOOK_SECRET || 'change-me'
app.post('/webhook/lenz', (req, res) => {
// Validasi Authorization header
const authHeader = req.headers['authorization']
if (authHeader !== `Bearer ${EXPECTED_TOKEN}`) {
return res.status(401).json({ ok: false, message: 'Unauthorized' })
}
const payload = req.body
console.log('Alert diterima:', {
severity: payload.severity,
stream: payload.stream_name,
label: payload.label,
time: payload.timestamp,
rule: payload.alert_rule,
})
// Proses alert sesuai kebutuhan Anda di sini
// Contoh: simpan ke database, kirim ke Slack, dll.
res.json({ ok: true, message: 'received' })
})
app.listen(3000, () => {
console.log('Webhook receiver berjalan di port 3000')
})Jalankan dengan:
node webhook-receiver.jsPastikan endpoint Anda merespons dengan HTTP 200 sesegera mungkin. Proses yang membutuhkan waktu lama sebaiknya dikerjakan secara asynchronous agar tidak memicu timeout dari sisi Lenz.
Fitur Utama
Multi-provider
Dukung Email, Webhook, Telegram, dan Discord dalam satu antarmuka yang seragam.
Template Kustom
Sesuaikan format pesan dengan variabel dinamis dari data event yang terdeteksi.
Queue & Retry Otomatis
Notifikasi gagal akan dicoba ulang secara otomatis dengan mekanisme exponential backoff.
Dead Letter Queue
Notifikasi yang melebihi batas retry disimpan di DLQ dan dapat dicoba ulang secara manual.
Log Pengiriman
Riwayat lengkap setiap upaya pengiriman notifikasi, termasuk status, durasi, dan respons server.
Test Instan
Uji koneksi channel langsung dari dashboard tanpa perlu menunggu alert sungguhan.
Aktivasi/Deaktivasi
Matikan sementara channel tertentu tanpa menghapus konfigurasinya.
Credential Dapat Dipakai Ulang
Token Telegram, webhook Discord, dan kredensial SMTP disimpan terpisah dari channel sehingga satu credential dapat melayani beberapa channel.
Tips & Troubleshooting
Selanjutnya
API Reference — Alert History
Endpoint untuk mengambil daftar alert, detail, memperbarui status follow-up, mengekspor data Alert History, dan berlangganan alert real-time lewat WebSocket.
API Reference — Notification Channels
Endpoint untuk mengelola Notification Channel, antrian pengiriman notifikasi, dan log pengiriman.