122 lines
3.6 KiB
Dart
122 lines
3.6 KiB
Dart
import 'package:get/get.dart';
|
|
import 'package:firebase_database/firebase_database.dart';
|
|
import 'package:cloud_firestore/cloud_firestore.dart';
|
|
import 'package:intl/intl.dart';
|
|
import '../../../routes/app_pages.dart';
|
|
import 'package:flutter/material.dart';
|
|
|
|
class HomeController extends GetxController {
|
|
final db = FirebaseDatabase.instance.ref();
|
|
final historyList = <Map<String, dynamic>>[].obs;
|
|
|
|
var feSebelum = 0.0.obs;
|
|
var feSesudah = 0.0.obs;
|
|
var pompaOn = false.obs;
|
|
|
|
@override
|
|
void onInit() {
|
|
super.onInit();
|
|
_setupListeners();
|
|
ambilHistoryTerbaru();
|
|
}
|
|
|
|
void _setupListeners() {
|
|
// Listener untuk kadar Fe dari Firebase Realtime Database
|
|
db.child("kadar_fe").onValue.listen((event) {
|
|
final data = Map<String, dynamic>.from(event.snapshot.value as Map);
|
|
double sebelum = double.tryParse(data['sebelum'].toString()) ?? 0.0;
|
|
double sesudah = double.tryParse(data['sesudah'].toString()) ?? 0.0;
|
|
|
|
// Format ke 2 angka di belakang koma
|
|
feSebelum.value = double.parse(sebelum.toStringAsFixed(2));
|
|
feSesudah.value = double.parse(sesudah.toStringAsFixed(2));
|
|
});
|
|
|
|
// Listener untuk status pompa
|
|
db.child("relay/pompa").onValue.listen((event) {
|
|
pompaOn.value = event.snapshot.value == true;
|
|
});
|
|
}
|
|
|
|
// Mengambil 3 history terbaru dari Firestore
|
|
void ambilHistoryTerbaru() async {
|
|
final snapshot = await FirebaseFirestore.instance
|
|
.collection("history")
|
|
.orderBy("timestamp", descending: true)
|
|
.limit(3)
|
|
.get();
|
|
|
|
historyList.assignAll(snapshot.docs.map((doc) {
|
|
final data = doc.data();
|
|
final time = data['timestamp'];
|
|
if (time is String) {
|
|
data['formatted_time'] = time;
|
|
} else if (time is Timestamp) {
|
|
data['formatted_time'] =
|
|
DateFormat("dd-MM-yyyy HH:mm").format(time.toDate());
|
|
} else {
|
|
data['formatted_time'] = "Tidak diketahui";
|
|
}
|
|
return data;
|
|
}).toList());
|
|
}
|
|
|
|
// Toggle status pompa ke Realtime Database
|
|
void togglePompa() {
|
|
final newValue = !pompaOn.value;
|
|
db.child("relay/pompa").set(newValue);
|
|
pompaOn.value = newValue;
|
|
}
|
|
|
|
// Navigasi ke halaman info dan histori
|
|
void keInfo() => Get.toNamed(Routes.INFO);
|
|
void keHistory() => Get.toNamed(Routes.HISTORY);
|
|
|
|
// Penilaian hasil deteksi berdasarkan kadar Fe
|
|
String get hasilDeteksi {
|
|
final fe = feSesudah.value;
|
|
if (fe <= 0.3) {
|
|
return "Bersih";
|
|
} else if (fe > 0.3 && fe <= 1.0) {
|
|
return "Perlu Penyaringan";
|
|
} else {
|
|
return "Keruh (Tercemar)";
|
|
}
|
|
}
|
|
|
|
// Simpan data ke Firestore
|
|
Future<void> simpanKeFirestore() async {
|
|
try {
|
|
final now = DateTime.now();
|
|
final timestamp = DateFormat("dd-MM-yyyy HH:mm").format(now);
|
|
|
|
// Pastikan nilai disimpan dengan 2 digit desimal
|
|
await FirebaseFirestore.instance.collection("history").add({
|
|
"fe_sebelum": double.parse(feSebelum.value.toStringAsFixed(2)),
|
|
"fe_sesudah": double.parse(feSesudah.value.toStringAsFixed(2)),
|
|
"result": hasilDeteksi,
|
|
"timestamp": timestamp,
|
|
});
|
|
|
|
Get.snackbar(
|
|
"Berhasil",
|
|
"Data berhasil disimpan ke histori",
|
|
snackPosition: SnackPosition.TOP,
|
|
backgroundColor: const Color(0xFF1E3A8A),
|
|
colorText: Colors.white,
|
|
);
|
|
|
|
ambilHistoryTerbaru(); // Refresh list setelah simpan
|
|
} catch (e) {
|
|
Get.snackbar(
|
|
"Gagal",
|
|
"Terjadi kesalahan saat menyimpan data",
|
|
snackPosition: SnackPosition.TOP,
|
|
backgroundColor: Colors.red,
|
|
colorText: Colors.white,
|
|
);
|
|
debugPrint("Error simpan: $e");
|
|
}
|
|
}
|
|
}
|