import 'package:firebase_database/firebase_database.dart'; import '../models/realtime_monitoring_model.dart'; class RealtimeDatabaseService { final DatabaseReference _database = FirebaseDatabase.instance.ref(); // ==================== MONITORING ==================== Stream> getRoomDevicesStream( String roomId, ) { return _database .child('realtime/rooms/$roomId/devices') .onValue .map((event) { final Map devices = {}; if (event.snapshot.value != null) { final data = event.snapshot.value as Map; data.forEach((deviceId, deviceData) { if (deviceData is Map) { devices[deviceId] = RealtimeMonitoringModel.fromRealtimeDB( deviceId, roomId, deviceData as Map, ); } }); } return devices; }); } Stream getDeviceStream( String roomId, String deviceId, ) { return _database .child('realtime/rooms/$roomId/devices/$deviceId') .onValue .map((event) { if (event.snapshot.value != null) { final data = event.snapshot.value as Map; return RealtimeMonitoringModel.fromRealtimeDB(deviceId, roomId, data); } return null; }); } Stream> getAllDevicesStream() { return _database.child('realtime/rooms').onValue.map((event) { final List allDevices = []; if (event.snapshot.value != null) { final rooms = event.snapshot.value as Map; rooms.forEach((roomId, roomData) { if (roomData is Map && roomData['devices'] != null) { final devices = roomData['devices'] as Map; devices.forEach((deviceId, deviceData) { if (deviceData is Map) { allDevices.add( RealtimeMonitoringModel.fromRealtimeDB( deviceId, roomId, deviceData as Map, ), ); } }); } }); } return allDevices; }); } Future getDevice( String roomId, String deviceId, ) async { try { final snapshot = await _database.child('realtime/rooms/$roomId/devices/$deviceId').get(); if (snapshot.value != null) { final data = snapshot.value as Map; return RealtimeMonitoringModel.fromRealtimeDB(deviceId, roomId, data); } return null; } catch (e) { return null; } } // ==================== CONTROL ==================== Future controlServo(String roomId, String deviceId, bool open) async { await _database .child('realtime/rooms/$roomId/devices/$deviceId/controlling') .update({ 'servo_open': open, 'last_command': DateTime.now().toIso8601String(), }); } Future updateDropRate( String roomId, String deviceId, double dropRate, ) async { await _database .child('realtime/rooms/$roomId/devices/$deviceId/monitoring') .update({ 'drop_rate': dropRate, 'last_update': DateTime.now().toIso8601String(), }); } Future updateDeviceStatus( String roomId, String deviceId, String status, ) async { await _database .child('realtime/rooms/$roomId/devices/$deviceId/monitoring') .update({ 'device_status': status, 'last_update': DateTime.now().toIso8601String(), }); } Future updateServoSettings( String roomId, String deviceId, int angleOpen, int angleClose, ) async { await _database .child('realtime/rooms/$roomId/devices/$deviceId/settings') .update({ 'servo_angle_open': angleOpen, 'servo_angle_close': angleClose, }); } // ==================== UTILITY ==================== Future isDeviceConnected(String roomId, String deviceId) async { try { final device = await getDevice(roomId, deviceId); return device?.deviceStatus == 'connected'; } catch (e) { return false; } } Future getDeviceDropRate(String roomId, String deviceId) async { try { final snapshot = await _database .child( 'realtime/rooms/$roomId/devices/$deviceId/monitoring/drop_rate') .get(); if (snapshot.value != null) { return (snapshot.value as num).toDouble(); } return 0.0; } catch (e) { return 0.0; } } }