firebaseService = $firebaseService; } /** * Test koneksi Firebase */ public function testConnection() { $result = $this->firebaseService->testConnection(); return response()->json([ 'success' => $result, 'message' => $result ? 'Firebase connection successful' : 'Firebase connection failed' ]); } /** * Endpoint untuk menerima data sensor dari IoT device */ public function receiveSensorData(Request $request) { $request->validate([ 'temperature' => 'required|numeric', 'humidity' => 'required|numeric', 'ph' => 'required|numeric', 'tds' => 'required|numeric' ]); $temperature = $request->temperature; $humidity = $request->humidity; $ph = $request->ph; $tds = $request->tds; // Simpan ke database lokal $sensor = Sensor::create([ 'temperature' => $temperature, 'humidity' => $humidity, 'ph' => $ph, 'tds' => $tds, 'waktu' => now() ]); // Simpan ke Firebase $firebaseKey = $this->firebaseService->saveSensorData($temperature, $humidity, $ph, $tds); return response()->json([ 'success' => true, 'message' => 'Data sensor berhasil disimpan', 'local_id' => $sensor->id, 'firebase_key' => $firebaseKey ]); } /** * Endpoint untuk menerima data actuator dari IoT device */ public function receiveActuatorData(Request $request) { $request->validate([ 'nama' => 'required|string', 'status' => 'required|string' ]); $nama = $request->nama; $status = $request->status; // Simpan ke database lokal $actuator = Actuator::create([ 'nama' => $nama, 'status' => $status, 'waktu_aktif' => now() ]); // Simpan ke Firebase $firebaseKey = $this->firebaseService->saveActuatorData($nama, $status); return response()->json([ 'success' => true, 'message' => 'Data actuator berhasil disimpan', 'local_id' => $actuator->id, 'firebase_key' => $firebaseKey ]); } /** * Terima data umur tanaman dari IoT device */ public function receiveUmurTanamanData(Request $request) { $request->validate([ 'jenis_tanaman' => 'required|string', 'tanggal_tanam' => 'required|date', 'umur_hari' => 'required|integer|min:0', 'status' => 'sometimes|string' ]); try { // Simpan ke database lokal $umurTanaman = UmurTanaman::create([ 'nama' => $request->jenis_tanaman, 'tanggal_tanam' => $request->tanggal_tanam, 'umur_hari' => $request->umur_hari, 'status' => $request->status ?? 'aktif' ]); // Simpan ke Firebase $firebaseKey = $this->firebaseService->saveUmurTanamanData( $request->jenis_tanaman, $request->tanggal_tanam, $request->umur_hari, $request->status ?? 'aktif' ); if ($firebaseKey) { return response()->json([ 'success' => true, 'message' => 'Data umur tanaman berhasil disimpan', 'local_id' => $umurTanaman->id, 'firebase_key' => $firebaseKey ]); } else { return response()->json([ 'success' => false, 'message' => 'Data berhasil disimpan ke database lokal, tapi gagal ke Firebase', 'local_id' => $umurTanaman->id ], 206); } } catch (\Exception $e) { Log::error('Error receiving umur tanaman data: ' . $e->getMessage()); return response()->json([ 'success' => false, 'message' => 'Gagal menyimpan data umur tanaman', 'error' => $e->getMessage() ], 500); } } /** * Ambil data real-time dari Firebase */ public function getRealtimeData() { $data = $this->firebaseService->getRealtimeData(); return response()->json([ 'success' => true, 'data' => $data ]); } /** * Update status actuator */ public function updateActuatorStatus(Request $request) { $request->validate([ 'firebase_key' => 'required|string', 'status' => 'required|string' ]); $result = $this->firebaseService->updateActuatorStatus( $request->firebase_key, $request->status ); return response()->json([ 'success' => $result, 'message' => $result ? 'Status actuator berhasil diupdate' : 'Gagal mengupdate status actuator' ]); } /** * Sync data dari Firebase ke database lokal */ public function syncFromFirebase() { // Ambil data sensor dari Firebase $sensorData = $this->firebaseService->getLatestSensorData(50); $syncedSensor = 0; foreach ($sensorData as $data) { if (isset($data['temperature']) && isset($data['humidity']) && isset($data['ph']) && isset($data['tds']) && isset($data['timestamp'])) { Sensor::firstOrCreate([ 'temperature' => $data['temperature'], 'humidity' => $data['humidity'], 'ph' => $data['ph'], 'tds' => $data['tds'], 'waktu' => $data['timestamp'] ]); $syncedSensor++; } } // Ambil data actuator dari Firebase $actuatorData = $this->firebaseService->getLatestActuatorData(50); $syncedActuator = 0; foreach ($actuatorData as $data) { if (isset($data['nama']) && isset($data['status']) && isset($data['timestamp'])) { Actuator::firstOrCreate([ 'nama' => $data['nama'], 'status' => $data['status'], 'waktu_aktif' => $data['timestamp'] ]); $syncedActuator++; } } return response()->json([ 'success' => true, 'message' => 'Data berhasil disinkronisasi', 'synced_sensor' => $syncedSensor, 'synced_actuator' => $syncedActuator ]); } /** * Get Firebase sensor data for testing */ public function getFirebaseSensorData() { $data = $this->firebaseService->getAllSensorData(); return response()->json([ 'success' => true, 'count' => count($data), 'data' => $data ]); } /** * Get Firebase actuator data for testing */ public function getFirebaseActuatorData() { $data = $this->firebaseService->getAllActuatorData(); return response()->json([ 'success' => true, 'count' => count($data), 'data' => $data ]); } /** * Get Firebase umur tanaman data for testing */ public function getFirebaseUmurTanamanData() { $data = $this->firebaseService->getAllUmurTanamanData(); return response()->json([ 'success' => true, 'count' => count($data), 'data' => $data ]); } }