120 lines
3.5 KiB
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);
|
|
}
|