6.6 KiB
Laporan Perbaikan Bug ApsGo
Tanggal: 26 Januari 2026
Status: ✅ SELESAI
Ringkasan Bug yang Diperbaiki
1. 🔒 Bug Logout Tiba-tiba ke Landing Page
Masalah:
- Aplikasi terkadang logout secara tiba-tiba saat klik menu Kontrol atau menu lainnya
- User ter-redirect ke Landing Page tanpa sengaja
Penyebab:
- Tidak ada monitoring auth state di DashboardPage
- Ketika Firebase Auth token expired atau ada perubahan auth state, tidak ada handler yang tepat
- Navigation stack tidak terlindungi dengan baik
Solusi:
✅ Tambahkan authStateChanges listener di initState() DashboardPage
@override
void initState() {
super.initState();
// Monitor auth state untuk mencegah logout tidak terduga
_authService.authStateChanges.listen((user) {
if (user == null && mounted) {
// User logged out, redirect to login
Navigator.of(context).pushNamedAndRemoveUntil(
'/login',
(route) => false,
);
}
});
}
File yang Diubah:
lib/screens/dashboard_page.dart
2. 💧 Bug Pompa Tidak Langsung Aktif Saat Soil Moisture Rendah
Masalah:
- Pompa terkadang tidak langsung aktif ketika soil moisture di bawah ambang bawah
- Delay response terlalu lama (10 detik)
- Cooldown period terlalu lama (5 menit)
Penyebab:
- Timer check sensor berjalan setiap 10 detik → terlalu lambat
- Cooldown 5 menit antar penyiraman → terlalu lama untuk kondisi kritis
- Kurang logging untuk debugging
Solusi: ✅ Interval Check: Ubah dari 10 detik → 5 detik (lebih responsif)
_sensorCheckTimer = Timer.periodic(
const Duration(seconds: 5), // Sebelumnya: 10 detik
(timer) => _checkSensorThreshold(),
);
✅ Cooldown Period: Kurangi dari 5 menit → 2 menit
if (diff.inMinutes < 2) { // Sebelumnya: 5 menit
debugPrint('⏳ POT $potNumber: Cooldown active (${2 - diff.inMinutes} min remaining)');
return;
}
✅ Tambah Logging Detail:
- Log setiap check sensor dengan nilai threshold
- Log setiap trigger penyiraman
- Log progress penyiraman per 5 detik
- Log saat target tercapai
✅ Pastikan Flag Reset: Tambah delay sebelum reset flag untuk memastikan cleanup selesai
await Future.delayed(const Duration(milliseconds: 500));
_isWateringActive[potKey] = false;
✅ Error Handling: Tambahkan try-catch untuk matikan pompa saat error
} catch (e) {
debugPrint('❌ Error watering pot by sensor: $e');
// Matikan semua untuk safety
try {
await _dbService.setPompaAir(false);
await _dbService.setPot(potNumber, false);
} catch (cleanupError) {
debugPrint('❌ Error during cleanup: $cleanupError');
}
_isWateringActive[potKey] = false;
}
File yang Diubah:
lib/services/kontrol_automation_service.dart
3. 🔌 Verifikasi Mapping Soil Sensor ke Mosfet
Masalah yang Diperiksa:
- Apakah soil_1 bisa mempengaruhi mosvet_3 dst
- Apakah mapping soil_x ke mosvet_y sudah benar
Hasil Verifikasi: ✅ Mapping sudah BENAR:
soil_1 (Pot 1) → mosvet_3 (Valve Pot 1)
soil_2 (Pot 2) → mosvet_4 (Valve Pot 2)
soil_3 (Pot 3) → mosvet_5 (Valve Pot 3)
soil_4 (Pot 4) → mosvet_6 (Valve Pot 4)
soil_5 (Pot 5) → mosvet_7 (Valve Pot 5)
Catatan:
- mosvet_1 = Pompa Air
- mosvet_2 = Pompa Nutrisi
- mosvet_3 s/d mosvet_7 = Valve Pot 1-5
Perbaikan: ✅ Tambah komentar dan logging untuk memperjelas mapping
// pot 1 → mosvet_3, pot 2 → mosvet_4, ... pot 5 → mosvet_7
debugPrint('💧 Starting watering: POT $potNumber (mosvet_${potNumber + 2})');
✅ Tambah logging tracking nilai soil sensor
debugPrint('🌡️ soil_$i = $soilValue (threshold: $batasBawah)');
debugPrint('⚠️ $soilKey ($soilValue) < batasBawah ($batasBawah) → Triggering watering for POT $i');
File yang Diubah:
lib/services/kontrol_automation_service.dart
Perubahan Detail
File: lib/screens/dashboard_page.dart
Perubahan:
- Import
AuthService - Tambah instance
_authService - Tambah
initState()dengan auth state listener
File: lib/services/kontrol_automation_service.dart
Perubahan:
- ✅ Timer interval: 10s → 5s (line ~183)
- ✅ Cooldown: 5 min → 2 min (line ~248)
- ✅ Tambah logging detail di
_checkSensorThreshold()(line ~217) - ✅ Tambah logging mapping pot (line ~254)
- ✅ Tambah logging progress watering (line ~265)
- ✅ Tambah delay sebelum reset flag (line ~283)
- ✅ Improve error handling dengan cleanup (line ~286)
Testing Checklist
Setelah update, pastikan test hal-hal berikut:
Auth & Navigation
- Login dan navigate ke Dashboard
- Klik menu Kontrol → tidak logout
- Klik menu Histori → tidak logout
- Buka drawer dan klik menu → tidak logout
- Test dengan koneksi internet ON/OFF
- Test dengan token yang akan expired
Sensor Automation
- Aktifkan mode Sensor
- Set soil moisture di bawah batas bawah (misal: 25%)
- Cek pompa aktif dalam < 5 detik
- Cek valve pot yang tepat aktif (soil_1 → mosvet_3, dst)
- Cek log di console untuk tracking
- Test dengan multiple pot di bawah threshold bersamaan
- Test cooldown period (2 menit)
Edge Cases
- Test saat Firebase disconnect
- Test saat sensor data tidak valid (0, null, string)
- Test saat automation service crash
- Test multiple user logout/login
Logging untuk Debugging
Untuk monitor aktivitas, cek console log dengan pattern:
Sensor Mode:
🌡️ Sensor Mode: Started
🌡️ Checking thresholds: batas_bawah=30, batas_atas=80
🌡️ soil_1 = 25 (threshold: 30)
⚠️ soil_1 (25) < batasBawah (30) → Triggering watering for POT 1
💧 Starting watering: POT 1 (mosvet_3)
🌡️ Target: soil_1 should reach >= 80 (currently: 25)
💧 POT 1 watering: 5s, soil_1: 35
💧 POT 1 watering: 10s, soil_1: 50
✅ POT 1 reached target: 80 >= 80
✅ Sensor Mode: Watering completed for POT 1 (15s)
Cooldown:
⏳ POT 1: Cooldown active (1 min remaining)
Errors:
❌ Error watering pot by sensor: [error message]
❌ Error during cleanup: [error message]
Rekomendasi Lanjutan
- Tambah UI Indicator: Tampilkan status automation (active/inactive) di Dashboard
- Notification: Push notification saat pompa aktif otomatis
- History Log: Simpan log automation ke Firebase untuk review
- Manual Override: Button untuk force stop automation
- Sensor Calibration: UI untuk kalibrasi sensor soil moisture
Kontak
Jika masih ada masalah setelah update ini, catat:
- Timestamp kejadian
- Screenshot console log
- Nilai sensor saat kejadian
- Action yang dilakukan user
Happy Gardening! 🌱