TKK_E32221196/lib/app/modules/home/controllers/home_controller.dart

120 lines
3.5 KiB
Dart

import 'package:get/get.dart';
import 'package:firebase_database/firebase_database.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:get_storage/get_storage.dart';
import 'package:intl/intl.dart';
import '../../../routes/app_pages.dart';
class HomeController extends GetxController {
final tinggiPakan = 0.0.obs;
final statusPakan = ''.obs;
final pembersih = false.obs;
final pakan = false.obs;
final mode = 'Manual'.obs;
bool pakanNotifSent = false;
final database = FirebaseDatabase.instance.ref();
final flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
final box = GetStorage();
@override
void onInit() {
super.onInit();
_initNotifications();
_listenToFirebase();
}
void _initNotifications() async {
const androidInit = AndroidInitializationSettings('@mipmap/ic_launcher');
final initSettings = InitializationSettings(android: androidInit);
await flutterLocalNotificationsPlugin.initialize(initSettings);
}
void _showNotification(String title, String body) async {
const androidDetails = AndroidNotificationDetails(
'channel_id',
'Peringatan',
channelDescription: 'Notifikasi penting',
importance: Importance.max,
priority: Priority.high,
playSound: true,
);
const platformDetails = NotificationDetails(android: androidDetails);
await flutterLocalNotificationsPlugin.show(
0,
title,
body,
platformDetails,
);
_saveNotificationToStorage(title, body);
}
void _saveNotificationToStorage(String title, String body) {
final now = DateFormat('yyyy-MM-dd HH:mm:ss').format(DateTime.now());
final List history = box.read('notification_history') ?? [];
history.add({
'judul': title,
'deskripsi': body,
'waktu': now,
});
box.write('notification_history', history);
}
void _listenToFirebase() {
database.child('sensor_data').onValue.listen((event) {
final data = event.snapshot.value;
if (data != null && data is Map) {
double pakanValue = 0.0;
if (data['tinggi_pakan'] != null) {
if (data['tinggi_pakan'] is double) {
pakanValue = data['tinggi_pakan'];
} else if (data['tinggi_pakan'] is int) {
pakanValue = (data['tinggi_pakan'] as int).toDouble();
} else if (data['tinggi_pakan'] is String) {
pakanValue = double.tryParse(data['tinggi_pakan']) ?? 0.0;
}
}
tinggiPakan.value = double.parse(pakanValue.toStringAsFixed(2));
if (pakanValue <= 1.0 && !pakanNotifSent) {
_showNotification("Pakan Habis", "Pakan ikan telah habis. Segera isi kembali.");
statusPakan.value = "Habis";
pakanNotifSent = true;
} else if (pakanValue > 1.0 && pakanValue <= 4.0) {
statusPakan.value = "Masih Berisi";
pakanNotifSent = false;
} else if (pakanValue > 4.0) {
statusPakan.value = "Penuh";
pakanNotifSent = false;
}
}
});
database.child('kontrol_alat').onValue.listen((event) {
final data = event.snapshot.value;
if (data != null && data is Map) {
pembersih.value = data['pembersih'] ?? false;
pakan.value = data['pakan'] ?? false;
}
});
}
void togglePembersih(bool value) {
database.child('kontrol_alat/pembersih').set(value);
}
void togglePakan(bool value) {
database.child('kontrol_alat/pakan').set(value);
}
void keNotifikasi() => Get.toNamed(Routes.NOTIFIKASI);
}