Flood Early Warning System — Dokumentasi Lengkap Sistem Monitoring Ketinggian Air Sungai untuk Peringatan Dini Banjir berbasis IoT.
Menjadi sistem peringatan dini banjir berbasis IoT yang andal, terjangkau, dan mudah diakses oleh masyarakat Indonesia.
Menyediakan data ketinggian air sungai secara real-time dan notifikasi peringatan dini multi-kanal (Email & Telegram) kepada warga.
SiagaBanjir adalah sistem monitoring ketinggian air sungai berbasis Internet of Things (IoT) yang dirancang untuk bekerja 24 jam non-stop, mandiri, dan siap digunakan di lingkungan nyata. Sistem ini menggunakan perangkat ESP32 yang dipasang di titik-titik rawan banjir untuk memantau ketinggian air secara real-time dan mengirimkan data melalui protokol MQTT.
Data yang terkumpul diproses secara otomatis untuk menentukan status bahaya banjir, menampilkan visualisasi di dashboard interaktif, dan mengirimkan notifikasi peringatan dini melalui Email dan Telegram Bot kepada warga yang terdaftar.
Pemantauan ketinggian air secara langsung dengan interval data setiap 30 detik dari perangkat ESP32 di lapangan.
Visualisasi lokasi perangkat monitoring pada peta interaktif dengan marker warna sesuai status banjir.
Peringatan dini otomatis dikirim melalui Email dan Telegram Bot kepada warga yang telah subscribe.
Dokumentasi visual kondisi sungai melalui kamera terintegrasi pada perangkat ESP32-CAM di lapangan.
Visualisasi tren ketinggian air, suhu, kelembaban, dan data sensor lainnya dalam bentuk grafik interaktif Chart.js.
Bot Telegram interaktif untuk mendapatkan Chat ID, notifikasi otomatis, dan panduan penggunaan sistem.
Sistem Siaga Banjir menggunakan arsitektur client-server berbasis event-driven dengan alur data sebagai berikut:
monitoring/{device_id}/sensor dan monitoring/{device_id}/status.Halaman landing page yang menjelaskan tentang proyek Siaga Banjir, masalah yang diatasi, dan solusi yang ditawarkan. Publik dapat mendaftar sebagai warga atau login ke dashboard masing-masing.
index.php | Halaman utama publik dengan informasi proyek |
dokumentasi.php | Dokumentasi lengkap proyek (halaman ini) |
Sistem autentikasi dengan role-based access control: Admin dan Warga. Dilengkapi proteksi brute-force dan CSRF token.
users/index.php | Halaman login |
users/register.php | Pendaftaran akun warga baru |
users/logout.php | Logout session |
app/auth.php | Fungsi autentikasi (require_login(), require_admin()) |
app/functions.php | Fungsi helper (CSRF, sanitasi, URL) |
app/config.php | Konfigurasi dari .env |
Fitur lengkap untuk administrator dalam mengelola sistem:
users/admin/index.php | Beranda dengan peta interaktif & status perangkat |
users/admin/devices.php | Manajemen perangkat monitoring |
users/admin/device.php | Detail perangkat, sensor, threshold, grafik, galeri kamera |
users/admin/users.php | Manajemen pengguna (CRUD) |
users/admin/warning_devices.php | Manajemen perangkat alarm (sirine/lampu) dengan kontrol MQTT |
users/admin/profile.php | Profil admin |
Dashboard untuk warga yang telah mendaftar dan subscribe ke perangkat monitoring:
users/warga/index.php | Beranda dengan info perangkat, grafik, peta, dan riwayat |
users/warga/settings.php | Pengaturan notifikasi (Email/Telegram, level notifikasi) |
users/warga/subscribe.php | Subscribe ke perangkat monitoring (POST) |
users/warga/unsubscribe.php | Unsubscribe dari perangkat (POST) |
Layanan backend yang berjalan secara terus-menerus di server:
mqtt/listener.js | MQTT Listener — menerima data sensor/status dari ESP32, menyimpan ke DB, memicu notifikasi (Node.js + PM2) |
bot/bot.js | Telegram Bot Polling — melayani perintah /start, /chatid, /help (Node.js + PM2) |
mqtt/ecosystem.config.js | Konfigurasi PM2 untuk menjalankan listener |
Sistem notifikasi otomatis multi-kanal yang memungkinkan warga menerima peringatan dini banjir:
notification_logs untuk audit dan evaluasi.File utama: app/notify.php, api/notify_trigger.php
Perangkat ESP32-CAM dapat mengirimkan foto kondisi sungai secara periodik ke server:
X-Device-ID dan X-API-Keyuploads/images/{tahun-bulan}/ dengan format JPEGFile utama: api/camera.php
Sistem terintegrasi dengan perangkat alarm fisik (sirine dan/atau lampu rotator) yang dapat dikendalikan dari dashboard admin:
warning/{device_id}/controlwarning/{device_id}/statusFile utama: users/admin/warning_devices.php
Sistem mendefinisikan 4 level status banjir berdasarkan ketinggian air yang terukur. Setiap perangkat dapat memiliki ambang batas (threshold) yang berbeda-beda:
| Level | Kode | Warna | Keterangan | Tindakan |
|---|---|---|---|---|
| ✅ Normal | normal |
Hijau | Ketinggian air dalam batas aman | Tidak ada notifikasi |
| ⚠️ Waspada | waspada |
Kuning | Ketinggian air mulai meningkat, perlu kewaspadaan | Notifikasi dikirim ke warga yang memilih level Waspada |
| 🟠 Siaga | siaga |
Oranye | Ketinggian air mendekati level berbahaya | Notifikasi dikirim ke warga level Siaga ke atas |
| 🚨 Awas / Bahaya | awas |
Merah | Ketinggian air mencapai level berbahaya, potensi banjir | Notifikasi dikirim ke semua warga, aktivasi warning devices |
Ambang batas (threshold) untuk setiap level dapat dikonfigurasi per perangkat melalui dashboard admin pada halaman detail perangkat.
Sistem menggunakan database MySQL/MariaDB dengan tabel-tabel utama sebagai berikut:
| Nama Tabel | Fungsi |
|---|---|
users | Data pengguna (admin & warga) — nama, email, password (Argon2id), role, status, notifikasi, subscribed device |
monitoring_devices | Data perangkat ESP32 — device_id, nama_lokasi, API key, GPS, status aktif, mode operasi, send_interval, last_trx |
device_sensors | Mapping sensor per perangkat — menghubungkan device dengan sensor types |
sensor_types | Jenis sensor yang tersedia — water_level, temperature, humidity, rain, dll. |
sensor_readings | Data pembacaan sensor individual — nilai numerik, boolean, atau teks per session |
reading_sessions | Sesi pembacaan data — status banjir, water level, raw payload JSON |
device_status | Status terkini perangkat — online/offline, water level terakhir, last_session_id |
device_images | Foto dari ESP32-CAM — path file, ukuran, water level, captured_at |
thresholds | Ambang batas banjir per perangkat — water_level_min, water_level_max, status_level |
device_shutdown_events | Log mati/peristiwa shutdown perangkat — reason, vbat, acknowledged |
warning_devices | Data perangkat alarm (sirine/lampu) — device_id, tipe, lokasi, status, MQTT topic |
notification_logs | Log pengiriman notifikasi — channel (email/telegram), status, error_msg |
login_attempts | Proteksi brute-force — IP, email, jumlah percobaan, waktu |
system_logs | Log aktivitas sistem umum — aksi, deskripsi, IP, user-agent |
| Endpoint | Method | Fungsi | Autentikasi |
|---|---|---|---|
/api/camera.php |
POST | Upload foto dari ESP32-CAM | X-Device-ID + X-API-Key (headers) |
/api/notify_trigger.php |
GET | Trigger notifikasi (dipanggil internal oleh MQTT listener) | Internal (parameter query) |
| Topik | Direction | Payload | Keterangan |
|---|---|---|---|
monitoring/{id}/sensor | ESP32 → Server | JSON | Data sensor (water_level, suhu, dll.) |
monitoring/{id}/status | ESP32 → Server | JSON | Status hidup/mati, mode, vbat |
warning/{id}/control | Server → Alarm | ON / OFF / TEST | Kontrol perangkat alarm |
warning/{id}/status | Alarm → Server | ON / OFF | Status perangkat alarm |
/users/register.php)/chatid, copy Chat ID, tempel di menu NotifikasiBot Telegram Siaga Banjir merespon perintah berikut:
/start | Memulai bot dan mendapat sambutan |
/chatid | Mendapatkan Chat ID untuk notifikasi |
/help | Menampilkan bantuan perintah yang tersedia |
Untuk pengembang atau teknisi lapangan yang memasang perangkat ESP32:
# 1. Clone repositori ke server web
git clone https://github.com/username/siagabanjir.git
# 2. Install dependensi PHP
cd siagabanjir
composer install
# 3. Copy .env dan sesuaikan konfigurasi
cp .env.example .env
# Edit .env: DB_HOST, DB_USER, DB_PASS, DB_NAME, MQTT_*, TELEGRAM_*, dsb.
# 4. Install dependensi Node.js untuk MQTT Listener
cd mqtt
npm install
# 5. Install dependensi Node.js untuk Telegram Bot
cd ../bot
npm install
# 6. Import database dari file SQL yang disediakan
# 7. Jalankan services dengan PM2
pm2 start mqtt/ecosystem.config.js
pm2 start bot/bot.js --name telegram-bot
# 8. Simpan PM2 config
pm2 save
pm2 startup
# Database
DB_HOST=localhost
DB_USER=root
DB_PASS=secret
DB_NAME=siagabanjir
# Aplikasi
BASE_URL=https://fews.kakaadebasodara.com
LOGIN_MAX_ATTEMPTS=5
LOGIN_BLOCK_MINUTES=60
# MQTT Broker
MQTT_HOST=localhost
MQTT_PORT=1883
MQTT_USER=mqtt_user
MQTT_PASS=mqtt_pass
# Email / SMTP
MAIL_FROM=noreply@siagabanjir.com
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USER=your_email@gmail.com
SMTP_PASS=your_app_password
SMTP_ENCRYPTION=tls
# Telegram Bot
TELEGRAM_BOT_TOKEN=123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11
TELEGRAM_BOT_USERNAME=SiagaBanjirBot
Proyek Siaga Banjir dikembangkan oleh tim yang terdiri dari:
Repositori: github.com/username/siagabanjir