Sistem Cerdas Pemantauan & Pengendalian Kualitas Air Akuarium
Berbasis Edge-Cloud Computing dan Generative AI
Proyek UTS Internet of Things โ Semester 6, Program Studi Informatika, Universitas Siliwangi
Fitur โข Arsitektur โข Tech Stack โข Quick Start โข Screenshot โข Struktur โข Lisensi
Aquarius adalah purwarupa sistem IoT full-stack yang merevolusi cara memelihara akuarium. Sistem ini mengintegrasikan:
- ๐ Edge Computing โ Mikrokontroler ESP32 membaca 5 sensor kualitas air dan menjalankan failsafe otonom
- โ๏ธ Cloud Dashboard โ Antarmuka Digital Twin real-time berbasis React JS dengan visualisasi interaktif
- ๐ง AI Cloud Brain โ Google Gemini AI menganalisis korelasi data, memprediksi tren, dan memberikan rekomendasi naratif
- ๐ก MQTT Telemetry โ Protokol publish-subscribe ringan untuk streaming data sensor tanpa overhead
Masalah yang dipecahkan: Air akuarium yang terlihat jernih belum tentu aman โ amonia, pH, dan TDS yang membahayakan tidak terlihat mata. Aquarius memantau parameter ini 24/7 dan memberikan peringatan dini cerdas sebelum terjadi kematian massal ikan.
| Fitur | Deskripsi |
|---|---|
| ๐ก๏ธ Pemantauan 5 Parameter | Suhu, pH, TDS/EC/Salinitas, Turbiditas, Amonia โ semuanya real-time |
| ๐ Water Quality Index (WQI) | Skor tunggal 0โ100 dari algoritma penalty-based yang menyederhanakan data kompleks |
| ๐จ Deteksi Anomali | Mendeteksi lonjakan data sensor yang tidak wajar (noise/outlier) dan menandainya |
| ๐ Failsafe Otonom | Pompa & alarm otomatis menyala saat WQI kritis โ tanpa perlu internet |
| ๐ค AI Predictive Analytics | Gemini AI melakukan prediksi tren, Root Cause Analysis, dan rekomendasi tindakan |
| ๐ Dark Mode | Antarmuka responsif dengan tema gelap premium untuk monitoring malam hari |
| ๐ก Terminal MQTT Live | Visualisasi paket JSON mentah dari broker MQTT secara langsung |
| ๐ Event Logger | Riwayat kronologis insiden, alarm, dan aksi pompa terstruktur |
| ๐พ Export CSV | Unduh data histori sensor ke format CSV untuk analisis lanjutan |
| ๐ฅ๏ธ Simulasi Hardware & Telemetri | Mendukung manipulasi data via slider kontrol UI yang menghasilkan pergerakan nilai (fluktuasi) menyerupai data sensor asli di dunia nyata |
graph TB
subgraph "๐ Edge Layer (ESP32)"
S1[๐ก๏ธ DS18B20<br/>Suhu Air]
S2[โ๏ธ SEN0161<br/>pH Level]
S3[๐ง SEN0244<br/>TDS/EC/Salinitas]
S4[๐ซ๏ธ Turbidity<br/>Kekeruhan]
S5[โ ๏ธ MQ-135<br/>Amonia]
MCU[๐งฎ ESP32<br/>Edge Computing]
R[โก Relay + Pompa]
BZ[๐ Buzzer + LED]
end
subgraph "๐ก Transport Layer"
MQTT[โ๏ธ MQTT Broker<br/>WebSocket Bridge]
CF[๐ Cloudflare<br/>Reverse Proxy + SSL]
end
subgraph "๐ฅ๏ธ Application Layer"
FE[โ๏ธ React Dashboard<br/>Frontend]
BE[๐ข Bun Backend<br/>REST API PM2]
PROXY[๐ CF Workers<br/>Gemini Proxy Bypass]
end
subgraph "๐ง Cognitive Layer"
AI[๐ค Google Gemini AI<br/>Predictive Analytics]
end
S1 & S2 & S3 & S4 & S5 -.->|Simulated Data| MCU
MCU -->|Failsafe Trigger| R & BZ
MCU -->|Publish JSON| MQTT
MQTT -->|WebSocket Stream| FE
FE -->|HTTPS POST| CF
CF -->|Reverse Proxy| BE
BE -->|Proxy Request| PROXY
PROXY -->|Forward Bypass Geo| AI
AI -->|JSON Response| PROXY
PROXY -->|Forward Result| BE
BE -->|Forward Result| FE
style MCU fill:#1e40af,color:#fff,stroke:#3b82f6,stroke-width:2px
style CF fill:#f59e0b,color:#000,stroke:#fbbf24,stroke-width:2px
style PROXY fill:#f59e0b,color:#000,stroke:#fbbf24,stroke-width:2px
style FE fill:#0891b2,color:#fff,stroke:#22d3ee,stroke-width:2px
style BE fill:#16a34a,color:#fff,stroke:#4ade80,stroke-width:2px
style AI fill:#9333ea,color:#fff,stroke:#c084fc,stroke-width:2px
sequenceDiagram
participant ๐ as ESP32 + Sensors
participant ๐ก as MQTT Broker
participant โ๏ธ as React Dashboard
participant ๐ข as Node.js Backend
participant ๐ค as Gemini AI
participant โก as Aktuator (Pompa/Alarm)
loop Setiap 2 Detik
๐->>๐: Baca 5 Sensor + Hitung WQI Lokal
๐->>๐: Cek Anomali & Batas Kritis
alt WQI โค 50 (BAHAYA)
๐->>โก: ๐จ FAILSAFE: Relay ON + Buzzer ON
end
๐->>๐ก: Publish payload JSON
end
loop Real-Time Sync
๐ก-->>โ๏ธ: WebSocket โ Data Sensor
โ๏ธ->>โ๏ธ: Kalkulasi WQI + Update Chart & UI
โ๏ธ->>โ๏ธ: Deteksi Anomali (Outlier Spike)
end
loop On-Demand / Berkala
โ๏ธ->>๐ข: POST /api/analyze {sensor + history}
๐ข->>๐ข: Rate Limiting + Deadband Filter
๐ข->>๐ค: Kirim Prompt (Context + Data)
๐ค-->>๐ข: JSON {status, risk, RCA, actions}
๐ข-->>โ๏ธ: Forward Response
โ๏ธ->>โ๏ธ: Render Panel "Pakar Ekosistem Virtual"
end
Walaupun aplikasi ini berjalan menggunakan simulasi telemetri berfluktuasi tanpa perangkat fisik, berikut adalah referensi koneksi pin (GPIO) jika proyek ini diimplementasikan dengan Real Hardware ESP32:
| Sensor / Modul | Pin ESP32 (Default) | Fungsi | Protokol Komunikasi |
|---|---|---|---|
| DS18B20 | GPIO 4 |
Suhu Air | 1-Wire (Butuh Resistor Pull-up 4.7k) |
| SEN0161 (pH) | GPIO 34 |
pH Air | Analog (ADC) |
| SEN0244 (TDS) | GPIO 35 |
Salinitas & Mineral | Analog (ADC) |
| Turbidity Sensor | GPIO 32 |
Kekeruhan Air | Analog (ADC) |
| MQ-135 | GPIO 33 |
Kadar Amonia | Analog (ADC) |
| Relay Pompa | GPIO 25 |
Kendali Sirkulasi | Digital Out |
| Relay Aerator | GPIO 26 |
Kendali Oksigen | Digital Out |
Catatan: Anda dapat melihat skema Wiring visual interaktif langsung di Dashboard dengan menekan tombol "Lihat Skema Perangkat".
Buat file .env di folder /backend dengan isian berikut:
| Variabel | Keterangan | Default / Contoh |
|---|---|---|
GEMINI_API_KEY |
API Key dari Google AI Studio (Wajib) | AIzaSy... |
PORT |
Port backend berjalan | 3001 |
GEMINI_PROXY_URL |
URL Cloudflare Worker (Untuk Geo-bypass) | https://proxy.workers.dev |
๐ Pro Tip: Karena kita mempublikasi repo ini, file
.envsudah aman masuk ke dalam.gitignoresehingga API Key milik Anda tidak akan terekspos ke GitHub.
|
|
|
|
| โ๏ธ Light Mode | ๐ Dark Mode |
![]() |
![]() |
๐ก Tip: Klik gambar untuk melihat dalam resolusi penuh. Dashboard menampilkan panel kontrol sensor (kiri), dashboard real-time dengan gauge meter dan chart (tengah), serta panel AI Cloud Assistant (kanan).
Skor WQI dihitung menggunakan algoritma penalty-based โ dimulai dari skor sempurna 100, lalu dikurangi berdasarkan deviasi setiap parameter:
graph TD
A["๐ฏ Skor Awal: 100"] --> B["๐ก๏ธ Penalti Suhu<br/>|temp - 27ยฐC| ร 5"]
A --> C["โ๏ธ Penalti pH<br/>|pH - 7.0| ร 15"]
A --> D["๐ง Penalti TDS<br/>(TDS > 400) ร 0.05"]
A --> E["๐ซ๏ธ Penalti Turbiditas<br/>(NTU > 10) ร 0.5"]
A --> F["โ ๏ธ Penalti Amonia<br/>NH3 ร 40 โ ๏ธ TERBERAT"]
B & C & D & E & F --> G["โ Total Penalti"]
G --> H["๐ WQI = 100 - Total"]
H --> I{WQI Score?}
I -->|"โฅ 80"| J["โ
Sangat Baik"]
I -->|"60-79"| K["โ ๏ธ Waspada"]
I -->|"40-59"| L["๐ Buruk"]
I -->|"< 40"| M["๐ด KRITIS<br/>Failsafe Aktif!"]
style A fill:#dbeafe,stroke:#3b82f6,stroke-width:2px
style F fill:#fce4ec,stroke:#ef4444,stroke-width:3px
style J fill:#dcfce7,stroke:#22c55e,stroke-width:2px
style K fill:#fef9c3,stroke:#eab308,stroke-width:2px
style L fill:#fed7aa,stroke:#f97316,stroke-width:2px
style M fill:#fecaca,stroke:#ef4444,stroke-width:3px
Catatan penting: Penalti Amonia memiliki bobot tertinggi (ร40) karena toksisitasnya yang mematikan โ hanya 0.5 ppm saja sudah memotong 20 poin WQI!
graph LR
A["๐ Data Sensor<br/>+ Histori 10 Poin"] --> B["๐ข Backend<br/>POST /api/analyze"]
B --> C{"๐ Rate Limiter<br/>+ Deadband"}
C -->|"Data berubah signifikan"| D["๐ Prompt<br/>Engineering"]
C -->|"Data stabil"| E["โธ๏ธ Cache Response<br/>(Cooldown 60s)"]
D --> F["๐ Dynamic Context<br/>Profil Lingkungan"]
F --> G["๐ค Gemini 3.1 Flash"]
G --> H["๐ JSON Response<br/>Terstruktur"]
H --> I["๐ status_level"]
H --> J["๐ predictive_insight"]
H --> K["๐ root_cause_analysis"]
H --> L["โ
recommended_actions"]
I & J & K & L --> M["โ๏ธ Panel AI<br/>di Dashboard"]
style G fill:#9333ea,color:#fff,stroke:#c084fc,stroke-width:2px
style F fill:#4f46e5,color:#fff,stroke:#818cf8,stroke-width:2px
Profil Lingkungan yang Didukung:
| Profil | Suhu Ideal | pH Ideal | TDS Maks | Kekeruhan |
|---|---|---|---|---|
| ๐ Ikan Tropis | 24โ30ยฐC | 6.5โ7.5 | 400 ppm | < 10 NTU |
| ๐ Ikan Koi | 20โ28ยฐC | 7.0โ8.0 | 300 ppm | < 5 NTU |
| ๐ฟ Aquascape | 22โ28ยฐC | 6.0โ7.0 | 500 ppm | < 5 NTU |
Sistem ini dirancang sebagai Proof of Concept (PoC) untuk kebutuhan akademik (UTS), dengan mempertimbangkan beberapa aspek keamanan dasar:
- AI API Key Protection: API Key Google Gemini disimpan aman di server backend (melalui
.env), tidak pernah diekspos ke sisi client (Frontend). - Geo-Restriction Bypass: Akses ke model Gemini di-routing melalui Cloudflare Workers sebagai Forward Proxy, sehingga IP VPS tidak ditolak oleh Google. Worker ini bersifat passthrough dan tidak menyimpan credential.
- Data Transport: Komunikasi antara Frontend dan Backend sudah dilindungi enkripsi HTTPS/WSS via Cloudflare/Caddy.
โ ๏ธ Batasan (Known Limitations):
- Data Berbasis Simulasi: Seluruh telemetri yang dimunculkan merupakan data mock (dummy) yang dirancang agar menyerupai sensor asli. Tidak ada sensor maupun ESP32 fisik yang terhubung ke dalam sistem.
- Tanpa Rate-Limiting: Endpoint
/api/analyzebelum dilengkapi mekanisme Rate Limiting. Pengguna publik dapat menguras kuota gratis API Gemini jika melakukan spam request.
Sistem ini sudah di-deploy dan dapat diakses publik.
- Aplikasi Web: https://iot.aquarise.my.id
- API Endpoint: https://iot.aquarise.my.id/api/analyze
- ESP32 Code: https://iot.aquarise.my.id/esp32-code.txt
1. Frontend (Caddy Static Hosting) Build Vite di-serve langsung menggunakan Caddy Reverse Proxy dengan auto-SSL dari Cloudflare.
2. Backend (Bun + PM2) Backend berjalan menggunakan runtime Bun yang super cepat dan dijaga tetap hidup oleh PM2.
pm2 start server.js --name iot-backend --interpreter bun
pm2 save3. Cloudflare Workers (Gemini Proxy) Karena Google Gemini API memblokir request dari IP Indonesia (Geo-restriction), request ke AI di-routing melalui Cloudflare Workers.
// CF Worker URL
GEMINI_PROXY_URL=https://gemini-proxy.yourname.workers.devBackend akan otomatis fallback ke local logic (Smart Fallback) jika API Key habis quota atau proxy mati.
- Node.js v18+ atau Bun v1+
- Google Gemini API Key (gratis)
- Browser modern (Chrome/Firefox/Edge)
git clone https://github.com/feb027/TugasIoT.git
cd TugasIoTcd backend
bun install # atau: npm install
# Buat file .env
echo "GEMINI_API_KEY=your_api_key_here" > .env
# Jalankan server
bun server.js # atau: node server.js
# โ
Server listening on port 3001cd frontend
bun install # atau: npm install
# Jalankan dev server
bun run dev # atau: npm run dev
# โ
Local: http://localhost:5173Akses http://localhost:5173 di browser.
โน๏ธ Catatan: Dashboard berjalan dalam mode Simulasi Telemetri. Anda bisa mencoba berbagai skenario ekosistem (Suhu tinggi, pH asam, dll) dengan menggeser slider pada Control Panel. Nilai data akan berfluktuasi secara otomatis (ditambah noise ยฑ) agar menyerupai perilaku data sensor riil di lapangan.
graph LR
A["๐ป Terminal 1<br/>bun server.js"] --> B["Port 3001<br/>Backend API"]
C["๐ป Terminal 2<br/>bun run dev"] --> D["Port 5173<br/>Frontend UI"]
D -->|"API Call"| B
E["๐ Browser"] -->|"localhost:5173"| D
style A fill:#16a34a,color:#fff
style C fill:#0891b2,color:#fff
smart-aquarium-iot/
โ
โโโ ๐ README.md # Dokumen ini
โโโ ๐ laporan_akhir.md # Laporan lengkap proyek (PDF-ready)
โโโ ๐ UTS Internet of Things 2026.md # Naskah soal UTS
โโโ ๐ prd.md # Product Requirements Document
โ
โโโ โก wokwi_sketch.ino # Firmware ESP32 (C++/Arduino)
โโโ ๐ diagram.json # Skema rangkaian Wokwi Simulator
โ
โโโ ๐ฅ๏ธ skema_rangkaian.html # Visualisasi skema rangkaian
โโโ ๐๏ธ arsitektur_sistem.html # Diagram arsitektur sistem
โโโ ๐ flowchart_wqi.html # Flowchart WQI interaktif
โ
โโโ ๐ข backend/ # Server Node.js + Express
โ โโโ server.js # Entry point (REST API + Gemini)
โ โโโ .env # Environment variables (API Key)
โ โโโ package.json # Dependencies backend
โ
โโโ โ๏ธ frontend/ # React Dashboard (Vite)
โ โโโ src/
โ โ โโโ App.jsx # Root component (State, WQI, Anomaly)
โ โ โโโ main.jsx # Entry point React
โ โ โโโ index.css # Global styles + Tailwind
โ โ โโโ App.css # App-specific styles
โ โ โโโ components/
โ โ โโโ Dashboard.jsx # Panel utama: Gauge, Chart, Events
โ โ โโโ ControlPanel.jsx # Slider sensor & toggle kontrol
โ โ โโโ AIPanel.jsx # Panel asisten AI Cloud
โ โ โโโ HardwareSimulation.jsx # Modal skema ESP32 (Diagram Wiring)
โ โ โโโ TrendChart.jsx # Line chart Recharts
โ โ โโโ GaugeMeter.jsx # Gauge meter komponen
โ โ โโโ CustomSlider.jsx # Slider input kustom
โ โโโ tailwind.config.js # Konfigurasi Tailwind CSS
โ โโโ vite.config.js # Konfigurasi Vite bundler
โ โโโ package.json # Dependencies frontend
โ
โโโ ๐ docs/ # Dokumentasi tambahan
โโโ screenshots/ # Screenshot aplikasi
โ โโโ dashboard_light.png # Dashboard mode terang
โ โโโ dashboard_dark.png # Dashboard mode gelap
โโโ plans/ # Rencana pengembangan
Berikut adalah pemetaan koneksi GPIO antara ESP32 dan seluruh modul sensor/aktuator:
graph LR
subgraph "ESP32 DevKit V4"
ESP["๐งฎ ESP32"]
end
subgraph "Sensor Input"
T["๐ก๏ธ DS18B20<br/>Pin 4 (1-Wire)"]
PH["โ๏ธ pH Sensor<br/>Pin 34 (ADC)"]
TDS["๐ง TDS Sensor<br/>Pin 35 (ADC)"]
NH3["โ ๏ธ MQ-135<br/>Pin 32 (ADC)"]
NTU["๐ซ๏ธ Turbidity<br/>Pin 33 (ADC)"]
end
subgraph "Aktuator Output"
RL["โก Relay Module<br/>Pin 2 (Digital)"]
LED["๐ด Warning LED<br/>Pin 5 (Digital)"]
BUZ["๐ Buzzer<br/>Pin 18 (Digital)"]
end
T -->|"Data"| ESP
PH -->|"Analog"| ESP
TDS -->|"Analog"| ESP
NH3 -->|"Analog"| ESP
NTU -->|"Analog"| ESP
ESP -->|"Control"| RL
ESP -->|"Control"| LED
ESP -->|"Control"| BUZ
style ESP fill:#1e40af,color:#fff,stroke:#3b82f6,stroke-width:3px
style RL fill:#dc2626,color:#fff,stroke:#ef4444,stroke-width:2px
style LED fill:#dc2626,color:#fff,stroke:#ef4444,stroke-width:2px
style BUZ fill:#dc2626,color:#fff,stroke:#ef4444,stroke-width:2px
| Komponen | Jenis Pin | GPIO | Keterangan |
|---|---|---|---|
| DS18B20 (Suhu) | Digital 1-Wire | GPIO 4 |
Dengan pull-up resistor 4.7kฮฉ |
| pH Sensor (SEN0161) | Analog (ADC) | GPIO 34 |
Range 0โ14 pH |
| TDS Sensor (SEN0244) | Analog (ADC) | GPIO 35 |
Range 0โ1000 ppm |
| Amonia (MQ-135) | Analog (ADC) | GPIO 32 |
Range 0โ5 ppm |
| Turbidity | Analog (ADC) | GPIO 33 |
Range 0โ100 NTU |
| Relay Module | Digital Output | GPIO 2 |
NO (Normally Open) |
| Warning LED | Digital Output | GPIO 5 |
Resistor 220ฮฉ |
| Buzzer | Digital Output | GPIO 18 |
1KHz tone |
Sistem dirancang dengan prinsip keselamatan otonom: meski internet mati, ESP32 tetap melindungi akuarium.
stateDiagram-v2
[*] --> Monitoring: Sistem Hidup
Monitoring --> Normal: WQI > 50
Monitoring --> Critical: WQI โค 50
Normal --> Monitoring: Baca Sensor (2s)
Critical --> FailsafeActive: Trigger Lokal
state FailsafeActive {
[*] --> RelayON: digitalWrite(RELAY, HIGH)
RelayON --> PompaAktif: Pompa Sirkulasi Menyala
[*] --> LEDON: digitalWrite(LED, HIGH)
LEDON --> LampuMerah: Indikator Darurat
[*] --> BuzzerON: tone(BUZZER, 1000)
BuzzerON --> AlarmBerbunyi: Sirine 1KHz
}
FailsafeActive --> Monitoring: WQI Pulih > 50
๐ Poin kunci: Failsafe berjalan di
loop()firmware โ tidak bergantung pada koneksi internet/cloud. Ini adalah garis pertahanan pertama yang melindungi ekosistem akuarium.
| # | Skenario | Tujuan | Hasil |
|---|---|---|---|
| 1 | Stabilitas UI | Memastikan chart tidak frame-drop saat data stream konstan | โ React Virtual DOM + Vite HMR stabil |
| 2 | Trigger Alarm Kritis | Injeksi Amonia > 2.5 ppm | โ LED, Buzzer, Relay aktif + Event Log mencatat |
| 3 | Rate Limiting AI | Spam klik "Analisis AI" berturut-turut | โ Backend mengembalikan HTTP 429 + Cooldown |
| 4 | Deteksi Anomali | Lonjakan TDS > 100 ppm/detik | โ Banner "Anomali Terdeteksi" muncul di UI |
| 5 | Failsafe Offline | Matikan koneksi saat WQI kritis | โ Pompa tetap aktif (Edge Computing) |
| 6 | Export CSV | Unduh data histori | โ
File .csv valid dengan semua kolom |
timeline
title Roadmap Smart Aquarium IoT
section Phase 1 โ MVP โ
Sensor Integration : ESP32 + 5 Sensor + Aktuator
Dashboard UI : React + Tailwind + Dark Mode
WQI Algorithm : Penalty-based scoring
AI Integration : Gemini API + Backend wrapper
section Phase 2 โ Enhancement ๐ง
Auto Feeder : Servo motor + jadwal pakan AI
Mobile App : React Native / Flutter
Push Notification : Alert darurat ke smartphone
MQTT Broker Publik : HiveMQ / EMQX Cloud
section Phase 3 โ Advanced ๐ฎ
Computer Vision : Kamera IP waterproof + deteksi perilaku ikan
Multi-Tank Support : Manajemen beberapa akuarium
Data Analytics : Grafik multi-minggu + ML prediction
Komersial Release : Produk jadi siap pasar
Proyek ini dikerjakan sebagai tugas UTS Internet of Things di bawah bimbingan:
| Peran | Nama |
|---|---|
| ๐ Dosen Pengampu | Reza Febriana, S.Kom., M.Kom., CEH. |
| ๐ซ Institusi | Program Studi Informatika, Fakultas Teknik, Universitas Siliwangi |
| ๐ Semester | Genap 2025/2026 |
Proyek ini dibuat untuk keperluan akademis (UTS IoT Semester 6). Diizinkan digunakan sebagai referensi pembelajaran.
Dibuat menggunakan ESP32, React, dan Google Gemini AI
ยฉ 2026 โ Smart Aquarium IoT Project

